Compiler的一些事(其一)

作为个人观念中计算机科学中的三大浪漫之一,在下终于在这个学期有机会去实现了一个相对较为完整的编译器。虽然仅仅是作为课程作业,不过也实现了编译器所需要的许多部分:Parser, Optimizer, Instruction Selection Module等等,而除此之外也从个人的角度去了解了一些有关编译器或者编译器实现的信息,在此记录下来权当一份备忘。而这第一篇,我们先说说我们用来实现这个编译器的语言:Haskell。

现在应该不存在任何一个成熟语言不能被用来实现编译器了,从传统的选择如C, Caml,到相对较新的Go, Rust,几乎都有用其写成的编译器,甚至是编译本身的编译器,甚至是官方用来编译自己的编译器。而对于这个贯穿了整个学期的大作业,我们选择了Haskell作为实现语言。而从结果来看,这个选择给我们带来了许多便利,当然也有一些麻烦。

从便利的角度来讲,Haskell有着很方便的Data Constructor语法,与之配套的Pattern Match和Guard Expression,以及非常强大的<del>被囚禁了一万年的力量</del>Monad。前者可以帮助我们很好的去进行模式匹配,特别是在编写优化代码的时候,例如:

mergeStmts (IRMov toTemp@(IRTemp _ _) val) 
           (IRMov loc (IRLoc fromTemp@(IRTemp _ _)))
         | toTemp == fromTemp = [IRMov loc val]
mergeStmts (IRAsgnOp toTemp@(IRTemp _ _) op val1 val2) 
           (IRMov loc (IRLoc fromTemp@(IRTemp _ _)))
         | toTemp == fromTemp = [IRAsgnOp loc op val1 val2]
mergeStmts lastStmt newStmt = [lastStmt, newStmt]

当然这并不是Haskell所独有的,其他的函数式编程语言,例如OCaml也有相似的语法,不过如果在C或者Python里面,大概就要用宏或者Meta Programming来替代了。

而后者,作为笔者初学Haskell时记忆最深的东西,在笔者经过一个学期从觉得各种坑到离开Monad就不会写程序的转变之后,笔者的感觉是Monad确确实实很好用,一方面,它可以允许程序员在特定的时候使用更加贴近过程式语言的文法来减少行数,进而减少错误;另一方面,配合不同的Monad以及Haskell强大的类型系统,它可以有效地帮助避免编写时的错误,并且提高可读性,例如是分离有副作用和没有副作用的代码。当然Monad本身几句话是说不完的,一个比较有趣的文章是Monad Transformer and Modular Interpreter,介绍了常用的State,Reader,Writer等Monad在实现解释器中的作用。

而从麻烦的角度来说,最大的问题当然是

教练,我们都没用过Haskell啊!

其次则是关于惰性求值。惰性求值意味着当且仅当一个变量的值真的被用到(例如IO操作,Trace),它和它的子表达式才会被求值,所以写程序的时候务必要时刻记着这一点,特别是<del>你想用你的方式守护你心爱的程序的时候</del>使用一些Unsafe或者IO相关的东西的时候。例如我们为了降低编译器超时的可能性,选择对寄存器染色进行限时,但这是要务必用Seq或者DeepSeq保证实际的染色结果在时限内被完全求值,否则限时就只是在限制构造出这段程序本身了。

而最后则是性能问题。编译器中的特定部分,例如上文提到的寄存器染色复杂度很高,而Haskell中由于所有的变量都是不变量,绝大多数操作,包括Map,都需要至少O(log N)的复杂度,除非用ST Monad或者IO Monad相关的可变容器。笔者在这个问题上选择的更加激进的做法:用C++实现模块,在Haskell中通过FFI调用,但也遇到了各种Segmentation Fault什么的,而且,并没能完全解决掉。

而一点题外话则是Haskell本身的编译系统很值得了解,虽然笔者只是看了一些皮毛,但是还是感受到了<del>如此强大的力量(你要玩多少遍这个梗啊)</del>。通过巧妙地运用指针低位等黑科技,Haskell的编译器能够生成非常高效的的代码,如果没有被程序员误用的话。

(待续)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容