代码编译的工作原理
当你运行一个程序时,你知道代码会在某个地方被编译。你或许能在编译过程中看到一些输出,但大部分操作都在后台进行。它就像一个我们都接受的“黑盒子”,很少有人会质疑它,这也没什么问题。但如果你想更深入地了解这个“黑盒子”的内部运作,那么以下内容或许能帮到你。
编译代码时会发生什么?
简单来说,你编写的代码会被转换成机器代码。这就是为什么我们通常在集成开发环境(IDE)中编写代码。IDE内置的编译器会读取你的代码并进行转换。编译器需要经过几个不同的步骤才能正确编译代码。
首先,它会将你的代码转换成一系列标记。这个过程叫做词法分析,也就是将代码转换成标记的另一种说法。每个标记都包含符号、数字和字母,这些符号、数字和字母对编译器来说是有意义的。
代码经过词法分析后,编译器会解析这一系列词法单元,以确保代码符合编程语言的所有规则。编译器解析代码的过程就是检查所有内容,确保其正确性。语法错误通常都会在这里被发现。
解析完成后,编译器会生成一棵语法树。语法树是对你编写的代码语义含义的一种表示。编译器会利用这棵语法树生成最终的翻译代码。输出可以是机器代码,也可以是其他语言的代码。
编译器的工作原理
既然你已经了解了编译代码的整个过程,那么了解你的集成开发环境(IDE)是如何工作的就显得尤为重要。编译器的作用就是将你的代码转换成另一种类型的代码。关键在于,编译器内部包含不同的层级。
编译器分为单遍编译器和多遍编译器。我在这里分享一段我了解到的历史。在计算机和编程的早期,编译能力受限于计算资源。你能想象在一台只有 1GB 硬盘的计算机上编译代码吗?这就是单遍编译器诞生的原因。
由于早期计算机资源有限,许多早期的编程语言,例如 Pascal,都被设计成单遍编译。如今,计算机的性能足以统治世界,我们可以使用多遍编译器。多遍编译器可以分为三个主要部分:前端、中间端和后端。这与 Web 开发中的前端和后端并不相同。
前端是代码验证的地方。所有语法错误检查都在这里进行。在这里,你的代码首先会被转换成计算机可以理解的形式。接下来是中间部分,这部分比较有意思。在这里,你的代码会被优化。
中间部分接收前端的输出并进行优化,例如进行循环转换或删除无用代码。它的作用是将前端的输出进行转换,使其更易于计算机运行。最后一部分是后端,它非常简单直接。
后端接收来自中间端的优化代码,并完成将其翻译成机器代码的过程。计算机正是通过这种方式来决定如何利用资源以最高效的方式执行你的代码。至此,编译器的工作结束,程序开始运行。
我们为什么要编译代码
你真的想写机器代码吗?你试过用汇编语言吗?我曾经犯过一个可怕的错误,那就是尝试学习汇编语言,结果它把我的大脑搞得一团糟,我至今都还没完全恢复过来。如果你觉得自己能接受挑战,那就试试用汇编语言写一个简单的if-else语句吧。我会给你提供精神支持。
编译器让我们能够使用如此多不同的编程语言而无需担心机器代码。正因如此,我们才能构建这些复杂的网站和系统,而无需处理 1 和 0。编译器能够将任何编程语言翻译成计算机可以理解的代码。
下次当你为你正在开发的网站编写代码时,不妨花点时间看看代码编译后的输出结果。直到我深入了解了一些编译器代码的底层原理,我才真正意识到它们为我们做了多少工作。那些东西真是复杂精妙,我非常感激有其他人能做到这一切。
你有没有尝试过编写编译器的代码?我很好奇你的个人经验,因为我不知道你是怎么做到的。
嘿!你应该在推特上关注我,原因你懂的:https://twitter.com/FlippedCoding
文章来源:https://dev.to/flippedcoding/how-compiling-code-works-51pc