Внутренняя функция


В компьютерном программном обеспечении , в теории компилятора, встроенная функция (или встроенная функция ) — это функция ( подпрограмма ), доступная для использования в данном языке программирования , реализация которой специально обрабатывается компилятором . Как правило, он может заменить последовательность автоматически сгенерированных инструкций для исходного вызова функции, подобно встроенной функции . [1] В отличие от встроенной функции, компилятор хорошо знает встроенную функцию и, таким образом, может лучше интегрировать и оптимизировать ее для данной ситуации.

Компиляторы, которые реализуют встроенные функции, обычно включают их только тогда, когда программа запрашивает оптимизацию , в противном случае возвращаются к реализации по умолчанию, предоставляемой системой среды выполнения языка (окружением).

Внутренние функции часто используются для явной реализации векторизации и распараллеливания в языках, которые не поддерживают такие конструкции. Некоторые интерфейсы прикладного программирования (API), например, AltiVec и OpenMP , используют встроенные функции для объявления, соответственно, векторизуемых и многопроцессорных операций во время компиляции. Компилятор анализирует встроенные функции и преобразует их в векторную математику или многопроцессорный объектный код , подходящий для целевой платформы . Некоторые встроенные функции используются для предоставления оптимизатору дополнительных ограничений, таких как значения, которые переменная не может принимать. [2]

Компиляторы для C и C++ от Microsoft, [3] Intel, [1] и коллекции компиляторов GNU (GCC) [4] реализуют встроенные функции, которые напрямую сопоставляются с инструкциями x86 с одной инструкцией, несколькими инструкциями данных ( SIMD ) ( MMX , Streaming SIMD Расширения (SSE), SSE2 , SSE3 , SSSE3 , SSE4 , AVX , AVX2 , AVX512 , FMA , ...). Компилятор Microsoft Visual C++ дляMicrosoft Visual Studio не поддерживает встроенную сборку для x86-64 . [5] [6] [7] [8] Чтобы компенсировать это, были добавлены новые встроенные функции, которые сопоставляются со стандартными инструкциями ассемблера, которые обычно недоступны через C/C++, например, битовое сканирование.

Некоторые компиляторы C и C++ предоставляют непереносимые встроенные функции для конкретных платформ. Другие встроенные функции (такие как встроенные модули GNU ) немного более абстрактны, приближаясь к возможностям нескольких современных платформ, с переносимыми резервными реализациями на платформах без соответствующих инструкций. [9] Для библиотек C++, таких как glm или векторные математические библиотеки Sony , характерно [10] достижение переносимости с помощью условной компиляции (на основе флагов компилятора, зависящих от платформы), предоставляя полностью переносимые высокоуровневые примитивы (например, четырехэлементный векторный тип с плавающей запятой), отображенный на соответствующийнизкоуровневые реализации языков программирования, при этом все еще использующие преимущества системы типов C++ и встраивания; следовательно, преимущество перед связыванием с написанными от руки объектными файлами сборки с использованием двоичного интерфейса приложения C (ABI).

JIT - компилятор виртуальной машины HotSpot Java (JVM) также имеет встроенные функции для определенных API-интерфейсов Java. [11] Встроенные функции Hotspot — это стандартные API-интерфейсы Java, которые могут иметь одну или несколько оптимизированных реализаций на некоторых платформах.