Lua学习系列(二)
资源整理:
风云老师博客:
http://blog.codingnow.com/eo/luaoeeeaeau/
知乎:
https://www.zhihu.com/question/20736660
http://del.icio.us/musicode/lua
---------------------------------------
C语言学到什么程度可以看Lua的源码?修改
如果说是为了培养编程能力,是否有更好的方式?
链接:https://www.zhihu.com/question/20736660/answer/22313839
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
如果你想通过看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代码有一个大致的概念了解。
作者:张涛
链接:https://www.zhihu.com/question/20736660/answer/16008805
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
首先你应该了解你想要阅读的源码是什么,如果你对你要阅读的源码缺乏基础的了解,那你就应该先去了解一下。 然后你就要对他进行归类,这样你才能做到有目的性的学习。然后就是针对归类进行专业的学习了。
其实对于很多开源代码来说,你会那种语言到什么程度,根本无足轻重。
拿你说的lua来说,他应该属于解释器/编译器类的代码,他的核心内容是语法分析,语义分析等等等等等编译或解释过程。从计算机科学的学科上来讲,他应该属于编译原理的范畴,编译原理的先导学科有很多,比如形式语言与自动机,比如句法结构等等。如果这些东西你掌握到家了 参照其代码中的注释,你可以很轻松的对其进行划分,然后你就可以轻松的自顶而下,分而治之了,到这种时候,其实你会的到底是C还是Pascal已经不重要了。因为你都可以轻松的理解代码中的真正精髓的东西
作者:刘虎
链接:https://www.zhihu.com/question/20736660/answer/21849915
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
Lua学习系列(二)的更多相关文章
- MyBatis学习系列二——增删改查
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...
- Maven学习系列二(1-5)
Maven学习系列二(1-5) 本文转自 QuantSeven 博客,讲解精炼易懂,适合入门,链接及截图如下 http://www.cnblogs.com/quanyongan/category/47 ...
- scrapy爬虫学习系列二:scrapy简单爬虫样例学习
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
- DocX开源WORD操作组件的学习系列二
DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...
- [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参
[转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...
- RabbitMQ学习系列二-C#代码发送消息
RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列 http://www.80iter.com/blog/1437455520862503 上一篇已经讲了Rabbi ...
- .net reactor 学习系列(二)---.net reactor界面各功能说明
原文:.net reactor 学习系列(二)---.net reactor界面各功能说明 安装了.net reactor之后,可以在安装目录下找到帮助文档REACTOR_HELP.c ...
- 图机器学习(GML)&图神经网络(GNN)原理和代码实现(前置学习系列二)
项目链接:https://aistudio.baidu.com/aistudio/projectdetail/4990947?contributionType=1 欢迎fork欢迎三连!文章篇幅有限, ...
- ASP.NET MVC学习系列(二)-WebAPI请求
继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...
- ASP.NET MVC学习系列(二)-WebAPI请求(转)
转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的g ...
随机推荐
- spice-vdagent
The spice-vdagent should be running in the guest. Have you installed the spice guest tools in your w ...
- The magic behind configure, make, make install
原文:https://robots.thoughtbot.com/the-magic-behind-configure-make-make-install#where-do-these-scripts ...
- shell 入门教程
打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. 一 惯例,第一个shell #!/bin/bash echo "Hello ...
- CAPSPageMenu分页交互
最近在开发过程中,我的前任在处理类似于新闻多板块的界面,在一个视图控制器里加载多个UITableView以显示不同类型的信息,并可通过头部按钮和左右滑动来切换不同的tableView这样的界面中,采取 ...
- js设置全局变量ajax中赋值
js设置全局变量,在ajax中给予赋值赋值不上问题解决方案 方案一. //在全局或某个需要的函数内设置Ajax异步为false,也就是同步. $.ajaxSetup({async : false}); ...
- Games on a CD
Games on a CD time limit per test 4 seconds memory limit per test 512 megabytes input standard input ...
- 一个经典的PHP验证码类分享
我们通过PHP的GD库图像处理内容,设计一个验证码类Vcode.将该类声明在文件vcode.class.php中,并通过面向对象的特性将一些实现 的细节封装在该类中.只要在创建对象时,为构造方法提供三 ...
- Drawcli分析
当前环境:windows7 32位旗舰版.VS2010旗舰版 Drawcli介绍: Drawcli是VS2010中的一个示例程序,能够进行简单的绘图操作,例如线.矩形.圆角矩形.多边形等,位于VS安装 ...
- 门面模式(Facade)解析
门面模式使用一个门面类来包装一些复杂的类,对外提供一个简单的访问方法. 见如下代码: class CPU { public void startup() { System.out.println(&q ...
- ==与equals()方法的不同
==比较分为两种情况:基本数据类型比较与引用数据类型比较 1.基本数据类型,根据基本数据类型的值是否相等来判断,相等则返回true,不相等则返回false.两端数据类型可以不同,如果转换后的数值相等, ...