跳至主要内容

用C语言写解释器(五)

用C语言写解释器(五)——其他一些东西

redraiment, 2009-11-05

写完解释器之后





  这一篇文章我只想和大家侃侃编程语言的事情,不会被放到书中。因此可以天南地北地扯淡,不用像前几篇一样畏首畏尾的了。
  经过前面几篇文章的讨论,已经把用纯 C 语言来实现一个解释器的方法介绍完了。但那些是写给我校 C 语言初学者看的,并不只是你,我得也觉得很不过瘾 ^_^。因此准备继续深入学习编译原理等课程,希望有志同道合的朋友和我一起交流!

富饶的语言(工具)

  在前几篇文章中一直在鼓吹我拍脑袋想出的语言四大要素:“内存管理”、“表达式求值”、“输入/输出”、“按条件跳转”,在这篇文章中您就姑且信一回当它是真的。按照这四条准则去匹配,汇编语言是完全符合的。那为什么又需要 C 语言、Java、C# 等高级语言?这是因为编程除了需要“语言”之外还需要“抽象”!
  “抽象”是个很有效的工具,相信你在为别人介绍自己房间时不会具体到每个木纤维、油漆分子和铁原子。同样的,我们也不乐意总是写一堆 JNZ、JMP 指令,而仅仅是为了实现 if、for、while 等控制结构。C 语言等高级语言提供的抽象的层次更高、表现力更强,允许用更少的语句描述更多的操作。感谢如此富饶的语言为我们带来不同的视角去审视这个世界。
  高级语言相较于低级语言属于更高地抽象层次,高级语言之间的差别主要体现在适用范围上。比如一些语言适合写 WEB 程序,另一些适合做数值分析等。术业有专攻,你只需根据自己的问题来选择一门合适的语言。

什么时候需要创造新的语言

  当我们碰到一类新的问题时,首先考虑的就是定义新的数据结构,并设计多个函数去操作它,最后将它们独立出来打包成一个类库方便在其他地方调用(比如处理图形图像的 OpenGL 库)。上面已经提过,每种语言都有它适合的领域,强行将一门语言用在它不擅长的领域中就出现冗长、繁琐的代码。自然语言也是如此:英语中有种语法叫虚拟语气,描述的是一种假设,并非事实。比如“If I have time, I will go to see you. ”。如果按原意一字不差地翻译相信会很繁琐,我知道台湾作家痞子蔡在使用中文式的虚拟语气很有一套:
如果我还能活一天,
我就要做你的爱侣。
我能活一天吗?可惜。
所以我不是你的爱侣。  ——《第一次亲密接触》
  上面是一段完整表现虚拟语气精髓的话,相信在生活中我们不会这么罗嗦。同样的,如果你发现用现有语言来描述某个特定领域问题时显得力不从心,就可以考虑为这个领域定制一种特定的语言了(Domain Specific Language)!使用现成的词法分析器和语法分析器(比如 lex 和 yacc)对提高开发效率很有帮助,但你也可以考虑采用像 REBOL 这样的语言设计一个“方言”,这会更简单。如果你对 DSL 或 REBOL 有兴趣,可以加入阿里旺旺 REBOL 群(16626148)和蔡学镛前辈交流,他是这方面的专家。

从语言(工具)中挣脱

  从写解释器这件事中可以获得一些建议:不要再争论哪个语言更优秀,只有最适合的;用高级语言写代码首先力求可读性好。第一条建议我在以前讨论“工具理论”时提过很多次,就不再重复,主要交流一下可读性的问题。
  经过了上面冗长的解释和亲自实现解释器以后,大家应该能了解到:一门新语言诞生的动机多数情况下不是为了提高执行效率,而是为了提高开发效率。很多人都沉浸在“++i”比“i++”高效、“10>>1”比“10/2”快等奇技淫巧中,但在你自己实现过解释器后希望能明白,如果真有哪个解释器执行语句“i++;”的效率比“++i;”低,那只能说明这个解释器写得烂!像现代的 C 语言编译器都会有优化的选项,编译时去识别一些常见的热点进行优化,难保那些自以为是的优化反而将代码破坏得连编译器也无法识别。所以要迁就解释器而将代码改得乱七八糟,我宁可换一个更好的解释器!
  真的想深入研究算法,就势必会和硬件相关。你需要精确地知道代码一共执行了多少个时钟周期,而不是简单地根据嵌套了几层 FOR 循环来判断复杂度是 O(n) 还是 O(n2)。除非你深入了解你的解释器,否则无从知晓执行一条 FOR 语句时解释器会不会背着你扫描了整个内存空间。无怪乎经典巨著《计算机程序设计艺术》三卷本中要使用汇编语言来编写代码。

总结

  废话了这么多,我只是想表达“我们是主人”,不要被一个蹩脚的工具牵着鼻子走。当你发现打字员平均打字速度忙时,总不会为了迁就她而只说一些她打得快的字吧?以上内容属于个人观点,切莫认真。欢迎大家通过邮件和我交流你们的想法,我的邮箱地址:redraiment@gmail.com


评论

此博客中的热门博文

AutoHotKey 新手入门教程

AutoHotKey 真是一个好玩的工具!短短几行代码就是先了“窗口置顶”、“窗口透明”等功能,之前我还特意为此装了好几个小工具,现在都可以卸掉了。闲来无事,就把 Quick Start 翻译了一下,我没有逐字逐句地翻译,有时候我嫌原文罗嗦就用自己的话概括地描述了一下。 原文地址:http://www.autohotkey.com/docs/Tutorial.htm 教程目录 创建脚本 启动程序 模拟鼠标键盘 操纵窗口 输入 变量与剪切板 循环 操纵文件 其他特性 创建脚本 每个脚本都是一个纯文本文件,由一些能被 AutoHotKey.exe 执行的命令组成。一个脚本可能还包含 热键 和 热字符串 。如果没有热键和热字符串,脚本在启动的时候就会从头依次执行到尾。 创建一个新的脚本: 下载 并安装 AutoHotkey。 右击鼠标,选择 新建 -> 文本文档 。 输入文件名并确保以 .ahk 结尾。例如:Test.ahk。 右击文件,选择 编辑脚本 。 输入以下内容:#space::Run www.google.com 上一行的第一个字符 "#" 代表键盘上的 Windows 键;所以 #space 表示在按住 Windows 键后再按空格键。"::" 后面的命令会在热键激活后执行,在本例中则会打开谷歌主页。继续按下面步骤操作,来执行这个脚本: 保存并关闭该文件。 双击该文件来启动它。在系统托盘里会出现一个新图标。 按下 Windows 和空格键,网页会在默认的浏览器里打开。 右击系统托盘里的绿色图标可以退出或编辑当前脚本。 注意: 可以同时启动多个脚本,并且在系统托盘里都会有一个相应的图标。 每个脚本都能定义多个 热键 和 热字符串 。 想让某个脚本开机即启动,可以将它的 快捷方式放到开始菜单的启动目录里 。 启动程序 命令 Run 可以运行程序、打开文档、网页链接或快捷键。请参看以下示例: Run Notepad Run C:\My Documents\Address List.doc Run C:\My Documents\My Shortcut.lnk Run www.yahoo.com Run mailto:someone@somedoma...

OmniGroup

前几天买了OmniGroup全家桶,强迫自己熟悉这些“效率工具”。现记录一些自己的理解。 为什么这些工具的功能看起来有重叠? 我的理解是每一款应用都是面向特定领域的专业人士的,并不会真的有像我这么“变态”的人一下子买全家桶的。 每款工具各自的作用和区别? OmniFocus:面向个人的GTD工具,。 OmniPlan:面向小组的项目管理工具。OmniFocus和它的区别:前者管理个人的行动;后者管理一组人的任务。 OmniOutline:它和OmniFocus的功能重叠度很高,但作为区分:Focus更专注于Action,即动词;Outline更专注于清单,即名词。 OmniGraffle:这款应用和其他三款区别最大,它是画图软件。它用起来不像我自己开发的KingYoung那么“流畅”,但的确很漂亮。我为了方便使用,还把积灰已久的鼠标拿出来。 OmniFocus 收件箱:灵光一闪,马上收集 项目:根据项目,纵向地将Action组织到一起。项目的特点是有始有终。例如具体看某一本书 上下文:类似于Spring的AOP概念,从横向/切面上看Action。例如读书,可以贯穿所有读书项目 透视:其实就是搜索功能

人所不欲,勿施于人

谁说博客也要像论文一样结构清晰、有条理?! 软件卸载 昨天整理自己的本本,卸载了 VMware 7.0 + 深度XP,MS Office 2007 以及 Visual Basic 6.0。我承认这些都是盗版软件,不过剩下的应用程序都是自由软件(freeware)或免费软件(freeware),这下我的计算机“干净”了。闲来无事,我就细数了一下当初装这些软件的原因: VMware + XP:当初刚买本本的时候,正好在上软件工程实践,紧遵老师的教导“将自己的开发环境随身携带”,自然第一款软件就是装了虚拟机(学校机房里是肆无忌惮地用盗版 VMware),另外上课指定使用 Visio 作图,那也只好一起装了;当然,也有部分原因是因为某些人的计算机装的是 XP,我这边有个 XP 环境也是为了方便问题重现(我的本本预装了 Vista)。 MS Office 2007:在毕设期间,我也还是用 Open Office 和 WPS 2010,但现在公司用的却是 Office 2007(正版)。我这次卸载这款办公软件其实也是在提醒自己:工作的事情要在工作时间里完成! VB 6:你可能无法想象在我们科班的毕业设计中有多少是 VB6 项目,从大二开始,每逢毕业将至,总会有人来找我帮忙看那些不晓得从哪儿搜罗来的 VB6 代码,经不住软磨硬泡,我总会帮着改改;另一个原因在我自己,我一直下不了决心去学 MFC 等,所以但凡要做 GUI 程序,我都是拿 VB6 来画界面,再调用由 C 语言开发的 DLL 库,不过现在改用 QT,于是 VB6 可以功成身退了。 己所不欲,勿施于人 有些人就喜欢把自己的事全盘交托给别人来做,我一直不明白他们既然有精力去说服别人,为什么就没耐心自己去完成(所以我下面说人和人之间是无法理解的)。既然自己都认为这是无聊的事情,为什么偏偏又假设其他人会愿意无偿地帮你来完成呢? 两千多年前,孔老夫子提出“己所不欲,勿施于人”的观点,但到了今天,我听到关于这句话时的语境普遍是,A说:“那个XX东西你也不要了(或要了也没用),不如就让给我吧?”,B就义正言辞地反对:“那怎么可以!己所不欲,勿施于人嘛。” 己所甚欲,勿施于人 易中天老师在《百家讲坛》讲解诸子百家...