如何创建编程语言,以及设计决策中的内容?

回答这个问题时要考虑的第一件事是:什么是编程语言?如果你问维基百科这个问题,你会发现一种编程语言

是一种形式语言,它包含一组产生各种输出的指令

这当然是正确的,但在真正的百科全书形式中也几乎没有帮助。它确实给出了正确的想法。只需写下一些说明和一些规则来表达他们的所作所为,并且你已经创建了一种编程语言。如果你使用稍微有点花哨的语言写下这些规则,你会称之为你的语言规范,并且声称已经创建了一种编程语言。

 

当然,在大多数情况下,编程语言不是从规范编写中的练习开始的。相反,一个程序开始于一个实际上用编程语言做某事的程序。一般来说,这将是一个程序,它读入一些用编程语言编写的代码,然后执行代码所说的内容(一个“解释器” - 思考一步一步的配方)或一个翻译实际硬件理解的位序列的源代码(尽管这个1和0的字符串也可以被认为是硬件然后解释的编程语言)。有一些更奇特的程序可以编写实现编程语言(例如类型检查器,只检查源代码是否格式正确,即语言规则允许,但是不要执行它)和编译器和解释器的各种变化(混合系统,编译器到“虚拟硬件”,即设计为易于映射到实际硬件的低级语言,编译器从一种高级编程语言到另一个,也就是“发布者”),但关键是这些程序以某种方式“理解”语言。如果有的话,规范通常会在以后出现。

 

现在,假设您已经开始使用自己的编程语言,那么如何确定语言应该是什么 - 可用的指令是什么,语言的规则和语法是什么,各种事物的语义是什么,等等。做出这些决定时需要考虑很多事项:它如何与系统的其他部分一起工作?它是自洽的吗?对用户有意义吗?通过查看代码,用户是否能够猜出发生了什么?我们是否能够有效地让硬件完成语言应该做的事情?在某些地方是否有先例,例如在数学或其他编程语言中设定用户对事物应如何工作的期望?如果是这样,我们偏离了这种期望,是否有充分的理由[1]?如果我们做了不同或意外的事情,我们应该提供两者还是应该至少添加一些内容以确保用户期望遗留行为能够轻松找出遗留行为等等?

 

最后,在你做出的每一个决定中,你需要考虑两件事:

1)必须运行它的计算机和

2)必须阅读它的人。

两者都非常重要,但当然它们之间需要进行权衡,语言在这个范围内有所不同。在朱莉娅,我们非常努力地使两者都能很好地理解一个程序(这实际上是朱莉娅的原始动机之一)。这并不容易,并且有时需要进行硬交换(例如,检查所有算术运算的溢出会很好,但默认情况下在当前一代机器上执行此操作太慢),但我们会尽力确保a)我们默认做出合理的选择b)每当我们在任何一个方向进行权衡时,都有办法让用户做出相反的选择,同时能够毫无困难地使用系统的其余部分。Julia的多重调度系统对于完成这项工作至关重要(尽管其细节是一个完全独立的主题)。

 

例如,我们有一个通常拼写出名称而不是使用简短缩写的政策,所以你可能会认为“正弦”和“余弦”的名字比“罪”和“cos”更一致,但是你要对抗100多年的数学符号。另一方面,很多语言都喜欢使用“+”来连接字符串。但是,我们认为这是一个严重的错误,因为+是面向交换的,字符串连接不是,这就是我们使用“*”作为字符串连接运算符的原因。

 

 
posted @ 2019-03-21 11:00  技术小工  阅读(472)  评论(0编辑  收藏  举报