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

Функция, реализация которой обрабатывается компилятором специально

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

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

Векторизация и распараллеливание

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

По языку программирования

С и С++

Компиляторы для C и C++ от Microsoft, [3] Intel, [1] и GNU Compiler Collection (GCC) [4] реализуют встроенные функции, которые напрямую сопоставляются с инструкциями x86 single instruction, multiple data ( SIMD ) ( MMX , Streaming SIMD Extensions (SSE), SSE2 , SSE3 , SSSE3 , SSE4 , AVX , AVX2 , AVX512 , FMA , ...). Встроенные функции позволяют сопоставлять стандартные инструкции ассемблера, которые обычно недоступны через C/C++, например, побитовое сканирование.

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

Примеры

Ниже приведены примеры сигнатур встроенных функций из набора встроенных функций Intel.

 uint64_t __rdtsc (); // возвращает внутренний счетчик часов ЦП uint64_t __popcnt64 ( uint64_t n ); // количество бит, установленных в n uint64_t _umul128 ( uint64_t Factor1 , uint64_t Factor2 , uint64_t * HighProduct ); // 64 бит * 64 бит => 128 бит умножение __m512 _mm512_add_ps ( __m512 a , __m512 b ); // вычисляет a + b для двух векторов из 16 чисел с плавающей точкой __m512 _mm512_fmadd_ps ( __m512 a , __m512 b , __m512 c ); // вычисляет a*b + c для трех векторов из 16 чисел с плавающей точкой                                

[7]

Ява

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

ПЛ/И

ANSI/ISO PL/I определяет около 90 встроенных функций. [9] Они условно сгруппированы следующим образом: [10] : 337–338 

  • Встроенные функции обработки строк, такие как INDEX, LENGTH
  • Встроенные арифметические функции, такие как ABS, CEIL, ROUND
  • Встроенные математические функции, такие как SIN, COS, LOG, ERF
  • Встроенные функции обработки массивов, например ANY, ALL, PROD
  • Встроенные функции обработки условий, такие как ONCODE, ONFILE
  • Встроенные функции управления хранилищем, например ADDR, POINTER
  • Встроенные функции ввода-вывода: LINENO
  • Различные встроенные функции, такие как ДАТА и ВРЕМЯ

Отдельные компиляторы добавляют дополнительные встроенные функции, специфичные для архитектуры машины или операционной системы.

Встроенная функция идентифицируется, если оставить ее имя необъявленным и разрешить ей значение по умолчанию, или если объявить ее BUILTIN. Пользовательскую функцию с тем же именем можно заменить, объявив ее как ENTRY.

Ссылки

  1. ^ ab "Руководство и справочник разработчика Intel® C++ Compiler 19.1". Документация по компилятору Intel® C++ . 16 декабря 2019 г. Получено 17 января 2020 г.
  2. ^ Команда Clang (2020). "Расширения языка Clang". Документация Clang 11. Получено 17.01.2020 . Встроенные функции
  3. ^ MSDN . "Внутренние компоненты компилятора". Microsoft . Получено 20.06.2012 .
  4. ^ Документация GCC. "Встроенные функции, специфичные для конкретных целевых машин". Free Software Foundation . Получено 20.06.2012 .
  5. ^ "Vector Extensions". Использование коллекции компиляторов GNU (GCC) . Получено 16.01.2020 .
  6. ^ "Sony open source Vector Math и библиотеки SIMD math (Cell PPU/SPU/другие платформы)". Beyond3D Forum . Архивировано из оригинала 2016-06-24 . Получено 2020-01-17 .
  7. ^ Встроенные компоненты Intel
  8. ^ Мок, Крис (25 февраля 2013 г.). "Внутренние методы в HotSpot VM". Slideshare . Получено 20.12.2014 .
  9. ^ Комитет ANSI X3 (1976). Американский национальный стандарт языка программирования PL/I .{{cite book}}: CS1 maint: числовые имена: список авторов ( ссылка )
  10. ^ Корпорация IBM (1995). Справочник по языку IBM PL/I для MVS и VM .
  • Руководство по встроенным функциям Intel
  • Использование процедур milicode, документация IBM AIX 6.1
Взято с "https://en.wikipedia.org/w/index.php?title=Внутренняя_функция&oldid=1264617936"