5 puntos por alstjr7375 2021-03-18 | 6 comentarios | Compartir por WhatsApp
  • Se puede usar JavaScript/TypeScript al integrar el runtime de Deno en Emacs

  • El motor V8 está mejor optimizado que la VM de Elisp

  • Las carencias de Emacs en procesamiento asíncrono y multihilo pueden resolverse con JavaScript (Async/Await, Web Workers), y también hay soporte para WebAssembly

  • Es posible la aceleración por GPU usando native-comp, que convierte Elisp en código nativo, y WebRender de Firefox como compositor (experimental)

Hace poco apareció en Hacker News.

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

6 comentarios

 
ryuheechul 2021-03-18

No conozco mucho Emacs porque antes solo había usado Spacemacs, pero leí la parte de abajo en la página principal y me pareció interesante. Al final, parece que la clave es mejorar el rendimiento y ampliar el soporte de lenguajes a través de Deno para dinamizar el ecosistema.

Performance#

v8's world-class JIT offers the potential for massive performance gains. For a simple benchmark (fibonacci), using the following implementations:

(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);

};

La implementación en JS de emacs-ng registra una velocidad más de 50 veces superior a la de emacs 28 sin native-comp al calcular fib(40). Con native-comp en nivel 3, JS sigue siendo más de 15 veces más rápido. Esto, junto con el Async I/O de Deno, WebWorkers y WebAsm, te da las herramientas para hacer de Emacs una experiencia más fluida y rápida sin tener que instalar herramientas adicionales para ejecutarlas como procesos en segundo plano ni preocuparte por las versiones de bibliotecas compartidas: rendimiento completo con TODO en la capa de scripting.

 
alstjr7375 2021-03-18

En realidad, la extensibilidad en sí no está nada mal.

Los macros propios de Lisp.

Compatibilidad con módulos dinámicos, así que hay bindings con lenguajes nativos (un proyecto representativo sería Tree-sitter).

También puede usar internamente un emulador de terminal y un navegador nativos gracias al soporte de libvterm y Xwidget...

https://github.com/canatella/xwwp

El problema es el I/O y los hilos.

Como el I/O no está implementado de forma asíncrona, con archivos grandes se congela, y aunque crees hilos, soporta concurrencia pero no paralelismo, así que cuando la carga aumenta casi siempre termina habiendo problemas. 😢😢😢

Pero este proyecto,

https://github.com/DavidDeSimone/ng-async-files

parece mostrar un intento de dar soporte al procesamiento asíncrono de archivos, así que me está interesando.

Y además se puede aprovechar el enorme ecosistema de NPM.

 
alstjr7375 2021-03-18

https://emacs-ng.github.io/emacs-ng/main-features/

Como es una capa agregada de forma estricta, se pueden aplicar limpiamente los parches de upstream.

Como ejemplo representativo, ayer intenté fusionar la rama native-comp del mirror de Emacs,

y aunque son más de 1200 commits, solo aparecieron conflictos en 4 o 5 archivos.

https://github.com/emacs-mirror/emacs/tree/feature/native-comp

https://github.com/emacs-ng/emacs-ng/pull/185

 
alstjr7375 2021-03-20

Sin darme cuenta, terminé uniéndome al equipo jaja

 
xguru 2021-03-20

Vaya, qué genial. ¡Mucho ánimo!!

 
alstjr7375 2021-03-20

¡¡Gracias!!