native Emacs Lisp

上次大嘴巴风波后教主估计伤透了心。Emacs可能是他最后的寄托了,比起Emacs Lisp教主大概也更喜欢Scheme,不过糟糠之妻不下堂啊。很少见教主在其他主流GNU software(GCC之流)的邮件列表发言的。

2 个赞

dynamic module,比较费劲。功能用c写好,还要编译,运行。不如elisp直接编写后运行来得爽。

1 个赞

所以你又要爽利又要快,这不是矛盾的吗?

首先Lisp方言是全引用类型,没有值类型,这一点就得输点性能。其次,Lisp方言都有很强的动态性。比如Elisp里catch throw乱跳/Scheme的continuation,generic的动态分派,full featured closure。有了这些语言特性写起来是爽了,付出运行时的代价是必然的。哦,Lisp系普遍都是有GC的,这又得输一筹。

还有object system为了实现自省,struct的memory layout必然没有C/Rust/C++高效。


遇到几个性能热点,用C/Rust写好一劳永逸,难道不比大动干戈换Guile来更环保吗?

Lisp本来就是挺非主流的语言,Emacs Lisp更是非主流中的非主流。某种意义上,把这个非主流的语言换成一些“主流”语言,比如Guile,甚至Python,JS。真的就好吗?

换语言,可以直接利用这些语言的生态,的确是件好事。但别忘了按照二八定律,能决定Emacs能力的主要是看20%的开发者,而不是看80%的用户。在20%的开发者里,就全部都是掌握数门的语言的程序员了吗?

事实上,helm的维护者Thierry主业是攀岩,论坛里的 @tumashu 是在政府机关工作的公务员,他们都不是程序员,很可能他们都只会Emacs Lisp来hack Emacs。如果唐突把Emacs的开发语言换成JS Py之流,对这部分人来说就意味着他们没法继续hack Emacs了,对Emacs的社区无疑是很大的损失。

dynamic module其实是一个很好的解决方案了,本身C有ABI标准王道,基本C/C++/Rust甚至Go的生态都能通吃。在扩展生态如此可观的情况下,用JS/Py/Java这些语言扩展的必要其实很小了。实在不行,你还可以用Unix的传统艺能IPC通信嘛,对于一般的计算,IPC通信那点开销基本忽略不记了。

4 个赞

EAF走起,哈哈哈哈

其实,我只希望有真正的多线程就行了,其他都挺好的。看大家讨论热烈,突然想为何不能这样处理: 遇到性能瓶颈用c或者rust写个module,其他的通用库全部从编译成native(dump方案不是很完善),剩下的第三方库不用做任何改变。这应该是现阶段最佳的方案了,既兼顾性能也兼顾了可维护性。对emacs来说,生态真的太重要了,否则不如直接上vscode。

1 个赞

guile 3.0好像发布了,不知道现在对 elisp 的支持到达什么样的程度了。

对,看到讨论还是挺热烈的,并不像上面说的凉透了

如果兼容性好也许也是一条重生之路。remacs估计是指望不上了,也解决不了elisp本身的问题。

说实话,发展都太缓慢了

讨论是挺热烈,只不过都是口嗨

echo下,附上一个十年前的抱怨,现在依然成立

http://xahlee.info/UnixResource_dir/writ/emacs_switch_to_scheme.html

都不用完美多线程,company能多线程,就别无所求了。补全的时候还要顿一下这个有点受不了。

确实,company体验不如其他编辑器。company能不能用make-thread?

主要是因为和 Symbolics 的事情对他们主导设计的 Common Lisp 有极大偏見,结果连 GNU 自家的 GCL 和 CLisp 都不受待见。另外我怀疑 RMS 理解上的 Scheme 指的是 ITS 上用 MacLisp 实现的 Scheme,即 R^0RS

EAF底层用的是dbus,还是进程间通信。

另一个进程间通信的Emacs应用telega,Emacs的Telegram客户端。基本上是很流畅的。


其实仔细想想,Js/Py/Java的生态主要还是用来开发应用级的程序,用来解决性能问题大概率指望不上。EAF用Python是因为懒猫觉得封装Elisp的QT绑定太耗费时间了。像这种应用,直接用IPC就很好了,非侵入式

大家一直很关心LSP的速度问题。说难听的,还是JSON格式太弱智,拖了Emacs后腿。换成Sexp,Emacs的速度绝对一骑绝尘

1 个赞

那写个proxy把json转成sexp,lsp性能会不会提升?

这个 proxy 的性能也会影响到 Emacs 啊。现在解析都是用 C lib 了,确定这里还是真正的瓶颈吗?

换 Guile 并不是要用scheme取代elisp,这一点你先弄清楚啊

按某人的说法就是用scheme换elisp。

换个解释器那就更无聊了。Guile做不到dynamic module了,另外Guile的生态也不怎么样。更何况Guile开发者也是群咕鸽(天国的Emacs lisp & JS support完成了吗)。

此外UI部分的native function怎么port到Guile,也是问题

唔,那可能你们俩对这事都有误解。

在win10上怎么编译emacs的native-comp分支?mingw64没找到libgccjit的package,重新编译带libgccjit的gcc v9.2版本还报错。头大啊。