Per capire "in linea" devi capire la storia e come era la vita 20 (e 30) anni fa
Stavamo scrivendo codice su computer che avevano poca memoria, quindi non era possibile per un compilatore elaborare tutto il codice che componeva un programma in una volta sola. Anche il compilatore era molto lento, quindi non volevi dover ricompilare il codice che non era stato modificato - prendere più di 24 ore (su un computer che costava più di un'auto di fascia alta) per ricompilare tutto il codice era normale per alcuni progetti. lavorato su.
Quindi ogni file di codice è stato compilato separatamente in un file oggetto. Ogni file oggetto è iniziato con l'elenco di tutte le funzioni in esso contenute, insieme con l'"indirizzo" della funzione. Un file oggetto aveva anche un elenco di tutte le funzioni chiamate in altri file oggetto insieme alla posizione della chiamata.
Un linker prima legge tutti i file oggetto e crea un elenco di tutte le funzioni che hanno esportato , insieme al file in cui si trovavano e al loro indirizzo. Quindi rileggerebbe tutti i file oggetto, trasferendoli nel file di programma, aggiornando tutte le chiamate di funzione "esterne" con l'indirizzo della funzione.
Il linker non ha modificato o ottimizzato il codice macchina prodotto dal compilatore in alcun modo se non per correggere i riferimenti a chiamate di funzioni esterne. Il linker faceva parte del sistema operativo e precedeva la maggior parte dei compilatori. Quando le persone scrivevano un nuovo compilatore, avevano bisogno che funzionasse con i linker correnti e di essere in grado di collegarsi ai file oggetto correnti, altrimenti non si potevano effettuare chiamate di sistema.
Il compilatore ha visto solo il codice nel file ".c" o ".cpp" che stava compilando insieme a tutti i file di intestazione inclusi. Quindi non è stato possibile effettuare alcuna ottimizzazione basata sul codice in altri file ".c" o ".cpp".
La parola chiave "in linea" consentiva di definire il corpo di una funzione (metodo) in un file di intestazione, consentendo quindi al compilatore di utilizzare il codice della funzione durante la compilazione del codice che lo chiama. Ad esempio, supponiamo di avere una classe di raccolta definita in un file .cpp anther, questa classe avrebbe un metodo "isEmpty", che conteneva una riga di codice, ci sarebbe una grande accelerazione del programma risultante se invece di una chiamata a una funzione , la chiamata alla funzione è stata sostituita con questa riga.
La parola chiave "in linea" è stata vista al momento come un modo "economico e facile" per consentire l'incapsulamento dei dati evitando il costo delle chiamate di funzione, senza che molti programmatori avessero semplicemente accesso ai campi privati dell'oggetto. (Macro in cui un modo molto peggiore di "allineare" il codice che era comune al momento.)
In questi giorni i "linker" fanno un sacco di ottimizzazione del codice e tendono ad essere scritti da qualche team come compilatore. Il compilatore spesso controlla che il codice sia corretto e lo "comprime", lasciando la maggior parte dell'attività di creazione del codice macchina al linker.