Внутренняя функция
Эта статья нуждается в дополнительных цитатах для проверки . ( декабрь 2009 г. ) |
В компьютерном программном обеспечении , в теории компиляторов, встроенная функция , также называемая встроенной функцией или встроенной функцией , представляет собой функцию ( подпрограмму ), доступную для использования в данном языке программирования , реализация которой специально обрабатывается компилятором . Как правило, исходный вызов функции может заменяться последовательностью автоматически сгенерированных инструкций , аналогично встроенной функции . [1] В отличие от встроенной функции, компилятор хорошо знает встроенную функцию и, таким образом, может лучше интегрировать и оптимизировать ее для конкретной ситуации.
Компиляторы, реализующие встроенные функции, могут включать их только тогда, когда программа запрашивает оптимизацию , в противном случае они возвращаются к реализации по умолчанию, предоставляемой системой времени выполнения языка (средой).
Векторизация и распараллеливание
[ редактировать ]Внутренние функции часто используются для явной реализации векторизации и распараллеливания в языках, которые не поддерживают такие конструкции. Некоторые интерфейсы прикладного программирования (API), например AltiVec и OpenMP , используют встроенные функции для объявления, соответственно, векторизуемых и многопроцессорных операций во время компиляции. Компилятор анализирует встроенные функции и преобразует их в векторный математический или объектный код многопроцессорной обработки , соответствующий целевой платформе . Некоторые встроенные функции используются для предоставления оптимизатору дополнительных ограничений, например значений, которые переменная не может принимать. [2]
По языку программирования
[ редактировать ]С и С++
[ редактировать ]Компиляторы для C и C++ от Microsoft, [3] Интел, [1] и Коллекция компиляторов GNU (GCC). [4] реализовать встроенные функции, которые напрямую сопоставляются с одной инструкцией x86 , инструкциями с несколькими данными ( SIMD ) ( MMX , потоковые расширения 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++, таких как или библиотеки Sony glm векторной математики . [10] добиться переносимости посредством условной компиляции (на основе флагов компилятора, специфичной для платформы), предоставляя полностью переносимые примитивы высокого уровня (например, четырехэлементный векторный тип с плавающей запятой), отображаемые на соответствующие реализации языка программирования низкого уровня , сохраняя при этом преимущества Система типов C++ и встраивание; отсюда и преимущество перед связыванием с рукописными объектными файлами сборки с использованием двоичного интерфейса приложения C (ABI).
Примеры
[ редактировать ] uint64_t __rdtsc (); // return internal CPU clock counter
uint64_t __popcnt64 (uint64_t n); // count of bits set in n
uint64_t _umul128 (uint64_t Factor1, uint64_t Factor2, uint64_t* HighProduct); // 64 bit * 64 bit => 128 bit multiplication
__m512 _mm512_add_ps (__m512 a, __m512 b); // calculates a + b for two vectors of 16 floats
__m512 _mm512_fmadd_ps(__m512 a, __m512 b, __m512 c); // calculates a*b + c for three vectors of 16 floats
Ява
[ редактировать ]также имеет встроенные функции для конкретных API - виртуальной машины HotSpot Java JVM- компилятор интерфейсов Java. [12] Внутренние функции Hotspot — это стандартные API-интерфейсы Java, которые могут иметь одну или несколько оптимизированных реализаций на некоторых платформах.
ПЛ/Я
[ редактировать ]ANSI/ISO PL/I определяет около 90 встроенных функций. [13] Условно их группируют следующим образом: [14] : 337–338
- Встроенные функции обработки строк, такие как INDEX, LENGTH.
- Встроенные арифметические функции, такие как ABS, CEIL, ROUND.
- Математические встроенные функции, такие как SIN, COS, LOG, ERF.
- Встроенные функции обработки массивов, например ANY, ALL, PROD.
- Встроенные функции обработки условий, такие как ONCODE, ONFILE.
- Встроенные функции управления хранилищем, например ADDR, POINTER
- Встроенные функции ввода-вывода: LINENO
- Различные встроенные функции, такие как ДАТА и ВРЕМЯ.
Отдельные компиляторы добавили дополнительные встроенные функции, специфичные для машинной архитектуры или операционной системы.
Встроенная функция идентифицируется, оставляя ее имя необъявленным и разрешая использовать значение по умолчанию, или объявляя ее. BUILTIN
. Пользовательскую функцию с тем же именем можно заменить, объявив ее как ENTRY
.
Ссылки
[ редактировать ]- ^ Jump up to: а б «Руководство и справочник по компилятору Intel® C++ 19.1 для разработчиков» . Документация по компилятору Intel® C++ . 16 декабря 2019 года . Проверено 17 января 2020 г.
- ^ Команда Clang (2020). «Расширения языка Clang» . Документация Clang 11 . Проверено 17 января 2020 г.
Встроенные функции
- ^ MSDN . «Внутренности компилятора» . Майкрософт . Проверено 20 июня 2012 г.
- ^ Документация GCC. «Встроенные функции, специфичные для конкретных целевых машин» . Фонд свободного программного обеспечения . Проверено 20 июня 2012 г.
- ^ MSDN . «Внутренности и встроенная сборка» . Майкрософт . Архивировано из оригинала 2 января 2018 г. Проверено 16 апреля 2010 г.
- ^ MSDN . «Внутренности и встроенная сборка» . Майкрософт . Проверено 28 сентября 2011 г.
- ^ MSDN . «Внутренности и встроенная сборка» . Майкрософт . Проверено 28 сентября 2011 г.
- ^ MSDN . «Внутренности и встроенная сборка» . Майкрософт . Проверено 28 сентября 2011 г.
- ^ «Векторные расширения» . Использование коллекции компиляторов GNU (GCC) . Проверено 16 января 2020 г.
- ^ «Математические библиотеки Vector Math и SIMD с открытым исходным кодом Sony (Cell PPU/SPU/другие платформы)» . Форум Beyond3D . Проверено 17 января 2020 г.
- ^ Внутренние структуры Intel
- ^ Мок, Крис (25 февраля 2013 г.). «Внутренние методы в HotSpot VM» . Слайдшер . Проверено 20 декабря 2014 г.
- ^ Комитет ANSI X3 (1976). Американский национальный стандартный язык программирования PL/I .
{{cite book}}
: CS1 maint: числовые имена: список авторов ( ссылка ) - ^ Корпорация IBM (1995). Справочник по языку IBM PL/I для MVS и VM .
Внешние ссылки
[ редактировать ]- Руководство по внутренним компонентам Intel
- Использование подпрограмм миликода , документация IBM AIX 6.1