• Lua学习系列(二)


    资源整理:

    风云老师博客:

     http://blog.codingnow.com/eo/luaoeeeaeau/

    知乎:

    https://www.zhihu.com/question/20736660

     http://del.icio.us/musicode/lua

    ---------------------------------------

    C语言学到什么程度可以看Lua的源码?修改

    除了C语言之外还需要什么能力?
    如果说是为了培养编程能力,是否有更好的方式?
    作者:airtrack
    链接:https://www.zhihu.com/question/20736660/answer/22313839
    来源:知乎
    著作权归作者所有,转载请联系作者获得授权。

    首先你需要学会lua(不仅仅是C语言水平的问题),这里的学会我指的是能用lua写个几千上万行业务代码,对lua有了一定的理解,再根据你自己理解找找对lua哪方面感兴趣,专门针对那方面去看lua的代码,比如函数调用是怎么实现的(以及与C语言怎么交互的)、lua的debug库是怎么提供hook指令执行的等等。你看云风那么多lua分析的文章都是这段时间关注GC就看GC的实现,那段时间关注string的实现就看string的相关代码。找到你关注的感兴趣的部分去看,比你在14588行代码(lua 5.2.3的代码,排除注释和空行)乱无头绪的看要好多了。

    如果你想通过看lua代码学习编译原理的知识,那自然就看词法分析、语法分析、代码生成及VM代码,这方面我曾写过三篇博客(lua源码剖析(一)lua源码剖析(二)lua源码剖析(三))。不过我不推荐通过lua源码来学习编译原理,因为很难在lua这种工业级的解释器里理清交杂在一起的语法分析、语义分析以及代码生成。lua本身是一个一遍式的编译器,我觉得对于初学者来说这是不好理解的,在这个一遍式的编译器里还交杂着GC和运行时报错的准备工作,另外一方面lua的代码变量太短,经常是一个字母,不好读(至少我是这么认为的),各个模块之间耦合也很大程度的影响理解。我觉得学习编译原理最好的方式是,先通看一遍编译原理,然后硬着头皮写一个渣编译器(解释器),这时候你再来看lua这块的代码会好很多。我在看lua代码之前,就是自己实现了一个lua的子集,我目前正在写第二版的实现(luna第二版:airtrack/luna · GitHub 只是子集,没有metatable userdata coroutine等东西),luna的第一版我实现了一个渣一般的栈虚拟机,在看了lua的代码之后,我想实现一个寄存器虚拟机,于是写了第二版。在写第二版的时候有时候遇到某个问题,觉得我自己的想法实现成本太高时(运行时的时空代价),我就会看看lua是怎么实现的,比如运行时报错(f()函数调用,f本身不是函数的报错),而这时候我已经有过自己的思考,再去看lua的这块实现,看代码3-5分钟就看到了重点,醍醐灌顶,然后迅速的实现出来。其实到目前为止我都没有完整的看过lua的代码。

    另外lua的是一个工业级的解释器,它的很多实现方式是有效率考虑的(比如一遍式的编译),而且很多实现方面都是在它这个语言之下是很优的(也许是最优的),如果换做另外一门语言,是不能完全套用它的实现方式,当然原理是通的,所以我觉得关键还是理解实现后面的原理,不单单是看怎么实现的。
     
     
    前面已经说的很多了.

    我来补充一点吧.Lua里面用到编译知识确实不多,也不太难,比如语法解析用的是最简单的递归下降,而不是LALR之类比较难的.

    但并不是说Lua里面用到的相应知识就一定简单.比如Lua是一遍分析的,我们学编译的时候一般是两遍,一遍先生成分析树,然后再遍历一遍生成opcode,而Lua跳过了生成分析树这一步直接生成Opcode,另外语法翻译这部分我现在看的还是比较头大.

    简而言之,我认为Lua中用到的编译的知识基本上到龙书的第五章语法制导翻译这部分就足矣了.但是知识点少,并不意味着就是简单,因为Lua追求的时简洁和高效.


    作者:codedump
    链接:https://www.zhihu.com/question/20736660/answer/22218382
    来源:知乎
    著作权归作者所有,转载请联系作者获得授权。
     
     
    LUA代码重点的部分除了数据结构,算法,词法语法,GC,VM等部分,还能够通过堆栈与C代码交互,如果你所谓的看LUA源码是要懂得这些的话,需要深入了解不只C,还有汇编和操作系统。如果单就能够了解LUA语言或了解解释器代码的话,能够对C的指针、寄存器、函数调用较为了解的话,就可以较为顺利的阅读了。
    可以看看云风老大的文章,对LUA代码有一个大致的概念了解。


    作者:张涛
    链接:https://www.zhihu.com/question/20736660/answer/16008805
    来源:知乎
    著作权归作者所有,转载请联系作者获得授权。
     
    这个问题是所谓的如何阅读开源代码的问题的一个典型例子。
    首先你应该了解你想要阅读的源码是什么,如果你对你要阅读的源码缺乏基础的了解,那你就应该先去了解一下。 然后你就要对他进行归类,这样你才能做到有目的性的学习。然后就是针对归类进行专业的学习了。
    其实对于很多开源代码来说,你会那种语言到什么程度,根本无足轻重。
    拿你说的lua来说,他应该属于解释器/编译器类的代码,他的核心内容是语法分析,语义分析等等等等等编译或解释过程。从计算机科学的学科上来讲,他应该属于编译原理的范畴,编译原理的先导学科有很多,比如形式语言与自动机,比如句法结构等等。如果这些东西你掌握到家了 参照其代码中的注释,你可以很轻松的对其进行划分,然后你就可以轻松的自顶而下,分而治之了,到这种时候,其实你会的到底是C还是Pascal已经不重要了。因为你都可以轻松的理解代码中的真正精髓的东西


    作者:刘虎
    链接:https://www.zhihu.com/question/20736660/answer/21849915
    来源:知乎
    著作权归作者所有,转载请联系作者获得授权。
  • 相关阅读:
    bzoj2006[NOI2010]超级钢琴
    bzoj1088[SCOI2005]扫雷
    bzoj1207[HNOI2004]打鼹鼠
    bzoj2132圈地计划
    bzoj2127happiness
    bzoj1037[ZJOI2008]生日聚会
    bzoj1031[JSOI2007]字符加密
    bzoj1566[noi2009]管道取珠
    bzoj2134单选错位
    vuejs之v-on小例子之实现购买数量的增加和减少
  • 原文地址:https://www.cnblogs.com/oxspirt/p/5893382.html
Copyright © 2020-2023  润新知