O que veio primeiro, o compilador ou a fonte?

17

Estou curioso sobre o nascimento do compilador. Como começou a programação? As pessoas criaram primeiro hardware que reconheceu um determinado conjunto de comandos ou definiram uma linguagem e depois construíram hardware em torno dela? E em uma nota relacionada, qual foi a primeira linguagem de programação?

David Cowden
fonte
1
Uma das sub-perguntas era uma questão em si mesma: qual foi a primeira linguagem de programação escrita para computadores? .
22812 Mark Booth
Certamente isso é algo que você pode procurar ?
Caleb
@Caleb ler os comentários em resposta de SkyDan ..
David Cowden
2
@Brian Suposição válida, mas está errada. Não é um problema de ovo de galinha, há uma resposta muito clara (dica: o mais votado abaixo está errado). O código-fonte longa antecede compiladores.
11133 Konrad Rudolph

Respostas:

30

Isso tem uma resposta muito clara, na verdade: o código fonte veio primeiro - por uma grande margem.

Antes de dar os detalhes técnicos, um pouco de perspectiva:

As primeiras linguagens de programação foram todas traduzidas para linguagem de máquina ou montador manualmente . A idéia de usar um software para automatizar essa tradução (por meio de um compilador ou avaliador) sempre veio mais tarde e estava longe de ser intuitiva.

Considere esta citação do artigo da Wikipedia sobre FORTRAN, que ilustra a relutância que os compiladores precisavam enfrentar:

… O primeiro compilador FORTRAN [foi] entregue em abril de 1957. Esse foi o primeiro compilador otimizador, porque os clientes relutavam em usar uma linguagem de programação de alto nível, a menos que seu compilador pudesse gerar código cujo desempenho fosse comparável ao da linguagem assembly codificada manualmente . [ênfase minha]

=> Quando o compilador FORTRAN chegou ao mercado (1957), as pessoas já estavam programando alegremente tanto na linguagem assembly quanto no FORTRAN.

O caso foi semelhante para o LISP (da Hackers & Painters ):

Steve Russell disse: veja, por que não programo essa avaliação ... e eu disse a ele, ho, ho, você está confundindo teoria com prática, essa avaliação é destinada à leitura, não à computação. Mas ele foi em frente e fez isso. Ou seja, ele compilou a avaliação no meu artigo no código de máquina IBM 704, corrigindo o bug e, em seguida, anunciou isso como um intérprete Lisp, o que certamente era. Então, nesse ponto, Lisp tinha essencialmente a forma que tem hoje ... "

Mais uma vez, não apenas o código fonte (no LISP) é anterior ao intérprete, mas o último nem estava implícito no primeiro.

Mas esses desenvolvimentos são relativamente atrasados. Mesmo sem considerar o Analytical Engine de Charles Babbage e o primeiro programa relacionado a Ada Lovelace , havia linguagens de programação no século 20 que antecederam os compiladores:

Plankalkül, de Konrad Zuse, e a construção matemática do cálculo λ, introduzida pela Igreja Alonzo. Ambas são linguagens de programação indubitavelmente especificadas formalmente, mas nenhuma delas possuía um compilador na época.

Para colocar isso em perspectiva, o λ-calculus é da década de 1930 e o Plankalkül foi desenvolvido por volta de 1945. Por outro lado, o primeiro compilador FORTRAN saiu em 1957 (mais uma vez três anos após a especificação do FORTRAN).

Konrad Rudolph
fonte
Ótima resposta! Eu não sabia que o código costumava ser compilado manualmente, mas isso faz sentido.
Ckb 24/04
10

A programação começou com as pessoas escrevendo código de máquina diretamente na memória, em cartões perfurados e fita de papel ou até mesmo encurtando links em um painel de remendo. É difícil saber se o hardware foi construído com base nas necessidades do software ou vice-versa. Certamente, o design mais antigo de um computador programável completo , o mecanismo analítico da Babbage , era anterior ao primeiro programa documentado de Ada Lovelace .

Quanto à primeira linguagem de programação, argumentei que era a linguagem de máquina do mecanismo analítico de Babbage (da pergunta Qual foi a primeira linguagem de programação escrita para computadores? )

Para responder à pergunta no título da pergunta, como a linguagem assembly é o código-fonte e as linguagens assembly pré-datam as linguagens de alto nível que poderiam ser compiladas no assembler, o código fonte veio primeiro.

Além disso, um compilador nunca foi necessário , apenas conveniente.

É perfeitamente possível gravar software diretamente na memória se você memorizou as tabelas de código operacional apropriadas . De fato, alguns computadores antigos exigiam que o usuário digitasse o código de inicialização no teclado hexadecimal do painel frontal para inicializá-los, mas você poderia digitar qualquer código que gostasse e ele seria executado.

É certo que, à medida que as CPUs ficam mais complexas, isso fica mais difícil, mas um conjunto de instruções simples como 6809 ou Z80 (ignorando todos os modos indexados estranhos) é relativamente fácil de programar, mesmo sem um montador , sem falar em um compilador de uma linguagem de alto nível.

Se o mecanismo analítico de Babbage já tivesse sido construído, tenho certeza de que haveria um Mel steampunk , escrevendo programas otimizados diretamente em cartões de tear.

Mark Booth
fonte
1
Você leu a definição do código-fonte no link da wikipedia que você postou? Como dito acima, o código da máquina não é um código fonte. E código da máquina! = Montagem. O código da máquina estava lá primeiro.
Oculus
@MarkBooth Acho MIPS e AVR são ainda mais simples ..
David Cowden
4
@occulus - De que maneira a linguagem assembly não é o código fonte ? A linguagem Assembly mapeia uma instrução de linguagem assembly para um código de máquina e pode ser montada trivialmente em sua cabeça, se você souber suas tabelas de códigos op. Honestamente, as crianças nos dias de hoje ... * 8 ')
Mark Booth
1
Para mim, a linguagem assembly é movl $0, -20(%rbp), enquanto o código da máquina é C745EC00000000, e é o último (bem, algo parecido) que foi inserido manualmente ou lido pela fita de papel. Quanto ao código de máquina contar como código-fonte , estou inclinado a dizer "o que quer que flutue no seu barco". Se você estiver alternando manualmente, sim, eu diria que conta.
9788 John Bode
@ JohnBode - Oh, eu concordo, mas, dada a correspondência 1: 1 entre instruções de montagem e instruções de código de máquina, a montagem é apenas uma questão de tradução mecânica (montagem), a lógica é idêntica. A compilação implica muitas mais complexas: muitas traduções (embora o Occam seja um idioma de alto nível e muitas instruções do Occam sejam mapeadas 1: 1 nas instruções do Transputer devido à sua arquitetura MISC . * 8 ').
10246 Mark Booth
6

O compilador foi o primeiro . Foi escrito diretamente no código da máquina, pois a fonte não pôde ser compilada sem um compilador.

Artigos da Wikipedia como este sobre Idiomas de computador podem responder à maioria das perguntas. Caso contrário, basta escolher um dos livros de Tanenbaum, como o Structured Computer Organization , que pode responder a mais perguntas do que você pode fazer :)

Não posso dizer nada mais específico, pois sua pergunta é muito ampla.

SkyDan
fonte
20
Também se poderia argumentar que a fonte era a primeira, porque nos primeiros "computadores" a fonte era equivalente ao binário (ou seja, eles foram programados diretamente na linguagem legível por máquina).
Joachim Sauer
5
@Joachim Por definição, o código fonte é um texto legível por humanos que é traduzido pelo compilador em código de máquina. O código da máquina, portanto, não é código fonte.
SkyDan
11
O compilador foi o primeiro, mas foi implementado em redes neurais biológicas.
Den
8
Por que isso é tão votado? Está errado. O código fonte em linguagens de alto nível (especialmente λ-calculus, Plankalkül e LISP) é anterior a compiladores e intérpretes. Isso nem leva em consideração os programas semi-formais que Ada Lovelace escreveu.
21978 Konrad Rudolph
4
@SkyDan Qual é a sua definição então? Não conheço nenhuma definição sensata para a qual sua resposta esteja correta (tanto para "compilador" quanto "código-fonte em uma linguagem de alto nível" - e muito menos em baixo nível).
21330 Konrad Rudolph
4

Os intérpretes existiam antes dos compiladores; portanto, o código-fonte existia antes dos compiladores.

Existem alguns artigos muito interessantes sobre a história da computação aqui . O código-fonte do compilador FORTRAN II deve estar disponível, mas esses links estão desfeitos.

Este artigo , de 1954, descreve o intérprete Whirlwhind.

Jon Strayer
fonte
1

Esta questão está fortemente ligada à nossa interpretação semântica do 'código fonte'. Se o definimos como 'instruções de computador baseadas em texto que são compiladas', presumivelmente um compilador veio primeiro.

Estou mais inclinado a aceitar algo mais autoritário, como o artigo de Mark Harman "Por que a análise e a manipulação do código fonte sempre serão importantes", apresentado na Décima Conferência Internacional de Trabalho do IEEE sobre análise e manipulação do código fonte

Definição 1 (Código-Fonte): Para fins de clareza, 'código-fonte' é considerado qualquer descrição totalmente executável de um sistema de software. Portanto, é concebido de modo a incluir código de máquina, linguagens de alto nível e representações gráficas executáveis ​​de sistemas.

E acho que sua resposta está implícita nessa definição - o código fonte certamente veio primeiro.

Kirk Broadhurst
fonte
“Presumivelmente um compilador veio em primeiro lugar” - somente se você definir “compilado” como “traduzido por uma ferramenta automática”, em vez de “traduzido manualmente para o código da máquina”.
21912 Konrad Rudolph
Papel muito interessante. Gosto que a definição de código-fonte - embora faça a minha pergunta um não-questão realmente ..
David Cowden
@KonradRudolph não é a unidade que realiza a compilação, seja uma intervenção de máquina, humana ou divina, chamada 'um compilador'?
precisa
0

Os algoritmos foram ordenados em papel e os demais foram conectados fisicamente / mecanicamente (fios móveis). Para alterar o programa, você move os fios e executa novamente.

Mais tarde, a linguagem assembly ordenada em papel, traduzida manualmente para o código da máquina e, em seguida, usando interruptores etc. para alimentá-lo no ram. Ou perfure cartões, etc. Eventualmente, você pode criar um montador, depois programar em assembly, não código de máquina, em seguida, criar um compilador. Eventualmente, você pode inicializar esse compilador. E crie novos idiomas e novos compiladores, etc.

O primeiro idioma não era um idioma, mais tarde o primeiro idioma foi a linguagem assembly. para cada processador, o primeiro idioma é a linguagem assembly (derivada do código da máquina). O conjunto de instruções é projetado primeiro, depois o hardware para implementá-lo, depois o assembler e depois os compiladores.

old_timer
fonte