梦寐以求的编程语言
梦寐以求的编程语言
中二电工吹短笛首先,一个编程语言没有一个好的实现,就不算完整。不必大惊小怪,一种编程语言不能只有语法规则,必须为它找到一个依附的系统。
语言的战争
如果用汇编语言只是为了让蜂鸣器响10次就不得不写出大堆代码,不难想象写出一个文字处理器或电子表格将是一项多么浩大的工程。
自从计算机CPU采用精简指令计算集开始,人们才不得不使用高级语言编程。现在绝大多数人在绝大多数时候都使用高级语言编程,很少会有人使用汇编语言编程。只有少数最关键的部分可能还会用到汇编语言,比如开发某个计算机游戏时,你需要在微观水平控制硬件,使得游戏速度得到最大限度的终极提高。Fortran、Lisp、Cobol、Basic、C、Pascal、Smalltalk、C++、Java、PHP、Perl和Python,全都是高级语言。那么,应该使用哪一种语言?
关于这个问题,现在有很多争论。部分原因是,如果你长期使用某种语言,你就会慢慢按照这种语言的思维模式进行思考。所以,后来当你遇到其他任何一种有重大差异的语言,即使那种语言本身并没有任何不对的地方,你也会觉得它极其难用,人们对于各种语言优缺点的判断经常被这种心态误导。如果你的思想被某个语言同化了,你向下看那些比你低级的语言可能会说:“这个语言怎么用?它甚至连xx功能都没有!”但是在你看向更强大的语言时,你可能就会认为那种语言和自己用的语言同样强大,只不过是加入了某些奇怪的东西。
抽象性
高级语言比汇编语言更接近人类语言,而某些高级语言又比其他语言更进一步。C语言是一种低层次语言,很接近硬件,几乎堪称可移植的汇编语言,而Lisp语言的层次则是相当高。
如果高层级语言比汇编语言更有利于编程,你也许会认为语言的层次越高越好。一般情况下确实如此,但不是绝对的。编程语言可以变得很抽象,完全脱离硬件,Prolog语言就走错了方向。
简洁性
最重要的方面就是要使得语言更抽象,高级语言应该设计得越抽象越好。语言设计者应该总是看着代码,问自己能不能使用更少的语法单位把它表达出来。如果你有办法让许多不同的程序都能更简短地表达出来,那么这很可能意味着你发现了一种很有用的新抽象方法,简洁性是静态类型语言的力所不及之处。不考虑其他因素时,没人愿意在程序的头部写上一大堆的声明语句。
hello-world本应该是一个很简单的程序,但是使用Java语言,你需要这样写:
1 | public class Hello { |
如果你从来没有接触过编程,看到上面的代码可能会很奇怪,让计算机显示一句话为什么要镐得这么复杂?有意思的是,程序员的反应与你一样。
使用像英语一样又长又啰嗦的语法的代价不仅是增加了打字的工作量,还包括提高了阅读代码的难度,以及占用了更多的显示器空间,python的语法非常简洁高效,被认为是最优美的编程语言。
如果使用python语言实现这个程序则只需要一行代码:
1 | print('hello World!') |
可编程性(安全带还是手铐?)
Python社区中常说这样一句话:“大家都是成年人了”
语言设计者之间的最大分歧也许就在于,有些人认为编程语言应该防止程序员干蠢事,另一些人则认为程序员应该可以用编程语言干一切他们想干的事。防止程序员做出“错误”举动的措施多得惊人,这是语言设计者很自以为是的危险举动。
目前最活跃的议题之一就是静态类型语言与动态类型语言之争。在静态类型语言中,写代码时必须知道每个变量的类型,而在动态类型语言中,随便什么时候,你都可以把变量设为任意类型的值。静态类型语言的拥护者认为这样可以防止bug,并且帮助编译器生成更快的代码(这两点理由都成立)。动态类型语言的拥护者认为静态类型对程序构成了限制(这点理由也成立)。我更喜欢动态类型,痛恨那些限制我的自由的语言。但是,确实有一些很聪明的人看来喜欢用静态类型语言。所以,这个问题依然值得讨论,并没有固定答案。
语言设计者应该假定目标用户是一个天才,会做出各种无法预知的举动,而不是假定目标用户是一个笨手笨脚的傻瓜,需要别人的保护才不会伤到自己。如果用户真的是傻瓜,不管你怎么保护他,他还是会搬起石头砸自己的脚。你也许能够阻止他引用另一个模块中的变量,但是你没法防止他日日夜夜不知疲倦地写出结构混乱的程序去解决完全错误的问题。
一次性程序
写什么样的语言适合写一次性程序?首先,它必须很容易装备。一次性程序往往不是真的只用一次,一次性程序是你只想在一小时内写出来的程序,所以它不应该耗费很多时间安装和配置,最好已经安装在你的电脑上了。它必须是想用就用的。C语言可以想用就用,因为它是操作系统的一部分;Python可以想用就用,因为它本来就是一种系统管理工具,大多数linux操作系统已经默认安装它了。
很容易装备不仅仅指很容易安装或者已经安装,还指很容易与使用者互动。一种有命令行界面、可以实时反馈的语言就具有互动性,那些必须先编译后使用的静态语言就不具备互动性。受欢迎的编程语言应该是前者,具有良好的互动性,可以快速得到运行结果,如果考虑到你最多只打算在这个程序上耗费一小时甚至几分钟,一次性程序简洁的特点就更重要了。看到这里,如果你是一个Python黑客,你会很容易联想到你写一个Python脚本然后马上就执行时的情景。python既可以用来开发大型项目,也可以写一些短粗猛的小脚本或者小工具。
Perl不仅仅设计成适合开发一次性程序,而且它本身就很像一次性程序。最初的Perl只是好几个生成表格的工具收集在一起而已,后来程序员用它写一次性程序,当那些程序逐渐发展壮大后,Perl才随之发展成了一种正式的编程语言。到了Perl 5,这种语言才适合开发重要的程序,但是在此之前它已经广为流行了,一次性程序往往不是真的只用一次。
函数库
那些内核最小、最干净的编程语言才会存在于进化的主干上。一种语言的内核设计得越小、越干净,它的生命力就越顽强。有些内核设计得并非很好,但是却有着无数强大的函数库,这种语言头重脚轻但是可以用来解决特定的问题,车顶上绑着飞机发动机的小车也许真能开,只要你不尝试拐弯,可能就不会出问题。
简洁性的最高形式当然是有人已经帮你把程序写好,你只要运行就可以了。函数库就是别人帮你写好的程序,所以它是编程语言的另一个重要特点,并且正在变得越来越重要。
编程语言的进步很大一部分与函数库有关。未来的函数库将像语言内核一样精心设计,优秀函数库的重要性可能超过语言本身,某种语言到底是静态类型还是动态类型还是面向对象还是函数式编程,这些都不如函数库重要。
设计优秀的函数库是很难的,并不只是写一大堆代码而已。一且函数库数量变得太多,找到一个你需要的函数有时候还不如自己动手写来得快。函数库的设计基础与语言内核一样,都是一个小规模的正交运算符集合。函数库的使用应该符合直觉,可以猜得出哪个函数能满足自己的需要。
如果有人已经帮你写好非常完美的底层实现,直接import不是很爽?Python的价值很大一部分就来自Python庞大且非常强大的函数库,这些函数库让其他语言淡然失色。
效率问题
此处说所的效率分为两个效率:
1.开发效率
2.运行效率
随着技术的发展,每一代人都在做上一代人觉得很浪费的事情。一旦未来硬件的性能大幅提高将会发生什么事?新增加的运算能力都会被糟蹋掉。
一些动态语言抽象层次很高,人们在使用非常高级的语言(比如Lisp)时,经常抱怨很难知道哪个部分对性能的影响比较大。可能确实如此,如果你使用一种非常抽象的语言,这也许是无法避免的。不管怎样,我认为一个好的性能分析器会解决这个问题。
仔细想想,抽象层次较高的语言使用简短的语句写完的程序,换作较低级的语言去实现就真的会快很多吗?运行速度往往只取决于一些关键的瓶颈。在编程实践中应该搞清楚瓶颈到底在哪里,提高代码运行速度的关键是使用好的性能分析器,而不是使用其他类似于精心选择一种静态类型的编程语言的方法。
为了提高运行速度,并没有必要每个函数的每个参数类型都声明清楚,你只需要在瓶颈处声明清楚参数类型就可以了。所以,更重要的是你需要能够找出瓶颈到底在什么地方。
如果因为运行效率选择低级的语言(除了一些本身就需要无限的算力(比如加密算法)的优化),那很有可能是最愚蠢的行为。抽象层次应该越高越好,因为随着计算机硬件性能的发展,计算机的时间与程序员的时间相比要越来越廉价。
面向对象编程
面向对象编程(Object-Oriented Programming,OOP)是一种常用的编程思想,它强调万物皆对象,编程时将现实世界中的事物抽象成程序中的对象。与传统的基于函数的编程不同,面向对象编程注重于将数据与行为封装在一起,即对象既包含数据状态,还包含可调用的行为方法。它的特点在于,它具有封装、继承和多状态三大特性。封装意味着将对象的状态和行为进行封装,使其对外只暴露必要的接口,从而提高了安全性和可维护性;继承指的是某个对象可以继承另一个对象的特性,从而快速构建具有相似属性的对象;多态是指同一种行为在不同的对象上具有不同的表现形式,即在不同的情境下,同一个方法可以被不同的对象进行调用。面向对象编程实现了数据和行为的有机结合,可以使程序更加高效、结构清晰,并方便管理和扩展,是一种强大的编程方式。
Python是一个面向对象的编程语言,Python语言的设计就处处体现面向对象的哲学。在Python中,万物皆对象,就连字符串类型在Python中也是对象。因此,Python对面向对象编程OOP提供了全面而强大的支持。OOP是一种编程范式,它将程序看作是一组相互作用的对象的集合,每个对象都有自己的数据和行为。Python中的OOP支持包括以下几个方面:
- 类(Class):类是创建对象的蓝图或模板。在Python中,类可以包含属性(变量)和方法(函数),它们共同定义了对象的状态和行为。
- 对象(Object):对象是类的实例,即根据类的定义创建的具体的实体。每个对象都有一组属性和方法,可以独立地存储数据并执行操作。
- 继承(Inheritance):继承是OOP的一个基本特征,它允许一个类(子类)继承另一个类(父类)的属性和方法。Python支持多重继承,即一个类可以同时继承多个父类的特征。
- 封装(Encapsulation):封装是将数据(属性)和操作数据的方法(函数)结合在一个单元中,并限制对数据的访问和修改的方式。Python中的类和对象提供了封装数据的机制,可以通过访问控制来隐藏内部实现细节。
- 多态(Polymorphism):多态是指不同的对象可以对相同的消息做出不同的响应。在Python中,多态通常是通过继承和重写父类的方法来实现的。
- 抽象(Abstraction):抽象是从众多的事物中抽取出共同的、本质性的特征,而忽略那些非本质的细节。在Python中,可以通过抽象类(Abstract Base Classes, ABCs)来定义接口和实现抽象概念。
- 运算符重载(Operator Overloading):Python允许自定义类的行为来响应特定的运算符操作,比如
+
、-
、*
等。这可以通过定义特殊方法来实现,比如__add__()
、__sub__()
等。- 属性访问控制:Python提供了装饰器如
@property
来定义getter、setter和deleter方法,从而控制对类属性的访问和修改。- 异常处理:在面向对象的Python程序中,异常处理是一个重要的组成部分。Python的
try
、except
、finally
语句块允许开发者优雅地处理程序中可能出现的错误和异常情况。- 标准库和第三方库支持:Python的标准库和丰富的第三方库提供了大量的类和对象,可以直接用于构建复杂的面向对象应用程序。
通过这些OOP特性,Python开发者可以构建出结构清晰、可维护性强、代码重用率高的软件系统。
时间
一种编程语言要想变得流行就要经受住时间的考验,没人想用一种会被淘汰的语言编程。这方面已经有很多前车之鉴了,大爆炸式项目的Multics操作系统和Ada语言现在都已经销声匿迹了,而它们的继承者则是自然成长式项目的Unix和C语言。
如果说成功的标准是相关书籍的出版量,或者是学Java找工作的大学生数量,那么Java确实已经成功了,当我说Java不会成功时,意思是Java走到了进化的尽头。这里的重点不是看衰Java,而是说编程语言存在一个进化的脉络,在整个进化过程中,某一种语言的位置到底在哪里?之所以要问这个问题,不是为了以后让别人感叹我们如此英明,而是为了找到进化的主干。
为梦寐以求的语言做个小结
这种语言干净简练,具有最高层次的抽象和互动性、容易装备、可以只用很少的代码就解决常见的问题,不管是什么程序,你真正要写的代码几乎都与你自己的特定设置有关,其他具有普遍性的问题都有现成的函数库可以调用。这种语言的句法短到令人生疑,抽象程度很高,使得你可以快速写出一个程序的原型、有大量优秀的范例可供学习,而且非常符合直觉,你只需花几分钟阅读范例就能领会应该如何使用此种语言。偶尔才需要查阅操作手册,它本身很薄,里面关于限定条件和例外情况的警告寥寥无几。这种语言的内核很小,但很强大,各个函数库高度独立,而且和内核一样经过精心设计,能很好地协同工作。语言的每个部分完美契合,不需要为了兼容性问题放弃或者保留某些功能,所有函数库的源码都很容易得到。这种语言能够很轻松地与操作系统和用其他语言开发的应用裎序对话或者引用其他语言开发的模块。
这种语言以层的方式构建。较高的抽象层透明地构建在较低的抽象层之上。如果需要的话,你可以直接使用较低的抽象层。除了一些绝对必要隐藏的东西,这种语言的所有细节对使用者都是透明的。它提供的抽象能力只是为了方便你的开发,而不是为了强迫你按照它的方式行事。
事实上,它鼓励你参与它的设计,给你提供与语言创造者平等的权力。你能够对它的任何部分加以改变,甚至包括它的语法。它尽可能让你自己定义的部分与它本身定义的部分处于同等地位。
这种梦幻般的编程语言不仅开放源码,更开放自身的设计。
这个我梦寐以求的编程语言就是Python!
如果你看看Python之禅,你就会发现我说的这个语言就是Python。
时至今日,计算机的硬件性能已经得到数量级的提高,计算能力不再是限制编程语言的最重要的因素。Python曾经不被看好的追求开发速度、强调简洁优雅、降低编程门槛的核心理念得到快速发展,大器晚成。敏捷开发成为生产环境下对语言选择的重要因素,而Python就很好的满足了这一点。
Python这样一个开源、跨平台、可移植、可扩展、交互式、解释型、面向对象并且社区活跃的动态语言在今天应用场景非常广泛,在Web开发、数据科学、网络爬虫、自动化运维、游戏开发、人工智能、科学计算、金融分析、系统自动化、网络编程等领域处处可见Python的身影,Python可以独自开发任何程序。
出身寒门的Python最终成了进化的主干。
作为Pythonistas,我们为自己使用的编程语言无比自豪。