12

Estou criando uma linguagem de programação do zero.

Opa, tenho 15 anos e sou programador fullstack. Domino várias linguagens, e uma delas é C. Então decidi aplicar meu conhecimento e tentar criar uma linguagem de programação do zero. Sei que não é nada fácil, mas chego lá kakka. Meu principal o objetivo é conhecer, me aprofundar mais na linguagem.

Comecei há 2 meses e já consegui implementar várias coisas.

O que já funciona:

  • Variáveis
  • Concatenação
  • Loops
  • Operações matemáticas
  • Entrada de dados
  • Condicionais
  • Arrays
  • Funções embutidas

Ou seja, já dá pra escrever bastante coisa útil com a linguagem.

Exemplos de uso:

Variáveis:

let x = 10      # cria uma variável
let nome = "João"

Atribuições simples:

x = x + 1
nome = "Maria"

Saída:

write("Olá mundo")
write("Valor de x: " + x)

Entrada:

input("Digite seu nome", nome)
write("Olá, " + nome)

Operações matemáticas:

let resultado = 2 + 3 * 4
write("Resultado: " + resultado)

Condicionais:

if (x > 5)
begin
  write("Maior que 5")
else
  write("Menor ou igual a 5")
end

Loops:

let i = 0

while (i < 5)
begin
  write("Valor: " + i)
  let i = i + 1
end

Arrays:

array nums[3]

let nums[0] = 10
let nums[1] = 20
let nums[2] = 30

write("Primeiro valor: " + nums[0])

Exemplo completo:

array notas[3]

let i = 0
while (i < 3)
begin
  input("Nota " + i, notas[i])
  let i = i + 1
end

let soma = 0
let i = 0

while (i < 3)
begin
  let soma = soma + notas[i]
  let i = i + 1
end

write("Soma: " + soma)

Eu pretendo deixar o projeto aberto, mas preciso ajustar algumas coisas. Fiquei até pensando em criar um cursinho de mais o menos isso "Desenvolvimento de Linguagens Utilizando C". Enfim, obrigado!

Carregando publicação patrocinada...
4

Parabéns pela iniciativa. Eu comecei criar uma linguagem com essa idade. Na época era muito difícil porque eu tinha 16KB de memória e quase nada de material para estudar sobre o assunto, eu fui na intuição.

Faça como achar melhor. O ideal é você poder justificar cada decisão, mais que o resultado é o pensamento crítico que vai te evoluir corretamente. Documente tudo. Se precisar, faça uma pergunta que eu tento responder. Eu não participarei no Github mas se perguntar aqui tem chance de eu responder, se eu for capaz.

Eu não gosto de algumas decisões, mas e daí? A linguagem é sua. Odeio begin e end, especialmente o begin, mas é só a minha opinião, meu gosto.

Não há problema algum em usar + para concatenação, apenas tome cuidado para a conversão automática, que parece ser a ação que escolheu para a linguagem, não vi nada documentado sobre isso. A questão do "mais" entre duas strings é bem ok, o problema é quando concatena outros tipos, isso pode virar uma bagunça, cabe a você não deixar isso acontecer. Ou deixe, afinal a linguagem é sua.

Me parece que a escolha óbvia é que sempre que tiver uma string, até mesmo uma vazia (provável com "") o que vem a seguir é convertido para string. E é provável que todos os tipos devam poder ser convertidos para string. Ou não? Pode ter algum argumento contra em algum caso.

Acho um pouco estranho obrigar parênteses (pelo menos pareceu obrigatório) while, if, etc. Você parece ter optado por não colocar caracteres especiais, a não ser nos operadores óbvios, na estruturação da tupla de parâmetros/argumentos de funções. Então isso parece ruído e é desnecessário, especialmente por causa do begin.

Pode ser apenas um lapso, o seu último código indica algo errado baseado no segundo código (um dos dois está errado). Dado o estilo que parece que você adotou, faz sentido usar uma palavra-chave para declarar variáveis, mas é um pouco estranho para mim, usar isso em cada operação com a variável, mas você decide o que é bom para sua linguagem. É mais estranho ainda quando a chamada de função não exige nenhuma palavra-chave. A chamada de função é uma operação a ser realizada, assim como a atribuição de variável, só fica consistente se ambos tiverem uma palavra-chave ou ambos não terem. Você escolhe, até mesmo deixar como está, a inconsistência não é grave, estou falando para você refletir mais sobre isso e outros aspectos da linguagem.

Mas use a palavra que achar melhor, você dá a semântica que quiser para o let, não precisa copiar de outras linguagens.

No momento certo veja o que acontece com erros, que passará ser mais importante que o que funciona.

Novamente, o que eu acho um erro, mas você decide o que fazer, é não ter toda decisão documentada formalmente, de um jeito estruturado. Ainda dá tempo, pode fazer retroativo.

https://www.tabnews.com.br/maniero/faq-do-programador-perdidao.

S2


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente (não vendo nada, é retribuição na minha aposentadoria) (links aqui).

1
1

Fala, fera! Sensacional sua iniciativa. Criar uma linguagem em C puro aos 15 anos não é para qualquer um; você está aprendendo a "física" da computação enquanto a maioria só quer saber da "química" pronta dos frameworks.
Sua sintaxe está curiosa: um mix moderno de let (Rust/JS) com a estrutura begin/end do Pascal. Já vi muita gente grande apanhando para fazer metade disso! Para o seu próximo salto evolutivo, deixo três provocações para você pesquisar:
A Árvore (AST): Se você ainda estiver usando busca de strings ou IFs para executar o código, pesquise sobre Abstract Syntax Trees (AST). É aqui que a mágica vira ciência. Entender como transformar o texto em uma árvore hierárquica vai te dar poderes de "Arquiteto de Sistemas".
O Destino (Wasm): Já que você domina C, veja como compilar sua lógica para WebAssembly (Wasm). Isso permitiria que sua linguagem rodasse no navegador com performance nativa. É o futuro batendo na porta.
Gestão de Memória: Como você está no C, o maior desafio será como sua linguagem gerencia arrays e strings. Vai ter Garbage Collector ou vai ser no braço?
Conselhos de quem rodava Unix Solaris 5.2 (minha idade kkk)
Inglês Técnico: São pouquíssimas palavras. Aprenda por osmose no fluxo do código, sem tradutor.
Arquiteturas: Você vai começar a brincar de verdade quando entender que x64, ARM e RISC-V compartilham características, mas "pensam" diferente. Hoje, paralelismo massivo em GPU é ouro.
IA como Exosqueleto: Aprenda a tirar da IA o conhecimento do espaço latente (pesos e parâmetros), mas parametrize seu nível para ela não supor que você é sênior e te entregar tudo pronto.
A Visão de Mercado (O Pulo do Gato)
Se você quer descer ao nível do fio, o caminho é o Assembly, mas se quiser mudar o jogo, vá para o FPGA e aprenda Verilog. O Verilog é quase um C com pequenos módulos onde tudo roda ao mesmo tempo, sujeito apenas à "tirania do clock". Com ele, você não dá ordens a um processador; você desenha o próprio processador.
Fique de olho: o mercado é cíclico. Daqui a uns 3 anos, o custo para imprimir wafers vai despencar. Quem souber desenhar um ASIC (chip especialista) vai poder encomendar o seu próprio silício. Imagina materializar sua linguagem em um chip com uma arquitetura alienígena personalizada, feita só para o seu código?
Na sua idade, eu estava ajustando impressora matricial Epson Kit Color para imprimir cheques em cores com lógica de SE aninhado no Excel 4.0. Você tem o canivete suíço na mão. Se dominar do software (C) ao hardware (Verilog), você não vai apenas programar o futuro, você vai fabricar ele.
Vai pra cima! Se você virar um Steve Jobs brasileiro, daqui a uns 8 anos, quando eu estiver me aposentando aos 60, aceita o currículo de um "véi" para meio horário? No resto do dia eu preciso de tempo para jogar LoL, Pac-Man, Cyberpunk 2087, Star Citizen e o bom e velho jogo da cobrinha! 👽🔮

1
1

Parabéns pelo projeto. Mesmo que no final a linguagem não vingue ou seja abandonada valeu por passar pelo processo, isso vai te trazer muito conhecimento sobre linguagens. Continue

0
1
1
1

Achei confuso o uso do let, se é para ter em TODA atribuição então OK, se é apenas uma definição me parece errado. Se é uma definição, para que uma palavra array para definir um array? Bastaria um
let var[5], acho que melhor seria um
def var1 : int = 0
def var2 : string = "texto"
def var3[4] : int
let var1 = var1 + 1
let var3[1] = 56
Mas, minha principal crítica vai para o begin...end. No if ficou esquisito, como assim um else no meio da estrutura!?!? Para manter a consistência, deveria ter um bloco no, que seria o then, e outro, no bloco do else. Considerando que essas estruturas parecem ter os parênteses obrigatórios, concluo que vc não precisa do begin, bastaria um end no final do bloco, sugiro um end e o nome da estrutura, para mostrar coerência:
if ( a > b and
x > y )
let ...
elseif ( x < 100 )
let ...
else
let ...
end if

while ( i < 10 )
let ...

if de uma linha

if( j < 100 ) break while
let ...
if( j + i > 90 ) continue while
...
end while

Quanto ao write() me parece clara a falta de vírgulas para demais parâmetros, assim não é necessário concatenar antes de imprimir.
write("x = ", x, " y = ", y )

1

faz sentido o que você falou, principalmente na parte de consistência.

sobre o let, a ideia foi justamente manter algo mais próximo do JavaScript, onde você sempre usa na atribuição, não só na definição. Eu acabei não separando “declaração” e “uso” como em linguagens mais tipadas, foi mais uma escolha de simplificação mesmo.

s parte de array separado também foi meio nessa linha de deixar explícito na leitura, mas curti essa ideia de unificar com let var[5], fica mais limpo mesmo.

sobre o begin...end, eu puxei mais inspiração do Pascal, principalmente pensando em deixar os blocos bem visíveis pra quem tá começando. Mas concordo que no if/else pode ficar estranho do jeito que está, essa ideia de end if / end while é bem interessante e deixa mais consistente.
e o write, realmente, suporte a múltiplos parâmetros com vírgula é uma melhoria que já faz bastante sentido.

no geral, eu fui mais na linha de fazer funcionar e depois ir ajustando a sintaxe com base nesses feedbacks. Vou testar algumas dessas mudanças pra ver como fica na prática.
valeu pelas sugestões.

1

Cara, que post massa
Parabéns mesmo! Dá um gás ver alguém tão jovem com essa mesma curiosidade pelos “bits” que a galera mais antiga sempre teve. Me lembrou quando comecei e consegui meu primeiro livro de Basic MXR — foi ali que virou a chave pra mim.
E vou te dizer: você acertou em cheio em três pontos que fazem MUITA diferença numa jornada dessas:
Criar uma linguagem — isso é mergulho profundo de verdade. Você começa a entender como as coisas funcionam por baixo dos panos: parsing, execução, memória… é outro nível de compreensão.
Open source — decisão certeira. Código aberto atrai revisão, crítica e colaboração. Aquela ideia clássica: com olhos suficientes, os bugs aparecem (e somem) mais rápido.
Ensinar — talvez o mais poderoso. Não tem jeito: quando você explica, organiza o pensamento e encontra lacunas que nem sabia que tinha. Eu mesmo aprendi muito mais ensinando do que só estudando.
Se me permite uma sugestão prática: começa a documentar e mostrar o processo.
Grava uns vídeos curtos, escreve no GitHub (ou outro versionador), mostra desde as decisões até os problemas que você encontrou. Isso constrói portfólio, ajuda outras pessoas e acelera MUITO teu aprendizado.
E sobre o cursinho: faz total sentido, mesmo que comece simples. Pode ser algo mais “diário de bordo” no início.
Agora fiquei curioso: qual o nome da linguagem? 😄

1

Me arrependi de não ter gravado. Eu codo ela enquanto estou em call no Discord. Eu tinha começado só pra tentar entender como funcionava, aí bateu a curiosidade e fui indo mais longe kkkk, até chegar nesse ponto. Não tem muitas coisas ainda, mas já dá pra fazer algumas coisinhas legais. Em relação ao nome, por enquanto eu deixei ManScript. Nem sei por quê, só veio na minha cabeça desde o começo kkkkk.

1
1
1

Sao por essas que eu fico com inveja mlk com 15 anos ja sabe fazer uma linguagem ainda usando c que é a linguagem mais difícil. Bom pra vc começar de c vc ja viu q ela é a linguagem mais poderosa dela vieram tudo as outras linguagens os sistemas operacionais kernel tudo ela é literalmente a linguagem base de tudo.e você ja sabe disso então oq eu tenho a dizer eh q eu tenho mt inveja pq so descobri isso agr velho.e se quiser me mostrar como vc programa tudo isso estou aqui eu sei um poco de segurança ofensiva mas nao muita coisa projetos que fiz foram pocos como brutrforce enumeração sabe coisa básica gosto muito de java pq a linguagem é retro mas sei que tem muitas limitações ainda mais lentidão no servidor acho q o melhor a se aprender se eu tivesse tempo aprenderia c c++ c# golang java. Qualquer coisa projeto junto

1

Salve lenda, tudo bem? Quando eu terminar algumas coisas aqui nela, eu vou fazer uns posts aqui de como desenvolver. To tentando terminar um bug que deu na hora de desenhar coisas na tela.

1

Mano, parabéns de verdade. Lexer + parser + evaluator rodando em 2 meses, aos 15, em C? Muito dev sênior nunca encarou isso. Respeito sincero.

Dica que vai acelerar muito esse projeto: procura Crafting Interpreters do Bob Nystrom (craftinginterpreters.com, grátis online). É O livro pra quem tá nessa trilha — começa com tree-walking interpreter em Java e termina com VM bytecode em C. Vai te dar a base teórica que o C sozinho não entrega.

Umas coisas pra você pensar no design quando puder, sem pressa:

  • let i = i + 1 dentro do while parece re-declarar a variável. Vale separar let (declara) de atribuição pura (i = i + 1), senão escopo vira inferno depois.
  • O else dentro do begin...end vai complicar feio quando você quiser else if encadeado. Pensa em como vai ficar a árvore sintática.
  • let nums[0] = 10 é inconsistente — se o array já foi declarado, por que precisa de let pra escrever num índice?
  • input("Digite seu nome", nome) passando variável como saída implica passagem por referência. É implementação pesada e destoa do resto do design.

Sobre o cursinho: foca em fazer primeiro, ensinar é outra disciplina. Mas a motivação tá certíssima. Tu vai longe.

1

Anotado! Obrigado pelo feedback. Eu tambem pensei nisso, to estudando um pouco pra ver como vou adicionar as classes kakaaks. Mas, vou postar um post de alguns jogos que já fiz usando ela.

0

Isso é bem interessante, cara.
Deve ter sido muito difícil implementar loops e arrays.
Eu desejo sucesso nesse projeto que trata da base da tecnologia computacional.
:)

0
0

Excelente progresso! E a consistência inicial da linguagem demonstra que você esta no caminho certo, como estudo é totalmente compressível as decisões tomadas, e as sugestões aqui de construir diversos tipos de projeto, com diferentes objetivos acrescento eu, fazem mais sentido para que possa desprogramar a sua mente para um determinado objetivo e começar a treinar habilidades de resolução de problemas mais profundas.

Registrar o tempo que gasta para fazer isso e fazer mais rápido a cada nova sessão é muito importante.

1
0
-8

Minha sugestão é, não cometa o mesmo erro que a maioria das linguagens comete, + não é concatenação, ao invés de:

"O resultado é: " + resultado 

Faça:

"O resultado é: " .. resultado 

Outro detalhe (você não comentou) é a escolha por let, essa keyword tem uma sematica restritiva, não é sinônimo de local, local pode ser redeclarado no mesmo bloco, liberando a instância da primeira declaração, let só é liberado automaticamente no final do bloco:

local x = recurso_A()
-- A deve ser liberado na linha
-- abaixo
local x = recurso_B()

let x = recurso_A()
-- A linha abaixo deve gerar
-- um erro de compile time
let x = recurso_B()

Ou seja, local sugere a chamada imediata de liberação de de recursos, let pode guardar até o final

0
-9

Não se engane com "fazendo do zero" essa é uma das maiores mentiras que existem no mundo do desenvolvimento de software. Evite inclusive usar a frase em qualquer texto, passa inexperiência.

A julgar pela falta de tipagem estatística, imagino que seja um interpretador que você está desenvolvendo. Ótimo trabalho até aqui. 2 meses honestamente parecem muita coisa pra o que você tem, mas julgo que seja por causa do aprendizado.

Não recomendo fazer um curso por agora, vejo que você ainda não tem conhecimento aprofundado e muito menos conhecimento dos termos técnico básicos. Imagino que seja seu primeiro, então tenha paciência. Sei que pode parecer grande coisa para alguém que está começando, mas parsear e executar código é algo extremamente simples (compiladores é literalmente matéria de faculdade).
Tenha paciência e aperfeiçoe seu código. Faça 2, 3 interpretadores, compiladores, transpiladores, etc. Só assim você vai ter certeza que está pronto pra reproduzir a teoria pra outra pessoa. Ainda assim, ensinar é um ótimo método de aprendizagem. Se você sente real confiança e não tem medo de errar, vai fundo.

Algumas sugestões:

  • Sugiro substituir begin .. end por brackets, é mas apenas uma preferência pessoal, mas também uma opinião popular.
  • implementar constantes
  • implementar tipagem (pode continuar com tipagem dinâmica, mas dê a opção do usuário definir um tipo fixo. Sua linguagens não vai longe sem tipagem e, honestamente, é a parte mais divertida)
  • estruturas (dictionary simples ou structs caso implemente tipagem básica)

Se quiser conversar mais, me chama @lumi_nya no discord. Estou desenvolvendo um compilador a 2 anos, sem contar anos anteriores de estudo e protótipos. Posso te ajudar bastante se estiver realmente disposto à aprender

3

Se me permite fazer algumas correções no seu comentário...

A julgar pela falta de tipagem estatística, imagino que seja um interpretador que você está desenvolvendo.

Uma coisa não tem nada a ver com a outra. Se a tipagem da linguagem é *estática ou dinâmica, isso não tem nada a ver com a forma como a linguagem vai ser implementada: interpretada ou compilada.

Uma coisa é a linguagem de programação e outra coisa é a implementação dela. Linguagem de programação não é software. A linguagem C tem tipagem estática e existe intepretador de linguagem C (picoc).

Outro erro que você cometeu foi confundir anotação de tipos com tipagem estática. Uma coisa também não tem nada a ver com a outra. Isso aqui é um código Rust válido:

let a = 5;

Rust tem tipagem estática.

Isso aqui é um código Python válido:

a: int = 5

Python tem tipagem dinâmica.

Anotação de tipos não é "tipagem estática", são dois conceitos distintos. Pesquise sobre inferência de tipos.

implementar tipagem (pode continuar com tipagem dinâmica, mas dê a opção do usuário definir um tipo fixo. Sua linguagens não vai longe sem tipagem e, honestamente, é a parte mais divertida)

De novo você confundiu duas coisas distintas. Não ter anotação de tipos não significa que a linguagem não tem tipagem. PHP sempre foi uma linguagem tipada, desde a primeira versão, e por muitos anos não tinha anotação de tipos. JavaScript é uma linguagem tipada e não tem anotação de tipos.

Uma linguagem não tipada é uma linguagem que não difere como os dados na memória são tratados. Todo dado é tratado da mesma forma. É equivalente a uma linguagem que tem um tipo só, basicamente.

No mínimo ele mostrou que a linguagem dele tem dois tipos: inteiro e string. Portanto, é tipada.

Para não ser tipada de verdade, ela teria que não diferir dados na memória, ou o equivalente: ter um tipo só. Como é o caso da linguagem B, por exemplo. Ou o exemplo mais óbvio: assembly.

Não se engane com "fazendo do zero" essa é uma das maiores mentiras que existem no mundo do desenvolvimento de software. Evite inclusive usar a frase em qualquer texto, passa inexperiência.

Design de linguagens de programação não é desenvolvimento de software, é Programming Language Theory (PLT), um ramo da Ciência da Computação.

Repito: Linguagem de programação não é software.

0
2

Ok! Eu comecei mais como forma de estudo mesmo, achei o processo bem interessante. Sobre o begin e end, eu usei como base o Pascal kkk.

Realmente, ainda tô no começo e tenho bastante coisa pra aprender, principalmente na parte de conceitos mais teóricos. Esses 2 meses foram mais de tentativa, erro e entender o básico mesmo.

Obrigado pelo feedback!

0

Pessoa, chamou muito a minha atenção a forma didática, respeitosa, e porque não, carinhosa, com a qual você respondeu ao colega. Que coisa bonita de se ver nos dias de hoje.

Eu sou totalmente leigo em programação e estou iniciando nesse mundo com a ajuda das amiguinhas AI.

Em breve postarei aqui minhas aventuras tecnológicas e também aguardarei suas considerações.

Muito sucesso e felicidades para você!

0
Conteúdo excluído
1

Existem diversos cursos relacionados a desenvolvimento de compiladores e interpretadores, e certamente muitos ainda à serem feitos.
Recomendo o "Crafting Interpreters". É meio que o padrão quando se fala no assunto e se aprofunda bastante tanto na teoria, quanto na prática.
Não há problema em fazer mais um, mas defendo que o OP precisa de mais paciência e estudo antes de tentar reproduzir pra outros.

Conteúdo excluído
0