作者回复: 看来我要跟你学习才对:)
这门课是实战和原理并重。但在设计上,会先让同学们建立对编译的直观感受,然后再引导到对算法的兴趣上。所以,在前端部分,我把算法的总结和提升放到了最后部分。因为这个时候,大家都已经没有陌生感、恐惧感了,学算法也就顺理成章了。
你的经验已经比大部分同学多。我也争取把理论这部分也在课程里搞好!
作者回复: 在各个阶段都会发现一些错误。
在词法分析阶段,可能会发现某些输入不符合我们的任何一条词法规则。
关键词拼错,在词法分析阶段是发现不出来的,它会被识别成一个标识符。比如inta, 假设是笔误,少了空格,也是一个合法的标识符。
在语法分析阶段,你说的少逗号,分号什么的,这些错误在语法分析阶段就可以识别出。因为不满足语法规则。
还有一些必须要等到语义分析阶段才能发现错误。比如
inta=10;
语法是没错的。
但我们真正想写的是:
int a = 10;
在语义检查的时候,对第一句就会检查出,之前并没有声明inta这个变量。所以可能是错误。
不知道是否解答了你的疑问。在后面的课程例子中,我们会做出错处理。
作者回复: 首先呢,编译原理不仅仅是造大家通用的语言。有很多是用来解决领域问题的。比如,好像阿里内部就有一个语言,叫cava,是跟它的搜索引擎配合的。
其次,我们做这些底层平台的时候,都要涉及编译。还是拿阿里的druid开源项目说事,它就手写了一个高速的sql parser。其他几家大的互联网公司肯定也有不少这种应用。
华为的方舟编译器,不是也很争气吗?有人说它没有多少创新,但它就是效果显著呀。
我跟大家一样,都期盼带有中国血统的、全球人都用的语言诞生出来。我相信时间不远了。这种事情需要技术底蕴,更重要的是需要产业发言权。这方面,我们是越来越强了!大家一起期盼!
作者回复: 对的,做DSL能够给具体的领域带来很大的帮助!感谢你分享游戏领域的经验!
我知道游戏领域有人在做DSL,我对这个领域不太了解。马云也曾经参观国外的一个游戏公司,发现他们把平台做的很好,能够支持很多游戏的快速研发。他回来以后,在阿里提了中台的概念,目前在企业应用领域很流行。中台呀,游戏平台呀,编译原理都能发挥作用。
作者回复: 如果我的哪一讲让你卡壳了,你要告诉我!我单独给你讲:)
作者回复: 有的,有很多demo。这门课不是纯讲理论,而是拿实操带动我们学理论。
第一节课是前端技术的概述。第二节就开始做例子了!示例代码到时候也释放出来。
作者回复: 对头!
作者回复: 你大的概念理解完全正确。
这个类语法分析后会变成一棵树。像这样的语法,解析起来是很简单的。反倒是像表达式这样看似很简单的语法,解析起来反倒有难度。在后面的课程里会深入到细节。
语义分析的关键点你也抓住了,就是上下文。语法阶段是上下文无关的,语义阶段则专门处理上下文。
加油!
作者回复: 谢谢鼓励。讲的易懂,是我准备这门课程最大的挑战。我会继续努力!
作者回复: 我刚好研究过UML和MDA。
UML是对世界的建模。我们普通的程序也是对世界的建模。所以,这两者之间应该是可以互相翻译的。就像一门高级语言可以翻译成另一门高级语言。
我记得之前有一个方向,就是建好UML模型之后,程序自动生成。在这个意义上,UML就是一门计算机语言。
作者回复: 对的。
如果允许数字开头的标识符,处理起来要麻烦一点。但也不是不可以。改一改本文的有限自动机应该也能实现。
作者回复: 记得这么认真!
Great!
作者回复: 这些级别的项目,还是自己写的。因为会最契合项目的需求。比如速度、资源消耗、解析过程等方面的需求。因为对V8的编写者来说,语法分析这个层面的事情真的不是事情。你如果把前端技术学透,也不会觉得这是个事。
另一方面,对于大多数项目来说,借助工具就足够了。比如,Hibernate,比如mysql workbench。后者就是用的antlr。
作者回复: 点赞!
动手,还是动手!
一旦动手,马上就明白了!
作者回复: 当然要涉及。
但我重视帮大家建立直觉的理解。一旦你直觉上理解那件事了,对它有感觉了,去做逻辑推理就很顺利了。
我觉得,这种直接认知,是学好一门课的关键。
作者回复: 我自己做过表单设计器、报表设计器,跟你说的页面设计器应该有相似之处。
界面模板引擎啦、前端的DSL啦,也都与你的兴趣有关联吧?这些都与编译技术有关。
我后面在课程里还提供了一个报表系统的原型系统。估计也会对你有启发。也就是说,做前端方面的工具,真的经常用到编译技术。
作者回复: 前端程序员当然有用。
第一,react这样的框架好不好?当然好。但作者一定是有编译的功底才能做这件事情。实际上,它就是要把一个DSL转换成Javascript的基础功能。
第二,typescript,也是前端的语言翻译工具。这是近几年的一个趋势,你用任何一种语言写前端,然后会被工具翻译成其他语言。flutter也在做这样的事情。把dart翻译成js。学好编译,有助于你深度切入这些技术。
第三,webassembly就要开始迈入实用了。很多后端语言甚至都能编译生成web assembly。到时候,前端和后端的界限,可能也就会再次模糊吧!
作者回复: 据我了解,不完全是。详细的可以看看吴军的书,他搞过全文检索。
根本原因,是程序语言有严格的词法规则,能够知道如何把词准确的分开。而像中文这样的自然语言就不行。同一个句子有多个可能的切法。所以就要用进去统计的方法。现在自然语言处理,更加要用AI的方法。
作者回复: 你理解得非常准确!非常好!
或者说,因为普通的文本解析似乎有点难度,所以发明XML这种格式,让解析更容易一些。代价就是很多尖括号标签,文件也膨胀得更厉害。
所以,计算机记日志的时候,不会采用xml,因为太浪费空间了。
作者回复: 嗯,肯定有帮助。也会帮助你理解其他表达式引擎、规则引擎。
我们这门课的一个目标,就是让有些同学产生“奥,原来我以前学的那个知识点是这么回事”的感觉:)