编程语言,作为人与计算机沟通的桥梁,有着重要和深远的意义。有过计算机编程经验的人,多少学习或掌握过一到多种编程语言。计算机专业领域的编程语言成百上千种,主流的编程语言也有数十种之多。每种编程语言面向的领域和特性都不尽相同,不过归根结底是为了解决人与计算机之间沟通的效率问题,提高计算机的生产力。想必有不少人对那些主流编程语言的创造者十分倾佩,也相信有不少人会好奇一门编程语言是如何诞生的。那么如何创造一门编程语言呢?

总的来看,创造一门编程语言需要有以下几个过程:

1)设计语言的特性。

2)定义语言的单词、语法和语义。

3)实现编译器或者解释器将程序翻译为计算机底层表示。

4)生成计算机程序的二进制存储格式。

5)完善语言的运行时环境和标准库。

一、语言特性设计

所谓语言特性,就是编程语言为开发者提供了什么样的原子性功能特征。比如是否支持数学表达式计算、字符串处理,是否支持变量、函数和递归,是否支持分支、循环复合语句等。语言的变量类型是强类型、弱类型,还是动态类型,程序是过程式、函数式,还是面向对象的。是否支持模板、泛型和反射机制,是否支持多线程和并发特性,是否支持错误和异常处理机制等等。

语言特性设计是一门编程语言最关键的环节,直接决定了语言的基本特征和雏形。当然,这也是最难的一个环节,因为语言设计是面向具体问题领域的,是语言设计者从大量的编程实践中的获得的总结和升华。比如C语言设计者希望面向计算机底层,拥有对操作系统和硬件的直接操纵能力。而Python的设计者则希望尽可能地减少操作计算机资源的繁琐过程,以获得语言的简洁性、高度的灵活性和扩展性。SQL的设计者面向具体的数据查询和分析领域,希望帮助开发者获得快速检索和操纵数据的能力。而Go语言的设计者则希望在保留C语言优秀功能的基础上,扩展编程语言对高并发环境的支持,并拥有垃圾回收和快速编译的能力。

凡此种种,编程语言特性的设计都是面向具体的问题领域的,是语言设计者构建于开发者和计算机之间的中间层,是对开发过程中重复功能逻辑的原子性“封装”,最终的目的是为了提升具体问题领域内的软件开发效率。

二、单词、语法和语义

和人类使用的自然语言类似,编程语言也有自身的单词、语法和语义,专业上称为词法记号、语言文法和语义。

常见的词法记号可以分为数字、字符、字符串、标识符、关键字,以及用于连接表达式的运算符、分割语句或者程序段落的界符等符号。这些是编程语言程序的基本单位,通过它们的有序组合,构建出了一门编程语言形形色色的代码片段。

编程语言的文法是用来描述语言的语法规则的,具体来说是规定词法记号之间的排列组合的顺序与规则。它描述了编程语言程序的基本模式,不符合该模式的词法记号的排列被挡在了合法语言程序的大门之外。同时,它也是各种编程语言对于开发者最明显的差异化特征。一个有经验的开发者可以很容易地通过扫视一段代码,就能分辨出这是哪种编程语言编写的计算机程序。

编程语言的语义描述了一段符合语言语法的程序,对于计算机而言的真正含义,是开发者最终要传达给计算机的意愿和指令。语言的语义必须是准确的、无二义性的,编译器也正是通过语义的指导,将计算机程序翻译为计算机可识别的表达形式。

三、程序的翻译

计算机程序是用来供人阅读和修改的,计算机硬件并不能理解程序内的思想和含义。因此,必须有一个翻译转换的过程,将人所表达的意愿准确无误地传递给计算机,让计算机明确并执行人下发的指令。实现这种翻译工作的工具就是编译器或解释器。

对于编译器来说,它的输入是人类书写的计算机语言程序,输出则是计算机可识别的底层表示。首先,它需要识别出程序中的单词,即词法分析。然后,根据单词的组合模式识别出程序的语法结构,即语法分析。最后,根据不同的语法结构对应的语义,将程序按照每个语法模块的形式转换为计算机可识别的指令序列,即语义分析和目标代码生成。

众所周知编译器的实现具有一定的复杂度,其根本原因来自于语言语法的结构灵活性和计算机底层表达形式的多样性,这也是创造一门编程语言最核心的环节。

四、二进制存储

编译器将语言程序翻译转换后,需要将转换后的结果存储起来,以便计算机在需要的时候将其加载、执行。这里不可避免的涉及到两个问题:

(1)转换后的结果是什么样的形式?

(2)转换后的结果保存在哪里?

第一个问题描述的是计算机程序被转换为怎样的形式,才是计算机可以识别的。由于计算机中实际运行程序的硬件模块是CPU,因此计算机程序只有被转换为CPU的二进制指令格式才能被正确识别、执行。比如常见的Intel体系的CISC指令格式、ARM体系的RISC执行格式等。

第二个问题描述的是计算机程序转化为二进制指令格式后,以什么样的方式保存在计算机的磁盘上。由于绝大多数的计算机程序是需要通过运行在计算机硬件之上的操作系统加载运行的,因此计算机程序的二进制表达形式必须以对应操作系统可识别的文件格式存储。比如常见的Windows操作系统的PE文件格式、Linux操作系统的ELF文件格式等。

五、运行时环境和标准库

理论上讲,一门编程语言如果能提供出完备的操纵操作系统和硬件的原子性功能就已经成功了。但是不提供强大的运行时环境支持和标准库,是很难让一门编程语言真正的好用和流行的。没有人希望简单地打印一行字符串,还需要使用编程语言提供的基本特性实现调用操作系统提供的打印接口的逻辑。Java语言之所以久兴不衰,正是因为它不仅提供了完善的运行时环境和开发库支持,甚至提供了更强大的开发框架和工具支持。

因此可见,除了完备的语言特性,为开发者提供更方便好用的库和框架支持,消除软件构建过程中复杂和重复的逻辑,才是一门优秀编程语言的长盛之道。

六、自己动手,立即开始!

《自己动手构造编译系统——编译、汇编与链接》一书详细阐述了一门编程语言从无到有的过程,从语言的功能特性设计,到词法、文法、语义分析;从编译器、汇编器的设计实现,到目标文件的链接生成可执行文件;甚至编译优化器的实现、二进制指令、可执行文件格式以及语言运行时和标准库的概念,都在书中做了认真细致地剖析。相信对本书的阅读,将是一次不错的获得知识的体验!

如何创造一门编程语言?相关推荐

  1. 他们创造了编程语言,他们是这个时代伟大的父亲

    坐在岸边看着夕阳让我想起你 暖暖余晖温柔如你慈爱的眼睛 感谢你啊 举起了我金色的童年 什么时候开始忘记讲给我的故事 什么时候开始想念你默默的注视 ...... 父爱,是朱自清笔下胖胖的背影,默不作声, ...

  2. 挑选合适自己的一门编程语言

    2019独角兽企业重金招聘Python工程师标准>>> 导读 想学编程的原因有很多,你也许是想要做一个程序,又或者你只是想投身于这个行业,所以,在选择你的第一门编程语言之前,问问你自 ...

  3. 如何学习一门编程语言,从入门到不放弃!

    在学习前,如果能把以下几个方面的问题弄清楚,就能够比较顺利和高效的学习,拿到你所想要的目标.而不是从入门到放弃. 一.方向和目标 首先要确定为什么要学习计算机编程语言,为考试?为工作?为兴趣? 如果是 ...

  4. 怎么开始学一门计算机语言有哪些,如何学习(自学)一门编程语言

    原标题:如何学习(自学)一门编程语言 在学习前,如果能把以下几个方面的问题弄清楚,就能够比较顺利和高效的学习,拿到你所想要的目标.而不是从坚持到放弃. 一.方向和目标 首先要确定为什么要学习计算机编程 ...

  5. 想法也疯狂--创造一门语言

    这是一个系列文章,目前共5篇.文章尽可能不涉及任何编程专业术语,努力做到让一般人都能读懂,所以,我会尽最大可能讲的通俗易懂些,便于为各位建立信心,同时也能让各位认知到这个行业的很多问题,避免再次走弯路 ...

  6. 语言输出奇树有多少总方法_如何学习一门编程语言?这些方法告诉你,不要再说你不会学习...

    前言 很多人喜欢争论什么什么编程语言好,我认为这个话题如果不限定应用范围,就毫无意义. 每种编程语言必然有其优点和缺点,这也决定了它有适合的应用场景和不适合的应用场景.现代软件行业,想一门编程语言包打 ...

  7. 在学习一门编程语言时要特别注意以下三个方面

    2019独角兽企业重金招聘Python工程师标准>>> 在学习一门编程语言时要特别注意以下三个方面: 这门语言提供了哪些Primitive,比如基本类型,比如基本运算符.表达式和语句 ...

  8. 用 C 语言开发一门编程语言 — 字符串与文件加载

    目录 文章目录 目录 前文列表 字符串 读取字符串 注释 文件加载函数 命令行参数 打印函数 报错函数 源代码 前文列表 <用 C 语言开发一门编程语言 - 交互式解析器> <用 C ...

  9. 用 C 语言开发一门编程语言 — 条件分支

    目录 文章目录 目录 前文列表 条件分支 排序函数 等于函数 if 函数 递归函数 源代码 前文列表 <用 C 语言开发一门编程语言 - 交互式解析器> <用 C 语言开发一门编程语 ...

  10. 用 C 语言开发一门编程语言 — 基于 Lambda 表达式的函数设计

    目录 文章目录 目录 前文列表 函数 Lambda 表达式 函数设计 函数的存储 实现 Lambda 函数 函数的运行环境 函数调用 可变长的函数参数 源代码 前文列表 <用 C 语言开发一门编 ...

最新文章

  1. android8.1上musicfx,Android自带音频均衡器MusicFx分析
  2. 组合使用Laravel和vfsStream测试文件上传
  3. 给定两个数r和n_输出r的n次方 java_滴滴出行2018编程题
  4. python with关键字学习
  5. Apache Ignite的Node.js客户端使用入门
  6. Python+Opencv颜色和形状检测
  7. C#元组类型System.ValueTuple
  8. CentOS7安装单机版RabbitMQ集群
  9. 枚举变量的重定义问题
  10. clob mybatis_spring + mybatis 存取clob
  11. html5仿qq空间,JS实现的仿QQ空间图片弹出效果代码
  12. Windows 游戏之父,DirectX 作者 Eric Engstrom 意外去世,享年55岁
  13. list删除null
  14. python文件或文本加密(4种方法)
  15. QMC5883L 校准方法
  16. 说说那些好用的图片调色软件
  17. mac上开启隐藏文件
  18. npm install 报错:found XXX vulnerabilities (XXX low, X moderate),run `npm audit fix` to fix them, or `
  19. clickhouse将csv文件导入表中出现的 DB::ParsingException: Cannot parse input: expected ‘,‘ before: ‘\‘错误的解决方法
  20. HTML5和CSS3新特性有哪些

热门文章

  1. Rickie的软件测试学习笔记-第四周
  2. jboss:在standalone.xml中设置系统属性(system-properties)
  3. linux service和daemon
  4. PHP学习之二:变量
  5. 远程服务器连接工具:Tmux
  6. 51nod 1133 - 矩阵快速幂(模版) 快速乘 + 快速幂 + 矩阵快速幂
  7. Flutter入门(1)—环境配置
  8. linux 下ifconfig修改IP
  9. 如果奇迹有颜色,那么一定是暴力or模拟比较6
  10. IBM X3650 M4 主板故障