wamcc:将Prolog编译成C (No.7-2)

二、WAM之下
几十年来势在必行,功能或逻辑语言的编译器分解在几个步骤。特别是使用一个抽象机作为高层次的源代码和低层次可执行目标代码之间的中间层。事实上,自从Pascal和P-代码,抽象机一直强调作为编译过程中的骨干。逻辑语言这里也不例外,将Prolog编译成WAM指令是事实上的标准和众所周知的过程。然而,WAM代码不能在直接在主流电脑执行,因此,需要一些治疗,以做出的可执行文件。存在经典的两种方法来执行WAM代码:WAM公司的仿真器或翻译器将其转为机器码。

模拟的WAM代码通常想到第一个解决方案。这种做法中,WAM指令(字节码)简单地被视为数据,将由某些模拟器程序处理,通常用C或汇编语言编写。一个模拟器的优点在于它的简单的书面形式(约3000行的未优化C代码),当用如C之类的语言,它具有可移植性。它能够创建和动态修改WAM代码。这些优势使得它成为Prolog语言开发人员之间的主要趋势。但是这种方法有一个重大的缺点,在仿真​​的开销周期:读取,解码和执行。另一个缺点是,它是不可能产生作为输出的一个自主的可执行程序,因为模拟器已存在。

生产机器码的特点,大致与仿真相反。写一个翻译器,从抽象的代码机器代码是一项艰巨的任务,需要一个深入地了解目标机。在这个价位的良好的性能,尤其是在RISC架构优化的代码是必不可少的。这样的编译器是不容易移植的新架构:机器是特别好,在某些方面也可能成为另一台机器的致命弱点。另一方面,开发机器码编译器,包括许多经典的部分,也许会痛苦地发展,但足够的技术是众所周知的,例如:寄存器分配。

由于这些方法都不符合我们的要求,我们决定尝试另一种由Prolog翻译成C的方法。以弥补缺乏优化(要求简单起见),缺少仿真开销的阶段(获取和解码),最终,C编译器会产生原生代码。这样做,我们将结合仿真和编译的优点到机器码。然而,没有这样的经验【1】,早在1991年我们已经做了决定开发我们的系统1。即使在今天,三年过去了,我们自己的wamcc系统之外,没有实施基于C编译的Prolog是适合的。然而在此期间实现几种确定而归属选择语言,可有如下选择:Janus[7],KL1[3]和Erlang[8]。它们都基于不同的编译计划,有趣的是拿它们和wamcc比较为了确定性的Prolog。

【1】虽然80年代末已有ECRC不成功的实验



你可能感兴趣的:(c,优化,erlang,语言,pascal,编译器)