主题:掌握程序语言的几大窍门
对于学程序语言开发的人来说,程序语言的确是一大难题,不断变化,怎样才可以学好?有哪些窍门呢?今天我们就一起来看看学习程序语言的几大窍门:
1.专注于“精华”和“原理”。
就像所有的科学一样,程序语言最精华的原理其实只有很少数几个,它们却可以被用来构造出许许多多纷繁复杂的概念。但是人们往往忽视了简单原理的重要性,匆匆看过之后就去追求最新的,复杂的概念。他们却没有注意到,绝大部分最新的概念其实都可以用最简单的那些概念组合而成。而对基本概念的一知半解,导致了他们看不清那些复杂概念的实质。比如这些概念里面很重要的一个就是递归。国内很多学生对递归的理解只停留于汉诺塔这样的程序,而对递归的效率也有很大的误解,认为递归没有循环来得高效。而其实递归比循环表达能力强很多,而且效率几乎一样。有些程序比如解释器,不用递归的话基本没法完成。
2.实现一个程序语言。
学习使用一个工具的最好的方式就是制造它,所以学习程序语言的最好方式就是实现一个程序语言。这并不需要一个完整的编译器,而只需要写一些简单的解释器,实现最基本的功能。之后你就会发现,所有语言的新特性你都大概知道可以如何实现,而不只停留在使用者的水平。实现程序语言最迅速的方式就是使用一种像Scheme这样代码可以被作为数据的语言。它能让你很快的写出新的语言的解释器。我的GitHub里面有一些我写的解释器的例子(比如这个短小的代码实现了Haskell的lazy语义),有兴趣的话可以参考一下。
3.高级过程式语言
很早的时候,国内计算机系学生的第一门编程课都是Pascal。Pascal是很好的语言,可是很多人当时都没有意识到。大一的时候,我的Pascal老师对我们说:“我们学校的教学太落后了。别的学校都开始教C或者C++了,我们还在教Pascal。”现在真正理解了程序语言的设计原理以后我才真正的感觉到,原来Pascal是比C和C++设计更好的语言。
它不但把人从底层细节里解脱出来,没有面向对象的思维枷锁,而且含有函数式语言的一些特征(比如可以嵌套函数定义)。可是由于类似的误解和误导,Pascal这样的语言已经几乎没有人用了。这并不很可惜,因为它的精髓,其实已经存在于像Scheme这样的函数式语言里。Scheme也有赋值语句,所以它实质上含有Pascal的所有功能。所以现在的含有赋值语句的函数式语言,可以被看作是是高级过程式语言的“改良版本”。
4.函数式语言
函数式语言相对来说是当今最好的设计,因为它们不但让人专注于算法和对问题的解决,而且没有面向对象语言那些思维的限制。但是需要注意的是并不是每个函数式语言的特性都是好东西。它们的支持者们经常把缺点也说成是优点,结果它们其实还是被挂上一些不必要的枷锁。比如OCaml和SML,因为它们的类型系统里面有很多不成熟的设计,导致你需要记住太多不必要的限制。
很多人推崇“纯函数式”语言(比如Haskell,Clean),而极力反对其它的带有“赋值”语句的语言(比如Scheme和ML)。这其中的依据其实是站不住脚的。如果你写过一个函数式语言的编译器,你就会了解如何把一个纯函数式语言翻译成机器指令。这些高级的编译器变换(比如CPS和ANF),其实在本质上揭示了纯函数式语言的本质。它们其实与带有赋值语句的语言没有本质上的区别,但是由于没有赋值语句,一些事情必须拐弯抹角的实现。理智的使用局部变量或者数组的赋值,会使程序更加简单,容易理解,甚至更加高效。
5.逻辑式语言
逻辑式语言(比如Prolog)是一种超越函数式语言的新的思想,所以需要一些特殊的训练。逻辑式语言写的程序,是能“反向运行”的。普通程序语言写的程序,如果你给它一个输入,它会给你一个输出。但是逻辑式语言很特别,如果你给它一个输出,它可以反过来运行,给你所有可能的输入。其实通过很简单的方法,可以顺利的把程序从函数式转换成逻辑式的。但是逻辑式语言一般要在“pure”的情况下(也就是没有复杂的赋值操作)才能反向运行。所以学习逻辑式语言最好是从函数式语言开始,在理解了递归,模式匹配等基本的函数式编程技巧之后再来看Prolog,就会发现逻辑式编程简单了很多。
程序员们你们看好了吗? (信息来源江苏万和计算机培训中心)