# Funzione intrinseca

La funzione intrinseca (dal latino intrinsĕcus) nel software per computer, nella teoria del compilatore, una funzione intrinseca (o funzione incorporata) è una funzione (subroutine) disponibile per l'uso in un determinato linguaggio di programmazione la cui implementazione è gestita appositamente dal compilatore. In genere, può sostituire una sequenza di istruzioni generate automaticamente per la chiamata della funzione originale, simile a una funzione in linea. A differenza di una funzione inline, il compilatore ha una conoscenza intima di una funzione intrinseca e può quindi integrarla e ottimizzarla meglio per una data situazione.
I compilatori che implementano funzioni intrinseche generalmente li abilitano solo quando un programma richiede l'ottimizzazione, altrimenti ricade su un'implementazione predefinita fornita dal sistema di runtime della lingua (ambiente).
Le funzioni intrinseche sono spesso utilizzate per implementare esplicitamente la vettorizzazione e la parallelizzazione in linguaggi che non affrontano tali costrutti. Alcune API (application programming interfaces), ad esempio AltiVec e OpenMP, utilizzano funzioni intrinseche per dichiarare, rispettivamente, operazioni vectorizable e multiprocessing -aware durante la compilazione. Il compilatore analizza le funzioni intrinseche e le converte in codice matematico vettoriale o codice multiprocessing appropriato per la piattaforma di destinazione.

## C e C ++

I compilatori per C e C++, di Microsoft, Intel e GNU Compiler Collection (GCC) implementano intrinseche che si associano direttamente alle istruzioni x86 single instruction, multiple data (SIMD) (MMX, Streaming SIMD Extensions (SSE)), SSE2, SSE3, SSSE3, SSE4). Il compilatore Microsoft Visual C++ di Microsoft Visual Studio non supporta l'assembly inline per x86-64. Per compensare ciò, sono stati aggiunti nuovi elementi intrinseci che mappano le istruzioni di assemblaggio standard che normalmente non sono accessibili tramite C / C++, ad esempio, bit scan.
Alcuni compilatori C e C++ forniscono elementi intrinseci specifici della piattaforma non portatili. Altre intrinseche (come i GNU built-in) sono leggermente più astratte, approssimando le capacità di molte piattaforme contemporanee, con implementazioni fallback portatili su piattaforme senza istruzioni appropriate. È comune per le librerie C++, come glm o le librerie matematiche vettoriali di Sony, per ottenere la portabilità tramite la compilazione condizionale (basata su flag di compilatori specifici della piattaforma), fornendo primitive di alto livello completamente portatili (ad esempio un quattro elementi tipo di vettore a virgola mobile) mappato sulle appropriate implementazioni del linguaggio di programmazione di basso livello, pur continuando a beneficiare del sistema di tipo C ++ e dell'inlinazione; da qui il vantaggio rispetto al collegamento a file di oggetti di assemblaggio scritti a mano, utilizzando l'interfaccia binaria di applicazioni C (ABI).

### Esempio
## Java

Il compilatore just-in-time della macchina virtuale Java HotSpot (JVM) ha anche caratteristiche intrinseche per specifiche API Java. Intrinseci degli hotspot sono API Java standard che possono avere una o più implementazioni ottimizzate su alcune piattaforme.