战国时代---编程语言杂谈(1)
1. 前言
说实话其实小弟现在还没有太多的底气来谈论编程语言的话题,因为一来现在对于编程语言的理论知识研究的也不算深,二来也没有什么实践经验。但是最近几天看了《冒号课堂》感触颇深,又研究了下C#老大对于编程语言发展的演讲,激发了对于程序设计语言的不少想法。小弟不才,在此把自己所想的抒写一下,其中错误不足之处还请高手指正。
2. 编程范式 Programming Paradigm
让我们首先回到最根本的问题:程序设计语言是干什么的呢?相信这个问题比较简单,每个程序员都会有自己的理解。程序设计语言就是程序员(人)与计算机(机器)交互的语言,程序员通过编程语言编写计算机程序操控计算机硬件进行工作。
编程范式 则指的是计算机编程的基本风格或典范模式,是对编程语言语法、表达形式的进一步抽象。如果把编程语言看作是程序员手中的如刀剑棍棒之类的兵器的话,那么编程范式就是这种兵器的心法和内功招数。编程范式是人的哲学和机器哲学的交汇之处。学习编程语言不仅仅是学习兵器如何使用,更应该学会领悟这种武功的精髓。
编程范式有很多种,分别代表着不同的哲学思想和思维方式,而且编程方式不仅仅体现在编程语言,而是体现在软件工程中的全部过程,如分析方法、设计模式、架构设计等等。但是编程语言是编程范式最朴素的体现。一种编程语言可以支持多种编程范式,而每种编程范式则都有最具代表性的编程语言。
最基本的编程范式便是过程式编程 procedural programming(或命令式编程 imperative programming),以顺序、条件分支和循环三种结构为最显著标识。过程式编程之所以是最基本的编程方式,并且为几乎所有的编程语言所支持,其原因就是计算机,严格的说是冯诺依曼机,的运行方式就是如此。从最初的机器语言到汇编语言都是若干行动指令组成的有序列表。所以过程式编程也就顺利成章的成为最初的程序设计的语言的最基本范式,典型的代表语言是Fortran 、 Pascal 、C等,都是纯过程式语言。
函数式编程(Functional Programming)和逻辑式编程(Logic Programming)都属于声明式编程(Declarative Programming)。声明式编程是一种更高层次的编程范式,告诉计算机要做什么,而不是具体的怎么做。命令式编程则注重告诉计算机怎么做,只有机器运行完了才能知道运行的效果。声明式编程的历史其实并不短,只是主要用于人工智能等的理论研究,更像是计算机科学家的玩物。而如今为了更提高程序员的开发效率,现代的编程语言已经吸收了不少声明式编程的特性。函数式编程建立在高等数学函数理论,主要是进行表达式变换,代表语言有Lisp、F#等。逻辑式编程则建立在离散数学数理逻辑的基础上,主要是进行逻辑推理,代表语言有Prolog等。
面向对象编程(OOP Object-Oriental Programming)相信大家应该是比较熟悉的了吧,代表语言便是C++、Java和C#等。过程式编程强调的是自顶向下、逐步求精;面向对象式编程则是自底向上、逐步合并。它把编程的数据结构单元,看作是一个个微小的对象,然后再对这些对象进行组合归并,最后实现解决整个的大问题。这种思维方式更加适合人们分析一个复杂的系统,与此同时可能够更方便地实现复用加快了开发效率,而这也已经成为当今程序设计的主流。
动态编程(Dynamic Programming)是不对编译时和运行时进行严格区分的语言。动态语言在程序运行时期改变数据结构、函数定义、对象行为或指令流程等。动态编程优化的是程序员的时间而非机器的时间,所以会给程序员带来更高的开发效率。动态语言是解释执行的因此效率相对于静态语言会有所偏低,但是现在经过优化后的解释器或运行平台已经将差距进一步缩小。动态编程和静态编程的混合统一已经成为趋势,如.NET就加入了DLR(Dynamic Language Runtime)以支持动态语言,如IronPython、IronRuby等。
泛型编程(Generic Programming)则是将算法与具体的数据类型分离开,并且将算法进一步的抽象泛化,使之能够支持更多的数据类型,进而实现算法的复用,而且还能够提高性能。实现泛型的最佳代表无疑便是C++的STL,其泛型三要素算法、容器和迭代器已经是其他编程语言实现算法的典范。Java 和 C# 也都有各自的泛型实现方式。
并发编程 (Concurrent Programming)是以进程为导向,以资源共享和竞争为主线。在程序的执行顺序进行扩展,允许不同的计算在执行时间上交替或重合。在如今的多核时代,并发式编程的重要性就不用多说了。代表语言非Erlang莫属了。当然对于现在如何解决多核编程问题还是没有统一的完美的方法,有的倾向于在编程语言层次,也有的倾向于平台层次,如.NET 4.0中就提供了Parallel Extention并行编程扩展。多核编程对于程序员来说既是挑战又是挑战。
另外的编程方式还有元编程(MetaProgramming)、切面编程(Aspect Programming)、事件驱动编程(Event-driven Programming)等。本人研究不深就不班门弄斧了,有兴趣的大家可以自己深入研究下。
总之,编程范式体现的是不同的编程思维方式抑或是不同的程序设计哲学。学习编程,掌握编程语言的语法技巧是基本的,而对于编程语言所支持的编程范式的理解则是更深入的。只有狂练内功才能把手中兵器运行更加得心应手,真正做到人剑合一、天下无敌!
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号