5 pontos por alstjr7375 2021-03-18 | 6 comentários | Compartilhar no WhatsApp
  • É 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.

https://news.ycombinator.com/item?id=26453174

6 comentários

 
ryuheechul 2021-03-18

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)

  n

(+ (fibonacci (- n 1)) (fibonacci (- n 2)))))

const fib = (n) => {

if (n <= 1) {

    return n;

}

return fib(n - 1) + fib(n - 2);

};

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.

 
alstjr7375 2021-03-18

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 libvterm e 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.

 
alstjr7375 2021-03-18

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-comp do 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

 
alstjr7375 2021-03-20

Acabei entrando para a equipe sem querer haha

 
xguru 2021-03-20

Uau, que incrível. Boa sorte!!

 
alstjr7375 2021-03-20

Obrigado!!