浅谈编译原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈编译原理相关的知识,希望对你有一定的参考价值。

什么是编译原理?

编译原理顾名思义,编译就是将源语言(高级程序语言)翻译成等价的目标语言(机器语言即计算机可以识别的语言即0和1或汇编语言)的过程。原理就是研究这一过程的思想方法、理论和技术。从本质上来讲编译是一个算法问题,但由于它的问题相当复杂,导致设计解决这个问题的算法也十分复杂。这里的算法和我们学习的数据结构和算法中的算法有些不同,后者讲述的是基础算法,是解决我们生活中遇到的问题,而编译中的算法则是在人与计算机交流时需要解决的“沟通”问题的算法,比较专注解决一种的算法。编译的过程包括:源程序->词法分析->语法分析->语义分析->中间代码生成->代码优化->目标代码生成->目标程序

为什么我们要编译程序?
因为在计算机发展的初期,我们要想操作计算机则需要学习如何与计算机沟通,当时沟通的方法只有0和1,只有熟练使用0和1来表示程序的科学家才能通过打孔卡或纸带操控计算机,由于直接使用二进制编程的门槛过高,使得除特定的科学家以外的人学习使用计算机较为困难且周期较长,不利于计算机的发展,所以之后的计算机科学家就设计了很多的高级语言使得程序代码更贴近自然语言,但还是有其特定的结构,通过高级语言解决了对学习编程门槛高的问题,但这也照成了机器不能识别高级语言的问题,这是就需要一个翻译程序(就像我们用翻译程序将英文翻译为中文)来使计算机“读懂”程序员写的高级语言。编译程序油然而生。

学习编译原理的作用?
1、学习编译原理,了解高级语言是如何翻译成机器语言的,这有助于提高我们代码编译的效率,提高代码的质量。
2、了解计算机的运作原理,能写出更高效的代码。
3、由于编译过程是将高级语言等价的翻译成机器语言,这样我们就知道了它们之间是如何等价转换的,这对于我们学习其他语言更加得心应手,因为我们学习了它们的核心思想。
4、对于计算机编程及计算机整体运作方式开始有更深一层次的理解。
5、可能可以在自然语言语义分析方面会后一些了解。
6、获得分析、设计、实现和维护编译系统的初步能力,理解运用编译技术解决工程实践中的变换和转换问题的方法。
7、感受到经典理论和先进技术之间的紧密联系。

不学习编译原理,会使自己的计算机思维停留在程序之上,虽然可以用程序解决生活实际问题,但没有真正走进计算机的0,1世界,你和它的交流始终隔着一个编译器,不能自由、灵活的表达自己的意思,同时也受限于高级语言给你的思维。

如何学习编译原理?
我觉得在深入学习编译原理之前,需要先对其有一个感性的认识。
1、可以先通过教材了解编译的流程,以及各个步骤的作用、目的。
2、在通过Github或开源中国中找一些小实例聊看看,可能一开始是看不懂,但可以通过对代码各模块功能的猜想和结合课本中理论的理解,应该会对编译器的运作原理有些初步的认识。
3、在有了一定了解后,开始对课上所学的理论与之前的感性认识进行整理结合,加深对所学理论的理解。
4、到最后看是否能写一个小型编译器,来检验自己的学习成果,并巩固理论基础。
PS:因为学习编译原理会涉及到离散数学、数据结构、汇编语言、高级语言、算法、计算机原理等,所以需要对这些课程有一定深度的理解,应该巩固这些学科的知识。

部分概念:
1、编译型语言:通过编译程序直接将源程序编译成机器语言。优点:编译效率比解释性语言高,但由于现在计算机的计算能力有了显著的提高,编译效率高的优点渐渐不明显了。(如C语言)
解释性语言:通过一个解释程序,将源程序翻译成机器语言。优点:可以逐行编译,这可以完成一些特殊的任务,比如R语言和Python。
2、垃圾回收机制:用于以不定时的方式动态回收程序在内存中占用空间但不再使用的部分的一种措施。Java就有垃圾回收机制,其是由JVM提供的。

以上是关于浅谈编译原理的主要内容,如果未能解决你的问题,请参考以下文章

浅谈C++编译原理 ------ C++编译器与链接器工作原理

浅谈JavaScript预编译原理

V8 编译浅谈

浅谈Thrift内部实现原理

jvm 原理浅谈

浅谈flask ssti 绕过原理