编译配置选项

译者 Lanza Schneider

通过修改 mrbconf.h 文件中的宏定义,我们可以配置mruby的一些构建选项

如何修改这些宏定义

  • 直接编辑 mrbconf.h

这样的方式在你有多个构建配置 (比如很多交叉编译平台) 的情况下很有用,因为你做出的修改会影响到所有的构建配置

另外,很多选项已经在该文件内写好了,你可以通过注释或解除注释来轻松地控制它们

  • 传递编译器 flags (或 defines)

请确保向所有编译器传递了相同的设置

stdio 设置 —— MRB_NO_STDIO

  • 如果你不需要启用任何 <stdio.h> 函数,就可以用这个设置
  • 一些功能可能会因此受到影响,比如:

mrb_irep(也就是字节码) 转储到文件,或者从文件加载将会不可用

编译 Ruby 源代码文件

一些 src/print.c 里定义的 print 行为

DEBUG 宏

MRB_USE_DEBUG_HOOK

  • 用于调试的 HOOK 函数将会启用
  • 任何 OP (就是 mruby 虚拟机的指令) 执行前都会调用 fetch hook
  • 另外还有专用于调试用途的特殊指令 OP_DEBUG,它会调用 Debug OP hook

MRB_DEBUG

  • mrb_assert 宏将会启用
  • 配置文件当中调用 enable_debug 时也会启用该宏

栈配置

MRB_STACK_EXTEND_DOUBLING

  • 将会启用两倍的 mruby 栈空间

MRB_STACK_GROWTH

  • 默认值 128
  • 这个值用于 mruby 栈空间的扩展量
  • 启用 MRB_STACK_EXTEND_DOUBLING 时,该选项无效化

MRB_STACK_MAX

  • 默认值是 (0x40000 - MRB_STACK_GROWTH)
  • 如果 mruby 栈空间消耗超出这个限度,就会抛出 RuntimeError

基本类型的设置

MRB_USE_FLOAT32

  • 如启用该设置,mrb_float 的值将会采用 float 型作为实体,否则将会采用 double 型

MRB_NO_FLOAT

  • 如启用该设置,mruby 将会去除浮点数功能
  • 这可以用于一些特殊场合,比如没有 FPU 的微控制器,或是不需要浮点数的 OS 内核部分

MRB_INT32

  • 如启用该设置,mrb_int 将会采用 int32_t 作为实体

MRB_INT64

  • 如启用该设置,mrb_int 将会采用 int64_t 作为实体

注:MRB_INT32MRB_INT64 是不兼容的 (很显然吧)

垃圾收集器(GC)设置

MRB_GC_STRESS

  • 如启用该设置,每次 RBasic 对象分配时,都会触发一次 full GC
  • 主要用于内存管理的调试

MRB_GC_TURN_OFF_GENERATIONAL

  • 用于关闭增量 GC

(译者注:这一点和 lua 不同,lua 默认不开启增量 GC,但是 mruby 却很自信地默认开启了)

MRB_GC_FIXED_ARENA

  • 如启用该设置,GC arena 将采用固定大小
  • 固定大小的情况下,GC arena 的消耗超出 MRB_GC_ARENA_SIZE 时将会抛出 RuntimeError
  • 这在追踪不必要的对象分配时很有用

MRB_GC_ARENA_SIZE

  • 默认值 100
  • 指定了 GC arena 的大小,当然如果没有启用 MRB_GC_FIXED_ARENA 的话,这个设置就没用了

MRB_HEAP_PAGE_SIZE

  • 默认值 1024
  • 指定每个堆页面的 RBasic 对象数目

内存池配置

POOL_ALIGNMENT

  • 默认值 4
  • 这和内存对齐有关,如果你要分配一个需要超出默认值所指定的对齐范围的对象,则应该指定所需要的最大值

POOL_PAGE_SIZE

  • 默认值 16000
  • 指定内存池页面的页面大小
  • 更小的值会导致更大的内存开销

mrb_value 配置 (译者注:mrb_value 就是用于维护 mruby 值的结构,它具有变体的特征)

MRB_ENDIAN_BIG

  • 如启用该设置,将会使 mruby 在大端模式下编译
  • MRB_NAN_BOXING 用到该配置
  • 一些 mrbgem 会用到这个配置

MRB_NAN_BOXING

  • 如启用该设置,mrb_value 将会被封装在一个 double 型值中
  • MRB_USE_FLOAT32MRB_NO_FLOAT 不兼容该配置

MRB_WORD_BOXING

  • 如启用该设置,mrb_value 将会被封装在一个 word 里 (具体的大小和平台的 word 应该有关系,但通常还是 32 位)
  • 这种设置下,浮点数将不会是 mrb_value 变体当中的一个成分,而是以一个 RBasic 对象的形式维护

其他配置

MRB_UTF8_STRING

  • 对字符串启用 UTF-8 支持,如果不启用,就只有 ASCII 编码了

MRB_FUNCALL_ARGC_MAX

  • 默认值 16
  • 指定 mrb_funcall 的第 4 个参数 argc 的最大值
  • 如果 argc 超出该值,将会抛出 ArgumentError

KHASH_DEFAULT_SIZE

  • 默认值 32
  • 指定 khash 的默认桶数目

MRB_NO_METHOD_CACHE

  • 关闭方法缓存,节省内存 (牺牲执行效率)

MRB_METHOD_CACHE_SIZE

  • 默认 256
  • MRB_NO_METHOD_CACHE 如果已经启用,则该设置无效化
  • 必须是 2 的幂

MRB_USE_METHOD_T_STRUCT

  • 用一个 C 结构体来作 mrb_method_t
  • 如果不启用的话,需要函数指针的最高 2 位为 0
  • 在需要用到函数指针高位的平台上,应该开启该配置

MRB_USE_ALL_SYMBOLS

  • 使 mrbgems/mruby-symbol-ext 中的 Symbol.all_symbols 功能可用
  • 将会增加堆内存的开销