Criamos uma linguagem de programação escrevendo um compilador?

8

Digamos, eu queria criar minha própria linguagem de programação. Supondo que eu tomei todas as decisões sobre como eu quero que pareçam e ajam, eu só preciso escrever um compilador para isso?

Por exemplo, o código Java de alto nível não é apenas texto e esse texto está no formato correto para o compilador aceitá-lo e transformá-lo em outra coisa?

Minha pergunta é: a criação de uma linguagem de programação é feita através de um compilador? Alto nível é bom.

Haych
fonte
Sua pergunta sobre como tornar a definição da linguagem de programação precisa ?
Anton Trunov
Na verdade não. Além disso, eu poderia, teoricamente, criar minha única linguagem puramente apenas criando um compilador que analisa algum texto? Onde este texto é minha linguagem inventada na minha sintaxe. Por exemplo, é System.out.println()Java porque o compilador Java aceita isso ou há alguma outra coisa trabalhando aqui.
Haych 10/05
3
O que você quer dizer com "a criação de uma linguagem de programação"? O que você quer dizer com "terminado"? É difícil para mim dizer exatamente o que você está perguntando. Você diz que já tomou todas as decisões sobre como deseja que a linguagem pareça e aja; o que mais há para a criação de uma linguagem de programação, na sua perspectiva? Se você tentar elaborar o que está tentando alcançar, provavelmente será possível fornecer respostas mais úteis sobre como isso pode ser alcançado. No momento, parece que precisamos adivinhar o que você pode estar perguntando.
DW

Respostas:

10

A resposta curta é não .

Você pode pensar em uma linguagem de programação como um formalismo matemático usado para expressar a computação. Um compilador / intérprete é apenas uma parte de um software real que realiza esse cálculo e não deve servir como especificação de linguagem.

Dito isto, além da especificação lexical e de sintaxe de uma linguagem, você também deve definir a especificação semântica, ou seja, o que um programa (sintaticamente correto) escrito em sua linguagem realmente significa. A semântica óbvia para começar é a semântica operacional , onde o significado de um programa é dado em termos de como o programa realmente é executado. Ou seja, (matematicamente) define com precisão como os programas são executados. Além dessa semântica, você deve criar um compilador / intérprete real com otimizações e assim por diante.

A especificação de semânticas operacionais completas do seu idioma fornecerá uma documentação formal do idioma e fará com que você entenda o idioma nos mínimos detalhes. Além disso, permitirá que você raciocine formalmente sobre alguns aspectos do idioma. Escrever semântica operacional é realmente um bom hábito.

Também existem outras semânticas úteis, como semântica axiomática , denotacional e de jogo . No entanto, eles são mais avançados e geralmente não são encaminhados para um compilador / intérprete.

bellpeace
fonte
3
Isto está errado. Uma linguagem de programação sem uma especificação formal ainda é uma linguagem de programação.
Reinierpost
3
@reinierpost Então, sua resposta para a pergunta "é a criação de uma linguagem de programação feita por meio de um compilador" é sim? Nesse caso, acredito que você deve escrevê-lo como resposta.
bellpeace
4
@reinierpost: Uma casa que não foi projetada por um arquiteto ainda é uma casa. Mas em que tipo de casa você prefere morar?
Andrej Bauer
1
A pergunta como afirmada é ambígua. Uma linguagem de programação pode ser criada criando um compilador para ela? Definitivamente. É assim que se cria uma linguagem de programação? Não, é apenas uma maneira possível.
Reinierpost
2
@johan Uma linguagem de programação é de grande importância prática e teórica para ser deixada como um conceito que não é definido com precisão. Por exemplo, como você explicaria precisamente a alguém o que é C ou como funciona com precisão? Dando a ela um compilador C? Mas existem muitos deles e são diferentes! Além disso, em muitos casos, nem sabemos o que o compilador C fará (dicas: simultaneidade, modelos de memória). Estritamente falando, um compilador / interpretador `` induz" uma linguagem de programação, mas pensando em uma linguagem de programação como uma mera implementação levanta mais problemas do que resolve.
bellpeace
5

Digamos, eu queria criar minha própria linguagem de programação. Supondo que eu tomei todas as decisões sobre como eu quero que pareçam e ajam, eu só preciso escrever um compilador para isso?

Não. Tomar todas as decisões sobre como você deseja que a linguagem pareça e aja é criar sua própria linguagem de programação. Você não precisa de um compilador ou intérprete para criar uma linguagem de programação. Você não precisa de um compilador ou intérprete para escrever programas em sua linguagem de programação.

Você só precisa de um compilador ou intérprete se realmente deseja executar os programas que escreve.

Minha pergunta é: a criação de uma linguagem de programação é feita através de um compilador? Alto nível é bom.

Não. A criação de uma linguagem de programação é feita através da criação de dois conjuntos de regras:

  1. como é um programa jurídico (sintaxe)
  2. o que um programa jurídico faz (semântica)

É isso aí.

Existem linguagens de programação que não têm implementação. Ou que não teve implementação por um longo tempo.

Por exemplo, Konrad Zuse criou o Plankalkül em meados da década de 1940, mas devido à guerra, ele nunca foi capaz de implementá-lo. Foi implementado pela primeira vez como parte de uma dissertação em 1975. Mas certamente existia nas décadas de 1950 e 1960.

O LISP foi originalmente projetado como uma alternativa mais tratável ao cálculo λ para o estudo da computação. Foi implementado por Steve Russell, um estudante de John McCarthy. O próprio McCarthy até duvidava que o LISP pudesse ser implementado!

O APL foi originalmente projetado como uma notação para o ensino de matemática. Mais tarde, foi estendido para servir como a linguagem de especificação do IBM System / 360. As implementações vieram mais tarde, depois que o idioma já havia sido usado.

PLANNER era uma linguagem muito influente, que na verdade só foi implementada depois de já ter influenciado outras línguas; foi projetado em 1969 e implementado em 1973, quando já havia influenciado Smalltalk e Prolog (ambos em 1972).

Estrutura e Interpretação da Mecânica Clássica é um livro de física que usa Esquema em vez de matemática para descrever sistemas dinâmicos; o fato de o Scheme ter intérpretes e compiladores não é essencial para o livro, ele é usado como uma linguagem para transmitir pensamentos, não para executar programas.

Como você pode ver, as linguagens de programação podem ser úteis mesmo sem implementações. "Os programas devem ser escritos para os humanos lerem, e apenas para os computadores executarem", é uma citação famosa de Estrutura e interpretação de programas de computador. Linguagens de programação são linguagens formais para descrever inequivocamente processos complexos. O fato de que se você descrever um processo com precisão suficiente para um ser humano entender, também será executável por uma máquina é um efeito colateral. É um efeito colateral muito desejável, útil, poderoso, mas é um efeito colateral.

As primeiras "linguagens de programação", λ-cálculo, SKI-cálculo, Turing Machines, funções μ-recursivas, não foram criadas para execução. Eles foram criados para entender questões fundamentais da lógica e da matemática.

Jörg W Mittag
fonte
0

A criação de uma linguagem de programação é feita através de um compilador?

Existem 3 opções.

  • Um montador
  • Um interprete
  • Um compilador

Assembler
O código-fonte escrito por um humano converte 1 para 1 no código da máquina consumido pela CPU.

Intérprete
Um programa lê cada linha de código, segue as instruções e as executa em ordem.

Compilador
Um programa analisa as instruções frequentemente usando uma Árvore de Sintaxe Abstrata e a utiliza para gerar código de objeto.
O compilador gera alguma forma de código de objeto que pode ser consumido por uma máquina real ou virtual.

Desfocando as linhas
Existem muitos intermediários aqui.
Ruby é executado a partir do seu AST. O famoso Java executa código de bytes para uma CPU fictícia.
O SQL é interpretado, mas não é executado como gravado, é convertido em um plano de consulta.

Javascript existe em uma estranha zona crepuscular. Ele é interpretado em sua maior parte, mas partes críticas são executadas através de um compilador JIT gerando código de bytes não padronizado e também é usado como código de objeto para alguns compiladores.
O php costumava ser uma linguagem interpretada pura, mas o Facebook usa seu próprio compilador php.

Minha recomendação
Se você quiser experimentar escrever uma linguagem de programação.
Comece com um intérprete.

Se você quer entender compiladores, estude AST's!
Uma linguagem como Pascal é feita sob medida para um AST, podendo ir do código fonte ao código da máquina em uma única passagem e, portanto, é relativamente fácil de implementar em um compilador.
Se você insistir em estudar compiladores e não intérpretes, recomendo que você estude os escritos de Wirth sobre o assunto.

Johan
fonte
Existem mais do que as três opções. Por exemplo, uma opção é: não faça nada. Você pode criar uma linguagem de programação simplesmente declarando suas regras. Você não precisa implementá-los. O Plankalkül não foi implementado até 60 anos (?) Após sua criação. O LISP e o APL não foram originalmente concebidos para serem implementados, o LISP foi projetado como uma versão mais tratável do cálculo-λ para estudar computação, o APL foi projetado como uma notação para o ensino de matemática. O livro Estrutura e Interpretação da Mecânica Clássica usa Scheme como uma notação para descrever sistemas dinâmicos, não como um…
Jörg W Mittag
linguagem para escrever programas que realmente são executados.
Jörg W Mittag
0

Tudo o que um compilador faz é garantir que a entrada fornecida use a linguagem que o compilador entende e que carregue a mesma estrutura semântica que a linguagem.

O compilador falsifica a inteligência usando um lexer e um analisador para analisar lexicamente a entrada e tentar analisar os tokens em uma ordem que tenha o significado pretendido sem introduzir ambiguidade.

Para responder sua pergunta, você PODE criar uma linguagem de programação criando o compilador, mas, ao fazer isso, a linguagem de programação é realmente criada antes da conclusão do compilador.

Pense nas linguagens de programação como qualquer outra linguagem existente - inglês, francês, alemão etc. O trabalho de um compilador é dado, com algumas informações, certificar-se de que as palavras usadas nessa entrada correspondam às palavras usadas no idioma para o qual foram criadas, certifique-se de que a ordem das palavras faça sentido no idioma para o qual foi criada e, finalmente, traduza essa entrada em um idioma que a máquina possa entender

smac89
fonte
Isto não é necessariamente verdade. Existem muitos exemplos de idiomas criados junto com os programas escritos para processá-los. FORTRAN era o nome do compilador, não o idioma.
Reinierpost
@reinierpost Meu argumento é que, antes que um compilador possa reconhecer um conjunto de tokens dentro de seu idioma, esses tokens devem existir primeiro ... portanto, o idioma passou a existir antes da conclusão do compilador. Um idioma não pode existir sem seus componentes mais básicos, que são as palavras / frases dentro desse idioma. A semântica pode vir mais tarde. Em grande parte da mesma forma, um compilador não pode sequer começar a fingir que compila uma língua, se ele não sabe as palavras que compõem essa língua
smac89
Não precisa haver um idioma 'determinado'. O compilador pode processar entrada sem qualquer definição específica do que constitui entrada válida para ele. Tente fazer com que muitos programadores em C concordem com o que é e o que não é exatamente um programa em C. Boa sorte!
Reinierpost