面向对象语言的编译过程–以C++为例(一)

 

摘要:

概述面向对象语言的重要概念和实现技术

以C 语言为例,介绍如何将C 程序翻译成C程序

实际的编译器大都把C 程序直接翻译成低级语言程序

关于面向过程的高级语言的编译过程想必大家不陌生。《编译原理》类的课程多是以C语言(C的子集)为例,介绍高级语言的编译过程。但是自从面向对象语言产生以来(I love OO programming,yeah),面向对象的编程语言明显在编程语言中占据了主流的位置。面向对象的编程语言有三个明显的特点:封装(Encapsulation),继承(Inheritance),和多态(Polymorphism)——以上是一道常见的面试题,各位童鞋请注意。最初的面向对象语言往往只提供部分的面向对象特性,比如VB(oh,I love VB so much)。

面向对象的三个特性给代码复用带来的极大的好处,同时也改变了程序员的理念,使逻辑开发更接近于现实世界,而面向对象从根本上说是一种世界观,是对现实世界的一种认识方式,扯远了。

那么编译器是如何理解这三个特性的呢?我们以C 为例,看编译器如何把面向对象的程序翻译成面向过程的程序,也就是把C 翻译成C语言,实际的编译器往往直接把C 程序翻译成低级语言,但是也有特例,比如ObjectC,就是把C 翻译成C语言,而以C语言(或C语言的子集,不甚了解)作为中间代码的。

翻译的过程如下:

1. 将C 语言中一个类的所有非静态属性构成一个C语言的结构体类型,取类的名字作为结构体类型的名字

2. 类的静态属性是该类的所有对象所共有的,应当翻译成C中的全局变量,但是需要改一个名字

3. C 语言中类的对象声明不加翻译就成了C语言中相应结构体类型的变量声明

4. 将C 语言中类的非静态方法翻译成C语言的函数,对应的方法和函数的区别有下面几点:

函数的名字必须在原来方法名的基础上修改

函数声明增加一个形参this

在函数体中出现的函数调用也要增加一个实参

在方法中对本对象的非静态属性的访问,改成对this相应域的访问。在方法中对其它对象的非静态属性的访问不必修改

5. 类的静态方法在定义和调用的地方都需要改名

我们举一个例子,以下是一个简单的面向对象的程序,主要体现了面向对象的封装特性:

#include 

using namespace std;

class Test

{

    public:

    //一个静态变量

    static int c;

    int a;

    static void printc();

    void printa();

};

int Test::c;//静态变量初始化

void Test::printc()

{

cout