Per capire "in linea" devi capire la storia e com'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 costituiva un programma in una volta sola. Anche il compilatore è stato molto lento, quindi non volevi ricompilare il codice che non era cambiato - prendere oltre 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.
Pertanto ogni file di codice è stato compilato separatamente in un file oggetto. Ogni file oggetto è iniziato con un elenco di tutte le funzioni contenute, insieme all '"indirizzo" della funzione. Un file oggetto aveva anche un elenco di tutte le funzioni che chiamava in altri file oggetto insieme alla posizione della chiamata.
Un linker legge prima tutti i file oggetto e crea un elenco di tutte le funzioni che hanno esportato, insieme al file in cui si trovavano e all'indirizzo. Rileggerebbe quindi tutti i file oggetto, emettendoli 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 riferimenti a chiamate di funzioni esterne. Il linker faceva parte del sistema operativo e precede la maggior parte dei compilatori. Quando le persone scrivevano un nuovo compilatore, avevano bisogno che funzionasse con i linker correnti e che fosse in grado di collegarsi ai file oggetto correnti, altrimenti non sarebbe stato possibile effettuare chiamate di sistema.
Il compilatore ha sempre visto 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 "inline" ha consentito 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 che tu abbia una classe di raccolta definita in un altro file .cpp, questa classe avrebbe un metodo "isEmpty", che contiene una riga di codice, ci sarebbe una grande velocità del programma risultante se invece di una chiamata a una funzione , la chiamata di funzione è stata sostituita con questa riga.
La parola chiave "inline" era vista all'epoca come un modo "economico e semplice" per consentire l'incapsulamento dei dati evitando il costo delle chiamate di funzione, senza di essa molti programmatori avrebbero semplicemente accesso ai campi privati dell'oggetto. (Le macro in cui un modo molto peggiore "allineano" il codice era comune all'epoca.)
In questi giorni i "linker" fanno molta ottimizzazione del codice e tendono ad essere scritti da alcuni team come compilatore. Il compilatore spesso verifica semplicemente che il codice sia corretto e lo "comprime", lasciando gran parte dell'attività di creazione del codice macchina al linker.