文件名称:运行中编译-vmware虚拟机中centos安装 centos安装qt的教程图解
文件大小:8.63MB
文件格式:PDF
更新时间:2024-06-29 06:29:55
程序设计实践
9.7 运行中编译 这几节我们一直在谈论写程序的程序。在前面的所有例子里,生成出来的程序都具有源 代码的形式,它还需要经过编译或者解释才能运行。实际上也可能产生出能够立即投入执行 的代码,只要我们生成的不是源代码而是机器指令。这种做法通常被称为“运行中”的编译, 或者“即时”编译。前一个词出现得更早,而现在后一个词却更流行,包括该词 (Just In Ti m e )的首字母缩写词J I T。 虽然这样编译产生代码必定是不可移植的—只能运行在一种类型的处理器上—但它 却可能非常快。考虑表达式: 计算过程中必须求出c,将它除以2,用得到的结果与b比较,选出其中较大的一个。如果用本 章前面给出了轮廓的虚拟机计算这个具体表达式,我们可以删去在 d i v o p里对除零的检查,因 为2不是0,有关的检查毫无意义。但是,无论确定采用什么样的设计,我们在对虚拟机的实现 做安排时,都不可能去掉其中的检查,在任何除法运算的实现里都必须做除数与 0的比较。 这也就是动态代码生成可以起作用的地方。如果直接从表达式出发构造代码,而不只是 简单地串起预先定义的一些操作,在那些已知除数不是零的地方,是完全可以避免再做除零 检查的。实际上还可以再前进一步,如果整个表达式就是常数,例如 m a x ( 3*3 , 4 / 2 ),我们 可以在产生代码的过程中对它求一次值,然后直接用常数 9取代它。如果表达式出现在一个循 环里,那么循环的每次执行都将节省时间。只要循环的次数足够多,我们就能把为弄清表达 式和生成代码所花费的额外时间都节省回来。 这里的关键思想还是记法。记法给了我们一种表达问题的一般性方法,而这种记法的编 译程序可以针对特定计算的细节生成专门代码。例如,在处理正则表达式的虚拟机里,我们 最好有一个匹配文字型字符的运算: 当我们为特定模式生成代码时,由于 l i t e r a l的值是固定的,例如就是‘ x’,那么我们最好 能改用像下面这样的运算: 190计计程序设计实践 下载