怎么开始动手自己写一个gg脚本编译器器,gg脚本编译器器的理论学习该从

抱歉,您要访问的页面不存在或被删除!
5秒后将自动跳转到新浪博客首页。
1.请检查输入的网址是否正确。
2.如果不能确认输入的网站,请浏览查看所要访问的网址。
3.直接输入要访问的内容进行搜索:
如还有疑问请联系新浪客服:致电程序是用编程语言写的,编译器也是程序,先有编译器还是编程语言
我的图书馆
程序是用编程语言写的,编译器也是程序,先有编译器还是编程语言
& & &&【【蝙蝠侠运维开发】程序是用编程语言写的,编译器也是程序,先有编译器还是编程语言】http://toutiao.com/group/6197383/?iid=&app=explore_article&timestamp=&tt_from=copy_link&utm_source=copy_link&utm_medium=toutiao_ios&utm_campaign=client_share&& & & & & & &我爱七龙珠首先肯定的是先有的编程语言,哪怕这个语言简单到只有一个符号。先是设计好语言的规则,然后编写能够识别这套规则的编译器,否则若没有语言规则做为指导方向,编译器编写将无从下笔。第1个编译器是怎么产生的,这个问题我并没有求证,不过可以谈下自己的理解,请大伙儿辩证地看。这个问题属于哲学中鸡生蛋,蛋生鸡的问题,这种思维回旋性质的本源问题经常让人产生迷惑。可是现实生活中这样的例子太多了,如:1.英语老师教学生英语,学生成了英语老师后又可以教其他学生英语。2.写新的书需要参考其它旧书,新的书将来又会被更新的书参考,就像本书编写过程一样,要参考许多前辈的著作。3.用工具可以制造工具,被制造出来的工具将来又可以制造新的工具。4.编译器可以编译出新的编译器。这种自己创造自己的现象,称为自举。自举?是不是自己把自己举起来?是的,人是不能把自己举起来的,这个词很形象的描述了这类“后果必须有前因”的现象。以上前三个举的都是生活例子,似乎比第4个更容易接受。即使这样,对于前三个例子大家依然会有疑问:1.第一个会英语的人是谁教的?2.第一本书是怎样产生的?3.第一个工具是如何制造出来的?其实看到第2个例子大家就可能明白了,世界上的第一本书,它的知识来源肯定是人的记忆,通过向个人或群众打听,把大家都认同的知识记录到某个介质上,这样第一本书就出生了。此后再记录新的知识时,由于有了这本书的参考,不需要重新再向众人打听了原有知识了,从此以后便形成了书生书的因果循环。从书的例子可以证明,本源问题中的第一个,都是由其它事物创建出来的,不是自己创造的自己。就像先有鸡还是先有蛋一样,一定是先有的其它生命体,这个生命体不是今天所说的鸡。伴随这个生命体漫长的进化中,突然有一天具备了生蛋的能力(也许这个蛋在最初并不能孵化成鸡,这个生命体又经过漫长的进化,最终可以生出能够孵化成鸡的蛋),于是这个蛋可以生出鸡了。过了很久之后,才有的人类。人一开始便接触的便是现在的鸡而不知道那个生命体的存在,所以人只知道鸡是由蛋生出来的。很容易让人混淆的是编译c语言时,它先是被编译成汇编代码,再由汇编代码编译为机器码,这样很容易让人误以为一种语言是基于一种更底层的语言。似乎没有汇编语言,c语言就没有办法编译一样。拿gcc来说,其内部确实要调用汇编器来完成汇编语言到机器码的翻译工作。因为已经有了汇编语言编译器,那何必浪费这个资源不用,自己非要把c语言直接翻译成机器码呢,毕竟汇编器已经无比健壮了,将c直接变成机器码这个难度比将c语言翻译为汇编语言大多了,这属于重新造轮子的行为。曾经我就这样问过自己,php解释器是c语言写的,c编译器是汇编写的(这句话不正确),汇编是谁写的呢?后来才知到,编译器gcc其实是用c语言写的。咋一听,什么?用c语言写c编译器?自己创造自己,就像电影超验骇客一样。当时的思维似乎陷入了死循环一样,现在看来这不奇怪。其实编译器用什么语言写是无所谓的,关键是能编译出指令就行了。编译出的可执行文件是要写到磁盘上的,理论上,只要某个进程,无论其是不是编译器,只要其关于读写文件的功能足够强大,可以往磁盘上写任意内容,都可以生成可执行文件,直接让操作系统加载运行。相像一下,用python写一个脚本,功能是复制一个二进制可执行文件,新复制出来的文件肯定是可以执行的。那python脚本直接输出这样的一个二进制可执行文件,它自然就是可以直接执行的,完全脱离python解释器了。编译器其实就是语言,因为编译器在设计之初就是先要规划好某种语言,根据这个语言规则来写合适的编译器。所以说,要发明一种语言,关键是得写出与之配套的编译器,这两者是同时出来的。最初的编译器肯定是简单粗糙的,因为当时的编程语言肯定不完善,顶多是几个符号而已,所以难以称之为语言。只有功能完善且符合规范,有自己一套体系后才能称之为语言。不用说,这个最初的编译器肯定无法编译今天的c语言代码。编程语言只是文本,文本只是用来看的,没有执行能力。最初的编译器肯定是用机器码写出来的。这个编译器能识别文本,可以处理一些符号关键字。随着符号的越来越多,不断地去改进这个编译器就是了。以上的符号说的就是编程语言。后来这个编译器支持的关键字越来越多了,也就是这个编译器支持的编程语言越发强大了,可以写出一些复杂的功能的时候,干脆直接用这个语言写个新的编译器,这个新的编译器出生时,还是需要用老的编译器编译出来的。只要有了新的编译器,之后就可以和老的编译器说拜拜了。发明新的编译器实际上就是能够处理更多的符号关键字,也就是又有新的开发语言了,这个语言可以是全新的也可以是最初的语言,这取决于编译器的实现。这个过程不断持续,不断进化,逐渐才有了今天的各种语言解释器,这是个迭代的过程。这张图片在网络上非常火,它常常与励志类的文字相关。起初看到这个雕像在雕刻自己时,我着实被感动了,感受到的是一种成长之痛。今天把它贴过来的目的是想告诉大家,起初的编译器也是功能简单,不成规范,然而经过不断自我“雕刻”,它才有了今天功能的完善。下面的内容是我参考了别人的文章,由于找不到这位大师的署名,只好在此先献上我真挚的敬意,感谢他对求知者的奉献。要说到C编译器的发展,必须要提到这两位大神——C语言之父Dennis Ritchie和Ken Thompson。Dennis和Ken在编程语言和操作系统的深远贡献让他们获得了计算机科学的最高荣誉,Dennis和Ken于1983年赢得了ACM图灵奖。编译器是靠不断学习,不断积累才发展起来的,这是自我学习的过程,下面来看看他们是如何让编译器长大的。我们都知道转义字符,转义字符是以’\’开头的多个字符,通常表示某些控制字符,它们通常是不可键入的,也就是这些字符无法在键盘上直接输入,比如’\n’表示回车换行,’\t’表示tab。由于以’\’开头的字符表示转义,因此要想表示’\’字符本身,就约定用’\’来转义自己,即’\\’表示字符’\’。转义字符虽然表示的是单个字符的意义,在编译器眼里转义字符是多个字符组成的字符串,比如’\n’是字符’\’和’n’组成的字符串,好啦,交待完毕。起初的c编译器中并没有处理转义字符,为叙述方便,我们现在称之为老编译器。如果待编译的代码文件中有字符串’\\’,这在老编译器眼里就是’\\’字符串,并不是转义后的单个字符’\’。为了表明编译器与做为其输入的代码文件的关系,我们称做为输入的代码文件为应用程序文件,尽管被编译的代码文件是实现了一个编译器,而在编译器眼里,它只是一个应用程序级的角色。例如,gcc –c a.c中,a.c就是应用程序文件。现在想在编译器中添加对转义字符的支持,那就需要修改老编译器的源代码,假设老编译器的源代码文件名为compile_old.c。被修改后的编译器代码,已不属于老编译器的源代码,故我们命名其文件名为compile_new_a.c,下面是修改后的内容。代码compile_new_a.c其中,函数next()的功能是返回待处理文本(即被编译的源码文件)中的下一字符,强调一下是单个字符,并不是记法分析中的单词(即token)。用老编译器将新编译器的源代码compile_new_a.c编译,生成可执行文件,该文件就是新的编译器,我们取名为新编译器_a。为了方便理清他们的关系,将他们列入表格中。编译器自身源代码编译器应用程序源代码输出文件名compile_old.c老编译器compile_new_a.c新编译器_a,支持’\\’这下编译出来的新编译器_a可以编译含有转义字符’\\’的应用程序代码了,也就是说,待编译的文件(也就是应用程序代码)中,应该用’\\’来表示’\’。而单独的字符’\’在新编译器_a中未做处理而无法通过编译。所以此时新编译器_a是无法编译自己的源代码compile_new_a.c的,因为该源文件中只是单个’\’字符,新编译器_a只认得’\\’。先更新他们的关系,见下表。编译器自身源代码编译器应用程序源代码输出文件名compile_old.c老编译器compile_new_a.c新编译器_a,支持’\\’compile_new_a.c新编译器_acompile_new_a.c编译失败也就是说,现在新编译器_a,无法编译自己的源文件compile_new_a.c,只有老编译器才能编译它。再啰嗦一下,新编译器_a无法正确编译自己的源文件compile_new_a.c的原因是,compile_new_a.c中’\’字符应该用转义字符的方式来引用,即所有用’\’的地方都应该替换为’\\’。再回头看一下新编译器_a的源代码compile_new_a.c,它只处理了字符串’\\’,单个’\’没有对应的处理逻辑。下面修改代码,将新修改后的代码命名为compile_new_b.c。代码 compile_new_b.c其实compile_new_b.c只是更新了转义字符的语法,这是新编译器_a所支持的新的语法,下面还是以新编译器_a来编译新的编译器。用新编译器_a编译此文件,将生成新编译器_b,将新的关系录入到表格中。编译器自身源代码编译器应用程序源代码输出文件名compile_old.c老编译器compile_new_a.c新编译器_a,支持’\\’compile_new_a.c新编译器_acompile_new_a.c编译失败compile_new_a.c新编译器_acompile_new_b.c新编译器_b,支持’\\’继续之前啰嗦两句:用编译器去编译另一编译器的源码,也许有的同学觉得很费解,其实您把被编译的编译器源码当成普通的应用程序源码就特别容易理解了。上面的编译器代码compile_new_b.c,其第3、6、7行的字符串’\\’被新编译器_a处理后,会以单字符’\’来代替(这是新编译器_a源码中return语句的功能),因此最终处理完成后的代码等同于代码compile_new_a.c。现在想加上换行符’\n’的支持:由于现在编译器还不认识’\n’,故这样做肯定不行,不过可以用其ascii码来代替,将其命名为compile_new_c.c。compile_new_c.c用新编译器_a来编译compile_new_c.c,将生成新编译器_c,新编译器_c的代码相当于代码compile_new_c.c中所有’\\’被替换为’\’后的样子,如下所示,暂且称之为代码compile_new_c1.c:代码compile_new_c1.c编译器自身源代码编译器应用程序源代码输出文件名compile_old.c老编译器compile_new_a.c新编译器_a,支持’\\’compile_new_a.c新编译器_acompile_new_a.c编译失败compile_new_a.c新编译器_acompile_new_b.c新编译器_b,支持’\\’compile_new_a.c新编译器_acompile_new_c.c新编译器_c,间接支持\n最后再修改compile_new_c.c为compile_new_d.c,将10用’\n’替代。代码compile_new_d.c用新编译器_c编译compile_new_d.c,生成新编译器d,将直接识别’\n’。同理,新编译器d的代码相当于代码compile_new_d.c中,所有字符串’\\’被替换为字符’\’、字符’\n’被替换为数字10后的样子,即等同于代码compile_new_c1.c。编译器自身源代码编译器应用程序源代码输出文件名compile_old.c老编译器compile_new_a.c新编译器_a,支持’\\’compile_new_a.c新编译器_acompile_new_a.c编译失败compile_new_a.c新编译器_acompile_new_b.c新编译器_b,支持’\\’compile_new_a.c新编译器_acompile_new_c.c新编译器_c,间接支持\ncompile_new_c.c新编译器_ccompile_new_d.c新编译器d,直接支持\n编译器经过这样不断的训练,功能越来越强大,不过体积也越来越大了。累死哥了。
喜欢该文的人也喜欢自制编译器
请至“随书下载”下载本书试读样章和相关资料。
本书将带领读者从头开始制作一门语言的编译器。笔者特意为本书设计了C?语言,C?可以说是C语言的子集,实现了包括指针运算等在内的C语言的主要部分。本书所实现的编译器就是C?语言的编译器, 是实实在在的编译器,而非有诸多限制的玩具。另外,除编译器之外,本书对以编译器为中心的编程语言的运行环境,即编译器、汇编器、链接器、硬件、运行时环境等都有所提及,介绍了程序运行的所有环节。
其他购买方式?
本书是HTTP及其相关核心Web技术方面的权威著作,主要介绍了Web应用程序是如何工作的,核心的因特网协议如何...
本书是JavaScript超级畅销书的新版。ECMAScript 5 和HTML5在标准之争中双双胜出,使大量...
本书全面而详细地阐述了计算机科学的理论基础,从抽象概念的机械化到各种数据模型的建立,用算法、数据抽象等核心思想...
通过学习本书,你将能够:
掌握最新的语言细节,包括Java 8的变化
使用基本的Java句法学习面向对...
机器学习是人工智能研究领域中一个极其重要的研究方向,在现今的大数据时代背景下,捕获数据并从中萃取有价值的信息或...
从零开始制作真正的编译器。
贯穿编译、汇编、链接、加载的全过程!
比“龙书”更具实践性!
通过实际动手制作一个精简版C语言编译器,让读者深入了解C语言程序编译、运行背后的细节。
不仅限于编译器,对以编译器为中心的编程语言的运行环境,即编译器、汇编器、链接器、硬件以及运行时环境等,均有所涉及。
日本知名技术书作家青木峰郎耗时3年精心打造,通过具体的例子讲解概念,通俗易懂,更适合入门。
第 1 部分 代码分析
第 3 章 语法分析的概要
第 4 章 词法分析
第 5 章 基于 JavaCC 的解析器的描述
第 6 章 语法分析
第 2 部分 抽象语法树和中间代码
第 7 章 JavaCC 的 action 和抽象语法树
第 8 章 抽象语法树的生成
第 9 章 语义分析(1)引用的消解
第 10 章 语义分析(2)静态类型检查
第 11 章 中间代码的转换
第 3 部分 汇编代码
第 12 章 x86 架构的概要
第 13 章 x86 汇编器编程
第 14 章 函数和变量
第 15 章 编译表达式和语句
第 16 章 分配栈帧
第 17 章 优化的方法
第 4 部分 链接和加载
第 18 章 生成目标文件
第 19 章 链接和库
第 20 章 加载程序
第 21 章 生成地址无关代码
第 22 章 扩展阅读
青木峰郎(作者)
程序员,著有《Ruby程序设计268技(第2版)》《Ruby源代码完全解说》《Linux程序设计》等多部编程相关著作。并积极参与标准库维护、文档维护等各种各样的活动。
严圣逸(译者)
毕业于上海交通大学。8年软件开发经验,期间赴日本工作。现就职于想能信息科技(上海)有限公司,从事基于云平台的客户关系管理及各类营销自动化系统的开发工作。译有《高效团队开发:工具与方法》。
绝云(译者)
毕业于清华大学软件学院。曾在日本创意公司KAYAC从事即时通讯软件及社交游戏的开发工作,现任蚂蚁金服前端架构专家。译有《写给大家看的算法书》等图书,曾参与《像外行一样思考,像专家一样实践(修订版)》的审校。
本书全面讲述了现代编译器的各个组成部分,包括词法分析、语法分析、抽象语法、语义检查、中间代码表示、指令选择、数...
这个问题和朋友,同事都讨论过数次,这里做个总结。
大部分认为用手写。
其实我不反对实际当中这么干的,但要说清楚非要用语法工具编写的原因。
用手写的理由大部分是:
编写速度快,可以快速上线
益于其他程序员理解。
就以上两点
首先,我们编写的手撸递归下降程序,…...13020 条评论分享收藏感谢收起let fact = \n -&
if n == 1 then 1 else n * (fact n - 1);
print $ fact 5;
利用模式匹配写阶乘:let fact n@1 = 1;
let fact n@Number = n * (fact n - 1);
print $ fact 5;
不动点组合子阶乘:let z = \f -& (\x -& f (\y -& x x y)) (\x -& f (\y -& x x y));
let makeFact = \g -& \n -& if n & 2
else n * (g n - 1);
let fact = z makeFact;
print $ fact 5;
网页版运行截图:是的,就是和 haskell 这么像。=====说正事=====之前我写过一个 js 代码高亮插件,用于高亮 html、js、css 代码,。原理是将代码切分成一系列 tokens, 然后给这些 tokens 添加着色就好了。至于如何切分 tokens 呢?Parser 就是负责这个事情的。我们先将输入的代码先分成以下几个基本元素:数字 Number字面量 Literial标点 Punctuar空白符 White文件结束符 EOF我们的任务就是要区分它们,这个目标还是蛮容易的,我们使用递归下降法来解析,这就是一个状态机的模型:首先,我们的初始状态机 State 处于默认状态。读入待解析代码,读第一个字符 c ,这时候有五种可能:c 属于 '9' ~ '0',State 转为数字模式。c 属于 'a' ~ 'z' 或者 'A' ~ 'Z',State 转为字面量模式。c 属于 '*,;"+'... 的标点,State 转为标点模式。c 属于 '\t' 或者 '\n' 或者空格,State 转为空白符模式。c 为空,则到了代码的最后,State 为文件结束模式。进入另一个模式后,我们会用不同的策略来接收下一个字符。比如,在数字模式假如下一个字符是 '0' ~ '9',那么读入数字,并拼接到之前的数字后;直到接收到一个非数字的字符(这里我们就不考虑小数了)。当退出数字模式,我们就能得到一个数字的 token 啦。同理我们可以得到标点,字面量等等。关于字面量,我们还需要做一些分类,字面量包括变量名,关键字,所以我们实现要有一个关键字表,当字面量不再关键字表里面,我们视为一个变量或者是函数名,否则就是有语法意义的字符比如 if else 。初步的 tokens 切分结束后,去除空白 tokens,我们就得到一个 token 数组。这时候我们要建立抽象语法树 (Abstract syntax tree)了。先设计几个基本语法,比如声明一个函数或者变量时,使用`let`关键字,`if...else...then...`做分支判断,声明匿名函数使用类似'\n -& n + 1'的语法(有且只有一个参数 n ,n + 1 为返回值),表达式采用中缀 `1 + 2 + a`。这时候我们可以定义几个树节点类型了:声明节点, defineNode (let x = 5)匿名函数节点, lambdaNode (\n -& n + 1)分支节点,conditionNode (if ... then ... else ...)引用节点,代表某一个已声明的变量值或者函数名 objectNode数字节点,代表一个数字,numberNode表达式节点, 代表某一中缀表达式,其本身储存运算符,比如 a + b,节点储存 `+`,expressNode函数调用节点,表示对函数的调用,比如 print x,callNode我们的任务就是将 tokens 转为这些节点的相互关系。首先还是读入第一个 token,判断 token 类型,如果是`let`,那么就按照声明节点来解析; 如果是`\`则是一个匿名函数声明节点,如果是`if`,则解析一个分支节点…… 解析表达式节点会难一点,因为有运算符的优先级,我参照了 llvm 教程中的 kaleidoscope 语言来写(传送门,)。总之这是需要你认真理解的一步,这一步完后,就可以根据语法树来得到代码运行结果了。每一种节点的结果计算方式都不同,但是有统一的接口 getValue()。比如声明节点无返回值,匿名函数返回一个函数,分支节点先对 condition 求值,当 condition 为 true,返回第一个分支的 value,否则是第二个……当这一切结束后,你的第一个语言就完成了。当然,现在我的语言已经比较复杂了,比如加入了模式匹配节点,声明多参数函数的语法糖,改变结合方向等等。你可以看我的 commit log 来看到我是如何一步一步添加这些功能的。编译原理这个方向,龙书虎书是经典,若要深入学习,一定要看。不过我也没有时间啃下来,不过有一本书也是简单有趣,叫做《计算的本质》,O‘REILY 出的,值得信赖。说了那么多,我这个只能算是解释器,并没有真正编译,当然对于初级已经够了。你不满足的话我再给你指条路,llvm 教程中有一个小语言叫做 kaleidoscope,你按照这个教程来,,这是我当年留下的中文翻译坑,当时翻了一些后就去做实验室任务了。这个从 parser 到 ast 到 ir 到各种优化都很全。赞同 8717 条评论分享收藏感谢收起怎么开始动手自己写一个编译器,编译器的理论学习该从何处下手?
09:47:28 +08:00 · 3279 次点击
当初不好好学习,基础性的东西还是太少,想补回来
现在还是想 from scratch 的学一下,想实现把一份源代码到可执行文件串起来
不知各位有什么好的学习路径,有哪些好的视频或教学系列吗
29 回复 &| &直到
12:41:09 +08:00
& & 09:52:50 +08:00
& & 09:54:08 +08:00
& & 10:01:47 +08:00
斯坦福大学幕课 编译器,理论加编程作业,实现一个教学语言编译器,从词法分析到代码生成与优化(需要学习汇编呦)
& & 10:17:41 +08:00
给一楼跪了。。。。
奉劝新人不要第一门语言选 js,会走上邪路的。。。。
& & 10:22:33 +08:00
有一本龍書。。。https://book.douban.com/subject/1134994/
& & 10:33:01 +08:00
最经典的是龙书吧
& & 10:41:57 +08:00
小叶子?~
& & 10:44:10 +08:00
我看着 LLVM 的教程写了个前端,还没优化
[LLVM 教程_CN]( )
[LLVM 教程_EN]( )
还有这个我没怎么看过的
& & 10:49:20 +08:00
入门难度的话就《自制编译器》,日本人的书很多细节都描述到了,适合入门。
& & 10:49:54 +08:00
编译器最好不要用脚本语言写,虽然很舒服。 不过学不到什么东西的。
我的编译原理课程就是全部用 python 写的,写起来贼快。
可是,思路完全跟 用 C 艹 写出来的不一样。
& & 10:50:26 +08:00 via Android
& & 10:58:33 +08:00 via iPhone
左鲸右虎中恶龙
& & 10:59:59 +08:00
以前莱斯大学编的一本编译器工程不错的
前端后端都有
& & 11:11:20 +08:00
怎么感觉都是前端...求后端优化 /字节码生成的教程
& & 11:15:26 +08:00 via Android
明天编译原理期末考试
& & 11:17:18 +08:00
这本后端挺多的
& & 11:17:37 +08:00
@ 距离考试还有 2 小时 13 分
& & 11:28:50 +08:00
以下的书都是我自己看过的:
1.纯入门的话,推荐 &自制编译器& 作者: [日] 青木峰郎
这本书用  Java 完整实现一个类C语法的可生成汇编代码的编译器。好处在于非常注重实战,但是又适度的介绍了相关的理论知识,对形成编译器整体的概念有很好的帮助。更好的是,对于大部分程序员日常的需求(比如工作中写个 DSL, 写特定格式文件的 Parser 等等)来说,掌握本书所讲的内容及工程实践基本能够应对了。
2.&编译原理及实践& 作者: Kenneth C.Louden
这本是我们的教材。这本书最大的缺点在于中文翻译极其差。但是就书本身来说,实现了一个简化的 C 语言编译器, 理论部分也讲得通俗易懂,特别是对于前端相关的知识相对于龙书来说详略得当,对初学者相当友好。相对于上一本来说,由于是编译原理教材,会更多的涉及相关的理论知识,适合为深入的学习编译器相关内容做理论铺垫。
3.&编译器设计& 作者: Keith Cooper / Linda Torczon
这本书对编译器后端的知识覆盖的非常好,我是通过这本书开始比较完整系统的入门了后端相关的内容(之前看过龙书没怎么看懂)。作为&编译原理及实践&之后的学习材料,我个人认为非常合适。
根据我个人的感受,按照以上三本书的路径循序渐进的入门是比较合适的。另外,以上的内容看着很多,其实真正入门后学起来很快,特别是前两本书的内容(更偏重前端),我相信如果是在校学生的话,一个暑假的时间搞定前两本不是不可能的。
& & 12:34:05 +08:00
洗洗睡了吧,基础不好还写编译器?
& & 12:48:06 +08:00
建议跟着这几门课学一下
15-213 还有 15-411
& & 16:15:48 +08:00
推荐 18 楼的书,不过我觉得《自制编译器》还是省略了一部分,比如他们是用 JavaCC 跳过了手写 parser 这些内容,所以我建议读《编译器设计》,很不错的一本书。
& & 16:32:48 +08:00
mark 一下,看起来挺有意思的。。
& & 17:03:52 +08:00
感觉你需要的不只是一个编译器,而是一整套:
《自制编程语言》 前桥和弥 (Maebasi Kazuya)
& & 19:13:27 +08:00
& & 19:35:07 +08:00 via Android
当然是看龙虎豹啦( ??ω??)(雾,其实是龙虎鲸),不过我感觉虎好点,龙看得话太抽象了,而且中文版翻译很渣。另外有本叫编译器设计( compiler engineer )也很不错,和虎的讨论很像但是讲的更细。
& & 19:43:05 +08:00 via Android
@ 写错了书名,编译器设计( Engineering a compiler )
& & 19:58:24 +08:00 via Android
可以先看 sicp,然后撸个解释器
& & 08:12:01 +08:00
Java 和 C 的两个版本,来自 google Dart 语言作者 Bob Nystrom
& & 12:41:09 +08:00
给一个我的编译器课的项目地址:
这是我老板的课,上得还挺好的,作业是撸一个 compiler。
& · & 1545 人在线 & 最高记录 3541 & · &
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.1 · 18ms · UTC 00:15 · PVG 08:15 · LAX 17:15 · JFK 20:15? Do have faith in what you're doing.}

我要回帖

更多关于 编译器是如何编写的 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信