Cosa è venuto prima, il compilatore o la fonte?


17

Sono curioso della nascita del compilatore. Come è iniziata la programmazione? Le persone hanno prima creato hardware che riconosceva un determinato insieme di comandi o hanno definito una lingua e quindi hanno costruito l'hardware attorno ad essa? E su una nota correlata, qual è stato il primo linguaggio di programmazione?



1
Una delle domande secondarie era una domanda a sé stante: qual era il primo linguaggio di programmazione scritto per computer? .
Mark Booth,

Sicuramente questo è qualcosa che potresti cercare ?
Caleb,

@Caleb ha letto i commenti nella risposta di SkyDan ..
David Cowden,

2
@Brian Presupposto valido, ma risulta essere sbagliato. Non è affatto un problema di uova di gallina, c'è una risposta molto chiara (suggerimento: il più votato di seguito è sbagliato). Il codice sorgente precede da tempo i compilatori.
Konrad Rudolph,

Risposte:


30

Questa ha una risposta molto chiara, in realtà: il codice sorgente è arrivato per primo - con un grande margine.

Prima di fornire i dettagli tecnici, un po 'di prospettiva:

I primi linguaggi di programmazione sono stati tutti tradotti in linguaggio macchina o assembler a mano . L'idea di utilizzare un software per automatizzare questa traduzione (tramite un compilatore o un valutatore) è sempre venuta dopo, ed era tutt'altro che intuitiva.

Considera questa citazione dell'articolo di Wikipedia su FORTRAN che illustra le riluttanze che i compilatori hanno dovuto affrontare:

... il primo compilatore FORTRAN [è stato] consegnato nell'aprile 1957. Questo è stato il primo compilatore di ottimizzazione, poiché i clienti erano riluttanti a usare un linguaggio di programmazione di alto livello a meno che il suo compilatore non potesse generare codice le cui prestazioni erano paragonabili a quelle del linguaggio assembly codificato a mano . [enfasi mia]

=> Quando il compilatore FORTRAN arrivò sul mercato (1957), la gente stava già programmando felicemente sia in linguaggio assembly che in FORTRAN.

Il caso era simile per LISP (da Hackers & Painters ):

Steve Russell ha detto, guarda, perché non programma questo eval ..., e gli ho detto, ho, ho, stai confondendo la teoria con la pratica, questo eval è destinato alla lettura, non all'informatica. Ma è andato avanti e l'ha fatto. Cioè, ha compilato l'eval nel mio documento nel codice macchina di IBM 704, risolvendo bug, e poi pubblicizzato come un interprete Lisp, che sicuramente lo era. Quindi a quel punto Lisp aveva essenzialmente la forma che ha oggi ... "

Ancora una volta, non solo il codice sorgente (in LISP) precede l'interprete, il secondo non era neppure implicito nel primo.

Ma questi sviluppi sono relativamente tardi. Pur non considerando il motore analitico di Charles Babbage e il primo programma correlato di Ada Lovelace , nel XX secolo esistevano linguaggi di programmazione che precedevano i compilatori:

Plankalkül di Konrad Zuse e il costrutto matematico del calcolo λ introdotto dalla Chiesa di Alonzo. Entrambi sono linguaggi di programmazione specificati formalmente indubbiamente, ma al momento nessuno dei due aveva un compilatore.

Per metterlo in prospettiva, il calcolo λ risale agli anni '30 e Plankalkül fu sviluppato intorno al 1945. Al contrario, il primo compilatore FORTRAN uscì nel 1957 (ma ancora tre anni dopo che FORTRAN fu specificato).


Bella risposta! Non sapevo che il codice fosse compilato a mano, ma ha senso.
ckb,

10

La programmazione è iniziata con le persone che scrivevano il codice della macchina direttamente nella memoria, su schede perforate e nastro di carta o addirittura collegamenti in corto su un pannello patch. È difficile stabilire se l'hardware sia stato costruito attorno alle esigenze del software o viceversa. Certamente il primo progetto per un computer completamente programmabile, il motore analitico di Babbage , il primo programma documentato di Ada Lovelace .

Per quanto riguarda il primo linguaggio di programmazione, ho sostenuto che si trattava del linguaggio macchina del motore analitico di Babbage (dalla domanda Qual è stato il primo linguaggio di programmazione scritto per computer? )

Per rispondere alla domanda nel titolo della domanda, poiché il linguaggio assembly è il codice sorgente e le lingue assembly prima dei linguaggi di alto livello che potrebbero essere compilati in assembler, il codice sorgente è arrivato per primo.

Inoltre, un compilatore non è mai stato necessario , solo conveniente.

È perfettamente possibile scrivere il software direttamente in memoria se sono state memorizzate le tabelle op-code appropriate . In effetti, alcuni dei primi computer richiedevano all'utente di inserire il codice bootstrap sulla tastiera esadecimale del pannello frontale per farli avviare, ma è possibile toccare qualsiasi codice che ti piace e verrà eseguito.

Certo, man mano che la CPU diventa più complessa, questo diventa più difficile, ma una semplice istruzione come 6809 o Z80 (ignorando tutte le strane modalità indicizzate) è relativamente facile da programmare anche senza un assemblatore , per non parlare di un compilatore da un linguaggio di alto livello.

Se il motore analitico di Babbage fosse mai stato costruito, sono sicuro che ci sarebbe stato uno steampunk Mel , che scriveva programmi ottimizzati direttamente sulle schede del telaio.


1
Hai effettivamente letto la definizione di codice sorgente su quel link di Wikipedia che hai pubblicato? Come detto sopra, il codice macchina non è il codice sorgente. E codice macchina! = Assembly. Il codice macchina era lì per primo.
occulus

@MarkBooth Penso che MIPS e AVR siano ancora più semplici ..
David Cowden

4
@occulus - In che modo il linguaggio assembly non è il codice sorgente ? Il linguaggio assembly associa un'istruzione del linguaggio assembly a un codice macchina e può essere banalmente assemblato nella tua testa, se conosci le tabelle dei codici operativi. Onestamente, bambini in questi giorni ... * 8 ')
Mark Booth,

1
Per me, il linguaggio assembly è movl $0, -20(%rbp), mentre il codice macchina è C745EC00000000, ed è quest'ultimo (beh, qualcosa del genere) che è stato prima inserito o letto manualmente dal nastro di carta. Per quanto riguarda se il codice macchina conta come codice sorgente , sono propenso a dire "qualunque cosa galleggi la tua barca". Se lo stai inserendo manualmente, allora sì, direi che conta.
John Bode,

@JohnBode - Oh, sono d'accordo, ma data la corrispondenza 1: 1 tra le istruzioni di assemblaggio e le istruzioni del codice macchina, l'assemblaggio è solo una questione di traduzione meccanica (assemblaggio), la logica è identica. La compilazione implica molte più complesse: molte traduzioni (sebbene Occam sia un linguaggio di alto livello e molte istruzioni Occam mappate 1: 1 su istruzioni Transputer grazie alla sua architettura MISC . * 8 ').
Mark Booth,

6

Il compilatore è stato il primo . È stato scritto direttamente nel codice macchina, poiché il sorgente non può essere compilato senza un compilatore.

Articoli di Wikipedia come questo sui linguaggi informatici possono rispondere alla maggior parte delle domande. Altrimenti, scegli uno dei libri di Tanenbaum, come Structured Computer Organization , che può rispondere a più domande di quante tu possa persino chiedere :)

Non posso dire nulla di più specifico, perché la tua domanda è troppo ampia.


20
Si potrebbe anche sostenere che la fonte è stata la prima, perché per i primi "computer" la fonte era equivalente al binario (cioè erano programmati direttamente nel linguaggio leggibile dalla macchina).
Joachim Sauer,

5
@Joachim Per definizione, il codice sorgente è un testo leggibile dall'uomo che viene tradotto dal compilatore in codice macchina. Il codice macchina stesso quindi non è il codice sorgente.
SkyDan,

11
Il compilatore è stato il primo, ma è stato implementato nelle reti neurali biologiche.
Den

8
Perché è così votato? È sbagliato. Il codice sorgente in linguaggi di alto livello (in particolare λ-calculus, Plankalkül e LISP) precede da tempo sia i compilatori che gli interpreti. Questo non tiene nemmeno conto dei programmi semi-formali scritti da Ada Lovelace.
Konrad Rudolph,

4
@SkyDan Qual è la tua definizione allora? Non conosco alcuna definizione ragionevole per la quale la tua risposta è corretta (sia per "compilatore" che per "codice sorgente in un linguaggio di alto livello" - per non parlare di basso livello).
Konrad Rudolph,

4

Gli interpreti esistevano prima dei compilatori, quindi esisteva il codice sorgente prima dei compilatori.

Ci sono alcuni articoli molto interessanti sulla storia dell'informatica qui . Il codice sorgente per il compilatore FORTRAN II dovrebbe essere disponibile, ma quei collegamenti sono interrotti.

Questo documento , del 1954, descrive l'interprete Whirlwhind.


1

Questa domanda è fortemente incentrata sulla nostra interpretazione semantica del "codice sorgente". Se lo definiamo "istruzioni informatiche basate su testo che vengono compilate", presumibilmente è arrivato prima un compilatore.

Sono più propenso ad andare con qualcosa di più autorevole, come l'articolo di Mark Harman "Perché l'analisi e la manipolazione del codice sorgente saranno sempre importanti" presentato alla decima conferenza di lavoro internazionale IEEE sull'analisi e la manipolazione del codice sorgente

Definizione 1 (codice sorgente): a fini di chiarezza, per "codice sorgente" si intende qualsiasi descrizione completamente eseguibile di un sistema software. È quindi concepito in modo tale da includere codice macchina, linguaggi di altissimo livello e rappresentazioni grafiche eseguibili di sistemi.

E penso che la tua risposta sia implicita in quella definizione: il codice sorgente è sicuramente arrivato per primo.


"Presumibilmente un compilatore è arrivato per primo" - solo se si definisce "compilato" come "tradotto da uno strumento automatico", piuttosto che "tradotto manualmente nel codice macchina".
Konrad Rudolph,

Carta molto interessante. Mi piace che la definizione del codice sorgente - anche se fa la mia domanda un non-domanda davvero ..
David Cowden

@KonradRudolph non è l'unità che esegue la compilazione, che si tratti di un intervento macchina, umano o divino, chiamato 'un compilatore'?
Kirk Broadhurst,

0

Gli algoritmi sono stati ordinati su carta, quindi gli alus sono stati cablati fisicamente / meccanicamente (spostando i fili). per cambiare il programma muovi i fili ed esegui di nuovo.

Successivamente il linguaggio dell'assemblaggio è stato risolto su carta, tradotto a mano in codice macchina, quindi usando interruttori, ecc. Per alimentarlo in ram. O punch card, ecc. Alla fine è possibile creare un assemblatore, quindi è possibile programmare nell'assemblaggio non il codice macchina, quindi è possibile creare un compilatore. Alla fine puoi avviare il compilatore. E crea nuove lingue e nuovi compilatori, ecc.

La prima lingua non era una lingua, in seguito la prima lingua era la lingua assembly. per ogni processore la prima lingua è il linguaggio assembly (derivato dal codice macchina). Il set di istruzioni è progettato prima quindi sull'hardware per implementarlo, quindi sull'assemblatore, quindi sui compilatori.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.