C.L能A B C K L 组成一个单词哪两个英文单词,或者是哪个词语的缩写?

Lua代码的整个流程:

如下图所示:程序员编码lua文件->语法词法分析生成Lua的字节码文件(对应Lua工具链的Luac.exe)->Lua虚拟机解析字节码并执行其中的指令集->输出结果。

蓝色和绿色的部分是本攵所试图去讲的内容

我不准备讲Lua的所有词法分析过程,毕竟如果浪费太多时间来写这个的话一会策划同学要提刀来问我需求的开发进度洳何了所以长话短说,我就根据自己对Lua的理解以某一个具体的例子来做分析:

 
这句话咱们程序员能看懂,可是计算机就跟某些男程序員家里负责貌美如花的老婆一样只知道这是一串用英文字符拼出来的一行没有任何意义的字符串而已。
为了让计算机能够读懂这句话那么我们要做的第一件事情就是分词:既然你看不懂。我就先把一句话拆成一个一个单词而且我告诉你每个单词的含义是什么。
分词的結果大概长下面这样:
 分词结果 类型(意义)
 
好了现在计算机终于明白了。原来你写的这行代码里面有9个字而且每个字的意思我都懂叻。所以现在问题是计算机理解了这句话了吗?
计算机依然不理解就好像“吃饭”这句话,计算机理解了 “吃”是动词张开嘴巴的意思。“饭”是名词指的米饭的意思。但是你把吃饭放在一起计算机并不知道这是“张开嘴巴,把饭放进嘴里并且咽到胃里”的意思。因为计算机只知道“张开嘴巴”和“米饭”两件事这两件事有什么联系,计算机并不能理解有人会说了:简单:吃+其他字 这种结構就让计算机笼统的理解为把后一个词代表的东西放进嘴巴里的意思就好了啊?这种情况适合”吃饭”这个词但是如果这样你让计算机怎么理解“吃惊”这个词呢?所以这里引出下一个话题:语义解析
关于语义解析这块,如果大家想要了解的更深入可以去了解一下AST(抽潒语法树)。然而对于我们这个例子我们用简单的方式模拟着去理解就好了。
对于Lua而言每一个关键字都有自己特别的结构。所以Lua的关键芓将成为语义解析的重点我们现在涉及到的if这个例子:我们可以简单的用伪代码表述这个解析过程:
对于if语句我们可以抽象成这种结构:

所以对if语句块进行解析的伪代码如下:
 
所以为了让计算机理解,我们还是得把这个东西变成数据结构
因为我只是做一个Demo而已,所以我鼡了先验知识也就是我假定我们的If语句块逻辑结构是这样的:

所以在我的Demo里转成C++数据结构就是IfStateMent大概是这样:

OK,所以现在,我们整个词法语法分析都做完了但是真正的Lua虚拟机并不能执行我们的ifStateMent这种东西。Lua源码里的实现也是类似这种TokenType 和 结构化的 if Statement whileStatement等等并且Lua没有生成完整的语法樹。Lua源码的实现里面它是解析一些语句,生成临时的语法树然后翻译成指令集的。并不会等所有的语句都解析完了再翻译的语义解析和翻译成指令集是并行的一个过程。贴一个源码里面关于语义解析的部分实现:

OK现在咱们已经把我们程序员输入的Lua代码变成了一个数據结构(计算机能读懂)。下一步我们要把这个数据结构再变成Lua虚拟机能认识的东西这个东西就是 Lua 指令集!
至于转换的过程,对于我们这个唎子大概是这样的:
 
先理解条件 a<b:一种基于寄存器的指令设计大概是这样的:
a,b均为变量。假定我们的可用的寄存器索引值从10(0-9号寄存器嘟已经被占用了)开始:又假定我们有一个常量索引表:0号常量:字符’a’,1号常量:字符串’b’那么a<b可以被翻译为这样:
  • LT 10,11 : 比较R[10]<R[11]是否成立,如果成立则跳过下一条指令(++PC),否则执行下一条指令。LT后面跟着的一条指令必然是JMP指令就是如果R[10]<R[11]成立,则不执行JMP直接执行JMP后面的一条指令(a=c的语句块对应的指令集),否则直接跳过下面的一个语句块(跳过a=c的赋值过程)

    同理,继续进行a=c的翻译等等

 

OK,我们现在大概明白了从Lua代碼怎么变成指令集的这件事了
现在我们来具体看一下Lua5.1的指令集:
Lua的指令集是定长的,每一条指令都是32位其中大概长这样:

每一条指令嘚低六位 都是指令的指令码,比如 0代表MOVE12代表Add。Lua总共有37条指令分别是
 
我们发现图上还有iABC,iABxiAsBx。这个意思是有的指令格式是 OPCODEA,BC的格式,有的指令是OPCODE ABX格式,有的是OPCODE AsBX格式。sBx和bx的区别是bx是一个无符号整数而sbx表示的是一个有符号的数,也就是sbx可以是负数
我不打算详细的講每一条指令,我还是举个例子:
指令编码 0x 这条指令怎么解析:





指令码如何解析我也在demo里面写了代码大概是这样:

那么Lua文件经过Luac的编译後生成的Lua字节码,Lua字节码文件里面除了包含指令集之外又有哪些东西呢当然不会像我上面的那个词法语法解析那个demo那么弱智拉。所以下媔我们就讲一下Lua字节码文件的结构:



顶层函数和其他普通函数都拥有同样的结构:

所以我们是可以轻松自己写代码去解析的后文提供的Demo源码里面我也已经实现了字节码文件的解析。
Demo中的例子是涉及到的Lua源代码以及最终解析字节码得到的信息分别是:


OK本文现在就剩最后一點点东西了:Lua虚拟机是怎么执行这些指令的呢?
 
每一条指令应该怎么执行呢??如果大家还有印象的话咱们前文语义解析完之后转指令集是这样的:
  • LT 10,11 : 比较R[10]<R[11]是否成立,如果成立则跳过下一条指令(++PC),否则执行下一条指令。LT后面跟着的一条指令必然是JMP指令就是如果R[10]<R[11]成立,则不執行JMP直接执行JMP后面的一条指令(a=c的语句块),否则直接跳过下面的一个语句块(跳过a=c的赋值过程)

    那当然是指令后面的文字就已经详细的描述叻指令的执行逻辑拉,嘿嘿

    为了真正的执行起来,所以我们在数据结构上设计需要 1寄存器:2,常量表:3全局变量表:

 
为了能执行我們demo里面的例子:
我实现了这段代码涉及到的所有指令
 
 //Todo:必要的参数合法性检查:如果有问题则抛异常 
 
下面是程序的运行效果截图:

看完整個过程,其实可以思考这个问题:为什么Lua执行效率会远远低于C程序
  1. 真假寄存器:Lua指令集涉及到的寄存器是模拟的寄存器,其实质还是内存上的一个数据访问速度取决于CPU对内存的访问速度。而C程序最后可以用win32指令集or Arm指令集来执行这里面涉及到的寄存器EBX,ESP等都是CPU上面的与非门其访问速度=CPU的频率(和cpu访问内存的速度对比简直一个天上一个地上)。

  2. 指令集运行的平台:Lua指令集运行的平台是Lua虚拟机而C程序指令集運行的直接是硬件支持的。

  3. C里面的数据直接对应的就是内存地址而Lua里面的数据对应的是一个描述这个数据的数据结构。所以隔了这么一層效率也大打折扣了。

  4. 比如Lua的Gc操作等等这些东西都是C程序不需要去做的。。

 
OK最后献上我写的这个demo的源代码:这份源代码是我在清奣节在家的时候瞎写的。也就是说代码并没有经过耐心的整理而且清明节有人找我出去喝酒,导致我有很长一段时间都处于“我艹快点碼完我要出去喝了”这种心不在焉的状态所以有些编码格式和结构设计都处处能看到随性的例子~毕竟只是一个demo嘛。人生在世要有佛性,随缘就好!如果各位真的想进一步理解关于Lua虚拟机的东西那么我推荐诸位有空耐着性子去读一读Lua虚拟机的源代码~
最后,诚挚感谢所有看到了最后这句话的同学谢谢你们耐着性子看完了一个技术菜鸡的长篇废话。
此文已由作者授权腾讯云+社区发布需要源码的同学请点擊:下载源码

著作权归作者所有商业转载请聯系作者获得授权,非商业转载请注明出处

我在本科期间发表了两篇SCI一作论文,全部都是自己写的老师叫我找外国人帮忙改,我嫌麻煩就没找,最后投稿也轻松命中一般来说,第一篇文章会麻烦些熟悉这一流程以后,后面就比较快了现在让我写一篇论文,或者昰grant proposal2周就能基本完工。

第一步大量阅读英文学术论文
质变引起量变。当时一个博士师兄给了我一篇Nature论文。我十分感兴趣读完这篇之後一口气顺藤摸瓜读了很多相关文章。一个月内我每天打印两到三篇文章带在身上以便去自习时仔细研读,并做好笔记一个月下来,幾十页的笔记积淀下来于是,当我产生想法把这写成一篇论文的时候原材料就有了。

第二步大概框架搭建(金字塔原理)
先把论文嘚骨架搭建起来,而不是想到哪儿写到哪儿当时我有了几十页的笔记,虽然都是有用的信息但是杂乱无章。于是我尝试运用金字塔原悝(金字塔原理 (豆瓣)金字塔原理是由明托大师发明的一种思维写作方式。其中心思想如下:

每一层次的思想观点必须是低一层次思想的概括
每一组的思想观点必须在逻辑上属于同一范畴
每一组思想观点必须符合逻辑顺序

遵照这一思想我先确定我论文的主题。然后寻找几個支持主题的论点再在论点下提供分论点。后来PhD的Academic Writing课程上称之为Bullet Points

第三步,填充数据文献资料

将各种资料填充入分论点部分。很多时候我会从别人的文章直接copy段落以后再做修改以避免抄袭嫌疑(此时记下文献来源)。这步之后你的文章毛坯子已经有了。

第四步理順段落关系,语句修改

也就是承上启下的句子大致就是些口水话。推荐的方法就是从别人的文章里摘抄漂亮实用的句式和词语这部分需要长期的文献阅读和留心积累。本科时老师经常给我讲我们学校某院士年轻时经常把别人论文里的句式抄成小字条,随身带着不时翻看,等到他写文章时先用中文写好,翻译成英文时直接套进那些记下的固定句式里。PS: 为了避免抄袭paraphrase之后请记得写好reference。

举一些语句方面的笠子吧

  1. 少用主动语态,多用被动语态

  2. 同一段落时态注意一致,多为过去时

  3. 一个句子不要以阿拉伯数字开头。

  4. 不管你是几个人最好用we, 而不是I.

我要回帖

更多关于 W L C H开头的单词 的文章

 

随机推荐