第四代编程语言,或者说是第四阶段的编程语言,这是我自己理解定义的一个概念,请勿告诉我说4gl是SQL。
个人认为,对程序员而言,编程语言已经发展到第四个阶段了。
第一阶段,汇编语言。在此之前,还有机器语言,即0101010101010这样的二进制代码。对程序员来说,机器语言无疑是天书,完全不可接受。而汇编用针对指令的符号代替二进制代码,对程序员来说无疑的莫大的福音。但是,我们直接去操作寄存器,需要了解不同硬件平台,比较抽象,相对于人们日常生活描述方式差之极远。
第二阶段,以C为代表,它给我们抽象一些底层的东西,我们大部分时间是关心业务逻辑,而不要了解我们当前的硬件。这类语言充分接近人们生活描述习惯,比较容易理解和学习。但是程序员编写它们,除了业务逻辑,我们还需要进行内存管理,这无疑增加了开发负担。
第三阶段,以JAVA为代表,它为我们进一步抽象底层,有了类、接口等OO概念,程序员也无需管理内存。它基本上是人们生活的描述,程序员很容易学习和编写自己的业务逻辑。
第四阶段,随着CPU性能的提升,计算速度越来越快,但是I/O性能却没有成比例的提升,大部分的时间耗在I/O等待上(网络I/O和磁盘I/O),CPU没有充分利用起来。第三代语言的解决办法是多进程和多线程,然而无论是多进程还是多线程,需要消耗额外的资源,比如资源消耗在线程同步、上下文切换等上面。为了解决这些问题,个人定义的第四代语言应运而生。他们充分利用CPU的性能实现并行、非I/O阻塞的计算,而这些特性是他们天生就有的,不需要程序员关心的。
Go、Lua、Node.js即是我认为的第四代的编程语言。
Go通过goroutine来实现多并发,尽管goroutine的底层实现是线程,但他通过封装,程序员不需要关心这些线程,而且是轻量级的。
Node.js采用了一个称为“事件循环(event loop)”的架构,举个例子吧,我们小学学过一篇华罗庚先生的《统筹方法》的课文,告诉我们要想提高效率,主要是把工序安排好。Node.js就是这样的,采用一系列“非阻塞”库来支持事件循环的方式。本质上就是为文件系统、数据库之类的资源提供接口。向文件系统发送一个请求时,无需等待硬盘(寻址并检索文件),硬盘准备好的时候非阻塞接口会通知Node.js。
Lua同样是非I/O阻塞的,它里面有个协程的东西。关于协程的概念,可以看看这篇文章http://www.douban.com/note/185796525/
从以上的分析来看,程序语言一代比一代简单易用,它为程序员封装了很多东西,程序员只需写具体的业务逻辑代码就可以了。
个人意见,欢迎探讨。