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,当然,有些文件中的测试程序的。但真正的入口在哪儿呢?这是个问题。

 

 

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