1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 深入思考编译原理之 理解执行过程和编译过程

深入思考编译原理之 理解执行过程和编译过程

时间:2023-02-28 07:29:34

相关推荐

深入思考编译原理之 理解执行过程和编译过程

在深入编译器原理细节之前,很多学习者并没有真正从宏观上理解一个编译器都做了些什么,这其实是非常遗憾的。

从计算机执行过程角度思考,函数调用的尤为重要,面向过程的语言更是将函数调用作为最基本的要素。面向对象的语言也是基于最基本的函数调用实现的。因此本文就从函数调用开始,由浅入深地思考如何构建我们的编译器。

1. 一个函数调用和其子调用之间的结构图。

一个SuperFunction对象 包含很多SubFunction函数,SubFunction 是SuperFunction的子函数。因此我们使用组合模式将他们组合起来。

[img]/upload/attachment/0126/6208/7fdc5860-ec4f-3432-91ca-3a57340e4114.png[/img]

2. 父函数SuperFunction与子函数SubFunction的交互图。

[img]/upload/attachment/0126/6210/fc6bc066-d03c-3502-a43b-6399658d7564.png[/img]

3. 执行引擎:

执行引擎负责创建所有的FunctionObject,连接他们之间的父子关系,进行入栈,出栈。假如这个栈向下增长,那么下图就表示了一个栈的动态结构图。

[img]/upload/attachment/0126/6212/992ef3a1-cfab-3789-ab80-23b7f05bdc87.png[/img]

4. 执行引擎算法设计(java 语言描述)

任意一个如下的函数:

Object function(Object[] parameters);

以上函数用结构体进行描述如下

FunctionObject extends CodeBlock{

Object[] parameters;

Object result;

List<Codeblock> codeBlocks;

}

类图如下

[img]/upload/attachment/0126/6214/0bc8d5a6-9456-306f-b1f0-324794148a67.png[/img]

则执行引擎的执行算法如下:

stack.push(mainfunction);

execute point:

do {

FunctionObject functionObject = stack.peek();

while(functionObject.codeBlocks.size()>0){

CodeBlock codeBlock = functionObject .codeBlocks.top();

If(subFunctionCall){

create subfunction is needed.

stack.push(subfunction);

goto executePoint;

}else{

codeBlock.execute();

codeBlocks.remove(codeBlock);

}

}

stack.pop();

}while(!stack.isEmpty())

5. 编译器,编译器实际上就是把源代码转换为执行引擎能执行的代码的过程。这个过程, 现代编译器一般情况不会直接转换到目标代码。而是有个中间过程,也就所谓的语法分析和语义分析。

我们的analyse 类似如下函数:

FunctionObject anayliyse(String );

6. 有了语法和语义分析,然后我们就可以很容易的转换到目标代码

String transferLanguage(FunctionObject functionObject);

最终形成目标代码。

完毕。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。