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.
System.out.println()
Java porque o compilador Java aceita isso ou há alguma outra coisa trabalhando aqui.Respostas:
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.
fonte
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.
Não. A criação de uma linguagem de programação é feita através da criação de dois conjuntos de regras:
É 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.
fonte
Existem 3 opções.
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.
fonte
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
fonte