编译语言与解释语言
2005年2月4日
从 BASIC 开始,然后 FOXBASE,然后 QBASIC,然后 TURBO C、QUICK C,好像一路从解释语言变成编译语言。然后又是 C++、VB、Javascript、C#、Java、Python,又一变回了解释语言。我们来看看它们有什么不同:
C 语言:在编译之后把所有的代码都转成了机器代码。甚至连结构体的定义在编译之后的代码中也不一定能看见。实际上代码在访问结构体的元素的时候,编译器将其转换成了偏移量。C++ 语言在编译结果上也与 C 语言类似,不过有一点不同:因为 C++ 引入了多态性,因此在面向对象编程里可能需要动态确定对象的类型。此时对于拥有虚函数的类及其子类,所有对象中都会有一个指针,指向这个对象的虚函数表,用以动态确定应该调用哪个函数。
Java/C#:它们是把代码编译出来的。所不同的是,它们也同时把类的结构保存在程序中。类的结构中也许通过包含偏移量的方式,让程序可以通过“反射”找到类的成员。另外,每个非结构体对象都有一个类的标记,而不仅仅是有虚函数的对象。当 int 等对象放到 object 对象中去的时候,想必是同时将 int 这个类型与对象的值同时放进去的。在 C# 里,typeof 操作符可以获取一个类的“type”。之所以不直接用类名而要加一个 typeof 操作符是因为语法的关系:避免二义性。如果要确定对象的运行时类型,要使用对象的 GetType 函数,否则使用 typeof 操作符获取的是对象的编译时类型。
Javascript、Python:它们把函数都作为对象,可以动态创建或操作。甚至函数中的代码都可以动态修改。这是典型的解释型代码。编译型代码得不到这样的好处。