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;
#define Vbefore_init_time globals.f_Vbefore_init_time
  Lisp_Object f_Vcommand_line_args;
#define Vcommand_line_args globals.f_Vcommand_line_args
  Lisp_Object f_Vdump_mode;
#define Vdump_mode globals.f_Vdump_mode
  Lisp_Object f_Vdynamic_library_alist;
#define Vdynamic_library_alist globals.f_Vdynamic_library_alist
  Lisp_Object f_Vemacs_copyright;
#define Vemacs_copyright globals.f_Vemacs_copyright
  Lisp_Object f_Vemacs_version;
#define Vemacs_version globals.f_Vemacs_version
  Lisp_Object f_Vinstallation_directory;
#define Vinstallation_directory globals.f_Vinstallation_directory
  Lisp_Object f_Vinvocation_directory;
#define Vinvocation_directory globals.f_Vinvocation_directory
  Lisp_Object f_Vinvocation_name;
#define Vinvocation_name globals.f_Vinvocation_name
  Lisp_Object f_Vkill_emacs_hook;
#define Vkill_emacs_hook globals.f_Vkill_emacs_hook
  Lisp_Object f_Vpath_separator;
#define Vpath_separator globals.f_Vpath_separator
  Lisp_Object f_Vreport_emacs_bug_address;
#define Vreport_emacs_bug_address globals.f_Vreport_emacs_bug_address
  Lisp_Object f_Vsystem_configuration;
#define Vsystem_configuration globals.f_Vsystem_configuration
  Lisp_Object f_Vsystem_configuration_features;
#define Vsystem_configuration_features globals.f_Vsystem_configuration_features
  Lisp_Object f_Vsystem_configuration_options;
#define Vsystem_configuration_options globals.f_Vsystem_configuration_options
  Lisp_Object f_Vsystem_messages_locale;
#define Vsystem_messages_locale globals.f_Vsystem_messages_locale
  Lisp_Object f_Vsystem_time_locale;
#define Vsystem_time_locale globals.f_Vsystem_time_locale
  Lisp_Object f_Vsystem_type;
#define Vsystem_type globals.f_Vsystem_type
  bool f_inhibit_x_resources;
#define inhibit_x_resources globals.f_inhibit_x_resources
  bool f_noninteractive1;
#define noninteractive1 globals.f_noninteractive1
};
extern struct emacs_globals globals;

#ifndef DEFINE_SYMBOLS
extern
#endif
struct Lisp_Symbol lispsym[5];

#define iQfile_name_handler_alist 0
DEFINE_LISP_SYMBOL (Qfile_name_handler_alist)
#define iQkill_emacs 1
DEFINE_LISP_SYMBOL (Qkill_emacs)
#define iQkill_emacs_hook 2
DEFINE_LISP_SYMBOL (Qkill_emacs_hook)
#define iQrisky_local_variable 3
DEFINE_LISP_SYMBOL (Qrisky_local_variable)
#define iQrun_hook_query_error_with_timeout 4
DEFINE_LISP_SYMBOL (Qrun_hook_query_error_with_timeout)
EXFUN (Fdaemon_initialized, 0);
EXFUN (Fdaemonp, 0);
EXFUN (Fdump_emacs, 2);
EXFUN (Finvocation_directory, 0);
EXFUN (Finvocation_name, 0);
_Noreturn EXFUN (Fkill_emacs, 1) ATTRIBUTE_COLD;
#ifdef DEFINE_SYMBOLS
static char const *const defsym_name[] = {
	"file-name-handler-alist",
	"kill-emacs",
	"kill-emacs-hook",
	"risky-local-variable",
	"run-hook-query-error-with-timeout",
};
#endif
#define Qnil builtin_lisp_symbol (0)
#if DEFINE_NON_NIL_Q_SYMBOL_MACROS
# define Qkill_emacs builtin_lisp_symbol (1)
# define Qkill_emacs_hook builtin_lisp_symbol (2)
# define Qrisky_local_variable builtin_lisp_symbol (3)
# define Qrun_hook_query_error_with_timeout builtin_lisp_symbol (4)
#endif
  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值