-
É possível usar JavaScript/TypeScript no Emacs integrando o runtime Deno
-
O motor V8 é mais otimizado do que a VM do Elisp
-
É possível lidar com as limitações do Emacs em processamento assíncrono e multithreading com JavaScript (
async/await, Web Workers), e também há suporte a WebAssembly -
Aceleração por GPU é possível usando o
native-comp, que converte Elisp em código nativo, e o WebRender do Firefox como compositor (experimental)
Há pouco tempo isso apareceu no Hacker News.
6 comentários
Usei pouquíssimo Emacs no passado, praticamente só o Spacemacs, então não conheço muito bem, mas li a parte abaixo na página principal e achei interessante. No fim das contas, parece que o ponto central é melhorar o desempenho por meio do Deno e ampliar o suporte a linguagens por extensões para ativar o ecossistema.
Performance#
A JIT de nível mundial do v8 oferece potencial para ganhos massivos de desempenho. Em um benchmark simples (fibonacci), usando as seguintes implementações:
(defun fibonacci(n)
(if (<= n 1)
const fib = (n) => {
};
A implementação em JS do emacs-ng roda mais de 50 vezes mais rápido que o emacs 28 sem native-comp para calcular fib(40). Com native-comp no nível 3, o JS roda mais de 15 vezes mais rápido. Isso, junto com Async I/O do Deno, WebWorkers e WebAsm, dá a você as ferramentas para tornar o Emacs uma experiência mais fluida e rápida sem precisar instalar ferramentas adicionais para executar como processos em segundo plano nem se preocupar com versões de bibliotecas compartilhadas — desempenho total com TUDO na camada de scripting.
Na verdade, a extensibilidade em si não é ruim.
Os macros característicos do Lisp
Suporte a módulos dinâmicos, com bindings para linguagens nativas (projetos como o Tree-sitter são exemplos representativos)
Com suporte a
libvterme Xwidget, também dá para usar internamente um emulador de terminal e um navegador nativos..https://github.com/canatella/xwwp
O problema é I/O e threads.
Como o I/O não foi implementado de forma assíncrona, arquivos grandes acabam causando travamentos, e mesmo criando threads, há suporte a concorrência, mas não a paralelismo, então quando a carga aumenta, os problemas acabam aparecendo inevitavelmente. 😢😢😢
Mas este projeto
https://github.com/DavidDeSimone/ng-async-files
parece mostrar um esforço para dar suporte ao processamento assíncrono de arquivos,
então estou ficando interessado.
E ainda dá para aproveitar o vasto ecossistema do NPM.
https://emacs-ng.github.io/emacs-ng/main-features/
Como é uma camada adicionada de forma estrita, dá para aplicar os patches do upstream de maneira limpa.
Como exemplo representativo, ontem tentei fazer o merge da branch
native-compdo mirror do Emacs.São mais de 1200 commits, mas só houve conflito em 4 ou 5 arquivos.
https://github.com/emacs-mirror/emacs/tree/feature/native-comp
https://github.com/emacs-ng/emacs-ng/pull/185
Acabei entrando para a equipe sem querer haha
Uau, que incrível. Boa sorte!!
Obrigado!!