emacs 源码分析(一)

<2022-09-14 Wed>

emacs源码分析(一)

最近心头又一热,想再学学emacs的源码,对于emacs-lisp这个语言越来越喜欢,所以有上面Emacs Lisp Intro的学习,看看info页,做做它的习题,感觉挺爽。

因为如果从emacs的源代码入手直接开始学习我觉得非常难,就像之前看emacs的源码一样,到最后进行不下去了也就只能放弃了。所以先选择熟悉emacs-lisp语言,相信对于最终emacs的源码分析会很有帮助。

但是对于emacs的内存结构也一直好奇,为什么Lisp_Object要是一个不完全类型?它是怎么实现诸如Lips_StringLisp_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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值