编程语言的优劣,一直众说纷纭。倘若编程语言的创造者们相聚一起共谈自己所设计的语言,是否又会掀起一番“腥风血雨”?
其实就在近日,Python 创始人 Guido van Rossum、Java 创始人 James Gosling、C# 创始人 Anders Hejlsberg、Perl 创始人 Larry Wall 四位技术大拿相聚西雅图,共同探讨编程语言的设计与未来发展。
Anders Hejlsberg表示,他遵循了他所接触过的所有编程语言的共同原则,即“做某件事情的方法只有一种。”他认为,如果开发人员有四种不同的方法,那么最终很有可能会选择错误的道路,而且要过很久才能在开发中意识到这个错误。根据Hejlsberg的说法,这就是为什么开发人员总是会创建一种名为“简单的复杂”的东西,也就是说拿到一些复杂的东西后,通过简单的打包来掩盖复杂性。
与Guido van Rossum的观点相似,他进一步补充说,在设计一种编程语言的时候,无论你做出怎样的决定,都必须坚持到底。在设计编程语言的时候,你需要谨慎地决定“不”将哪些东西引入到这种编程语言中。通常,人们会向你提出他们的建议,但你无法真正改变编程语言的本质。虽然你无法真正改变语言的基本性质,但是你可以进行扩展。基本上你有两个选择:要么坚持语言的本质,要么开发一个新的编程语言。
编程语言的类型系统
在谈论到Python决定类型的方法时,Guido van Rossum分享了Python首次推出时的一个故事。起初,int不是一个类,实际上它是一个转换函数。后来,Guido意识到这是一个错误。“我们有很多这样的功能,我们意识到我们犯了一个错误,我们向用户提供了与内置对象类型不同的类。”
于是,Python团队决定重新构建Python的整个类型,并进行了大量的清理。因此,他们将函数int更改为类int的指定符。现在,调用这个类意味着构造该类的实例。
James Gosling表示一直以来他都很注重性能,而提高性能的一个因素是类型系统。在构建优化编译器和提前检查正确性等方面,类型系统非常实用。拥有类型系统也有助于为小型设备构建系统的情况。他说:“为了能在有限的空间内工作,你必须了解设备提供的每一种可能性,而且你知道得越早,就越有可能出色地完成工作。”
Anders Hejlsberg将类型系统视为一种工具。开发人员喜欢他们的IDE,他们习惯于使用语句的自动补齐、重构和代码导航等。这些功能是通过代码的语义知识而实现的,而这种语义知识正是由类型系统的编译器提供的。Hejlsberg认为,添加类型可以大大提高开发人员的生产力,虽然这与我们的直觉相反。
他补充说:“我们以为动态语言更容易掌握,因为你摆脱了类型的束缚。然而,事实证明,如果你以非侵入的方式添加类型,同时努力做好类型推断等,那么就可以提高效率。”
谈到Perl中的类型系统时,Wall表示Perl 5和Perl 6有不同类型的系统。在Perl 5中,所有类型都会被视为字符串,即便是数字或浮点类型。该团队希望在重新设计Perl 6的时候依然保留这个功能,然而他们意识到:“如果新用户对可互换性感到困惑,那还好;但如果连计算机都感到困惑,那就不妙了。”
于是,在Perl 6中,Wall和他的团队希望将其打造成更好的面向对象以及更好的函数式编程语言。为了实现这一目标,他们需要一个非常合理的类型系统,并在底层建立一个非常合理的元对象模型。此外,你还需要非常重视“一切都是对象,一切都是闭环”的口号。
影响编程语言维护性的因素有哪些?
Guido van Rossum认为,如果想加强编程语言的维护性,那么就需要在灵活性和规范性之间取得恰当的平衡,这一点非常重要。虽然对于小型程序来说,动态类型更好用,但大型程序则需要采用严格的方法。而且,最好能够通过编程语言本身实现规则,不要给用户留下太多自由发挥的空间。出于这个原因,Guido打算在Python中添加类似TypeScript的技术。他补充说:
除了类型系统以外,事实证明重构引擎也非常有用。有了重构引擎后,就可以一次执行数百万行代码的大规模重构了。通常,人们不会重命名方法,因为你很难认真看完一段代码,然后正确地给每一个变量重命名。如果你有一个重构引擎,那么只需点下几个按钮,输入新名称,然后30秒内就可以完成重构。
Anders Hejlsberg表示,TypeScript项目源自一些庞大的JavaScript代码库。随着这些代码库变得越来越大,维护工作变得异常艰难。后来基本上这些代码库变成了“只写的代码”。他补充说,因此我们需要理解代码的语义,而这个过程也降低了重构工作的难度。他表示:“这种语义的理解需要一个类型系统,而且在你开始添加类型系统时,你还可以添加代码的文档。”Wall也支持“良好的词法作用域有助于重构”的观点。