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

Como a minha irritação com o JavaScript me levou a criar uma linguagem de programação

Em 2020, eu comecei no mundo da programação, mais especificamente na área de desenvolvimento Front-End, e foi ali que começou meu primeiro contato e meu rápido estranhamento com o JavaScript. Pra um iniciante, lidar com os "nuances" do JS era muito difícil, como a diferença entre null e undefined, o comportamento do this mudando completamente entre functions e arrow functions, a coerção de tipos imprevisível etc. Essa estranheza, vinda de uma linguagem que foi criada em apenas 10 dias, fez com que eu evitasse ao máximo o uso do JavaScript, fazendo eu buscar refúgio no Python, que é uma linguagem com uma sintaxe bem mais simples. Com o passar do tempo, consegui entender melhor o JS, mas mesmo assim, toda essa estranheza dele, me irrita até hoje.

WebAssembly e a busca por uma alternativa

Recentemente, eu estava pensando comigo mesmo, se existia alguma alternativa ao JavaScript para o navegador. Eu queria algo mais simples de se usar, e até mesmo mais rápido. Foi aí que eu descobri que existe o WebAssembly (Wasm). Foi aí que surgiu uma ideia de criar uma linguagem de programação que compila pra Wasm, para que eu possa usar como uma alternativa ao JavaScript. Eu não tenho o objetivo de fazer o SimpleScript desbancar o JavaScript, mas servir como uma alternativa viável e performática pra sites que não precisam de um framework, compilando diretamente pra Wasm.

Por que Zig e LLVM?

Quando decidi que queria criar essa linguagem, eu decidi que queria simplicidade, mas não queria abrir mão da performance. Foi assim que cheguei ao Zig e ao LLVM, com o Zig sendo usado pra gerenciar a memória de forma manual e segura, e o LLVM otimizando e transformando em binário nativo de alta performance a Representação Intermediária (IR) no qual o código SimpleScript é traduzido.

Um dado curioso de performance: Em testes iniciais de estresse aritmético, uma lógica que levou cerca de 41 segundos no Python foi processada em menos de 1 segundo no SimpleScript.

Como é o código hoje?

Aqui está um exemplo de um código feito em SimpleScript:

const LIMITE: int = 18
var idade: int = 20

if idade >= LIMITE {
    say("Acesso permitido")
} else {
    say("Acesso negado")
}

for i in 0..5 {
    say("Iteração número:", i)
}

O que vem por aí?

O SimpleScript ainda está dando os seus primeiros passos, ele ainda possui alguns bugs e muitas funcionalidades básicas faltando, mas o foco agora é estabilizar o núcleo da linguagem pra depois focar 100% no backend para WebAssembly.

Eu sou novato no Zig e no LLVM, algumas coisas eu vou aprendendo através de tutoriais no YouTube ou com a IA.

O projeto é open-source e adoraria receber feedback (e as críticas construtivas) de vocês: https://github.com/VictorFrancelino/simplescript

Carregando publicação patrocinada...
3

Não é querendo ser alguém chato, se vc possui dificuldade de lidar com os "nuances" da linguagem provavelmente você terá mais complicações na implementação de uma nova linguagem.
Acredito que este seja um comportamento interessante de auto-avaliação, a ideia não se sustenta tecnicamente e com o passar dos anos você vai me agradecer de ter observado com outros olhos.

Não adianta criar uma nova linguagem se ela é mais do mesmo, outro ponto é que a problemática precisa ser real e te digo, trabalho alguns anos com JS, e embora a linguagem tenha problemas, os citados no post não possuem muita relevância.

Diferenças entre undefined e null

Outras linguagens como C# não possuem o undefined, e isso traz características normalmente da tipagem forte em que um tipo atribuido para aquele espaço de memória não pode ser modificado para outro tipo exceto se for para algum já herdado. Então aqui faz sentido o null porque você tem um espaço de memória que agora não aponta mais para o objeto e sim para NULL, é aqui que mora o problema de linguagens gerenciadas/interpretadas. No JavaScript temos o total inverso, o espaço de memória pode ser alocado com qualquer outro tipo em runtime (não que fisicamente assim aconteça), o problema é que o Wrapper do Objeto de JS no C++ é bem complexo para poder ter esta dualidade de performance/maleabilidade, acarretando na possibilidade de outra vertente da concepção de nullidade.
Sem contar que no JS temos o hoisting que a linguagem faz automaticamente para funções, é uma das facilidades da linguagem por ser imperativa/procedural de script, mas que implica na função sendo realocada para antes de uma alocação de memória (isso quando a chamada também ocorre antes) considerando assim um ponteiro para um objeto que nesse caso estará com o estado de undefined, veja abaixo:

sayHello(); // undefined
var message = "Hello, world!";

function sayHello() {
    console.log(message);
}

Que a própria linguagem já corrigiu a muitos anos atrás com const:

sayHello(); // ReferenceError: Cannot access 'message' before initialization
const message = "Hello, world!";

function sayHello() {
    console.log(message);
}

Mas você pode sim fazer:

const message = "Hello, world!";
sayHello(); // "Hello, world!"

function sayHello() {
    console.log(message);
}

this no JS

Não vejo problemas com o this. Vejamos, a crítica ao this geralmente surge de uma leitura incompleta sobre como os contextos funcionam no JavaScript e os famigerados closures/functions/methods e as suas aplicabilidades práticas.
É um tanto quanto simples:

  • É função? this refere-se ao objeto da função;
  • Era função e agora você atribuiu a uma propriedade de objeto virando um método? agora o this é o objeto;
  • Esta executando o código arbitrariamente no arquivo ou tag script? o this é contexto arquivo/script pág;
  • É uma closure? o this é agora o contexto imediato acima (reaplicando as regras anteriores);
  • É um método declarado? this refere-se ao objeto/classe instance;

Problema real

O problema na verdade é o uso incorreto da linguagem, por ser uma linguagem maleável e de fácil curva de aprendizagem muitos dev's acabam utilizando incorretamente e/ou acabam não entendendo de fato como o ambiente funciona. Lembre-se, é mais fácil criticar do que procurar entender.
Muitos erros a linguagem já corrigiu, e embora eu concorde que o protótipo tenha sido feito em 10 dias como mencionado, a linguagem não parou no tempo e tem sido aprimorada/testada há décadas.

Novas linguagens

Caso prefira seguir algum longo período não mensurável de tempo construindo sua própria linguagem, ainda que tenha coesão e resolva um problema real seu, como angariar pessoas para sua comunidade?
O sucesso de uma linguagem está diretamente associado à uma comunidade ativa e motivada, afinal ninguém constrói isso sozinho, uma vez que o workflow de um dev exige muitos pacotes e soluções no dia a dia, como sua linguagem vai abordar a interoperabilidade entre pacotes já existentes? Uma linguagem sem lib's é uma linguagem morta, infelizmente.
Manutenabilidade também é um problema.


Enfim, cada um faz a sua avaliação das problemáticas das linguagens, nem tudo fará sentido para todos, mas eu consigo encontrar alguns bons motivos para a comunidade JS seguir com o rumo em que está seguindo, e na MINHA PERCEPÇÂO, temos tido resultados.

#PAZ

2

Gostei muito do seu comentário, passei o dia pensando sobre o que você disse e cheguei nessas conclusões:

Mesmo o JavaScript sendo uma linguagem muito poderosa, que gera resultados e que ao longo dos anos foi evoluindo, um problema que ela não conseguiu resolver totalmente foi a falta de previsibilidade, você mencionou que o entendimento sobre o this é simples, mas você citou 4/5 ocasiões em que ele se refere a coisas diferentes, pra você isso realmente pode ser simples, mas pra alguns iniciantes em programação, aprender que uma palavra reservada muda de sentido dependendo do contexto gera uma carga mental alta. O SimpleScript é focado nesses programadores que buscam uma alternativa com mais previsibilidade e menos "nuances".

Na questão de angariar mais pessoas para a comunidade e a interoperabilidade entre pacotes, meu foco inicial é o WebAssembly Interface Types (WIT). Acredito que seguindo os padrões do Wasm, o SimpleScript poderá "conversar" com bibliotecas de outras linguagens sem que eu precise reconstruir todo o ecossistema do zero.

Obrigado por dar a sua opinião, isso ajuda muito a refinar o direcionamento do projeto.

1

Interessante, como novato na programação, quando vejo algo mais fácil fe compreender e usar me empolga, embora eu fique mais empolgado com o difícil pois estimula muito mais o meu cérebro, mas interessante. Nao tenho nada a acrescentar nas suas ideias e nada a questionar tambem pois sou iniciante. Vou acompanhar o projeto de perto e ver como funciona a aplicação do mesmo.

1

Obrigado pelo apoio, fico muito feliz em saber que você vai acompanhar o projeto :)

Como você é iniciante na programação, seu feedback sobre a experiência de uso da linguagem será valioso demais. O objetivo é que a linguagem seja intuitiva. Conforme o projeto evoluir, a ajuda da comunidade pra encontrar bugs e sugerir melhorias será essencial.

1

Eu comecei a programar com o Cobol, para passar ao Java e ter que traduzir todo o software de Cobol para Java.
Apareceram muitas linguagens e muitas desapareceram logo.
No âmbito web front end tem uma bagunça terrível, cada dia surge algo de novo que come sempre mais RAM.
A tua ideia é interessante, espero que progride rapidamente. Aconselho focar na economia de memória porque hoje em dia é um tema muito importante. Boa sorte.

1

Obrigado pelo apoio e pelo conselho :)

A economia de memória é um pilar central do projeto, tanto é que foi por esse motivo que eu escolhi o Zig pra construir o SimpleScript, já que ele me fornece um gerenciamento de memória manual, o objetivo é que o binário final seja minúsculo e consuma apenas o estritamente necessário.

1

Po cara a iniciativa eh sempre valida. Dahora seu projeto. Mas o JS é muito odiado pq nao é compreendido. Claro tem alguns pequenos bugs eternos mas a linguagem evoluiu de mais. A sua raiva com JS não vem de ele ser ruim ou buggy, vem simplesmente de você não se aprofundar o suficiente nela. Recomendo ler a seria toda de You Don't Know JS. É uma linguagem maravilhosa

1

Obrigado pelo comentário.

O JS é sim uma linguagem bem poderosa quando compreendida, mas o meu objetivo com o SimpleScript é justamente sobre a barreira de entrada.

Eu acredito que uma linguagem deve priorizar a intuição antes da memorização de exceções, no JS o iniciante investe muito tempo tentando entender o porquê da linguagem se comportar de certas formas, o objetivo do SimpleScript é ser o contrário: em vez de você se aprofundar pra entender os "nuances" da ferramenta, você se aprofunda pra dominar 100% do que ela pode construir.

Eu quero que o foco seja na lógica do projeto e não nas peculiaridades da sintaxe.

O SimpleScript é simplesmente uma alternativa pra iniciantes em programação ou até mesmo pra programadores já experientes que buscam uma alternativa ao JS que tenha mais previsibilidade e que seja mais intuitiva de se usar.

1
1

Obrigado pelo apoio, pode se sentir a vontade pra dar seu feedback em relação a sintaxe e a experiência de uso do SimpleScript

1

Eu também não gosto do JavaScript, mas como todo bom profissional, adaptação é necessário. Posso dizer o mesmo para Python. De longe a linguagem que mais odeio, mas infelizmente quando é necessário, tenho de usar.

Acho interessante a ideia de criar uma linguagem de programação. As vezes isso é feito em projetos para facilitar coisas (especialmente nas áreas de gamedev). No entanto, pelo o tom do post, parece que a ideia é que a linguagem é mais do que para meramente estudos.

O que vai ser do futuro da linguagem? Você tem um direcionamento? É meramente uma alternativa ao JS ou ele tem algo especial?

A linguagem queridinha para wasm hoje em dia é Rust, por motivos óbvios. Pode ser interessante que você estude um pouco de Rust para entender o porquê.

Desde já, gostaria de apoiar, mas como meu conhecimento em Zig beira o zero, só iria atrapalhar mais do que ajudar.

Gostei do fato que você usou Zig. Afinal é uma ótima linguagem que promete bastante coisa boa. Quanto mais projetos, mais forte o Zig fica.

1

Realmente, a linguagem é mais do que meramente pra estudos, eu comecei ela com a ideia de criar algo que fosse só pra eu usar nos meus projetos, mas decidi deixar o projeto público, já que ele pode ser útil pra outros devs que também possuem a mesma necessidade de uma alternativa ao JS.

No momento o objetivo do SimpleScript é apenas ser uma alternativa viável ao JS, com o passar do tempo pode ser que o objetivo seja fazer dele algo a mais do que isso. Acredito que o diferencial seja a simplicidade, performance, facilidade e intuição que ele fornece ao programador, já que o que eu tinha em mente quando criei esse projeto foi criar algo que fosse bem mais simples de se usar do que o JS.

Mesmo que você não tenha conhecimento em Zig, o feedback sobre a sintaxe e a experiência de uso do SimpleScript já ajuda demais :)

1

Ainda não usei a linguagem propriamente dita, então não posso falar muito sobre. Gosto da ideia.

Sobre a sintaxe, eu particularmente não ligo. Depois de ter usado certos tipos de linguagens com sintaxe esquisita, eu deixei de me importar com isso. Na superfície, me lembra o próprio JavaScript, então a adaptação é bem mais rápida. Só o fato de não usar o modelo esquisito do Python, para mim já tá perfeito.

1