No. 408 未来700种编程语言是什么样子的?

编程爱好者一般都有两个爱好,一是想发明一个操作系统,二是想发明一门编程语言。由于发明操作系统实在是太难了,而发明一门编程语言看起来比前者容易一些。什么时候编程爱好者会想开发一门属于自己的编程语言呢?一般来说,当掌握了三门编程语言以后,爱好者就会觉得我也可以搞一门编程语言了。在学第一门语言的时候,一鼓作气,看什么都是新鲜的。在学第二门语言的时候,再而衰,因为跟第一门语言有太多相似的地方。在学第三门语言的时候,三而竭,上看下看左看右看,感觉全懂,与其再学一门语言,不如自己发明一门新语言,让别人来学。

很多人都有这种想法。在1964年的时候,就已经有1700种编程语言了。英国的计算机科学家Peter John Landin,他主要研究计算机编程语言,他写了一篇名为《The Next 700 Programming Languages》的论文,论文的开篇就讲了当时已经有1700种编程语言,应用在700多个领域中。

在这篇论文里,他创造了一种新的编程语言:ISWIM(If You See What I Mean)。他用这种名为ISWIM的编程语言,介绍了未来700种编程语言肯定会具有的四大特征,其中的第四种特征是:语法结构。这个特征与内容相关,讲了控制流。我最佩服的就是这种科学家,在1964年就预测到了今天几乎所有编程语言的模样。

我之所以讲这个故事,是因为我不知道读者是一鼓作气的初学者,还是已经掌握了一门编程语言,对结构化编程和控制流已经意兴阑珊的熟练工,甚至已经掌握了好几门编程语言,对结构化编程早已烂熟于心,已经走在发明属于自己的编程语言的道路上了。不管你是哪种类型的读者,都应该清楚,结构化编程和控制流,依旧是未来700种,甚至7万种编程语言的核心之一。

对上文提到的论文,非常建议学有余力的好奇者仔细阅读,这篇论文在编程语言的实现和设计领域影响巨大。即使后来语言的设计者没有读过这篇论文,设计出来的语言也会验证这篇论文给出的“预言”。

如果你不想读这篇有点晦涩的论文,可以读读下面我当年的故事,我也曾经想发明一个操作系统,想发明一门编程语言,两者我都没做到。希望这个故事能让你了解,为什么编程爱好者在人生的某个阶段都想发明一种语言?原因不难,真的非常“平常”,所有的主流语言(C/C++、Java、Python、Go、PHP……)都支持三种结构:顺序结构、条件结构和循环结构。条件结构有三四种语法,循环结构顶多六七种语法,再加上一些细枝末节的小知识,就组成了结构化编程语言的主体。就这么一点知识外加年轻气盛,毕竟钱钟书说过:“年轻的时候,总是把创作冲动误以为是创作才华。”于是,就出现了海量的编程语言。

好了,我开始讲我当年的故事了。

每种编程语言都有自己的语法,当年学编程的时候,很苦恼,这么多语言,怎么能学得过来呢?当时我在学C++,有一天,我想找点别人写的C++来读一下,就在一个叫sourceforge上的网站上乱逛,看到了一个项目,项目的名字叫Gcc-XML。

容我讲一下这个项目,让大家了解一个背景。

在1999年的时候,美国国立卫生研究院(National Institutes of Health,NIH)要做一个项目,要把人体数字化。一位因病去世的女性参加了这个计划,人体被切割成0.3毫米左右的切片,然后用高清相机拍照后,重建整个人体,这个项目大概产生了65G数据。

为了处理这些数据,研究人员使用C++语言写了一个项目,最终产生了160多万行C++代码,这些代码被广泛使用,增加功能,越来越难以维护。NIH的研究人员越来越多的使用Python语言,用Python语言来和这些C++代码交互,直到有一天,他们觉得要是把C++的代码全部改写成Python代码就好了。

这可不是一万行代码,而是一百多万行C++代码,工作量可想而知。

有没有办法把C++代码转换成Python的代码呢?于是他们就有了这样一个项目,项目最初的名字叫Gcc-XML,现在已经改名为CastXML了,有兴趣的可以到github上看一下。项目的目标是把C++代码转换成Python代码。

当时我已经学会了Python,正在学C++,对C++转换成Python有浓厚的兴趣,就读了该项目的代码,大体了解了其工作原理。原理是这样的:使用Gcc-XML对C++代码进行处理,生成中间状态的代码,然后再根据生成的中间代码,使用pycxml转换成Python语言。

当年我孤陋寡闻,一直学不好C++,看到有人能直接把C++转换成Python代码,惊呆了!我就想搞明白他们是怎么做的。于是我就写一段C++代码,然后用Gcc-XML转换成中间代码,然后再转换成Python代码,整个过程乐此不疲。

在查看中间代码的时候,我意识到这样一个问题,从道理来说,根据这些中间代码,C++不止可以转换成Python,只要你写的代码足够精妙,巧妙的避开其它语言中不存在的特性,C++可以转换成其它任何语言。想法再远一点,任何语言都可以转换成另外一种语言。

当我有这个想法以后,呼吸都开始急促了,我无意之中发现了一个可以统一一切的语言,只要按照中间代码的方法搞出一种编程语言,比如dong语言,我这个语言就能一统江湖了。但是这个想法在我脑子里停留了没多久,我就发现,这种中间代码每个学过计算机的人都知道,学名叫抽象语法树(Abstract Syntax Tree, AST),这个抽象语法树也就《编译原理》这门课主要讲的内容之一。

抽象语法树是一种用于表示源代码结构的树形数据结构,在编译器或解释器中,抽象语法树通常用于表示程序的语法结构,以便于后续进行语义分析和代码生成。尽管不同的编程语言有不同的语法和语义规则,但是它们最终都可以转化为抽象语法树。

虽然想创造一种统一江湖的dong语言的梦想破灭了,但是在我重新发现抽象语法树的那一刻,我觉得我对《编译原理》产生了某种顿悟,我们上课时候老师花了大量时间讲解如何构造一个语法解析器(parser),实际上,这东西并没有想象的那么重要。

为什么不直接用抽象语法树来写代码呢?原因是太难了,对大多数程序员来说,阅读和理解抽象语法树不容易,因为它难以映射到程序的实际结构,这会使程序难以维护和协作。相比而言,标准语法更加易学、易用、易于工具化,这也是绝大多数现代语言选择标准语法而非抽象语法树作为基础的原因。抽象语法树更适用于程序分析和处理,而不是直接编程。

为了能更高效的以人类可读写的方式来编写代码,几乎所有的编程语言都使用了语法来定义程序的结构和组织方式。这些语法规则决定了程序员可以怎样编写代码,以及代码如何被解析和理解。这是编程语言的重要组成部分,因为它们提供了一个框架,使得程序员可以在其中编写结构化的代码。

0 0 投票数
文章评分
订阅评论
提醒

1 评论
最旧
最新 最多投票
内联反馈
查看所有评论
yeelight
8 月 前

1

1
0
希望看到您的想法,请您发表评论x
滚动至顶部