En software de computadora , en teoría del compilador, una función intrínseca , también llamada función incorporada o función incorporada , es una función ( subrutina ) disponible para su uso en un lenguaje de programación determinado cuya implementación es manejada especialmente por el compilador . Normalmente, puede sustituir una secuencia de instrucciones generadas automáticamente para la llamada a la función original, similar a una función en línea . [1] A diferencia de una función en línea, el compilador tiene un conocimiento profundo de una función intrínseca y, por lo tanto, puede integrarla y optimizarla mejor para una situación determinada.
Los compiladores que implementan funciones intrínsecas pueden habilitarlas solo cuando un programa solicita optimización ; de lo contrario, recurren a una implementación predeterminada proporcionada por el sistema de ejecución del lenguaje (entorno).
Las funciones intrínsecas se utilizan a menudo para implementar explícitamente la vectorización y la paralelización en lenguajes que no abordan dichas construcciones. Algunas interfaces de programación de aplicaciones (API), por ejemplo, AltiVec y OpenMP , utilizan funciones intrínsecas para declarar, respectivamente, operaciones vectorizables y multiprocesamiento durante la compilación. El compilador analiza las funciones intrínsecas y las convierte en matemáticas vectoriales o código objeto de multiprocesamiento apropiado para la plataforma de destino . Algunos intrínsecos se utilizan para proporcionar restricciones adicionales al optimizador, como valores que una variable no puede asumir. [2]
Los compiladores para C y C++ de Microsoft, [3] Intel, [1] y GNU Compiler Collection (GCC) [4] implementan elementos intrínsecos que se asignan directamente a las instrucciones x86 de instrucción única y datos múltiples ( SIMD ) ( MMX , Streaming SIMD Extensiones (SSE), SSE2 , SSE3 , SSSE3 , SSE4 , AVX , AVX2 , AVX512 , FMA , ...). El compilador Microsoft Visual C++ de Microsoft Visual Studio no admite el ensamblaje en línea para x86-64 . [5] [6] [7] [8] Para compensar esto, se han agregado nuevos elementos intrínsecos que se asignan a instrucciones de ensamblaje estándar a las que normalmente no se puede acceder a través de C/C++, por ejemplo, escaneo de bits.
Algunos compiladores de C y C++ proporcionan elementos intrínsecos específicos de la plataforma no portátiles. Otros elementos intrínsecos (como los integrados de GNU ) son un poco más abstractos y se aproximan a las capacidades de varias plataformas contemporáneas, con implementaciones portátiles de respaldo en plataformas sin instrucciones apropiadas. [9] Es común que las bibliotecas C++, como glm o las bibliotecas matemáticas vectoriales de Sony , [10] logren portabilidad mediante compilación condicional (basada en indicadores de compilador específicos de la plataforma), proporcionando primitivas de alto nivel totalmente portátiles (por ejemplo, un tipo vectorial de punto flotante de cuatro elementos) asignado a las implementaciones apropiadas del lenguaje de programación de bajo nivel , sin dejar de beneficiarse del sistema de tipos C++ y la integración; de ahí la ventaja sobre la vinculación a archivos de objetos ensamblados escritos a mano, utilizando la interfaz binaria de aplicación C (ABI).
uint64_t __rdtsc (); // devuelve el contador de reloj interno de la CPU uint64_t __popcnt64 ( uint64_t n ); // recuento de bits configurado en n uint64_t _umul128 ( uint64_t Factor1 , uint64_t Factor2 , uint64_t * HighProduct ); // 64 bits * 64 bits => multiplicación de 128 bits __m512 _mm512_add_ps ( __m512 a , __m512 b ); // calcula a + b para dos vectores de 16 flotantes __m512 _mm512_fmadd_ps ( __m512 a , __m512 b , __m512 c ); // calcula a*b + c para tres vectores de 16 flotantes
El compilador justo a tiempo de la máquina virtual Java (JVM) de HotSpot también tiene elementos intrínsecos para API de Java específicas. [11] Los intrínsecos de Hotspot son API de Java estándar que pueden tener una o más implementaciones optimizadas en algunas plataformas.
ANSI/ISO PL/I define casi 90 funciones integradas. [12] Estos se agrupan convencionalmente de la siguiente manera: [13] : 337–338
Los compiladores individuales han agregado elementos integrados adicionales específicos de la arquitectura de una máquina o del sistema operativo.
Una función incorporada se identifica dejando su nombre sin declarar y permitiéndole que actúe de forma predeterminada, o declarándolo BUILTIN
. Una función proporcionada por el usuario con el mismo nombre se puede sustituir declarándola como ENTRY
.
Funciones integradas
{{cite book}}
: Mantenimiento CS1: nombres numéricos: lista de autores ( enlace )