Executando verificação de segurança...
6

Pitch: Carla, a linguagem mais baixo nivel que C?

Quem sou eu?

Meu nome é Lucas Silveira. Tenho 16 anos, e programo desde os 8.

Grande parte do meu tempo de vida, foi na frente de uma IDE. E eu sempre fui apaixonado por linguagens.

Dito isso...

O que é Carla, Morgana e Runa?

Carla, Morgana e Runa são todas "linguagens" criadas por mim. Eu venho trabalhado nisso de forma silenciosa a muito tempo, e vi recentemente projetos de linguagens sendo anunciados aqui, e notei o quão maior é o escopo do meu projeto.

Isso, de forma alguma deve diminuir a conquista dos outros, apenas aumentar um pouco a minha (talvez)

O início

Carla nasceu e foi maturada com o tempo, já usou LLVM como back-end, e até Assembly diretamente. Mas, eu sempre achava ruim isto, e queria ter um "ecosistema" real. Disto, nasceu o Morgana, uma alternativa ao LLVM no qual foi feita para o Carla. Porém com algumas diferenças do LLVM:

  • Compilação rápida (Maior problema do Rust, por exemplo)
  • Fácil acesso à comunidade (Falaremos melhor sobre isso logo)
  • Portabilidade extrema (tal como LLVM, porém oferecendo um back-end complexo)

Extensors

Extensors são "pacotes" no qual você baixa para ter seu código Morgana finalmente transformado em assembly.

E, como você pode baixar um complemento para o Morgana, o ideal era que este complemento fosse fácilmente adaptavel por você, ou por "desenvolvedores enxeridos" e interessados em melhorar a performance de seu projeto.

Para isto, eu decidi usar lua como a linguagem dos extensors. Mas, tive alguns problemas com o Lua 5.4 oficial da PUC-RJ para AARCH64, e, decidi criar o meu interpretador de lua. Com isso, nasce o Runa.

Runa

Runa, nada mais é do que um interpreatdor MINIMALISTA, contendo apenas o que eu julguei necessário para uma linguagem "Basica" como o Lua usado nos extensors. Ele tem um FFI direto com C, compartilhando do mesmo endereço virtual de memória, permitindo comunicação fina entre C e Lua.

Runa também é escrito em Rust, sendo 0 memory-leaks (se bem usado). O que torna Runa uma opção viável para programas embarcados, de hardware altamente limitado.

Além de que, fiz algumas medições básicas comparando o tempo de runtime do Runa, JavaScript e Python.

Rodei o mesmo código (Fibonacci NÃO RECURSIVA de 80) nas 3 linguagens, e obtive:

Runa:
Output: 14472334024676220
em: 0,003s

JavaScript (Node.js):
Output: 14472334024676220
em: 0,033s

Python:
Output: 14472334024676221
em: 0,013s

E, sim, eu também não sei por que o Python deu um resultado diferete, mas vida que segue.

E por que eu deveria conhecer Carla?

Além de Carla ter seu próprio ecosistema, assim como zig, ou clang, Carla tem também o objetivo de ser sério, e não um projeto de brincadeira. Uma sintaxe CONCISA, muito inspirada em C, Rust, Zig e Go.

Sendo, praticamente um wrapper de Assembly (C like), mas, com coisas de qualidade de vida. Como, um "print" de strings estáticas. (puts como statement), e coisas do tipo.

Por exemplo, um Hello, world básico em Carla (que vem quando vocês usam "carla init"), seria:

@_start
void main = () {
    puts "Hello, world";
}

E, sim. você pode baixar e testar o Carla no seu próprio pc.

No repositório oficial (https://github.com/lucasFelixSilveira/carla) vc pode baixar o "./install.sh", e rodar. Será instalado na sua máquina o Carla e o Morgana. (Runa já vem empacotado no Morgana).

Por enquanto, posso garantir o funcionamento do Carla e do Morgana APENAS no Linux. Mas, claro, traremos pro Windows e outras plataformas.

Lembrem-se que Carla é para ser mais baixo nível do que C (em alguns quesitos). Não respeito o padrão de outras linguagens nem mesmo em como estruturei meus compiladores e interpretador. Eu fiz como acho que deve ser feito.

Assim como Go tem a sintaxe que Ken Thompson acha que deve ter, Carla tem a sintaxe que eu acho que deve ter, da forma que eu idealizo uma linguagem ideal. Isto quer dizer, que sim, haverá coisas que só funcionam em X aplicação. (Tal como o puts)

Conclusão

Eu gostaria MUITO que vocês dessem uma olhada no Carla, no Morgana e até no Runa, me passasem um bom feedback do que acham e, claro, deixar uma estrelinha nos repositórios!

Agradeço a atenção!

https://github.com/lucasFelixSilveira/runa
https://github.com/lucasFelixSilveira/morgana
https://github.com/lucasFelixSilveira/carla

Carregando publicação patrocinada...
1

Opa, Lucas! Tudo bem? Primeiramente queria dizer que adorei teu post e queria te parabenizar por essas 3 linguagens, tu certamente é um programador diferenciado.

Mas analisando esse problema de diferença entre o resultado de Runa, JavaScript e Python, acredito que eu saiba qual é o problema:

Seu fibonacci(80) na verdade é um fibonacci(79) pelo que percebi (mas isso não tem nenhum problema, só depende se você considera ou não o primeiro número na implementação).

O fibonacci(79) resulta em 4472334024676221, ou seja, o Python tá certo.

Talvez o fato de que JavaScript e Runa apresentarem o mesmo resultado seja a maneira de como eles lidam com números.

No JavaScript, quando você define um valor numérico (mesmo se for inteiro) ele é um "Number", que na prática é um float64/double e quando esse valor cresce demais você não consegue mais trabalhar com ele e precisa trabalhar com BigInt.

Usando declarações de número com sufixo "n" ele entende que eles são BigInt. Ex.: const num = 88n

Já o Python funciona de uma maneira diferente. Quando tu define um número inteiro no Python ele usa uma lógica de "big integers" automática, sempre que o valor cresce ele aumenta a capacidade sozinho.

Talvez Python tenha abordado dessa forma porque a linguagem tem um foco na simplicidade e na ergonomia.

Olhando para os resultados, talvez a tua linguagem implemente isso de uma maneira semelhante ao JavaScript.

Era apenas isso. Novamente, adorei seu post e te desejo sucesso na área!