如何创造⼀门编程语⾔?
编程语⾔,作为⼈与计算机沟通的桥梁,有着重要和深远的意义。有过计算机编程经验的⼈,多少学习或掌握过⼀到多种编程语⾔。计算机专业领域的编程语⾔成百上千种,主流的编程语⾔也有数⼗种之多。每种编程语⾔⾯向的领域和特性都不尽相同,不过归根结底是为了解决⼈与计算机之间沟通的效率问题,提⾼计算机的⽣产⼒。想必有不少⼈对那些主流编程语⾔的创造者⼗分倾佩,也相信有不少⼈会好奇⼀门编程语⾔是如何诞⽣的。那么如何创造⼀门编程语⾔呢?
总的来看,创造⼀门编程语⾔需要有以下⼏个过程:
(1)设计语⾔的特性。
(2)定义语⾔的单词、语法和语义。
(3)实现编译器或者解释器将程序翻译为计算机底层表⽰。
(4)⽣成计算机程序的⼆进制存储格式。
(5)完善语⾔的运⾏时环境和标准库。
目前流行的编程语言⼀、语⾔特性设计
所谓语⾔特性,就是编程语⾔为开发者提供了什么样的原⼦性功能特征。⽐如是否⽀持数学表达式计算、字符串处理,是否⽀持变量、函数和递归,是否⽀持分⽀、循环复合语句等。语⾔的变量类型是强类型、弱类型,还是动态类型,程序是过程式、函数式,还是⾯向对象的。是否⽀持模板、泛型和反射机制,是否⽀持多线程和并发特性,是否⽀持错误和异常处理机制等等。
语⾔特性设计是⼀门编程语⾔最关键的环节,直接决定了语⾔的基本特征和雏形。当然,这也是最难的⼀个环节,因为语⾔设计是⾯向具体问题领域的,是语⾔设计者从⼤量的编程实践中的获得的总结和升华。⽐如C语⾔设计者希望⾯向计算机底层,拥有对操作系统和硬件的直接操纵能⼒。⽽Python的设计者则希望尽可能地减少操作计算机资源的繁琐过程,以获得语⾔的简洁性、⾼度的灵活性和扩展性。SQL的设计者⾯向具体的数据查询和分析领域,希望帮助开发者获得快速检索和操纵数据的能⼒。⽽Go语⾔的设计者则希望在保留C语⾔优秀功能的基础上,扩展编程语⾔对⾼并发环境的⽀持,并拥有垃圾回收和快速编译的能⼒。
凡此种种,编程语⾔特性的设计都是⾯向具体的问题领域的,是语⾔设计者构建于开发者和计算机之间的中间层,是对开发过程中重复功能逻辑的原⼦性“封装”,最终的⽬的是为了提升具体问题领域内的软件开发效率。
⼆、单词、语法和语义
和⼈类使⽤的⾃然语⾔类似,编程语⾔也有⾃⾝的单词、语法和语义,专业上称为词法记号、语⾔⽂法和语义。
常见的词法记号可以分为数字、字符、字符串、标识符、关键字,以及⽤于连接表达式的运算符、分割语句或者程序段落的界符等符号。这些是编程语⾔程序的基本单位,通过它们的有序组合,构建出了⼀门编程语⾔形形⾊⾊的代码⽚段。
编程语⾔的⽂法是⽤来描述语⾔的语法规则的,具体来说是规定词法记号之间的排列组合的顺序与规则。它描述了编程语⾔程序的基本模式,不符合该模式的词法记号的排列被挡在了合法语⾔程序的⼤门之外。同时,它也是各种编程语⾔对于开发者最明显的差异化特征。⼀个有经验的开发者可以很容易地通过扫视⼀段代码,就能分辨出这是哪种编程语⾔编写的计算机程序。
编程语⾔的语义描述了⼀段符合语⾔语法的程序,对于计算机⽽⾔的真正含义,是开发者最终要传达给计算机的意愿和指令。语⾔的语义必须是准确的、⽆⼆义性的,编译器也正是通过语义的指导,将计算机程序翻译为计算机可识别的表达形式。
三、程序的翻译
计算机程序是⽤来供⼈阅读和修改的,计算机硬件并不能理解程序内的思想和含义。因此,必须有⼀
个翻译转换的过程,将⼈所表达的意愿准确⽆误地传递给计算机,让计算机明确并执⾏⼈下发的指令。实现这种翻译⼯作的⼯具就是编译器或解释器。
对于编译器来说,它的输⼊是⼈类书写的计算机语⾔程序,输出则是计算机可识别的底层表⽰。⾸先,它需要识别出程序中的单词,即词法分析。然后,根据单词的组合模式识别出程序的语法结构,即语法分析。最后,根据不同的语法结构对应的语义,将程序按照每个语法模块的形式转换为计算机可识别的指令序列,即语义分析和⽬标代码⽣成。
众所周知编译器的实现具有⼀定的复杂度,其根本原因来⾃于语⾔语法的结构灵活性和计算机底层表达形式的多样性,这也是创造⼀门编程语⾔最核⼼的环节。
四、⼆进制存储
编译器将语⾔程序翻译转换后,需要将转换后的结果存储起来,以便计算机在需要的时候将其加载、执⾏。这⾥不可避免的涉及到两个问题:
(1)转换后的结果是什么样的形式?
(2)转换后的结果保存在哪⾥?
第⼀个问题描述的是计算机程序被转换为怎样的形式,才是计算机可以识别的。由于计算机中实际运⾏程序的硬件模块是CPU,因此计算机程序只有被转换为CPU的⼆进制指令格式才能被正确识别、执⾏。⽐如常见的Intel体系的CISC指令格式、ARM体系的RISC执⾏格式等。
第⼆个问题描述的是计算机程序转化为⼆进制指令格式后,以什么样的⽅式保存在计算机的磁盘上。由于绝⼤多数的计算机程序是需要通过运⾏在计算机硬件之上的操作系统加载运⾏的,因此计算机程序的⼆进制表达形式必须以对应操作系统可识别的⽂件格式存储。⽐如常见的Windows操作系统的PE⽂件格式、Linux操作系统的ELF⽂件格式等。
五、运⾏时环境和标准库
理论上讲,⼀门编程语⾔如果能提供出完备的操纵操作系统和硬件的原⼦性功能就已经成功了。但是不提供强⼤的运⾏时环境⽀持和标准库,是很难让⼀门编程语⾔真正的好⽤和流⾏的。没有⼈希望简单地打印⼀⾏字符串,还需要使⽤编程语⾔提供的基本特性实现调⽤操作系统提供的打印接⼝的逻辑。Java语⾔之所以久兴不衰,正是因为它不仅提供了完善的运⾏时环境和开发库⽀持,甚⾄提供了更强⼤的开发框架和⼯具⽀持。
因此可见,除了完备的语⾔特性,为开发者提供更⽅便好⽤的库和框架⽀持,消除软件构建过程中复杂和重复的逻辑,才是⼀门优秀编程语⾔的长盛之道。
六、⾃⼰动⼿,⽴即开始!
《⾃⼰动⼿构造编译系统——编译、汇编与链接》⼀书详细阐述了⼀门编程语⾔从⽆到有的过程,从语⾔的功能特性设计,到词法、⽂法、语义分析;从编译器、汇编器的设计实现,到⽬标⽂件的链接⽣成可执⾏⽂件;甚⾄编译优化器的实现、⼆进制指令、可执⾏⽂件格式以及语⾔运⾏时和标准库的概念,都在书中做了认真细致地剖析。相信对本书的阅读,将是⼀次不错的获得知识的体验!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。