以下文章源于Java知识堂,作者李立敏
12月初,在pugetsoundprogrammingpython ( puppy )举办的第一届年度慈善活动中,传奇的编程语言创始人4人聚集在一起,就编程语言设计的过去和未来展开了热烈的讨论。 本次活动旨在为面向所有人的计算机科学教育( Computer Science For All,美国前总统奥巴马当年年初提出的新计划,以在美国教育系统中普及计算机科学为目的)募集资金。
参加的团队成员包括Guido van Rossum:Python的创始人、人气编程语言的创始人
James Gosling:Java编程语言的创始人兼最高设计师
Andersandhejsberg:turbopascal的原作者,他也致力于C#和TypeScript的开发
拉里·沃尔: perl的创始人。
这次讨论会由carol willing主办,现在是Jupyter项目指导委员会的成员和开发人员。 她是Python指导委员会的第一个成员,也是Python软件基金会的研究员和前任主任。
程序设计语言设计的关键原则
小组成员首先提出的问题是“编程语言设计的原理是什么? 的双曲馀弦值
Guido van Rossum认为编程语言的设计与JK滚动写哈利波特系列的方法非常相似。
他解释说JK滚动是天才,她在第一本哈利波特书中提到的细节,在第六本和第七本书中与重要场景相称。
在说明这与编程语言设计的关系时,他说:“在编程语言设计中也是一样的,需要顺利对应”。 在设计编程语言时,首先要约定我们想使用的关键词、我们遵循的编码方式等详细内容。 但是,不管我们做出了什么决断,都必须坚持到底。 将来我们像JK滚动一样,需要找到使用这些细节的新方法。
“另一方面,在设计编程语言的工作中,首先要做出一系列的选择,为你的故事发展埋下伏笔。 另一方面,设计编程语言的艺术需要回顾你的故事,展开不可思议的想法,以你意想不到的方式推进故事的发展。
当James Gosling谈到Java的制作过程和他遵循的设计原则时,他只说:“Java的出现不如个人喜欢的项目。 我们只是想试制一个样品。”当时James Gosling和他的团队开展了一个关于嵌入式系统领域的项目。 因此,他们与许多为嵌入式系统构建软件的开发人员交谈,了解了工作流程。
这个项目大约有十几个人,Gosling有责任从编程语言的角度将项目尽量简化。 他补充说:“最初我们想做比c好的东西,然后失去控制,最终项目的剩馀部分只提供了素材。” 幸运的是,“Java”从这个项目中幸存下来。 基本上这些编程语言是为了解决数据中心外部的人的问题,他们总是被网络、安全性、可靠性等问题所困扰。
拉里·沃尔认为自己不像计算机科学家,而像“语言学家”。 他想编写一种接近自然语言的编程语言。 举出了“我们每个人都不需要进入大学校园决定自己的住处,观察人们想去哪里,可以设立去那个地方的捷径”这样的例子。 创建Perl的一个基本原则是通过API提供所有功能。 这个编程语言的目标不仅仅是确立优秀的文本处理语言,还想成为粘合剂语言。
Wall还说,Perl在90年代非常稳定,但确实存在一些问题。 因此,2000年Perl团队打破了一切,提出了新的设计原则。 然后,根据这些原则重新设计了Perl 6。 有些原则作出了正确的选择——小括号。 否则,即使放入Unicode括号,也没有必要再次发明面向对象等。
“大量的再设计,就像我们应该用哪个支柱来支撑一切一样”,再加上这样的新设计是面向对象的吗? 是在字句范围内重新设计,还是在更广的范围内设计? 每个信息的正确支柱是什么?如果我们没有支柱,怎么做? ’他说
根据Andersandhejsberg,他说他所接触到的所有编程语言的共同原则,即“只有一个办法可以做”。 他认为,如果开发者有4种不同的方法,最终选择错误的道路的可能性很高,到在开发中意识到这个错误需要很长时间。 根据Hejlsberg的报道,开发人员总是在制作“简单的复杂性”这个东西,也就是说得到复杂的东西后,用简单的包装来隐藏复杂性。
和Guido van Rossum的想法相似,在设计编程语言时,附加了无论你做出什么样的决定都必须坚持到底。 在设计编程语言时,必须慎重决定“否”在这种编程语言中导入什么样的内容。 通常人们会给你建议,但是编程语言的本质是不能真正改变的。 语言的基本性质真的不能改变,但可以扩展。 我基本上有两个选择。 坚持语言的本质还是开发新的编程语言。
程序设计语言的类型系统
当Python谈论如何决定类型时,Guido van Rossum分享了Python首次出现时的故事。 最初,int不是类,实际上是转换函数。 后来,Guido意识到这是个错误。 “我们有很多这样的功能。 我们发现我们犯了一个错误,为用户提供了一个与嵌入式对象类型不同的类”
因此,Python团队决定重建Python的全部类型,进行大量的清理。 因此,将函数int更改为类int的指定符。 调用此类意味着构建类的实例。
据杰默斯·格林先生所说,他一直以来重视性能,但提高性能的主要原因之一是类型系统。 类型系统在优化编译器的构建和准确性预检查等方面非常实用。 拥有类型的系统也有助于为小型设备构建系统。 “要想在有限的空间内工作,就必须了解设备提供的可能性,越早知道就越有可能出色地完成工作。”
Andersandhejsberg将类型系统视为工具。 开发者喜欢自己的IDE,习惯使用句子的自动补充、重构、代码导航等。 这些功能通过大型系统的编译器所提供的代码的语义知识来实现。 Hejlsberg认为,添加类型将大大提高开发人员的工作效率。 这和我们的直觉相反。
“我觉得动态语言更容易掌握。 因为他们摆脱了类型的束缚。 但事实证明,如果以未侵入的形式追加类型,努力推断类型等,效率就会提高。”
对于Perl中的类型系统,Wall表示Perl 5和Perl 6中有不同类型的系统。 Perl 5将所有类型视为字符串,即使它们是数字类型或浮点类型。 该团队希望重新设计Perl 6能够维持这一功能,但是他们认为“如果新用户对兼容性感到困惑,就没问题了”。连计算机也感到困惑,就会感到困惑。”
鉴于此,在Perl 6中,Wall和他的团队希望创建更好的面向对象和更好的函数编程语言。 为了实现这一目标,他们需要非常合理类型的系统,在基础上构建非常合理的元对象模型。 另外,还需要重视“一切为对象,一切为闭环”的口号。
影响编程语言可维护性的因素是什么?
Guido van Rossum认为,要增强编程语言的可维护性,必须在灵活性和正规性之间取得平衡。 在小程序中,动态类型更方便,但在大程序中需要严格的方法。 另外,最好用编程语言本身实现规则,不要给用户留下太多自由使用的空间。 因此,Guido计划在Python中添加类似TypeScript的技术。 “事实上,TypeScript非常实用,我想在Python中添加同样的概念。 当然,我们的追加方法有些不同。 因为我们的语言环境不同。 ’他说
事实证明,除了类型系统,重建引擎也非常有用。 有了重建引擎,一次可以大规模地重建数百万行的代码。 方法的名称通常不会重命名。 因为在仔细阅读代码之后,很难正确重命名每个变量。 如果有重建引擎,您可以单击几个按钮并输入新名称,然后在30秒内完成重建。
根据Andersandhejsberg,TypeScript项目来自一些巨大的JavaScript代码库。 随着这些代码库的增大,维护变得非常困难。 之后,基本上这些代码库变成了“只有写的代码”。 他补充说,我们需要理解代码的意思,这一过程降低了重建工作的难度。 “理解这个意思需要类型系统,在开始添加类型系统的时候也可以添加代码文档”。 Wall也支持“良好的字句作用域有助于重建”的观点。
程序设计语言设计的未来
在谈到编程语言设计的未来时,James Gosling共享了编程中未被充分探索到的区域,编写了使用GPU的代码。 他强调“现在我们的编程语言无法直接利用GPU,我们应该加大这一领域的发展。”
根据Andersandhejsberg,编程语言不像硬件和所有其他技术那样快速变化。 就发展速度而言,编程语言与数学和人脑相似。 “我们还是用50年前发明的语言编程的,所有的函数编程原理都是50多年前的研究成果。”
但是,他也相信现在的编程语言范例很多,不能严格区分面向对象编程和函数型编程等类别。
“语言面向多种范式。 我们不应该说我们只喜欢面向对象的编程、指令型编程和函数型编程语言”
现在更重要的是,了解最新的研究、新的思维和新的范式,优雅地将这些新思想融入我们的编程风格中。