如果不考虑实现的难度,理论上说只要能输入16进制的编码就可以编程。不过事实上这种事情即使在小说里面也不会有人去做的,毕竟人的精力是有限的。现在人们一般使用某种语言来进行编程,那么语言的到底是什么呢?

就程序语言的发展来说,最初的语言应该是汇编。这种语言严格来说不具备语言的特征,只是转换可理解的代码到不可理解的代码而已。近代首次语言上的重大突破是IBM公司的forturn语言,这种语言基本具备了高级语言的几大特征。而后就是伴随UNIX一起称霸了计算机界半边天的C,以及同属于C系列的C++/Jaca。目前趋势来看,形式化/结构化语言用Java,操作化语言用C已经成为流行。估计在十到二十年内我们会迎来语言的又一大发展。

任何语言基本来说,都要考虑三大要素。语义逻辑解析,程序操作接口,复用。这三大要素的出现顺序是按时间顺序排列的。

首次出现高级语言的时候,着重是在语义逻辑解析上。主要目的是将人类思考的形式以自然语言的方法描述,转换成可以实现的机器语言。这一时期的语言不能说没有考虑后两者,不过在实现上的却比现在差很多。

程序操作接口是我们注意的第二个要素,我不知道C以前的语言是怎么处理和系统交互的问题的,不过C的解决方案的却不算是很理想的方案。C利用相对独立的和系统相关的代码库来实现接口的抽离,这种方式如同舍弃高级语言中的转跳而使得语言结构化增强一样,是一种无奈的取舍。但是如此一来,操作底层的时候就必须舍弃标准代码,而使用标准代码就却不能完全脱离系统。(关于此点,相信所有被TC中16位的unsigned

int困扰过的朋友们都深有体会)于是std标准库就成了半个鸡肋,之所以说半个是因为聊胜于无。java在抽离上比C更进了一步,彻底的同系统抽离了,这使得在形式操作的时候我们可以避免考虑系统差异。但是和刚刚一样,java操作底层是非常差劲的。大家可以试试用java在windows中编写一个服务,注册运行。不过jni的开放在一定程度上弥补了这个问题,上有java,下有C。虽然差强人意,不过也算是比较完美的解决了系统接口的问题。

最后一个问题就是当前我们关心的要点,复用。复用的最大意义就是减少劳动的重复,增加劳动的效率。从目前来看,复用主要是两种形式。黑箱接口,同形重用,而这两者又不是完全割裂的。黑箱接口的核心就是将相同部分组成一个黑箱,黑箱外可以任意操作黑箱。只要遵循黑箱的说明原则,就不必关心黑箱内部是怎么实现的。而同形复用也可以相对称为白箱复用,是指将一系列代码组成一个白箱,对外部并不封闭。在应变的时候需要改变箱内的内容,但是这种改变要么是自动的,要么是轻松的。黑箱多数是运行时复用,而白箱多数是编译时复用。例如库技术,接口,COM(这个应该也算接口吧)就是黑箱。在编译前无需假定操作对象是什么。而C++的模板技术就是典型的白箱,编译前必须假定操作对象。如果编译的时候我们没有编译针对某个类的函数,那么运行时就会出错。

复用和接口有着紧密的关系,假定我们有一套操作下层接口的方法,并且经常被用到。那么根据复用的原则,我们就应该把他封装成复用块。这样,复用块成了新程序的基础。也就是说,对在此上写的程序来说,这些复用的代码是接口的一部分。

我前面曾经说,在十到二十年内我们会迎来语言的又一大发展,主要是在说分布和同步上。目前我们的所有程序都已经从单线程转为多线程了(我指支持,如果你硬要写单线程也可以),然而线程间的同步依旧是非常麻烦的事情。如果线程间共享数据,那么我们必须手工操作同步。java算是比较先进的,可以通过形式化的方式来设定同步。然而这不是语言发展的最终目的,我们的最终目的是要使得同步有一系列明确的机制,只要按照机制来做,就可以不考虑同步的问题。这不仅仅是说本地线程的同步,而且是说如果一个程序在两个地方分别有一个线程,到底应该如何操作。如果能完美有效的解决这个问题,相信我们也就同时解决了诸如B/S好还是C/S好,分布资源的调集等等我们现在非常头痛的问题。