我已经编程多年了(主要是Python),但我不理解当我编译或执行代码时幕后会发生什么。
在我之前问过的关于操作系统的question的脉络中,我正在寻找编程语言工程的温和介绍。我希望能够定义和理解编译器、解释器、本机代码、托管代码、虚拟机等术语的基础知识。了解这一点的有趣和互动的方式是什么?
发布于 2009-10-04 08:55:20
在nutshell中执行的代码
程序(代码)被输入到编译器(或解释器)中。
字符用于形成标记(+、标识符、数字),它们的值存储在称为符号表的东西中。
将这些标记放在一起形成语句:(int =6+b* c;)。主要以语法树的形式出现:
=
/ \
/ \
a +
/ \
/ \
6 *
/ \
b c在解释器中,树是直接执行的。
使用编译器,树最终被翻译成中间代码或汇编代码。
你现在有一个或多个“目标文件”。它们包含汇编程序代码,没有精确的跳转(因为这些值还不知道,特别是当目标位于其他目标文件中时)。目标文件通过一个链接器链接在一起,该链接器填充跳转的空白(ans引用)。链接器的输出是库(也可以链接)或可执行文件。
如果启动可执行文件,程序数据将被复制到内存中,并且会有一些其他链接来将指针与正确的内存位置相匹配。然后将控制权交给第一条指令。
发布于 2009-10-04 08:54:22
编译器、解释器和虚拟机只是实现细节的示例。你可能需要的是编程语言理论,生成语法,语言翻译器,你可能需要一些计算机体系结构来将理论与实现联系起来。
就我个人而言,我从Sebesta's book那里学到了东西。它对这个主题进行了非常广泛的介绍,但没有深入细节。它也有一个关于编程语言历史的很好的章节(大约20种语言~每种语言3篇论文)。它对语法和语言理论有很好的解释。此外,它还很好地介绍了Scheme、Prolog和编程范式(逻辑、函数式、命令式、面向对象)。
^它比前两个更专注于命令式范式。
发布于 2009-10-04 17:17:53
简单地说,就是编写。这些都是花哨的文本文件,它们被接收,输出某种形式的可执行代码(执行它的内容取决于您所说的代码类型)。编译器有几个部分:
的二进制文件的实际过程。
解释器是一种程序,它以某种形式的二进制数据表示未编译为目标机器可直接执行的代码的程序,并在其中运行命令。例如python、java和lua。
这是已编译成可由目标计算机直接执行的本机指令的代码。例如,如果您在x86架构上运行,那么c++将编译成处理器可以理解的可执行文件。
这通常是为模拟处理器的构造和操作而构建的程序。它可能像读取并根据字节码表示的命令运行本机语言操作的程序一样简单(尽管将其称为虚拟机可能有些夸张),也可能像完全模拟处理器和所有相关外围设备的行为一样复杂。
这些其他的答案都有很好的观点,但这些信息和链接应该能让你入门。任何其他问题,尽管问吧!
(这篇文章的大部分内容都是在维基百科的帮助下写的,但也有一些是凭记忆写的)
https://stackoverflow.com/questions/1515940
复制相似问题