编译器的定义和用途

编译器是将人类可读的源代码翻译成计算机可执行机器代码的程序。要成功地做到这一点,人类可读的代码必须遵守它所用的任何编程语言的语法规则。编译器只是一个程序,无法为您修复代码。如果您犯了错误,您必须更正语法,否则它将无法编译。...

编译器是将人类可读的源代码翻译成计算机可执行机器代码的程序。要成功地做到这一点,人类可读的代码必须遵守它所用的任何编程语言的语法规则。编译器只是一个程序,无法为您修复代码。如果您犯了错误,您必须更正语法,否则它将无法编译。

Global data, conceptual artwork

编译代码时会发生什么?

编译器的复杂性取决于语言的语法以及编程语言提供的抽象程度。C编译器比C++编译器或C语言编译器要简单得多。

词汇分析

编译时,编译器首先从源代码文件读取字符流,并生成词法标记流。例如,C++代码:

int C= (A*B)+10;

可以分析为以下标记:

  • 输入“int”
  • 变量“C”
  • 等于
  • 左括号
  • 变量“A”
  • 时代
  • 变量“B”
  • 右括号
  • 字面“10”

句法分析

词法输出传递给编译器的语法分析器部分,该部分使用语法规则来决定输入是否有效。除非变量A和B之前已声明且在范围内,否则编译器可能会说:

  • “A”:未声明的标识符。

如果它们已声明但未初始化。编译器发出警告:

  • 局部变量“A”未经初始化就已使用。

永远不要忽略编译器警告。他们可以用奇怪和意想不到的方式破坏你的代码。始终修复编译器警告。

一张还是两张?

有些编程语言是这样编写的,编译器只能读取源代码一次并生成机器代码。帕斯卡语就是这样一种语言。许多编译器至少需要两个过程。有时,这是因为函数或类的前向声明。

在C++中,类可以声明,但直到后来才被定义。在编译类的主体之前,编译器无法计算类需要多少内存。在生成正确的机器代码之前,它必须重新读取源代码。

生成机器代码

假设编译器成功地完成了词法和语法分析,最后一个阶段是生成机器代码。这是一个复杂的过程,尤其是在现代CPU中。

编译的可执行代码的速度应该尽可能快,并且可以根据生成的代码的质量和请求的优化程度而有很大的不同。

大多数编译器允许您指定快速调试编译器和完全优化已发布代码所需的优化量。

代码生成具有挑战性

编译器编写器在编写代码生成器时面临挑战。许多处理器通过使用

  • 指令流水线
  • 内部缓存。

如果代码循环中的所有指令都可以保存在CPU缓存中,那么该循环的运行速度要比CPU必须从主RAM获取指令时快得多。CPU缓存是内置在CPU芯片中的一块内存,其访问速度比主RAM中的数据快得多。

缓存和队列

大多数CPU都有一个预取队列,CPU在执行指令之前将指令读入缓存。如果发生条件分支,CPU必须重新加载队列。应生成代码以尽量减少这种情况。

许多CPU都有单独的部件用于:

  • 整数算术(整数)
  • 浮点算术(小数)

这些操作通常可以并行运行以提高速度。

编译器通常将机器代码生成目标文件,然后通过链接程序将这些文件链接在一起。

  • 发表于 2021-09-28 03:57
  • 阅读 ( 86 )
  • 分类:数学

你可能感兴趣的文章

宣言(declaration)和c中的定义(definition in c)的区别

C中的声明和定义的关键区别在于C中的声明告诉编译器函数名、返回类型和参数,而C中的定义包含函数的实际实现。也就是说,声明向编译器提供有关函数的信息,而定义包含执行特定任务的函数的实际语句。 C是一种通用的...

  • 发布于 2020-10-22 15:12
  • 阅读 ( 193 )

如何使用linux的ar命令创建静态库

...decode.c文件 为了编译源代码文件,我们将使用gcc,标准GNU编译器。c(compile,no link)选项告诉gcc编译文件,然后停止。它从每个源代码文件生成一个称为对象文件的中间文件。gcc链接器通常获取所有的对象文件并将它们链接在一...

  • 发布于 2021-04-03 09:35
  • 阅读 ( 304 )

iphoto相册(iphoto album)和智能相册(smart album)的区别

...现在充满了上述图像。用户可以进一步用分级和关键字来定义内容。 创建一个智能相册需要更多的时间,但它确实使它更有效地分类和编译相关的图像。智能相册的用途更广泛,因为用户可以确定不断监视iPhoto库和事件中任何...

  • 发布于 2021-06-23 14:04
  • 阅读 ( 300 )

常数(constant)和只读(readonly)的区别

...。 内存分配 常量值作为编译时替换直接放入代码中。编译器将常量值放在定义常量的程序集元数据中,并在初始化后将该值嵌入IL代码本身,因此在运行时不需要内存来分配常量。Readonly值不是常量,它存储在加载程序堆中,...

  • 发布于 2021-06-25 14:54
  • 阅读 ( 288 )

常量(constants)和变量(variables)的区别

...示相同的常量(如pi或销售税率)正在再次使用,但代码编译器不会查找常量值的更改,这可以节省计算时间。 计算机编程中的常量不必定义为数字数据,但可以是任何其他不变的数据,如一串单词或字母。 2.计算机程序设计中...

  • 发布于 2021-06-25 15:40
  • 阅读 ( 404 )

编译器解释器(compiler interpreter)和汇编程序(assembler)的区别

...级或汇编程序应转换成机器语言,以便计算机理解指令。编译器、解释器和汇编程序是将高级或汇编语言程序转换为机器语言的翻译器。 覆盖的关键领域 1.什么是编译器-定义,功能2.什么是解释器-定义,功能3.什么是汇编器-定...

  • 发布于 2021-06-30 18:09
  • 阅读 ( 1405 )

石斑鱼类(ide)和编译程序(compiler)的区别

IDE和编译器之间的主要区别在于IDE是一个软件套件,由开发和测试软件应用程序所需的工具组成,而编译器是一个将用高级编程语言编写的源代码翻译成低级机器代码的程序。 IDE提供了一个创建、构建和测试软件应用程序的环...

  • 发布于 2021-07-01 03:13
  • 阅读 ( 396 )

链接器加载程序(linker loader)和编译程序(compiler)的区别

链接器加载程序和编译器之间的主要区别在于,链接器将编译器生成的一个或多个对象文件合并到一个可执行文件中。同时,加载程序将程序放入内存并准备执行,同时编译器将源代码转换为目标代码。 计算机程序是在计算机...

  • 发布于 2021-07-01 04:45
  • 阅读 ( 676 )

口译译员(interpreter)和jit编译器(jit compiler)的区别

解释器和JIT编译器的主要区别在于解释器是一种逐行将源代码转换成本机代码的软件,而JIT编译器是JVM中的一个组件,它通过在运行时将字节码编译成本机代码来提高Java程序的性能。 解释器是一种程序,它将程序员编写的指令...

  • 发布于 2021-07-01 05:51
  • 阅读 ( 527 )

解析树(parse tree)和语法树(syntax tree)的区别

...方面,语法树将编程语言的语法表示为树。它有助于生成编译器和以后代码生成所需的符号表。 覆盖的关键领域 1.什么是语法树-定义,功能2.什么是语法树-定义,功能3.语法树和语法树的区别是什么-关键区别的比较 关键术语 ...

  • 发布于 2021-07-01 10:14
  • 阅读 ( 1735 )
tmjg5556
tmjg5556

0 篇文章

相关推荐