Sebbene possano essere utili come forma di documentazione, il sistema che circonda i file di intestazione è straordinariamente inefficiente.
C è stato progettato in modo tale che ogni passaggio di compilazione costruisca un singolo modulo; ogni file di origine viene compilato in un'esecuzione separata del compilatore. I file di intestazione, d'altra parte, vengono iniettati in quel passaggio di compilazione per ciascuno dei file di origine che li fanno riferimento.
Ciò significa che se il file di intestazione è incluso in 300 file di origine, viene analizzato e compilato più e più volte, 300 volte separate durante la creazione del programma. La stessa identica cosa con lo stesso identico risultato, ancora e ancora. Questo è un enorme spreco di tempo ed è uno dei motivi principali per cui i programmi C e C ++ impiegano così tanto tempo per essere costruiti.
Tutte le lingue moderne evitano intenzionalmente questa assurda piccola inefficienza. Invece, in genere nei linguaggi compilati i metadati necessari sono archiviati nell'output di compilazione, consentendo al file compilato di fungere da una sorta di riferimento di ricerca rapida che descrive il contenuto del file compilato. Tutti i vantaggi di un file di intestazione, creato automaticamente senza alcun lavoro aggiuntivo da parte tua.
Alternativamente nelle lingue interpretate, ogni modulo che viene caricato rimane in memoria. Fare riferimento o includere o richiedere una libreria leggerà e compilerà il codice sorgente associato, che rimane residente fino al termine del programma. Se lo richiedi anche altrove, nessun lavoro aggiuntivo in quanto è già stato caricato.
In entrambi i casi, è possibile "sfogliare" i dati creati da questo passaggio utilizzando gli strumenti della lingua. In genere l'IDE avrà un browser di classe di qualche tipo. E se la lingua ha un REPL, può anche essere usata spesso per generare un riepilogo della documentazione di tutti gli oggetti caricati.