Ruby Ruby 源码 Hack... (鼓足勇气发个,有可能 TJ,慢慢更新)

jinleileiking · 2012年04月19日 · 最后由 ywjno 回复于 2012年04月19日 · 4090 次阅读

之所以鼓足勇气,我感觉这个东西写出来,会觉得自己很无知。而且本人不像主席那样爱打字。。而且思维很乱,而且本坛子有很多高人,心里压力很大

基于的 git 版本为:

commit 6da92c3e89697e1263248ab56e2ad33381429d6c
Author: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date:   Thu Mar 29 07:38:14 2012 +0000

    * lib/rdoc/task.rb: suppress overriding deprecated class warning.


编译 ruby

不看不知道,一看下一跳,一般来说,很少用 FSF 的 automake 的,而 matz 的 ruby,用了 autoconf, 动态生成 makefile,一搜 autoconf, autoconf 的帮助..1000 多页,所以我就放弃研究这块了,不过要是玩纯正的 linux,这东西躲不掉。不得不佩服 matz 了。。

后来想把 ruby 搞到自定义的目录,研究了一下 make install 的代码。没研究明白。不过大致是这样:先生成 miniruby,这个程序负责执行 tools/rbinstall.rb, -> rbconfig.rb (这个会把环境变量搞到 ruby 环境,具体怎么搞的,没细研究)

所以如果你想调试 ruby。在 Makefile 里修改:CC = gcc -g (用 gdb 调试) 执行 DESTDIR="./rubybin" make install (装到./rubybin 目录,而不是默认的/usr/local)

ruby a.rb

-_-# ruby 启动时,如何引用 rubygem 的?原来在 ruby 启动时,要自动执行一些 ruby 命令。。。见`prelude.c,一共有 3 个,前面两个没细看

static const char prelude_name2[] = "<internal:gem_prelude>";
static const char prelude_code2[] =
"require 'rubygems.rb' if defined?(Gem)\n"


(gdb) bt
#0  Init_prelude () at prelude.c:81
#1  0x800cc4a4 in ruby_init_prelude () at ruby.c:1097
#2  process_options (argc=0, argv=0xbffff438, opt=0xbffff1f8) at ruby.c:1360
#3  0x800cd503 in ruby_process_options (argc=1, argv=0xbffff434) at ruby.c:1816
#4  0x8001951a in ruby_options (argc=1, argv=0xbffff434) at eval.c:73
#5  0x80016930 in main (argc=1, argv=0xbffff434) at main.c:38


**但是,还是提示

➜  bin git:(trunk) ✗ ./ruby
<internal:gem_prelude>:1:in `require': cannot load such file -- rubygems.rb (LoadError)
    from <internal:gem_prelude>:1:in `<compiled>'

其实你不用鼓足勇气,因为你这帖子估计一大批人都看不懂,比如鼓足勇气回帖的我:(

这么蛋疼..给个简洁版的,希望对如何加载 rubygems 的问题又所帮助

#require 'rubygems' # comment me and see the difference

puts $"
puts '--'
puts $:

编译没这么麻烦的,rvm 都有帮助的。

export optflags="-O0 -ggdb3" && rvm install "1.9.3-debug"

我比较习惯从调试开始

有没有什么资料导读 ruby 内部实现?印象中 matz 写了个日文的,然后有人翻译英文到一半,我把名字忘了搜不出来

#6 楼 @hooopo 好像是,原来不是 matz 写的阿

#6 楼 @hooopo 你那总是有好东西,还有么

支持楼主继续写下去!:) CRuby 的源码是学习如何实现一门语言的好素材。建议楼主不用从 main 开始面面俱到的看,可以重点先放在 Ruby 的对象模型上,以后有兴趣再分别看 Ruby 内存管理,GC,YARV 等。

autoconf 没必要深入去研究,已有的项目基本也不用怎么改。自己弄还是 cmake 吧

我了个去。。。那个日文教材好难看懂

需要 登录 后方可回复, 如果你还没有账号请 注册新账号