ruby.c源碼分析
代碼編譯不了,但生活還是要繼續的。我今天就讀ruby.c。我快速的瀏覽了一下文件。因爲我執行時
./ruby -v
helloworld01
[hello] ruby - version 0.49 (18 Jul 94)
yang@DESKTOP-V9HS3B6:~/ruby049/ruby$
也就是說,-v參數是可以執行的。於是我去找了,並進行了修改。
static char*
proc_options(argcp, argvp)
int *argcp;
char ***argvp;
{
optind = 0;
while ((c = getopt_long(argc, argv, "+acde:F:i:I:lnpR:svxX:yNES",
long_options, &opt_index)) != EOF) {
switch (c) {
case 0: /* long options */
if (strcmp(long_options[opt_index].name, "version") == 0) {
version = TRUE;
show_version();
}
break;
case 'p':
}
這裏,就是在處理選項。我在
case 'v'
那裏進行修改。再編譯。果然就能看到效果。
如果這樣執行
./ruby -e 'print("ok")'
的處理邏輯在這裏:
case 'e':
script_given++;
if (script == 0) script = "-e";
lex_setsrc("-e", optarg, strlen(optarg));
yyparse();
break;
可惜報錯誤。
另外,如果沒有使用-e選項,需要從文件中讀程序,處理如下:
if (script_given == 0) {
if (argc == optind) { /* no more args */
if (version == TRUE) exit(0);
script = "-";
load_stdin();
}
else {
script = argv[optind];
rb_load_file(argv[optind]);
optind++;
}
}
沒有提供文件,就讀標準輸入,否則從文件中讀。
再去讀rb_load_file函數。
rb_load_file實際上也是調readin(fd,fname)
再看readin()
在readin()的最後,有:
start_read:
lex_setsrc(fname, p, pend - p);
yyparse();
這裏,就是讀進行源rb程序後,進行詞法分析,語法分析。作者的程序結構和gawk1.01確實很像。
最後作者有如下主程序。
void
rb_main(argc, argv) /* real main() is in eval.c */
int argc;
char **argv;
{
char *script;
extern VALUE errat;
rb_call_inits();
rb_define_variable("$@", &errat, Qnil, Qnil);
errat = str_new2(argv[0]);
rb_define_variable("$VERBOSE", &verbose, Qnil, Qnil);
rb_define_variable("$DEBUG", &debug, Qnil, Qnil);
#ifdef USE_DLN
rb_dln_argv0 = argv[0];
#endif
script = proc_options(&argc, &argv);
if (do_check && nerrs == 0) {
printf("Syntax OK\n");
exit(0);
}
if (do_print) {
yyappend_print();
}
if (do_loop) {
yywhole_loop(do_line, do_split);
}
if (nerrs == 0) {
TopLevel(script, argc, argv);
}
exit(nerrs);
}
可以c語言的是main呀。那ruby0.49的main在哪裏呢,我
grep 'main' *.c
發現很多文件中有main,當然,有些文件中的測試程序的。但真正的入口在哪兒呢?這是個問題。