<2022-09-14 Wed>
emacs
源码分析(一)
最近心头又一热,想再学学emacs
的源码,对于emacs-lisp
这个语言越来越喜欢,所以有上面Emacs Lisp Intro
的学习,看看info
页,做做它的习题,感觉挺爽。
因为如果从emacs
的源代码入手直接开始学习我觉得非常难,就像之前看emacs
的源码一样,到最后进行不下去了也就只能放弃了。所以先选择熟悉emacs-lisp
语言,相信对于最终emacs
的源码分析会很有帮助。
但是对于emacs
的内存结构也一直好奇,为什么Lisp_Object
要是一个不完全类型?它是怎么实现诸如Lips_String
,Lisp_Vector
这样的结构的?等等。
我这里选择的版本是27.2
或者28.1
。
globals.h
是如何生成的
这个文件是在编译过程中生成的,里面有很多宏定义是代码里需要用到的,比如在跟踪init_alloc_once()
时,第一个变量gc_cons_threshold
的定义就来自globals.h
文件,相信对于理解内存结构会很有帮助。经过查找会发现在src/Makefile.in
中有如下内容:
gl-stamp: $(libsrc)/make-docfile$(EXEEXT) $(GLOBAL_SOURCES)
$(AM_V_GLOBALS)$(libsrc)/make-docfile -d $(srcdir) -g $(obj) > globals.tmp
$(AM_V_at)$(top_srcdir)/build-aux/move-if-change globals.tmp globals.h
$(AM_V_at)echo timestamp > $@
globals.h: gl-stamp; @true
这里就很容易理解了,globals.h
是通过make-docfile
生成的,将命令隔离出来运行一下看看:
$ make-docfile -d ~/dnld/emacs-28.1/src -g emacs.o > emacs.o.make-docfile
生成的emacs.o.make-docfile
内容如下:
/* This file was auto-generated by make-docfile. */
/* DO NOT EDIT. */
struct emacs_globals {
Lisp_Object f_Vafter_init_time;
#define Vafter_init_time globals.f_Vafter_init_time
Lisp_Object f_Vbefore_init_time;