Quando alguém escreve uma nova linguagem de programação, o que eles escrevê-la em?

StackOverflow https://stackoverflow.com/questions/1629513

  •  06-07-2019
  •  | 
  •  

Pergunta

Por favor, desculpe minha ignorância. Eu estou intrometendo em PHP e recebendo meus pés molhados navegar SO, e sentir-se compelido a fazer uma pergunta que eu estive pensando sobre por anos:

Quando você escreve uma inteiramente nova linguagem de programação, o que você escrevê-lo in?

Isso provavelmente soa muito bobo para todos vocês, programadores, por quem tenho um enorme respeito, mas é um frango e ovo coisa desconcertante para mim. O que você faz? Diga a si mesmo Hoje eu vou inventar uma nova língua! e, em seguida, o fogo até ... Notepad? São todos os compiladores construídas sobre línguas já existentes, de modo que eram um para se preocupar se poderia traçar todas as linguagens de programação já concebidas para uma árvore de ramificação monstruosa que, eventualmente, aterrada para fora em ... Eu não sei, algo velho?

Com meu intelecto fraco, eu acho isso fascinante ... Por favor, me educar!

Foi útil?

Solução

A sua não é uma pergunta estúpida. Sua uma excelente pergunta.

Como já respondeu a resposta curta é, "outra língua".

Bem, isso leva a algumas questões interessantes? E se a sua primeira língua escrita para seu determinada peça de hardware? Um problema muito real para as pessoas que trabalham em dispositivos embarcados. Como já respondeu "uma língua em outro computador". Na verdade, alguns dispositivos embarcados nunca vai ter um compilador, seus programas sempre será compilado em um computador diferente.

Mas você pode empurrá-lo ainda mais para trás. E sobre os primeiros programas já escritos?

Bem, os primeiros compiladores para "linguagens de alto nível" teria sido escrito no que é chamado de "linguagem assembly". linguagem assembly é uma linguagem onde cada instrução nos corresponde linguagem para uma única instrução para a CPU. Sua linguagem nível muito baixo e extremamente detalhado e muito trabalhoso para escrever.

Mas, mesmo escrevendo linguagem assembly requer um programa chamado um montador para converter a linguagem de montagem em "linguagem de máquina". Nós voltar mais. As primeiras montadoras foram escritos em "código de máquina". Um programa que consiste inteiramente de números binários que são um direto one-to-one correspondência com a linguagem crua do próprio computador.

Mas ainda não termina. Mesmo um arquivo com números apenas matérias em que ainda precisa de tradução. Você ainda precisa obter esses números brutos em um arquivo no computador.

Bem, acredite ou não os primeiros computadores tinham uma linha de switches na frente deles. Você virou as chaves até que representou um número binário, então você ligou outro interruptor e que carregado esse número único para a memória de computadores. Então você continuou sacudindo ligado até que você tinha carregado um programa de computador mínimo que podia ler programas a partir de arquivos de disco ou cartões perfurados. Você acendeu outro interruptor e começou o programa em execução. Quando fui para a universidade nos anos 80 computadores vi que tinha essa capacidade, mas nunca foi dada a tarefa de carregamento num programa com os switches.

E ainda mais cedo do que os programas de computador tiveram que ser duro com fio com placas de plug !

Outras dicas

A resposta mais comum é C. A maioria das linguagens são implementados em C ou em um híbrido de C com retornos de chamada e um "léxico" como Flex e gerador de analisador como YACC . Estes são idiomas que são usados ??para uma finalidade - para descrever a sintaxe de uma outra língua. Às vezes, quando se trata de linguagens compiladas, eles são primeiramente implementado em C. Então, a primeira versão da linguagem é usada para criar uma nova versão, e assim por diante. (Como Haskell .)

Muitas línguas são bootstrapped- ou seja escrito em si . Por que motivo você iria querer fazer isso, muitas vezes é uma boa idéia para comer sua própria ração .

O artigo wikipedia Refiro-me discute da galinha e do ovo questão. Eu acho que você vai encontrá-lo bastante interessante.

Praticamente qualquer idioma, embora usando um adequado para trabalhar com gráficos e outras estruturas de dados complexas vai fazer muitas coisas mais fáceis. compiladores de produção são muitas vezes escritos em C ou C ++ por motivos de desempenho, mas linguagens como OCaml, SML, Prolog e Lisp são indiscutivelmente melhor para prototipagem o idioma.

Existem também vários "pequenos idiomas" usados ??no design de linguagem. Lex e yacc são usadas para especificar a sintaxe e gramáticas, por exemplo, e eles compilar a C. (Existem portas para outros idiomas, tais como ocamllex / ocamlyacc, e muitas outras ferramentas semelhantes.)

Como um caso especial, novos dialetos Lisp são muitas vezes construídos em implementações Lisp existentes, uma vez que podem pegar carona na maior parte da mesma infra-estrutura. Escrevendo um intérprete Esquema pode ser feito no Esquema em menos de uma página de código, em que ponto se pode facilmente adicionar novos recursos.

Fundamentalmente, compiladores são apenas programas que lêem em alguma coisa e traduzi-lo para outra coisa - convertendo fonte LaTeX para DVI, conversão de código C para montagem e, em seguida, em linguagem de máquina, convertendo uma especificação de gramática para o código C para um analisador, etc. seus especifica de designer a estrutura do formato da fonte (de análise), o que essas estruturas dizer, como para simplificar os dados (otimização), e o tipo de saída para gerar. Intérpretes ler a fonte e executá-lo diretamente. (Os intérpretes são normalmente mais simples de escrever, mas muito mais lento.)

Na verdade, você pode escrever em praticamente qualquer idioma que você gostaria de. Não há nada que o impeça de escrever um compilador C em Ruby. "All" você tem que fazer é analisar o programa e emitir o código de máquina correspondente. Se você pode ler / arquivos de gravação, sua linguagem de programação provavelmente suficiente.

Se você está começando do zero em uma nova plataforma, você pode fazer compilação cruzada: escrever um compilador para a sua nova plataforma, que roda em Java ou nativamente em x86. Desenvolver no seu PC e, em seguida, transferir o programa para a sua nova plataforma de destino.

Os compiladores mais básicas são, provavelmente, Assembler e C.

"Escrever uma nova linguagem de programação" tecnicamente não envolve qualquer código. É só chegar com uma especificação para o que sua aparência linguagem como e como ele funciona. Uma vez que você tem uma idéia do que seu idioma é como, você pode escrever tradutores e intérpretes para realmente fazer o seu "trabalho" da linguagem.

entradas tradutor A um programa em um idioma e saídas um programa equivalente em outro idioma. Um entradas intérprete um programa em alguma linguagem e executa-lo.

Por exemplo, um compilador C tipicamente traduz o código de fonte de C (o idioma de entrada) de um programa de linguagem assembly (a língua de saída). A montadora, em seguida, leva o programa em linguagem assembly e produz linguagem de máquina. Depois de ter sua saída, você não precisa de tradutores para executar o seu programa. Desde agora você tem um programa em linguagem de máquina, a CPU atua como intérprete.

Muitas línguas são implementados de forma diferente. Por exemplo, javac é um tradutor que converte o código-fonte Java para bytecode JVM. A JVM é um intérprete [1] que executa bytecode Java. Depois de executar javac e obter bytecode, você não precisa javac mais. No entanto, sempre que você deseja executar o seu programa, você vai precisar do JVM.

O fato de que os tradutores não precisa ser mantido em torno de executar um programa é o que torna possível a "bootstrap" seu idioma sem ter que acabar por correr "em cima de" camadas e camadas de outras línguas.

[1] A maioria JVMs fazer tradução nos bastidores, mas eles não são realmente tradutores em que a interface para o JVM não é "idioma de entrada -> Idioma de saída".

Geralmente você pode usar praticamente qualquer linguagem que você gosta. PHP foi escrita em C, por exemplo. Se você não tem acesso a qualquer compilador que seja, você vai ter que recorrer a escrever linguagem assembly e compilá-lo para código de máquina com a mão.

Muitas línguas foram escritas pela primeira vez em outro idioma disponível e depois reimplantado em si mesmo e bootstrapped dessa maneira (ou apenas manteve a aplicação na língua estrangeira, como PHP e Perl), mas algumas línguas, como a primeira montadora era mão compilado para o código de máquina, como o primeiro, C-compilador foi mão compilado para montagem.

Eu estive interessado em bootstrapping desde que li sobre isso. Para saber mais Eu tentei fazer isso sozinho por escrever meu próprio super conjunto de BF, que i chamado EBF , em si mesmo. a primeira versão do EBF teve 3 primitivas extras e eu mão compilou o primeiro binário. Eu encontrei um ritmo de dois passos quando fazê-lo. Eu implementou um recurso na linguagem corrente em uma versão e tinha um doce libertação, onde eu reescrevi o código para utilizar o recurso implementado. A linguagem foi suficiente expressiva a ser usado para fazer uma LISP intérprete .

Eu tenho a mão versão compilada juntamente com a fonte no primeira tag liberação eo código é muito pequeno. A última versão é 12 vezes maior em tamanho e o código e permite o código mais compacto, mão compilar a versão atual seria difícil de acertar.

Edmund Grimley Evans fez algo semelhante com sua linguagem HEX

Uma das coisas interessantes sobre como fazer isso se é que você entende por que algumas coisas são como são. Meu código era produto se pequenos ajustes incrementais um que parece mais como ele evoluiu ao invés foi concebido a partir do zero. I manter isso em mente ao ler o código hoje que eu acho que parece um pouco fora.

Geralmente com uma linguagem de programação de propósito geral adequada para desenvolvimento de sistemas, por exemplo, C, Haskell, ML, Lisp, etc., mas a lista de opções é longa. Além disso, geralmente com alguns idiomas específicos do domínio para implementação da linguagem, ou seja analisador e geradores analisador lexical, línguas como intermediários LLVM , etc. . e, provavelmente, alguns shell scripts, estruturas de teste e um sistema de configuração de compilação, por exemplo, autoconf.

A maioria compilador foram wriiten C ou ac como o programa se não c, em seguida, a montagem lang é o caminho a percorrer No entanto, ao escrever uma nova lang do zero e você não tem uma lib macro ou código-fonte de uma linguagem de protótipo você tem que definir suas próprias funções agora em que língua? Você pode apenas escrever um formulário "do código-fonte chamado psedocode para a máquina se parece com uma gramática BNF do orientada estruturado objeto especificação lang como Fortran básica algo lisp. Então imagem escrevendo um código cruz semelhante a qualquer um destes sintaxe da linguagem daquele código psedo

Ainda mais binário, ou operações de montagem deve ser traduzida em funções, isso é o trabalho montadores / compiladores, em seguida, em objeto, a partir de dados e funções, se você não tem um arquivo de origem para ver" como esses objetos funcionalidade deve ser representado na sua implementação da linguagem, então você tem que reconhecer "ver" implementar, ou definir suas próprias funções, procedimentos e estruturas de dados, o que requer uma grande quantidade de conhecimento, você precisa perguntar a si mesmo o que é uma mente function.Your então se torna o língua simulation.This Separe um programador mestre do resto.

Eu também tinha essa pergunta alguns meses atrás. E eu li alguns artigos e assisti alguns vídeos que me ajudaram a começar a escrever a minha própria linguagem chamada macio. A sua não é completa ainda, mas eu aprendi um monte de coisas a partir desta jornada.

coisas básicas que você deve saber é como compilador funciona quando tem de executar um trecho de código. Compiler tem um monte de fases como análise lexical, analisador semântico, AST (Abstract árvore de sintaxe) etc.

O que eu fiz na minha nova língua pode ser encontrado aqui - http: / /www.singhajit.com/writing-a-new-programming-language/

Se você estiver escrevendo uma linguagem para a primeira vez, então tudo de melhor e você tem um longo caminho a percorrer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top