首先定义一下题目中出现的“高级语言”和“低级语言”,这里的高级和低级指的不是语言特性的丰富程度区别、也不是开发环境和工具的区别,既然谈编译,我打算说的是编程语言实现中很常见的一种模式,即用相对原生的(比如可以方便灵活地构造复杂的数据结构,和操作系统交互极其容易),来实现一个相对高级的运行时环境(例如有垃圾回收等比较复杂的特性)以及运行在这个运行时环境的编程语言。一个很典型的实例就是,用C/C++来实现一个小型的编程语言虚拟机,有自己的指令集,以及其上的编程语言(例如Python的最原始实现CPython和Lua的官方实现这样的模式)。这样的编程语言实现模式相对简单,可以暂时跳过后端繁琐的事务,但是又不至于过分依赖高级工具(例如某些支持JIT的成品虚拟机或者LLVM)以至于让自己觉得好像略过了很多工作自己做得不够。
我们知道,哪怕是C语言这样的比较“原生”的语言,自带的标准库功能都是相当原始的。如果一个人从头包办所有的工作用C语言开发,在现在这个社会对应用快速开发的要求下,首先是很困难,因为不少该是库完成的功能要全部自己做工作量将会非常大,然后是有时候这样的愿望根本不可能实现。比如实现一个程序,你需要加密功能,那么得首先花一段时间熟悉数据加密方面的知识、研究到公钥方面甚至可能还得看看数论;而开发一个游戏程序、可能得学习不少图形知识,在没有任何库的辅助下自己实现一个类似“软渲染”的东西,中间一堆矩阵变换什么的……那么多知识,一般人根本应付不来。好在可以调用外部库,加密库由密码学专家开发,图形库由图形学专家开发,这样避免了重复工作,我们可以把精力集中在最重要的业务上。原生库,往往和那些原生的编程语言实现(比如C/C++)本质上一样,都是一些二进制机器码,通过操作系统给出的接口调用即可,实在没有操作系统自己也可以做个简单的加载器实现类似的效果。而前文提到的那类高级语言,实现上就不能简单地照搬原生低级语言的模式了,这里面牵涉了很多微妙的问题和技巧。
我策划了5篇文章围绕这个主题讲我的一些经验,这些主题涵盖了设计高级语言虚拟机和低级语言交互的若干初级话题:
一:操作系统接口
二:高级语言调用原生语言
三:原生语言调用高级语言
四:外部事件
五:线程与全局锁
以后也许也会补充更多的文章,希望这些文章能给读者解释一些疑惑,也给预备实现编程语言的朋友防止“踩坑”做一些提示,也非常欢迎读者和我进行交流。
posted on 2014-07-28 03:58
呜呜 阅读(487)
评论(0) 编辑 收藏 引用