Crie sua própria linguagem de programação (I)

A evolução das linguagens de programação

Depois de escrever o primeiro artigo sobre como criar seu próprio sistema operacionalAlguém me disse se eu pudesse fazer um artigo sobre como criar uma linguagem de programação. No início não prestei muita atenção, mas agora e de outras maneiras aprendi muito mais sobre a criação de linguagens de programação. Então vamos fazer uma linguagem de programação básica, facilmente embutível em outros programas e que funciona com uma máquina virtual que também iremos projetar. Hoje temos que fazer a máquina virtual mais básica.

Você provavelmente está se perguntando: «Uma máquina virtual? Mas isso não é muito difícil e também torna os programas mais lentos? " Em contraste, uma máquina virtual simples é muito simples e relativamente rápida. Escolhi Ferrugem como uma linguagem para a máquina virtual. Mas é Ferrugem?

Ferrugem É uma linguagem de programação que tem como foco a segurança de execução, portanto, com ela será praticamente impossível alguém conseguir fechar a máquina virtual. É uma linguagem compilada em desenvolvimento criada por Mozilla. Servo, o substituto para Lagartixa, está se desenvolvendo nele. Você ainda pode alterar sua sintaxe, mas o código que vou usar vai ficar até a primeira versão estável.

Ferrugem instala em Linux De forma simples. No entanto, não existe um pacote oficial. Usuários de Ubuntu você pode adicionar esses dois PPA: ppa: hansjorg / rust  y ppa: cmrx64 / cargousuários de arco pode usar AUR (carga-git é o pacote que instala tudo). O resto pode usar:

curl -s https://static.rust-lang.org/rustup.sh | sudo sh

Como funciona uma máquina virtual?

Se você sabe como funciona o mundo montador, é exatamente o mesmo, com a pilha ou a pilha. Se não, vou explicar para você. Vamos imaginar o seguinte código:

imprimir 2 + 3

O computador não entende o que significa 2 + 3, nem sabe em que ordem seguir. Os computadores funcionam com baterias ou pilhas nas quais os dados são acumulados e continuamente extraídos. Esse código em nossa máquina virtual deve ser semelhante a este:

PUSH 2 PUSH 3 ADICIONAR IMPRESSÃO

Basicamente, colocaríamos o 2 na pilha no topo, o 3 também. ADD iria puxar (ou seja, removê-lo da pilha e obter seu valor) os últimos 2 itens na pilha e adicionar o resultado ao topo da pilha. PRINT pegaria o último item da pilha e o usaria para exibi-lo para nós. Agora vamos fazer isso em Ferrugem.

Devemos primeiro definir uma linguagem para o Bytecode, poderíamos usar um existente como o de Java ou CLR do .NET / Mono, mas vamos criar um mais básico.

https://gist.github.com/a01de8904fd39a442c20

Usamos notação hexadecimal para cada instrução. No alto colocamos # [derivando (FromPrimitive)], é uma peculiaridade de Ferrugem e nos ajudará mais tarde a sermos capazes de comparar a enumeração com bytes diretamente.

Agora devemos fazer uma função que execute cada uma dessas instruções. Para isso devemos ler um byte e compará-lo com as instruções que temos na enumeração. Se encontrar algum existente, você deve executar sua ação.

https://gist.github.com/8950ce212a2de2f397f9

Fazemos isso para ler cada byte individualmente e para executá-los:

https://gist.github.com/12e24a1f0dd65e4cd65d

Como você pode ver, diferenciamos se recebemos o comando PUSH (nosso comando INTEGER) antes, o próximo byte será completamente colocado na pilha. Lá estamos usando duas funções que não ensinei a você, self.pop () y self.push (), que são obviamente responsáveis ​​pelo manuseio da pilha.

https://gist.github.com/54147f853a8a2b8c01d9

Eles não são muito complexos, mas a função pop possui mecanismos de detecção de erros. Na verdade, em Ferrugem, se removermos esses mecanismos, teremos um erro de compilação. Agora, simplesmente temos que chamar um programa Muito (nossa máquina virtual) e execute um bytecode.

https://gist.github.com/99b1ab461318b3a644d0

Esse bytecode pode ser lido de um arquivo, mas aqui para simplificar, armazenei-o em uma variável. Se o executarmos, teremos o resultado esperado:

Perin v0.1 Perin VM executa FlopFlip bytecode Iniciando instância PerinVM PerinVM v0.1.0 Valor inteiro 5

Todo o código está disponível em GitHub Sob a Licença Apache 2.0: https://github.com/AdrianArroyoCalle/perin. Para compilar eles devem ter Carga instalado e colocado:

cobrar compilação && ./target/main

No próximo capítulo, veremos mais sobre nossa linguagem de programação.


Deixe um comentário

Seu endereço de email não será publicado. Campos obrigatórios são marcados com *

*

*

  1. Responsável pelos dados: Miguel Ángel Gatón
  2. Finalidade dos dados: Controle de SPAM, gerenciamento de comentários.
  3. Legitimação: Seu consentimento
  4. Comunicação de dados: Os dados não serão comunicados a terceiros, exceto por obrigação legal.
  5. Armazenamento de dados: banco de dados hospedado pela Occentus Networks (UE)
  6. Direitos: A qualquer momento você pode limitar, recuperar e excluir suas informações.

  1.   caminhoneiro dito

    Curiosidade interessante, embora não seja muito útil na realidade, não custa saber.

    Que bom que você anuncia o Rust, é uma linguagem que promete muito, não só é mais segura que o c ++, mas (por enquanto) mais clara em sua sintaxe.

    Quanto à foto, eu não consideraria java evolution XD.

    1.    caminhoneiro dito

      E do fortran, eu nunca usei, mas não ouvi muito sobre isso ...

      1.    Fórico dito

        Sim, e é especialmente útil na engenharia, embora o Python esteja ganhando terreno.

      2.    banheiro dito

        Fortran é talvez a outra grande linguagem junto com C. Ainda hoje, em questões realmente críticas, será uma ou outra.

        E seria discutível que Fortran seja uma 'evolução' de C, quando talvez devesse ser o contrário, já que C é mais novo, mais moderno e com mais possibilidades; embora um não esteja nem um pouco separado do outro.

        Embora as posições finais sejam todas discutíveis de algum ponto de vista.

    2.    Francisco dito

      +1 para Java

  2.   Portaro dito

    Vamos ver se gosto disso, vou dar algo para programação mas básico para ver se entendo mais.

  3.   usuáriognulinux dito

    Qual é o real propósito de criar uma nova linguagem de programação? Parece-me pessoalmente que é uma manobra para ocultar o código-fonte.

  4.   Yeilly dito

    Amigo, o que aconteceu com a continuação de "seu próprio sistema operacional"? Não o deixe assim, continue.

    Na verdade, você é um mestre e apenas essas duas músicas cativaram completamente minha atenção, mas eu não gostaria que ficassem na metade.

    Sei que muitos de nós pensam o mesmo e aguardamos as continuações e conclusões destes tópicos tão interessantes.

  5.   Cristiano David dito

    Muito interessante, muito obrigado. 🙂

  6.   Franco dito

    Não considero java uma linguagem de programação, e sim um interpretador de comandos, uma vez que não é compilável

    1.    Mario dito

      [Uma linguagem de programação é uma linguagem formal projetada para expressar processos que podem ser executados por máquinas como computadores.]

      Por esse motivo, Java é uma linguagem de programação. Até a linguagem bash (linguagem linux shell) é uma linguagem de programação em si.

      Existem dois tipos de idiomas:
      - compilado
      - interpretado
      - Misto (máquinas virtuais, as bibliotecas nativas são compiladas e o código funcional é interpretado)

      Os intérpretes são muito úteis quando se trata de multiplataforma e não têm um desempenho desastroso para isso. Java, VB.NET, C ++ .NET, F #, C # são linguagens mistas. A linguagem bash, bat, PHP, Javascript e muitas outras são linguagens interpretadas.

      Se você não considera Java como uma linguagem porque ela é interpretada (o que não é), não deve considerar muitas outras linguagens que são usadas para fazer programas. Além disso, por essa regra de três, você não deve considerar que existe qualquer linguagem de programação, exceto a própria linguagem de máquina.

      E por que não? Mesmo a linguagem de máquina não poderia ser considerada linguagem, pois na verdade é apenas um conjunto de comandos "interpretados" pelo processador.

      Porque, efetivamente, TODAS as linguagens nada mais são do que um conjunto de comandos que são interpretados por um processador.

      Você pode gostar mais ou menos de uma linguagem (Java, neste caso), parecer mais ou menos útil e poderosa, mas dizer que não é uma linguagem de programação porque não está compilada ... vai contra todas as definições de linguagem de programação.

    2.    Mario dito

      😐 Espero não ter parecido muito rude

      1.    Maria Antonieta de Manuela Cárdenas dito

        não quieto você só destruiu nossas vidas

      2.    Mario dito

        hahahahaha, perdoooon. não era minha intenção xD

    3.    carlos dito

      java é uma linguagem de programação. Porque você pode desenvolver um aplicativo e quando você compila, você faz um .jar que é interpretado pela JVM. Então, de acordo com sua lógica python também não é interpretado, mas compila para diferentes executáveis ​​...

  7.   Elias Mongelos dito

    Informação muito boa

  8.   Carlos arturo dito

    boas informações mas tenho uma dúvida, será possível criar uma nova linguagem de programação do zero sem ter que contar com outras analogias ou softwares. Falo da mesma forma que outras linguagens foram feitas, como java ou HTML.
    Eu apreciaria muito sua ajuda nesta questão.