ruby.c源碼分析

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,當然,有些文件中的測試程序的。但真正的入口在哪兒呢?這是個問題。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章