3

Pitch: Construindo uma linguagem de programação chamada Su

Nos últimos anos venho trabalhando em um projeto pessoal que começou como estudo sobre interpretadores e foi evoluindo para uma linguagem de programação própria: Su.

Tudo nasceu por curiosidade sobre como interpretadores funcionam por dentro — análise léxica, parsing, AST, resolução de escopo e execução. Com o tempo, comecei a incorporar ideias próprias sobre sintaxe e legibilidade. O objetivo de longo prazo é caminhar em direção ao paradigma funcional, mas atualmente Su é uma linguagem imperativa.

A linguagem já suporta:

  • Variáveis
  • Inteiros e ponto flutuante (com suporte a precisão arbitrária via BigInt/BigFloat)
  • Strings com interpolação (#{variavel} e #{expressão})
  • Booleanos e nil
  • Operadores aritméticos, lógicos e de atribuição composta (+=, -=, ++, --)
  • if / else if / else
  • while
  • for clássico e for com range (for(i to 10))
  • Escopo por blocos
  • typeOf nativo

O próximo passo é implementar funções de primeira classe, o que abrirá caminho para closures, recursão e começar a pensar em paradigma funcional de verdade.

O nome Su vem de Sujeito, inspirado nas reflexões sobre trabalho e produção presentes em O Capital de Marx. A ideia é que o programador não seja apenas operador de uma ferramenta, mas sujeito ativo no processo de criação.

Aceito críticas sobre arquitetura do interpretador, organização do código e direção do projeto.

sintaxe:

./su file.su
nome = "Karl";
idade = 42;

if(idade > 18){
    proclaim("#{nome} é adulto");
}
Carregando publicação patrocinada...
4

Primeiro, parabéns pelo projeto! Gosto muito de incentivar as pessoas à entenderem como as coisas funcionam por baixo dos panos. Compiladores é um dos fundamentos de computação que acredito que todo programador deveria dominar.

Dito isto, acho importante fazer uma correção na sua percepção de conceitos. Primeiro, a sua linguagem Su não é funcional, ela é imperativa. Linguagens de programação funcionais são baseadas em cálculo lambda e funcionam essencialmente com a definição, derivação e aplicação de funções. É tudo sobre funções, por isso é chamada de funcional.

Se quiser ver linguagens que são realmente funcionais, veja linguagens como Lisp ou Haskell e você verá como são muito diferentes de linguagens como JavaScript, Python, C ou a Su. Inclusive, programadores que só estão acostumados com paradigma imperativo costumam sofrer para programar em uma linguagem funcional. Não é intuitivo, você tem que reaprender a programar do zero.

Tudo nasceu por curiosidade. Eu estava estudando sobre como as linguagens de programação funcionam por dentro: análise léxica, parsing, AST, resolução de escopo e execução.

Tudo que você listou neste trecho não diz respeito à como linguagens funcionam, mas sim como compiladores/interpretadores funcionam. Esse é um erro muito comum entre os programadores, mas é importante entender que uma linguagem de programação não é um software. Linguagem de programação é um objeto matemático, é teórico.

O software (compilador ou interpretador) é a implementação da linguagem de programação, não a linguagem em si. A linguagem em si é teórica e, normalmente, descrita em um documento. Esse documento a gente chama de especificação da linguagem de programação, e isso é a linguagem de fato. Se quiser ver como a especificação de uma linguagem de programação se parece, veja um desses:

Se você quiser entender como linguagens de programação funcionam, você deve estudar Programming Language Theory (PLT), que aí sim você vai realmente aprender sobre linguagens e não sobre detalhes de implementação de um software.

Se quiser uma sugestão de por onde começar a estudar PLT, estude sobre paradigmas de linguagens de programação e sistemas de tipo. Sugiro a leitura:


Parabéns pelo interesse em estudar fundamentos. É sempre legal fazer esse tipo de projeto e aprender coisas novas.

2

Muito obrigado pelo feedback, @Silva97! É exatamente o tipo de correção que eu precisava ler.

Você tem razão em tudo. Eu estava usando o termo "funcional" de forma equivocada fiquei deslumbrado até onde consegui chegar confundi a aspiração com a realidade do que foi construído. Su, no estado atual, é imperativa. Variáveis mutáveis, loops, atribuições... tudo característico do paradigma imperativo.

Também agradeço a distinção entre linguagem e compilador/interpretador. Eu sabia intuitivamente que eram coisas diferentes, mas no texto acabei misturando os conceitos. A linguagem é o objeto teórico a especificação e o que estou construindo é a implementação dela. Faz total sentido.

Vou reeditar o post com as correções, ...é minha primeira postagem achei que minguém iria falar nada :p