Como construir um compilador de Typescript?
Javascript/Typescript é uma linguagem que tem espaço reservado no meu coração, mas tem uma coisa que o ecossistema JS peca é no desempenho.
Recente tive que fazer uma implementação de leitura e escrita de arquivos com dotnet, coisa que ja tinha feito anteriormente com node, e fiquei abismado com a diferença de performance.
A partir dessa comparação, pensei na possibilidade de um compilador de TS. Não transpilar para JS, ou para algum método intermediário, como Java e C#, mas para linguagem de máquina!
Pensei em criar um compilador de Typescript com C ou Rust, mas não sei como fazer isso. Ja me planejei para passar na biblioteca e alugar o livro "Compiladores", mas seria legal ter um roadmap ou um resumo do mecanismo por tras do gerador de bits.
Como construir um compilador de TypeScript?
Basicamente, da mesma forma que vc escreve um compilador de qualquer outra linguagem. Mas não é tão simples assim, dê uma lida aqui para ter uma ideia do tamanho da tarefa (e do quanto precisa estudar só pra começar).
Depois, para se "inspirar", pode se basear em um já existente, pra ver como é, pegar ideias, etc.
O kht já deu uma mostra do trabalho que é fazer isto e que alguém já fez o que deseja, então talvez seja melhor usar o que existe (não sei se é bom e pelo que entendi está sempre atrasado).
Eu imagino que quem fez nem criou o compilador de fato, pelo menos uma parte. O compilador é separado em frontend e backend. Eu imagino que pegaram o frontend de TS criado pela Microsoft e se bobear não mexeram em nada nessa parte. O que eles devem ter mexido, e não feito do zero é o backend.
O compilador tem a parte da frente que entende a linguagem fonte que compila códigos e se gosta de TS como ela é então não tem porque mexer nisso. A parte que entende a linguagem alvo, ou seja, o que gera o código final compilado por padrão gera JavaScript, e ali ele gera a linguagem intermediária do LLVm que depois vai gerar um código nativo ou alguma outra forma.
Isso deve ajudar muito a performance, mas pode não ajudar tanto quanto uma linguagem pensada para ser rápida. TypeScript é compatível com JavaScript, então é necessário ter uma infraestrutura para fazer isso funcionar, eu entendo que esse projeto fez isso também. E essa infra tem um custo no processamento. Tem mecanismos que algumas linguagens adotam que sempre vão custar caro, não tem como escapar.
Tentar fazer direto para linguagem de máquina é algo que até os mais experientes não querem fazer, e sabem que fracassarão de alguma forma.
TypeScript é uma das linguagens mais complexas já criadas, não é um bom começo.
Provavelmente se começar estudar o processo você vai desistir, justamente por não entender a complexidade é que acha que vale o esforço.
Faz sentido para você?
Espero ter ajudado.
Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).
Devido a natureza do JavaScript ser dinamicamente tipado acho que não combina muito com assembly, vai ter problemas de performance do mesmo jeito porque vai precisar verificar tipos e fields toda hora o que não e eficiente.
alem disso TS/JS e bem complicado, tente fazer sua própria linguagem compilada do 0, faca um compilador simples que pega o AST e gera assembly direto sem llvm sem GCC, e roda alguma coisa como NASM ou o fasm pra realmente gerar o binário.
Acho que se tu conseguir criar um frontend do Ts pode compila-lo usando o llvm. Não conheço bem o projeto, mas ele vai gerar teus binários, se não me engano... acredito que você vá eliminar os desafios direto no frontend, de novo, não conheço bem o llvm mas ele muito provavelmente vai te pedir alguma AST, daí é pegar a sintaxe do TS e montar de forma que o llvm entenda.
Ou faz como a galera da PUC-RJ e monta tua linguaguem com menos de 30 mil linhas de código na mão!! kkkk Lua é uma obra de arte, bicho!
Quer outro caminho? Se quer montar a parada como um Deus da programação, dá uma olhada no TCC(Tiny C Compiler)! É um pequeno compilador da linguagem C escrito pelo gênio Fabrice Bellard(TCC, QEMU, entre outros...), é facil pegar o fonte do Tcc e estudar, faz uma engenharia reversa e parte dele pra montar o teu. Mas aviso, é bem confuso!! Eu já tentei isso e o cara é uma maquina de código, porém programa como os antigos, então vai achar muita variavel assim: k, j , C.... nem preciso falar que deve saber linguagem C em qualquer um dos casos, né?