编译器
编辑编译器,是一种计算机程序,它将特定编程语言的源代码翻译成可以(更直接地)由计算机执行的形式。 这导致或多或少的直接可执行程序。 解释器之间必须有所区别,例如 BASIC 的早期版本,它们不生成机器代码。
翻译器和编辑器这两个术语有时会有所区别。 翻译器将程序从正式源语言翻译成正式目标语言的语义等价物。 编译器是将程序代码从面向问题的编程语言(所谓的高级语言)转换为特定体系结构的可执行机器代码或中间代码(字节代码、p 代码或 .NET 代码)的特殊翻译器。 并非在所有情况下都将术语翻译器和编辑器分开。
翻译的过程也称为编译或转换(或用相应的动词)。 相反,即将机器语言反向翻译成特定编程语言的源文本,称为反编译和相应的程序反编译器。
术语
编辑翻译器是一种程序,它将以源语言制定的程序作为输入,并将其翻译成目标语言的语义等价程序。 特别是,要求生成的程序交付与给定程序相同的结果。 源语言的汇编程序通常被视为一个例外——它的翻译器(在机器代码中)被称为“汇编程序”并且是 i. A. 不称为“编译器”。 翻译器的任务包括范围广泛的子任务,从语法分析到目标代码生成。 另一个重要任务是检测并报告源程序中的错误。
“编译器”一词来源于英文“to compile”,真正意义上的“收集器”。 在 20 世纪 50 年代,该术语在计算机世界中尚未牢固确立。 编译器原指由个别子程序或公式求值编制成整体程序,以执行特殊任务的辅助程序。 (链接器今天完成了这项任务,但它也可以集成到编译器中。)各个子程序仍然是用机器语言“手工”编写的。 从 1954 年开始,术语“代数编译器”出现了,它指的是一个独立地将公式转换为机器代码的程序。 随着时间的推移,“代数”消失了。
工作原理
编辑将源代码翻译成目标代码的基本步骤如下:
语法检查检查源代码是否表示有效程序,即是否符合源语言的语法。 记录检测到的错误。 结果是源代码的中间表示。分析和优化分析和优化中间表示。 根据编译器和用户偏好,此步骤的范围有很大差异。 它的范围从简单的效率优化到程序分析,代码生成优化的中间表示被翻译成目标语言中的相应命令。 此外,可以在此处进行特定于目标语言的优化。
注意:同时(大部分)现代编译器不再进行自己的代码生成。
- 启用全局优化的 C++:代码在链接时生成。
- C#:代码生成是由 .NET 环境的 JIT 或 NGEN 编译器在运行时从编译时通用中间语言代码完成的。
- 对于使用公共语言基础结构的其他语言(如 F# 和 VB.NET)也是如此,请参阅 .NET 语言列表。
- Java:代码生成由 Java JIT 编译器在运行时从编译时 Java 字节码完成。
运行时代码生成允许:
- 跨模块优化,
- 对目标平台的精确调整(指令集、对 CPU 功能的调整),
- 分析信息的使用。
编译器的结构
编辑现代编译器分为不同的阶段,每个阶段承担编译器的不同子任务。 其中一些阶段可以作为独立程序实现(参见预编译器、预处理器)。 它们是顺序执行的。 本质上,可以区分两个阶段:前端(也是分析阶段),分析源文本并从中创建属性语法树,以及后端(也是综合阶段),从源文本创建目标程序。
前端(也称为“分析阶段”)
在前端,代码被分析、结构化并检查错误。 它本身是分阶段的,现代C++等语言由于语法上的歧义,不允许将解析分为词法分析、句法分析和语义分析。 他们的编译器相应地复杂。
词法分析
词法分析将读取的源文本拆分为各种类型的词法单元(标记),例如关键字、标识符、数字、字符串或运算符。 编译器的这一部分称为分词器、扫描器或词法分析器。
扫描器有时会使用单独的筛选器来跳过空格(空格、制表符、换行符等)和注释。
内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/366084/