Lua2.4 解释器入口 lua.c

开始解释器篇。

解释器部分会写几节还说不准,因为,不少相关内容在之前的版本中是有覆盖到的。

同样,还是从解释器入口的 main 函数说起。

int main (int argc, char *argv[])
{
 int i;
 int result = 0;
 iolib_open ();
 strlib_open ();
 mathlib_open ();
 lua_register("argv", lua_getargv);
 if (argc < 2)
   manual_input();
 else
 {
  for (i=1; i<argc; i++)
   if (strcmp(argv[i], "--") == 0)
   {
    lua_argc = argc-i-1;
    lua_argv = argv+i;
    break;
   }
  for (i=1; i<argc; i++)
  {
   if (strcmp(argv[i], "--") == 0)
    break;
   else if (strcmp(argv[i], "-") == 0)
    manual_input();
   else if (strcmp(argv[i], "-v") == 0)
    printf("%s %s\n(written by %s)\n\n",
            LUA_VERSION, LUA_COPYRIGHT, LUA_AUTHORS);
   else
   {
    result = lua_dofile (argv[i]);
    if (result)
      fprintf(stderr, "lua: error trying to run file %s\n", argv[i]);
   }
  }
 }
 return result;
}

程序上来先定义一个程序的返回值。按 C 语言惯例,程序返回 0 表示成功,非 0 表示失败。
打开几个库,io 库,字符串库,数学库。打开库的过程就是把库函数注册到全局符号表中去。
注册一个 argv 函数以在 Lua 脚本里取得命令行中给 Lua 脚本的参数。这些参数是保存在了 C 的执行环境中。注册函数用的是 lua_register 宏,上面的程序内置库的注册用的也是这个宏。
如果无参,则表示程序执行在交互模式。就是把命令行里的用户手动输入的内容做为 Lua 脚本程序来执行。

static void manual_input (void)
{
  if (isatty(0))
  {
   char buffer[250];
   while (fgets(buffer, sizeof(buffer), stdin) != 0)
     lua_dostring(buffer);
  }
  else
    lua_dofile(NULL); /* executes stdin as a file */
}

isatty 是检查设备是否是某种终端类型,它定义在 POSIX 里的。
这里是在 windows 里分析的,所以用一个宏代替它,就是把标准输入当做一个 tty。
因此在 windows 里,isatty(0) 永远为真,也就是手动输入 manual_input 里是按行执行输入脚本代码的,通过 lua_dostring 执行。

回到 main 函数。
接着开解释命令行的参数。
第一个 for 循环是为了解析出 Lua 脚本的输入参数的位置和个数,就是从两个减号 "--" 开始的参数是 Lua 脚本的参数。

  for (i=1; i<argc; i++)
   if (strcmp(argv[i], "--") == 0)
   {
    lua_argc = argc-i-1;
    lua_argv = argv+i;
    break;
   }

第二个 for 循环也是解析命令行输入的。
如果是两个减号"--",表示是 Lua 脚本的参数开始了,就停止。
如果是一个减号 "-",表示是交互模式,这个和无参时情况类似,调用的也是 manual_input 来执行用户的手动输入内容。
如果是 "-v",打印程序的版本,版权,作者信息。
否则,就是脚本文件的解释执行了。调用 lua_dofile 解释脚本文件。
如果执行脚本文件结果出错(就是 result 非 0 的情况),打印出错信息。

这一版本,新增了外部编译器,Lua 可以直接解释编译器编译过的 luac.out 格式的二进制文件, Lua 是如何区分脚本文件和编译过的二进制文件的呢?

----------------------------------------
到目前为止的问题:
> Lua 是如何区分脚本文件和编译过的二进制文件的呢?
----------------------------------------

时间: 2024-08-29 18:09:23

Lua2.4 解释器入口 lua.c的相关文章

Lua4.0 解释器入口

开始解释器了. 解释器的入口文件为 lua.c,在文件中找到 C 语言的 main. int main (int argc, char *argv[]) {   struct Options opt;   int status;   opt.toclose = 0;   getstacksize(argc, argv, &opt);  /* handle option `-s' */   L = lua_open(opt.stacksize);  /* create state */   use

Lua2.4 编译器入口 luac.c

luac.c 是编译器 luac 的入口文件.老规矩,从 main 函数看起,看看这个过程中程序都做了些什么? int main(int argc, char* argv[]) {  char* d="luac.out";            /* default output file */  int i;  for (i=1; i<argc; i++)  {   if (argv[i][0]!='-')            /* end of options */    

用VC编译lua源码,生成lua语言的解释器和编译器

用VC编译lua源码,生成lua语言的解释器和编译器 1.去网址下载源码 http://www.lua.org/download.html 2.装一个VC++,我用的是VC6.0 3.接下来我们开始编译源码,我们需要编译: 一个静态库 一个动态库 一个lua语言解释器 一个lua编译器 建立一个工静态库工程 打开VC-->文件-->(点击)新建--(弹出框中选择)工程-->(win32 static library) 创一个空的工程 工程名为luaLib 把lua中所有的源码添加,去掉其

Lua 架构 The Lua Architecture

转载自:http://magicpanda.net/2010/10/lua%E6%9E%B6%E6%9E%84%E6%96%87%E6%A1%A3/ Lua架构文档(翻译) 十 102010 前段时间翻译了lua官方关于lua5架构设计的一份文档,现在分享给大家. 注意:所有版权都归lua官方所有,本人仅将其翻译为中文,以方便中文阅读者.翻译中出现任何错误导致的结果,本人不负任何责任. 如果有任何翻译错误,以及意见与建议,请email本人.邮件地址:[email protected]. 转载请注

[转载]轻量级Lua IDE ZeroBrane Studio 的使用技巧和汉化

快捷键 : alt + shift +鼠标 ,可以块选中文本.F12 折叠/展开 所有F5 调试运行 点击第二次 将跳转到第一个断点处 F10 单步执行 shift +F10 单步执行,不进入函数体Ctrl + F10 跳出停止调试 f6 运行程序不调试ctrl + f6 不停循环运行程序不调试 f7 汇编代码 ctrl +f7 分析代码 环境配置(我觉得常用的): 环境配置文件在安装目录\cfg\user.lua,也可以通过菜单 edit-preferences-Settings:System

《The Evolution of Lua》读书笔记 1

lua的优点: 可移植性 容易嵌入 体积小 高效率 这些优点都来自于lua的设计目标:简洁.从Scheme获得了很多灵感,包括匿名函数,合理的语义域概念 lua前身: 巴西被禁运,引入计算机软件和硬件受限,巴西人有强烈的民族情绪去创造自己的软件.三名作者都是同一个实验室Tecgraf的,这个实验室与很多工业实体有合作关系.成立的头十年,重点是创造交互性的图形软件,帮助合作伙伴进行设计.巴西石油公司是其中一个重要伙伴.有大量的遗留数据需要处理.于是诞生了DEL,一个领域专用语言,主要用来描述数据流

lua 5.1语法约定

Lua 5.1参考手册 由罗伯特·Ierusalimschy路易斯Henrique de Figueiredo沃尔德蔡氏 ?一个版权?2006 A¢A€"2012 Lua.org,银行业者.免费的根据Lua许可证. 内容一个?·指数一个?·其他版本一个?·英语一个?·portuguA?Aa年代一个?·espaA?A±ol 1 A¢A€"介绍 Lua是一个扩展编程语言设计的支持一般过程式编程与数据描述设施.它还提供了很好的支持面向对象编程,函数式编程,数据驱动的编程.Lua是打算作为一个

Mac 下纯lua(一)

Lua 介绍 什么是lua - lua是一种跨平台开发脚本语言. Lua 历史 学校 University of Rio de Janeiro 国家 巴西 作者 Roberto Ierusalimschy,Luiz Henrique Figueiredo Waldemar Celes 小组 计算机图形小组 公司 Petrobas 成长 Data-Entry-Language=>Sol==>Lua Lua 时间线 1993 - 创建 1996 - Dr.Dobbs 的文章发表提及Lua,被世界所

Lua 5.1 参考手册

Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes 云风 译 www.codingnow.com Copyright © 2006 Lua.org, PUC-Rio. All rights reserved. 1 - 介绍 Lua 是一个扩展式程序设计语言,它被设计成支持通用的过程式编程,并有相关数据描述的设施. Lua 也能对面向对象编程,函数式编程,数据驱动式编程提供很好的支持.