lua的解释器拿到 lua 编写的源码,首先进行解析,就是进行词法分析和语法分析,将源码转换成 lua 的指令集,然后执行这个指令集。

  

  lua 源码:

  

function f(val)
return val;
end function main()
local i = 1;
local j = 2;
local b = i + f(2);
--local b = i + j; print("retval = "..b); return b;
end

   调用 main 的指令集分析:

  

 in while  opcode = [CALLFUNC]. -- main
in while opcode = [NOP].
in while opcode = [SETFUNCTION].
in while opcode = [ADJUST].
in while opcode = [NOP].
in while opcode = [SETLINE].
in while opcode = [PUSH1]. -- i
in while opcode = [SETLINE].
in while opcode = [PUSH2]. -- j
in while opcode = [SETLINE]. -- local b = i + f(2)
in while opcode = [PUSHLOCAL0]. -- i
in while opcode = [PUSHGLOBAL]. -- f
in while opcode = [PUSHMARK].
in while opcode = [PUSH2]. -- val
in while opcode = [CALLFUNC]. -- f()
in while opcode = [NOP].
in while opcode = [SETFUNCTION].
in while opcode = [ADJUST].
in while opcode = [NOP].
in while opcode = [SETLINE].
in while opcode = [PUSHLOCAL0]. -- val
in while opcode = [RESET].
in while opcode = [RETCODE].
in while opcode = [SETLINE].
in while opcode = [ADJUST].
in while opcode = [ADDOP]. -- local b = i + f(2)
in while opcode = [SETLINE].
in while opcode = [NOP].
in while opcode = [PUSHGLOBAL]. -- print
in while opcode = [PUSHMARK].
in while opcode = [PUSHSTRING]. -- retval =
in while opcode = [PUSHLOCAL2]. -- b
in while opcode = [CONCOP].
in while opcode = [CALLFUNC]. -- print()
retval = 3
in while opcode = [ADJUST].
in while opcode = [SETLINE].
in while opcode = [PUSHLOCAL2].
in while opcode = [RESET].
in while opcode = [RETCODE].
in while opcode = [HALT].

PS:

  函数就是一个入口地址,入口是通向将要执行的指令集。想下 汇编 中的 call,ret。lua 中的虚拟指令类似,只不过入口中的指令集是 lua 自己的虚拟指令,不是像 c 那样的机器指令。

lua 1.0 源码分析 -- 1 lua 的虚拟指令的更多相关文章

  1. lua 1.0 源码分析 -- 总结

    读完 lua1.0 的源码感触:1. 把复杂的代码写简单2. pack 的内存回收3. hash 实现简单,但是应该可以改进,看高版本的代码怎么实现4. lua 初始化环境做了什么,就是一组全局变量初 ...

  2. lua 1.0 源码分析 -- 2 内存回收

    说这个,先要说下 lua 的环境,正常说创建一个 lua 的虚拟环境,就是创建一组全局变量, lua1.0 里创建的主要是以下几个: extern Symbol *lua_table; /* 符号数组 ...

  3. AFNetWorking3.0源码分析

    分析: AFNetWorking(3.0)源码分析(一)——基本框架 AFNetworking源码解析 AFNetworking2.0源码解析<一> end

  4. Solr5.0源码分析-SolrDispatchFilter

    年初,公司开发法律行业的搜索引擎.当时,我作为整个系统的核心成员,选择solr,并在solr根据我们的要求做了相应的二次开发.但是,对solr的还没有进行认真仔细的研究.最近,事情比较清闲,翻翻sol ...

  5. Solr4.8.0源码分析(25)之SolrCloud的Split流程

    Solr4.8.0源码分析(25)之SolrCloud的Split流程(一) 题记:昨天有位网友问我SolrCloud的split的机制是如何的,这个还真不知道,所以今天抽空去看了Split的原理,大 ...

  6. Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五)

    Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五) 题记:关于SolrCloud的Recovery策略已经写了四篇了,这篇应该是系统介绍Recovery策略的最后一篇了 ...

  7. Solr4.8.0源码分析(23)之SolrCloud的Recovery策略(四)

    Solr4.8.0源码分析(23)之SolrCloud的Recovery策略(四) 题记:本来计划的SolrCloud的Recovery策略的文章是3篇的,但是没想到Recovery的内容蛮多的,前面 ...

  8. Solr4.8.0源码分析(22)之SolrCloud的Recovery策略(三)

    Solr4.8.0源码分析(22)之SolrCloud的Recovery策略(三) 本文是SolrCloud的Recovery策略系列的第三篇文章,前面两篇主要介绍了Recovery的总体流程,以及P ...

  9. Solr4.8.0源码分析(21)之SolrCloud的Recovery策略(二)

    Solr4.8.0源码分析(21)之SolrCloud的Recovery策略(二) 题记:  前文<Solr4.8.0源码分析(20)之SolrCloud的Recovery策略(一)>中提 ...

随机推荐

  1. 不支持原子性的 Redis 事务也叫事务吗?

    文章收录在 GitHub JavaKeeper ,N线互联网开发必备技能兵器谱 假设现在有这样一个业务,用户获取的某些数据来自第三方接口信息,为避免频繁请求第三方接口,我们往往会加一层缓存,缓存肯定要 ...

  2. nginx模块化结构

    NGINX是一个免费.开源.高性能.轻量级的HTTP和反向代理服务器,也是一个电子邮件(IMAP/POP3)代理服务器 特点: 占有内存少,并发能力强 Nginx的优点: 模块化.事件驱动.异步.非阻 ...

  3. Git——从安装到连接GitHub

    安装Git Windows平台上很轻松的,直接点击地址Git下载进行下载,之后基本就是下一步,安装成功. 在所需要操作的项目下右键,点击"Git Bash Here"弹出Git命令 ...

  4. pytest132个命令行参数用法

    在Shell执行pytest -h可以看到pytest的命令行参数有这10大类,共132个 序号 类别 中文名 包含命令行参数数量 1 positional arguments 形参 1 2 gene ...

  5. Linux远程ssh执行命令expect使用及几种方法

    expect命令实现脚本免交互 一.Linux下SSH无密码认证远程执行命令 在客户端使用ssh-keygen生成密钥对,然后把公钥复制到服务端(authorized_keys). 实现步骤: 1.客 ...

  6. TNFE-Weekly[第七十二周已更新]

    前端行业发展飞速,新技术如雨后春笋般快速出现,尤其是各种小程序陆续推出,相关的信息.文章也铺天盖地的遍布在各处,我们有时候会困惑,不知道哪些信息对于自己是有价值的,那么TNFE-腾讯新闻前端团队启动了 ...

  7. Docker实战(1):通过配置文件启动MongoDB

    系统环境:Centos7 MongoDB 4.0.0 创建文件 注意:创建文件全是为了Docker run做准备,文件所对应的路径需与下一步的映射路径所对应,路径可自我更改. mkdir mongo ...

  8. k8s重要概念及部署k8s集群(一)

    k8s介绍 Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg).在Docker技术的基础上,为容器化的应用提供部署运行.资源调度.服务发现和动态伸缩等一系列完整功 ...

  9. vue自适应布局的n中方法

    在index.html中 head标签中 <script> //通过window.screen.width获取屏幕的宽度 var offWidth = window.screen.widt ...

  10. ribbon源码(3) 配置模块

    ribbon的很多功能可以通过配置进行调整,ribbon通过IClientConfig来获取配置信息,用户可以通过实现IClientConfig来管理配置. ribbon也提供了默认的实现(Defau ...