En el software informático , en la teoría de compiladores , una función intrínseca , también llamada función integrada o función incorporada , es una función ( subrutina ) disponible para su uso en un lenguaje de programación determinado cuya implementación es gestionada especialmente por el compilador . Normalmente, puede sustituir una secuencia de instrucciones generadas automáticamente por la llamada a la función original, de forma 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 tiempo de ejecución del lenguaje (entorno).
Vectorización y paralelización
Las funciones intrínsecas se utilizan a menudo para implementar explícitamente la vectorización y la paralelización en lenguajes que no admiten dichas construcciones. Algunas interfaces de programación de aplicaciones (API), como AltiVec y OpenMP , utilizan funciones intrínsecas para declarar, respectivamente, operaciones vectorizables y compatibles con multiprocesamiento durante la compilación. El compilador analiza las funciones intrínsecas y las convierte en código objeto de matemáticas vectoriales o multiprocesamiento adecuado 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 ]
Mediante lenguaje de programación
C y C++
Los compiladores para C y C++ de Microsoft, [ 3 ] Intel, [ 1 ] y GCC [ 4 ] implementan intrínsecos que se asignan directamente a las instrucciones de instrucción única, datos múltiples ( SIMD ) x86 ( MMX , Streaming SIMD Extensions (SSE), SSE2 , SSE3 , SSSE3 , SSE4 , AVX , AVX2 , AVX512 , FMA , ...). Los intrínsecos permiten la asignación a instrucciones de ensamblador estándar que normalmente no son accesibles a través de C/C++; por ejemplo, escaneo de bits y operaciones paralelas en 128 bits y 256 bits .
Algunos compiladores de C y C++ proporcionan intrínsecos no portátiles específicos de la plataforma. Otros intrínsecos (como los integrados de GNU ) son ligeramente más abstractos, aproximando las capacidades de varias plataformas contemporáneas, con implementaciones de reserva portátiles en plataformas sin instrucciones apropiadas. [ 5 ] Es común que las bibliotecas de C++, como glm o las bibliotecas de matemáticas vectoriales de Sony , [ 6 ] logren la portabilidad a través de la compilación condicional (basada en indicadores del compilador específicos de la plataforma), proporcionando primitivas de alto nivel totalmente portátiles (por ejemplo, un tipo de vector de punto flotante de cuatro elementos) mapeadas a 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 inserción en línea; de ahí la ventaja sobre el enlace a archivos de objetos de ensamblaje escritos a mano, utilizando la ABI de C.
Ejemplos
A continuación se muestran ejemplos de firmas de funciones intrínsecas del conjunto de funciones intrínsecas de Intel.
uint64_t __rdtsc (); // devuelve el contador de reloj interno de la CPU uint64_t __popcnt64 ( uint64_t n ); // cuenta de bits establecidos 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 floats __m512 _mm512_fmadd_ps ( __m512 a , __m512 b , __m512 c ); // calcula a*b + c para tres vectores de 16 floatsCOBOL
El módulo de función intrínseca para COBOL se introdujo en ANSI INCITS X3.23a-1989 e ISO 1989:1985/Amd 1:1992.
Java
El compilador justo a tiempo de la máquina virtual Java (JVM) HotSpot también tiene funciones intrínsecas para API Java específicas. [ 8 ] Las funciones intrínsecas de Hotspot son API Java estándar que pueden tener una o más implementaciones optimizadas en algunas plataformas.
PL/I
ANSI/ISO PL/I define casi 90 funciones integradas. [ 9 ] Estas se agrupan convencionalmente de la siguiente manera: [ 10 ] : 337–338
- Funciones integradas para el manejo de cadenas, como INDEX, LENGTH
- Funciones aritméticas integradas como ABS, CEIL, ROUND
- Funciones matemáticas integradas como SIN, COS, LOG, ERF
- Funciones integradas para el manejo de matrices, por ejemplo ANY, ALL, PROD
- Funciones integradas de manejo de condiciones como ONCODE, ONFILE
- Funciones integradas de Control de almacenamiento, por ejemplo ADDR, POINTER
- Funciones integradas de entrada/salida: LINENO
- Funciones integradas diversas como FECHA y HORA
Los compiladores individuales han añadido funciones integradas adicionales específicas para la arquitectura de la máquina o el sistema operativo.
Una función integrada se identifica dejando su nombre sin declarar y permitiendo que use el valor predeterminado, o declarándola como BUILTIN. Una función proporcionada por el usuario con el mismo nombre puede sustituirse declarándola como ENTRY.
Referencias
- 1 2 "Guía y referencia para desarrolladores del compilador Intel® C++ 19.1" . Documentación del compilador Intel® C++ . 16 de diciembre de 2019. Consultado el 17 de enero de 2020 .
- ↑ El equipo de Clang (2020). "Extensiones del lenguaje Clang" . Documentación de Clang 11. Consultado el 17 de enero de 2020.
Funciones integradas
- ↑ MSDN . "Compiler Intrinsics" . Microsoft . Consultado el 20 de junio de 2012 .
- ↑ Documentación de GCC. "Funciones integradas específicas para máquinas de destino particulares" . Free Software Foundation . Consultado el 20 de junio de 2012 .
- ↑ "Extensiones vectoriales" . Uso de la colección de compiladores GNU (GCC) . Consultado el 16 de enero de 2020 .
- ↑ "Sony publica como código abierto las bibliotecas matemáticas Vector Math y SIMD (Cell PPU/SPU/otras plataformas)" . Foro Beyond3D . Archivado del original el 24 de junio de 2016. Consultado el 17 de enero de 2020 .
- ↑ Intel Intrinsics
- ↑ Mok, Kris (25 de febrero de 2013). "Métodos intrínsecos en HotSpot VM" . Slideshare . Recuperado el 20 de diciembre de 2014 .
- ↑ Comité ANSI X3 (1976). Lenguaje de programación estándar nacional estadounidense PL/I .
{{cite book}}: CS1 maint: nombres numéricos: lista de autores ( enlace ) - ↑ IBM Corporation (1995). Referencia del lenguaje IBM PL/I para MVS y VM .
Enlaces externos
- Guía de Intel Intrinsics
- Uso de rutinas de milicode , documentación de IBM AIX 6.1
- Construcción de compiladores
- Programación informática