Este artículo necesita citas adicionales para su verificación . ( diciembre de 2009 ) |
En software de computadora , en teoría de compiladores, 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 dado cuya implementación es manejada especialmente por el compilador . Típicamente, puede sustituir una secuencia de instrucciones generadas automáticamente por la llamada de 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 íntimo de una función intrínseca y, por lo tanto, puede integrarla y optimizarla mejor para una situación dada.
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 que admiten multiprocesamiento durante la compilación. El compilador analiza las funciones intrínsecas y las convierte en código objeto de multiprocesamiento o matemática vectorial apropiado para la plataforma de destino . Algunas funciones intrínsecas 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 intrínsecos que se asignan directamente a las instrucciones de instrucción única, múltiples datos ( SIMD ) x86 ( MMX , Streaming SIMD Extensions (SSE), SSE2 , SSE3 , SSSE3 , SSE4 , AVX , AVX2 , AVX512 , FMA , ...). El compilador Microsoft Visual C++ de Microsoft Visual Studio no admite ensamblaje en línea para x86-64 . [5] [6] [7] [8] Para compensar esto, se han agregado nuevos intrínsecos que se asignan a instrucciones de ensamblaje estándar que normalmente no son accesibles a través de C/C++, por ejemplo, escaneo de bits.
Algunos compiladores de C y C++ proporcionan intrínsecos específicos de la plataforma que no son portables. Otros intrínsecos (como los integrados de GNU ) son ligeramente más abstractos, aproximándose 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 de C++, como glm o las bibliotecas de matemáticas vectoriales de Sony , [10] logren portabilidad a través de la compilación condicional (basada en indicadores de compilador específicos de la plataforma), proporcionando primitivas de alto nivel totalmente portables (por ejemplo, un tipo de vector de punto flotante de cuatro elementos) mapeadas en las implementaciones de lenguaje de programación de bajo nivel apropiadas , mientras que aún se benefician del sistema de tipos de C++ y la incrustación; de ahí la ventaja sobre la vinculación a archivos de objetos de ensamblaje escritos a mano, utilizando la interfaz binaria de aplicación (ABI) de C.
uint64_t __rdtsc (); // devuelve el contador de reloj interno de la CPU uint64_t __popcnt64 ( uint64_t n ); // recuento de bits establecido en n uint64_t _umul128 ( uint64_t Factor1 , uint64_t Factor2 , uint64_t * HighProduct ); // multiplicación de 64 bits * 64 bits => 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
[11]
El compilador just-in-time de la máquina virtual Java (JVM) HotSpot también tiene intrínsecos para API de Java específicas. [12] 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. [13] Estas se agrupan convencionalmente de la siguiente manera: [14] : 337–338
Los compiladores individuales han agregado funciones integradas adicionales específicas para una arquitectura de máquina o un sistema operativo.
Una función incorporada se identifica dejando su nombre sin declarar y permitiendo que tenga el valor predeterminado, o declarándola como BUILTIN
. Una función proporcionada por el usuario con el mismo nombre se puede sustituir declarándola como ENTRY
.
Funciones integradas
{{cite book}}
: CS1 maint: nombres numéricos: lista de autores ( enlace )