什么是编程语言

前一段时间从C++的客户端开发转到Java的Web服务开发,从C++转换到Java开发其实是一件非常有意思的事情。在学校的4年从头至尾都在用学习使用C/C++,顶多还有点Javascript,对编程语言的认识已经非常僵化。这一段时间的Java开发过程中,学习了一些Java中和C++不同的语言特性,在对这些语言特性的思考过程中对编程语言有了更深的理解。

以前我的理解是编程语言是对机器的抽象,比如垃圾回收是对内存模型的抽象,文件是对设备的抽象,函数是对栈的抽象等等。不同的编程语言的抽象程度不同,抽象低的语言诸如C,拥有更verbose的语法,但是拥有performance优势;抽象层次高的编程语言语法优雅,但是牺牲了performance,总之不同的编程语言是在编写时间个运行时间上做tradeoff。学习了解Java GC机制的时候更加深了我这种看法。

组内技术交流的时候讲了一个函数式编程的题目,准备这个Talk的时候注意到lambda演算这个函数式编程重要的基础概念,虽然至今我还没理解lambda演算这个数学概念,但是根据wiki上的解释:“λ演算(lambda calculus)是一套用于研究函数定义、函数应用和递归的形式系统”来看,它和机器一点关系都没有。事实上lambda演算的发明者是阿兰·图灵的老师阿隆佐·邱奇,lambda演算是个和图灵机等价的计算模型,描述的是问题的可计算性。也就是说函数式语言并不是对机器的抽象(至少不完全是),这个发现迫使我重新思考编程语言是机器的抽象这个观点。

回顾计算机的历史,计算机发明之初大多用于军事方面的大规模计算,比如弹道计算、密码破译,这实际上也是计算机(computer)名字的由来,换句话说当时计算机的问题域是纯计算。然而随着计算机工业的发展,计算机的问题域被不断的拓宽,编程语言也随着问题域的变化而发生了很多变化,也就是说编程语言不但是对机器的抽象,也是对问题域的抽象。举个例子,最早的1957年IBM发明fortran的时候,支持INTEGER和REAL类型,随着文本处理的需求日渐增加,fortran77里加入了CHARACTOR作为基本数据类型以提高语言的字符串处理能力。更典型的例子是如今种类繁多的DSL(Domain Specific Language),比如jQuery、VHDL、shell脚本等等,它们更关注的是对问题域的抽象。

于是我得到了一个更完整的对编程语言的理解:编程语言是程序员解决问题的工具,程序员用编程语言在机器上建立一个目标问题的模型,所以编程语言是既是对机器的抽象和也是对问题域的抽象

有了这样的理解,对于编程语言的特性都可以归类于对机器的抽象或者对问题域的抽象。各大语言忙不迭地加入函数式编程中的列表操作(filter、map、reduce、foreach)的支持,是对问题域的抽象,java1.5中concurrent包则可以理解成对现在SMP机器的抽象。

This entry was posted in 技术学习 and tagged . Bookmark the permalink.

One Response to 什么是编程语言

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据