Funzione intrinseca
{{O|informatica|maggio 2018}}La '''funzione intrinseca'''<ref>{{Cita libro|nome=Enrico|cognome=Pedemonte|titolo=Fondamenti di struttura, proprietà e tecnologia dei polimeri|url=https://books.google.it/books?id=L9N1Zr7UyaMC&pg=PA48&lpg=PA48&dq=Funzione+intrinseca+tecnologia&source=bl&ots=iZeNolAk3i&sig=3wSsYsfWojHbjcrllK0K9wXuAq8&hl=it&sa=X&ved=0ahUKEwjjgNeGhJLbAhXEa1AKHUQaBhUQ6AEIOzAC#v=onepage&q=Funzione%20intrinseca%20tecnologia&f=false|accesso=19 maggio 2018|data=2011|editore=Edizioni Nuova Cultura|ISBN=9788861347229}}</ref><ref>{{Cita web|url=http://www.math.unipd.it/~michela/funzint.html|titolo=Che cos'è una funzione intrinseca in informatica?|accesso=19 maggio 2018}}</ref> (dal [[Latino medievale|latino]] ''intrinsĕcus'') nel [[software]] per [[computer]], nella teoria del compilatore, una '''funzione intrinseca''' (o '''funzione incorporata''') è una funzione ([[Funzione (informatica)|subroutine]]) disponibile per l'uso in un determinato linguaggio di programmazione che l'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 automatica|parallelizzazione]] in linguaggi che non affrontano tali costrutti. Alcune API ([[application programming interface]]s), ad esempio [[AltiVec]] e [[OpenMP]], utilizzano funzioni intrinseche per dichiarare, rispettivamente, operazioni [[vectorizable]] e [[Multiprocessore|multiprocessing -aware]] durante la compilazione. Il compilatore analizza le funzioni intrinseche e le converte in codice matematico vettoriale o codice [[Multiprocessore|multiprocessing]] appropriato per la piattaforma di destinazione.

== C e C ++ ==
I compilatori per [[C (linguaggio)|C]] e [[C++]], di [[Microsoft]]<ref>{{Cita web|url=https://msdn.microsoft.com/en-us/library/26td21ds}}</ref>, [[Intel]] e [[GNU]] [[Compiler Collection]] (GCC)<ref>{{Cita web|url=https://gcc.gnu.org/onlinedocs/gcc/Target-Builtins.html}}</ref> 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 Studio|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 [[Fall Back Down|fallback]] portatili su piattaforme senza istruzioni appropriate. È comune per le librerie C++, come ''glm'' o le librerie matematiche vettoriali di [[Sony]]<ref>{{Cita web|url=https://forum.beyond3d.com/threads/sony-open-sources-vector-math-and-simd-math-libraries-cell-ppu-spu-other-platforms.38677/|titolo=Copia archiviata|accesso=18 aprile 2018|dataarchivio=24 giugno 2016|urlarchivio=https://web.archive.org/web/20160624183718/https://forum.beyond3d.com/threads/sony-open-sources-vector-math-and-simd-math-libraries-cell-ppu-spu-other-platforms.38677/|urlmorto=sì}}</ref>, 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 [[Applicazione (informatica)|applicazioni]] C (ABI).

=== Esempio ===
<syntaxhighlight lang="c">
uint64_t __rdtsc        ();                                                          // return internal CPU clock counter
uint64_t __popcnt64     (uint64_t n);                                                // count of bits set in n
uint64_t _umul128       (uint64_t Factor1, uint64_t Factor2, uint64_t* HighProduct); // 64 bit * 64 bit => 128 bit multiplication
__m512   _mm512_add_ps  (__m512 a, __m512 b);                                        // calculates a + b for two vectors of 16 floats
__m512   _mm512_fmadd_ps(__m512 a, __m512 b, __m512 c);                              // calculates a*b + c for three vectors of 16 floats
</syntaxhighlight>

== Java ==
Il [[compilatore just-in-time]] della [[macchina virtuale Java]] [[Hotspot (telematica)|HotSpot]] (JVM) ha anche caratteristiche intrinseche per specifiche [[API Java]]<ref>{{Cita web|url=https://www.slideshare.net/RednaxelaFX/green-teajug-hotspotintrinsics02232013}}</ref>. Intrinseci degli [[Hotspot (telematica)|hotspot]] sono API Java standard che possono avere una o più implementazioni ottimizzate su alcune piattaforme.

== Note ==
<references/>

== Collegamenti esterni ==
* {{Cita web|url=https://software.intel.com/sites/landingpage/IntrinsicsGuide/#|titolo=Guida Intel Intrinsics}}
* {{Cita web|url=https://www.ibm.com/support/knowledgecenter/ssw_aix_61/com.ibm.aix.alangref/idalangref_milicode_routines.htm|titolo=Utilizzo di routine milicode}}, documentazione IBM AIX 6.1

{{Portale|informatica|scienza e tecnica}}

[[Categoria:Compilatori]]