Como foi escrito o primeiro compilador?

166

Eu ouvi sobre o frango, o ovo e a inicialização. Eu tenho algumas perguntas.

O que escreveu o primeiro compilador que converteu algo em instruções binárias?

O assembly é compilado ou traduzido em instruções binárias?

... Eu acho difícil acreditar que eles escreveram um compilador em binário.

Shawn Mclean
fonte
@nawfal, é uma diferença entre uma nova linguagem de programação eo primeiro compilador, de modo nenhum - não é uma duplicata
@PauliSudarshanTerho qual é a diferença? O espírito das perguntas é o mesmo. Você não pode escrever uma linguagem de programação, essa pergunta, por sua vez, está falando sobre o primeiro compilador.
Nawfal
Em sua imaginação espiritual, talvez? Na realidade, você não encontra nada mencionado sobre o primeiro compilador nesse link. E você não deve aconselhar quem escreve um novo idioma para começar do zero. E se sim, por que você deseja ocultar as respostas sobre como o primeiro compilador é escrito, se é importante para escrever um novo idioma?
Aprenda comigo - esta é uma duplicata: stackoverflow.com/questions/4772768/…

Respostas:

133

As instruções de montagem são (geralmente) um mapeamento direto para os códigos de operação, que são valores de (multi) bytes de código de máquina que podem ser interpretados diretamente pelo processador. É bem possível escrever um programa em código de operação diretamente, pesquisando-os em uma tabela (como esta para o microprocessador 6039 , por exemplo) que os lista com as instruções de montagem correspondentes e determinando manualmente endereços / compensações de memória para coisas como saltos.

Os primeiros programas foram feitos exatamente dessa maneira - opcodes escritos à mão.

No entanto, na maioria das vezes é mais simples usar um assembler para "compilar" o código de montagem, que realiza automaticamente essas pesquisas de código de operação, além de ser útil na computação de endereços / deslocamentos para etiquetas de salto nomeadas etc.

Os primeiros montadores foram escritos à mão. Esses assemblers poderiam então ser usados ​​para montar assemblers mais complicados, que poderiam ser usados ​​para montar compiladores escritos para linguagens de nível superior, e assim por diante. Esse processo de escrita iterativa das ferramentas para simplificar a criação do próximo conjunto de ferramentas é chamado de bootstrap (como mencionado por David Rabinowitz em sua resposta) .

Âmbar
fonte
18
Meu primeiro computador foi uma máquina baseada em Z80, em cujo monitor ROM eu tive que montar manualmente um carregador de bootstrap para mostrar o básico de um sistema operacional (CP / M) para que eu pudesse montar o restante do sistema operacional em um sistema operacional , completo com um carregador de bootstrap baseado em disco. Tempos divertidos. Então sim, você pode montar manualmente muito bem. É lento, doloroso e propenso a erros (e é por isso que automatizamos as coisas), mas é possível.
APENAS MINHA OPINIÃO correta
O primeiro link está quebrado.
Luke
Escrito à mão. Quão? Cartões de fiação ou perfuração? Eu acho que eles tinham teclados hexadecimais.
44

Leia sobre a inicialização do compilador e o histórico de escrita do compilador

A idéia é escrever um compilador muito simples diretamente no código da máquina, usá-lo para escrever um compilador mais sofisticado, usar o segundo para criar um terceiro e assim por diante até que você possa ter um compilador completo.

David Rabinowitz
fonte
36

Ovos por muito tempo precedem galinhas. A resposta para a maioria dos problemas de "galinha e ovo" é a mesma: evolução. Algumas pessoas também têm dificuldade em acreditar na evolução biológica, mas a descrença não é um argumento (google argumentum ad ignorantiam).

Para responder diretamente à sua pergunta: o primeiro compilador foi escrito (por um humano) em uma linguagem assembly - um programa chamado assembler traduzia a linguagem assembly em binário; esse é um processo muito mais simples que a compilação, porque a linguagem assembly é apenas uma forma simbólica da linguagem de máquina que usa nomes de códigos de operação em vez de números, representa endereços com símbolos e assim por diante. Muitos compiladores subsequentes também foram escritos em uma linguagem assembly. Mas a primeira compilador C foi um compilador B modificada, que foi escrita em B . O primeiro compilador B foi escrito em TMG . O compilador TMG usado para compilar esse compilador B foi escrito na linguagem de montagem PDP-7.

Jim Balter
fonte
24

Woz disse em uma de suas palestras públicas que, quando ele começou, ele não podia pagar um compilador, então ele compilou o binário manualmente no papel. Se você quiser ver algo ainda mais selvagem, leia sobre as condições sob as quais Bill Gates e Paul Allen escreveram o BASIC para o Altair 8800.

Quanto a "escrever um computador em binário" - dê um passo para trás de ser um programador e pense sobre o que eram os primeiros computadores. Material de alto nível ainda não existia - você pensou em tudo no nível baixo, porque era tudo o que era. Você tinha um hardware que poderia fazer lógica e aritmética básica que manipula via código de máquina (que é apenas uma montagem compilada - Amber explica por que essa peça não é difícil de fazer manualmente) e você queria que esse hardware realizasse certos feitos matemáticos. Você não se preocupou com o sistema operacional inexistente, apenas disse ao hardware (em montagem) como manipular os números que você o alimenta. Era uma calculadora apenas grande. O computador de hoje foi construído uma abstração por vez.

Se você quiser quebrar a barreira que faz com que os computadores pareçam mágicos, recomendo a leitura de CODE de Charles Petzold e / ou The Elements of Computing Systems . Com apenas um conhecimento básico de programação, esses livros maravilhosamente acessíveis farão você entender os computadores de cima para baixo. Obviamente, não se pode obter um comp. sci. ou diploma de EE após apenas dois livros, mas posso dizer como programador autodidata que perdeu o treinamento formal: esses livros abalaram meu mundo!

Dinah
fonte
2
Escrevendo o intérprete Altair BASIC depois de fazer o discurso de vendas? Codificando o bootstrapper na viagem de avião para Albuquerque? Isso soa meio ridículo. E diversão.
Ehtesh Choudhury
2
@Shurane: ha! Esses pontos também são relevantes, mas, para mim, o âmago da questão de como eles fizeram o intérprete do BASIC e como o grupo o amontoou no pequeno espaço é algo de beleza e habilidade / hackery de programação espantosa.
Dinah
10

O que escreveu o primeiro compilador que converteu algo em instruções binárias?

Um humano fez. Leia sobre o sistema A-0 :

Em 1952, Grace Hopper completou seu primeiro compilador para Sperry, conhecido como A-0. O sistema A-0 era um conjunto de instruções que podiam traduzir código matemático simbólico em linguagem de máquina. Ao produzir A-0, ela pegou todas as sub-rotinas que vinha colecionando ao longo dos anos e as colocou em fita. Cada rotina recebeu um número de telefone, para que a máquina pudesse encontrá-lo na fita. "Tudo o que eu precisava fazer era escrever um conjunto de números de chamada, deixar o computador encontrá-los na fita, trazê-los e fazer as adições. Este foi o primeiro compilador", conforme descrito por Grace.

Sinan Ünür
fonte
1
O link parece estar 404 agora, em qualquer caso, "Grace" acima é Grace Hopper.
Volker Stolz
2
Ouvi dizer que Hopper escreveu o primeiro compilador, mas a descrição acima faz parecer mais um vinculador do que um compilador. Ainda assim, boa história. É incrível pensar que houve um tempo quando os cientistas da computação estavam céticos sobre a idéia de compiladores ...
Mark E. Haase
1
@ mehaase é por isso que é chamado de "compilador". faz uma compilação de rotinas, cada uma das quais é (potencialmente) escrita diretamente em linguagem de máquina.
Elazar 4/13
@ MarkE.Haase As pessoas que Hopper mencionou aqui eram engenheiros de aplicação e cientistas usando computadores para tarefas de cálculo específicas; eles não eram "cientistas da computação". Havia um punhado de ciberneticistas em 1952, mas duvido que ela tenha falado com algum deles.
Jim Balter
9

Os primeiros programas foram escritos em código de máquina (não em linguagem assembly) - números reais conectados à memória do computador usando interruptores. Percorremos um longo caminho ...

Às vezes, isso ainda acontece em pequena medida - para corrigir pequenos pedaços de código ou criar thunks. Lembro-me de digitar números em seqüências de caracteres básicas que foram executadas como sub-rotinas pequenas e rápidas nos primeiros micros. Também me lembro de alternar interruptores no painel frontal do PDP-11 para inserir um programa de bootloader em sua memória para um curso universitário.

Esses programas costumavam ser usados ​​para processar arquivos de texto para criar outros programas e foram criadas linguagens de programação voila.

Michael Burr
fonte
A questão é sobre o primeiro compilador, não os primeiros programas em geral, apesar de os programas serem compiladores; a história dos dois não é a mesma. (Uma analogia: a resposta à pergunta de quando os primeiros animais apareceram na Terra não é a resposta para a questão de quando os primeiros gatos apareceram na Terra, apesar gatos serem animais.)
Jim Balter