Eu sempre me pergunto isso, e talvez eu precise de uma boa lição de história sobre linguagens de programação. Mas como a maioria dos compiladores atualmente são feitos em C, como foram os primeiros compiladores (AKA antes de C) ou todas as linguagens foram interpretadas?
Com isso dito, eu ainda não entendo como foi feita a primeira linguagem assembly, entendo o que é a linguagem assembly, mas não vejo como eles conseguiram que a MUITO primeira linguagem assembly funcionasse (como, por exemplo, como eles criaram a primeira linguagem assembly) comandos (como mov R21
) ou w / e definido como o equivalente binário?
programming-languages
history
assembly
mosquito
fonte
fonte
Respostas:
Ha, eu fiz isso. Muitas CPUs possuem instruções simples e de tamanho fixo, com apenas alguns bytes de comprimento. Para uma CPU simples como um Motorola 6800, por exemplo, você pode caber todas as instruções em uma única folha de papel . Cada instrução teria um código de operação de dois bytes associado a ela e argumentos. Você pode montar um programa manualmente, pesquisando o código de operação de cada instrução. Você escreveria seu programa no papel , anotando cada instrução com seu código de operação correspondente. Depois de escrever seu programa, você poderá gravar cada código de operação em sequência em uma EPROMque armazenaria seu programa. Conecte a EPROM à CPU com apenas as instruções corretas nos endereços certos e você terá um programa de trabalho simples. E para responder sua próxima pergunta, sim. Foi doloroso (fizemos isso no ensino médio). Mas devo dizer que ligar todos os chips de um computador de 8 bits e escrever um programa manualmente me proporcionou uma compreensão profunda da arquitetura do computador que provavelmente não poderia ter conseguido de outra maneira.
Os chips mais avançados (como x86) são muito mais difíceis de codificar manualmente, porque geralmente possuem instruções de tamanho variável. Os processadores VLIW / EPIC como o Itanium são quase impossíveis de codificar com eficiência, porque eles lidam com pacotes de instruções que são otimizadas e montadas por compiladores avançados. Para novas arquiteturas, os programas são quase sempre escritos e montados em outro computador primeiro e depois carregados na nova arquitetura. De fato, para empresas como a Intel que realmente constroem CPUs, elas podem executar programas reais em arquiteturas que ainda não existem, executando-os em simuladores. Mas eu discordo ...
Quanto aos compiladores, na sua forma mais simples, eles podem ser pouco mais do que programas "recortar e colar". Você pode escrever uma "linguagem de alto nível" muito simples, não otimizadora, que agrupe instruções simples em linguagem assembly sem muito esforço.
Se você quer um histórico de compiladores e linguagens de programação, sugiro que você faça um histórico do FORTRAN .
fonte
É disso que trata a inicialização do compilador (já que ninguém mencionou como é chamado =).
fonte
Por fim, todos os computadores operam com códigos binários, que são alimentados na CPU. Esses códigos binários são perfeitamente naturais para uma CPU, mas também perfeitamente inúteis para os seres humanos. Uma das primeiras maneiras de escrever um programa foi perfurando os cartões. A posição dos furos representava uma posição de bit específica em uma palavra, e a presença ou ausência do furo era interpretada como zero ou uma. Esses cartões foram colocados na sequência correta em uma caixa e, em seguida, alimentados em um leitor de cartão, que os converteu efetivamente em código binário para a CPU (e sua vida foi efetivamente perdida se você soltasse a caixa).
Obviamente, os primeiros programadores elaboraram os códigos binários um por um e tinham uma máquina para perfurar os cartões. Isso é essencialmente programação em linguagem assembly em suas mãos e joelhos. Depois disso, você poderá criar todas as outras coisas: um editor de texto simples, um compilador de linguagem assembly (para converter as instruções de montagem de texto em códigos binários), um vinculador e um carregador. E o resto, como eles falam, é história.
fonte
Um pouco de pesquisa mostra as Ordens Iniciais da EDSAC do final dos anos 40. Como foi o primeiro montador, provavelmente foi codificado em linguagem de máquina.
Posteriormente vieram montadores para outras máquinas, como SOAP I e II para o IBM 650. SOAP I também provavelmente foi codificado em linguagem de máquina, embora não tenha encontrado a declaração definitiva.
Um pouco mais tarde veio Fortran (tradutor de fórmulas), para o IBM 704. Presumivelmente, foi escrito em assembler para o 704. Um dos primeiros montadores para o 701 é creditado a Nathan Rochester .
Se você quiser ter uma idéia de como programar um computador em linguagem de máquina, confira um dos meus sites favoritos, o computador de retransmissão de Harry Porter .
fonte
É possível (se entediante) escrever código de máquina direto. Talvez você escreva o programa no assembler em um pedaço de papel e depois o traduza manualmente nas instruções numéricas do código da máquina que você digita na memória da máquina. Você pode até pular a etapa do montador em papel se tiver memorizado os valores numéricos de todas as instruções de código de máquina - não é incomum naqueles dias, acredite ou não!
Os primeiros computadores foram diretamente programados em binário, alternando os comutadores físicos. Foi uma grande melhoria de produtividade quando o hardware evoluiu para permitir que o programador (ou o assistente de entrada de dados) insira o código em números hexadecimais via teclado!
Um assembler de software só se tornou relevante quando mais memória se tornou disponível (já que o código do assembler ocupa mais espaço do que o código bruto da máquina) e o hardware evoluiu para permitir entrada alfanumérica. Portanto, os primeiros montadores foram escritos diretamente por pessoas fluentes em código de máquina.
Quando você tem um assembler, você pode escrever um compilador para uma linguagem de nível superior no assembler.
A história para C tem várias etapas. O primeiro compilador C foi escrito em B (um predecessor de C), que por sua vez foi escrito em BCPL. BCPL é uma linguagem bastante simples (por exemplo, não possui tipos), mas ainda é um passo em frente ao assembler bruto. Então você vê como linguagens gradualmente mais complexas são construídas em linguagens mais simples, desde o assembler. E o próprio C é uma linguagem bem pequena e simples para os padrões atuais.
Hoje, o primeiro compilador para um novo idioma geralmente é escrito em C, mas quando o idioma atinge uma certa maturidade, é frequentemente reescrito "em si". O primeiro compilador Java foi escrito em C, mas posteriormente reescrito em Java. O primeiro compilador C # foi escrito em C ++, mas recentemente foi reescrito em C #. O compilador / intérprete Python é escrito em C, mas o projeto PyPy é uma tentativa de reescrevê-lo no Python.
Nem sempre é possível escrever um compilador / intérprete para um idioma no próprio idioma. Existe um intérprete JavaScript escrito em JavaScript, mas os compiladores / intérpretes nos navegadores atuais ainda são gravados em C ou C ++ por motivos de desempenho. JavaScript escrito em JavaScript é simplesmente muito lento.
Mas você não precisa usar C como o "idioma inicial" para um compilador. O primeiro compilador de F # foi escrito em OCaml, que é o outro idioma que está mais relacionado ao F #. Quando o compilador foi concluído, ele foi reescrito em F #. O primeiro compilador para Perl 6 foi escrito em Haskell (uma linguagem funcional pura muito diferente do Perl), mas agora possui um compilador escrito em C.
Um caso interessante é o Rust, onde o primeiro compilador foi escrito no OCaml (agora é reescrito no Rust). Isso é notável porque o OCaml geralmente é considerado um nível mais alto que o Rust, que é uma linguagem de sistemas mais próxima do metal. Portanto, nem sempre os idiomas de nível superior são implementados nos idiomas de nível inferior; também pode ser o contrário.
fonte
Supondo que você esteja começando com um conjunto de instruções simples e nada mais, você começaria criando um montador ou compilador mínimo e pouco funcional que possa carregar um arquivo, analisar um subconjunto mínimo do idioma de destino e gerar um executável arquivo como saída, escrevendo o código bruto da máquina usando um editor hexadecimal ou similar.
Você usaria esse compilador ou montador apenas quase funcional para implementar um compilador ou montador um pouco mais capaz que possa reconhecer um subconjunto maior do idioma de destino. Espuma, enxágüe, repita, até obter o produto final.
fonte
Não é tão difícil, como parece. Na infância;) fiz algumas desmontagens do x86 em mente.
Você nem precisa aprender especialmente. Acontece que quando você é capaz de programar no ASM e depois tentar consertar um binário de terceiros usando desmontadores interativos. Ou ao escrever sua própria proteção com criptografia de código.
Ou seja, às vezes você está migrando mesmo do idioma para os códigos sem surpresa.
fonte
Os primeiros compiladores foram implementados usando linguagem assembly. E os primeiros montadores foram implementados por programas de codificação em binários ...
Não faz muito tempo que a programação em binário ainda era uma habilidade que as pessoas usavam.
Quando eu estava na graduação, lembro-me de fazer um exercício de programação que envolvia escrever um pequeno programa em código de máquina PDP-8 (eu acho), inseri-lo através dos comutadores do painel frontal e executá-lo. Alguns anos depois, comprei um kit de desenvolvimento de sistema 6502 que possuía um teclado hexadecimal para a entrada de programas ... e 4k bytes de RAM.
fonte
UMA RESPOSTA MUITO SIMPLES Suponha que escrevamos um programa conectado e o armazenemos na ROM. Pode ser considerado como compilador. Então, eu simplesmente quero dizer é que o primeiro compilador foi conectado. À medida que a tecnologia melhorava, esses compiladores simples eram então usados para escrever compiladores de alto nível.
fonte