各种编程语言介绍,应用,性能等

主流编程语言优缺点

前言

本文的目的并非是想挑起语言之争,而是希望通过客观地分析每一种主流语言的能力,辨明其长短,让程序员能够扬长避短,有效地使用各种语言。让各种语言能够各安其位,为你更好的服务。

程序员应当成为语言的主人,而不是语言的奴隶。

正文

这里,我将比较一下几种主流编程语言:C,C++,Java,.NET,Ruby,JavaScript。

其他主流编程语言,如Pascal,Delphi,我不太熟悉。希望熟悉的朋友能够补全对这些语言的评价。

至于Basic,它的版本差异很大,而且能力不太全面,这里也不做评价。

语言特性对比表

             C           C++        Java          .NET              Ruby        JavaScript

类型           无类型        强类型        强类型         强类型       强类型         强类型

静态/动态        静态     静态   静态检验类型动态解释执行       动态        动态

支持面向过程   是               是               否                否                否               是

支持基于对象   否               是               否                是                 是              是

支持范型      否                否              是                是                 否              否

支持模板      否                是               否               否                 否              否

支持面向对象   否                是              是                是                 否              否

可能你对于我这样的语言评价有些疑问,请首先看我的另一篇文章基于对象和面向对象编程范式辨析和主流编程语言中的应用  理清相关的概念。我对与面向对象和基于对象的定义和流行的定义不太一样。

C语言优劣考

C语言由来

让我们先回顾一下历史。

电脑使用CPU指令,通过寄存器,内存等物件执行计算。最早的编程,是直接使用代表CPU指令的机器码编写的。

直接使用二进制的数据编程,当然很容易出错。

于是,人们后来发明了一种方法,就是使用英语单词作为助记符,代表各条CPU指令。

这就是汇编语言。现在,程序员可以使用英语单词进行编程,然后使用一个解释程序,把汇编指令翻译成机器语言,再交给计算机执行。

1970年,UNIX操作系统的研制者丹尼斯·里奇(Dennis Ritchie)和肯·汤普逊(Ken Thompson)为了更好地编写操作系统,发明了C语言。

C语言比汇编语言更先进。它使用了面向过程的编程范式。同时它仍是一门十分接近汇编语言,面向机器的编程语言。适合编写操作系统和其他直接操纵硬件硬件的编程。

面向过程编程范式

下面是我查到的过程式设计的定义:

过程式设计:

1、自上而下(top-down)的设计方式:是一个自顶向下,逐步求精的过程;

2、以main函数概括出整个应用程序需要做的事情,而main函数由对一系列的子函数的调用组成;

      main中的每一个子函数都可以被精炼成更小的函数。重复这个过程,即可完成一个过程式的设计;

3、特征是以函数为中心,以函数作为划分程序的基本单位,数据往往处于从属地位。

过程式设计的优点:易于掌握与理解,符合人们的思维习惯;

过程式设计的缺点:

1、不能适应问题比较复杂,或者需求经常变化的情况;

2、数据与操作分离开,对数据与操作的修改变得很困难;

3、程序架构的依赖关系不合理:main函数依赖于子函数,子函数又依赖于更小的子函数;

     而子函数往往是细节的实现,这些实现是经常变化的,造成的结构就是:

     程序的核心逻辑依赖于外延的细节,一个细节上的小改动,会引起一系列的变动。

我对于面向过程编程范式是这样理解的:

面向过程编程,就是使用函数代表处理的过程。这些函数使用的数据,要么是参数,要么是外部的数据。

使用函数编程,这看上去很像函数式编程。但面向过程的编程范式不同于函数式编程。函数式编程的函数,一般不使用外部的数据。不维持外部的状态。这有很多优点,但也同样有了很大的局限性,不似面向过程编程这样方便。

C语言就是典型的面向过程编程语言。它通过函数抽象了过程处理。函数,就是C语言的接口。

C语言中,数据常常作为全局的变量保存起来。这样,使用C语言编程就很难保证其他代码不破坏函数依赖的数据的状态。这是C++基于对象编程范式出现的原因。这个我们稍后再说。

我们再看看C语言对机器指令的抽象。

C语言是一门十分接近汇编语言的语言。所以有人说C语言既是一门高级语言(面向过程,函数),也是一门低级语言(面向机器,直接反映计算机的实际计算过程)。

C语言使用原生类型,数组,Struct等来表示数据。C语言中,数据在内存中的表示是十分确定的。程序员可以充分控制。如,C语言中可以使用memcpy()直接复制内存中的数据。

现在,大多数的操作系统原生函数库,都使用C语言作为其接口。绝大多数的语言都具备与C语言函数库进行互操作的能力。

    C语言可以说是程序世界的世界语。

C语言的优点

1, 面向过程开发,以函数为中心。简单有效。实现了简单的接口。

2, 面向机器,让用户可以完全的操纵机器,效率较高。

C语言运行高效,广泛应用于各种计算领域。对于简单的任务,非常有效。 

C语言的缺点

1, 函数无法有效控制需要的数据。不能保证外部状态不变。容易出现Bug。

2, 对于机器的控制太强,也就是依赖太强。由于过于强调效率,使用C语言编程时,更多的需要考虑机器,而不是问题本身。

由于过于关注机器,而不是问题域本身,因此抽象能力不足。容易出现各种Bug。对于编写大型的程序,常常力不从心。

C语言的使用方法

C语言作为一种简单高效的编程语言,适用于编写简单的程序。在编程中,应该注意扬长避短,使用面向过程的编程范式,少用对机器的依赖。

1, 使用函数编程时,应该尽量使用函数参数传递状态,少用全局数据。因为,你无法保证全局数据不被其他代码改变。

这样使用函数,叫作“纯函数”。类似于函数式编程的用法。而且,使用这种方式编程,由于不存在全局数据,在进行多线程开发时,还不需要考虑多线程问题。

2, 使用结构化的编程方式。不要卖弄技巧。

3, 函数是接口。尽量使用函数调用,而不是直接的代码。通过层层分层,分配职责,编写出短小精悍,易于维护的代码。

4, 尽管C语言是一种面向机器的语言。但是,我们还是应该尽量少地依赖机器。多从问题域来考虑和抽象问题。如,少用内存假设等等。因为,我们会使用很多种语言,C,C++,Java,C#等语言的很多语法类似。但是实际的表现,各个语言都是不同的。如果过分考虑C的机器特性,那么很可能会因为记错而编写出错误的代码。

5, 代码,首先是给人看的。顺便给机器执行!

不要处处优化代码。只应该优化性能瓶颈。因为优化的代码,常常表示很难看懂!

6, 应该大量使用Struct组织相关的数据。在用C语言编程时,也应该树立类型和对象状态的概念。把Struct作为函数的参数传递数据。

   

 C++语言优劣考

在C语言优劣考中曾经说过:C语言中,数据常常作为全局的变量保存起来。这样,使用C语言编程就很难保证其他代码不破坏函数依赖的数据的状态。这是C++基于对象编程范式出现的原因。

C++最初是作为C语言的扩展出现的,最初的名字就叫“带类的C”。后来,C++逐渐演化成一门独立的语言。但还是和C语言兼容。

基于对象的编程范式

基于对象的编程范式,又称“抽象数据类型”(ADT)。

面向过程的编程范式中,函数无法控制函数外的共享数据。这使面向过程的编程语言不能很好地编写大型系统。为了解决这个问题,人们发明了基于对象的编程范式。

就是把数据和处理数据的函数都封装在一个类中。这样,共享的数据就不会再被外部的代码改变了!

   

下面是我查到的定义:

抽象数据类型(Abstract Type简称ADT)

    ADT是指抽象数据的组织和与之相关的操作。可以看作是数据的逻辑结构及其在逻辑结构上定义的操作。

ADT的描述规范

一个ADT可描述为:

ADT ADT-Name{

    Data://数据说明

    数据元素之间逻辑关系的描述

    Operations://操作说明

     Operation1://操作1,它通常可用C或C﹢﹢的函数原型来描述

     Input:对输入数据的说明

     Preconditions:执行本操作前系统应满足的状态//可看作初始条件

     Process:对数据执行的操作

     Output:对返回数据的说明

     Postconditions:执行本操作后系统的状态//"系统"可看作某个数据结构

    Operation2://操作2

    ……

 }//ADT

抽象数据类型可以看作是描述问题的模型,它独立于具体实现。它的优点是将数据和操作封装在一起,使得用户程序只能通过在ADT里定义的某些操作来访问其中的数据,从而实现了信息隐藏。在C﹢﹢中,我们可以用类(包括模板类)的说明来表示ADT,用类的实现来实现ADT。因此,C﹢﹢中实现的类相当于是数据的存储结构及其在存储结构上实现的对数据的操作。

ADT和类的概念实际上反映了程序或软件设计的两层抽象:ADT相当于是在概念层(或称为抽象层)上描述问题,而类相当于是在实现层上描述问题。此外,C﹢﹢中的类只是一个由用户定义的普通类型,可用它来定义变量(称为对象或类的实例)。因此,在C﹢﹢中,最终是通过操作对象来解决实际问题的,所以我们可将该层次看作是应用层。例如,main程序就可看作是用户的应用程序。

C++支持多范型的开发方式:面向过程,基于对象,面向对象,模版。

C++和C语言是兼容的。因此,你完全可以使用C++编译系统编写C语言的程序,因此,支持面向过程编程是很自然的。

但是,使用面向过程编程,还能说是在使用C++编程吗?

另外,需要注意,C++语言,实际上是一种不同于C语言的新语言。在内存上,除了一些C语言的元素之外,新的语言元素并不像C那样面向机器。

对于C++,你不能使用memcpy等内存操作的函数,很可能会出现错误。因为C++语言建立在一些高级概念的规范上,这些规范并没有规定内存如何分配等机器方面的细节。

我在基于对象和面向对象编程范式辨析和主流编程语言中的应用 一文中已经指出基于对象和模板是必须组合在一起使用的技术。 

C++中首选的编程范式是“模板支持的基于对象”的编程范式。实现静态多态。

然后才是面向对象的编程范式。实现动态多态。

最后是C语言风格的面向过程编程。

 C++的使用方法

使用C/C++开发环境,我们可以同时使用C和C++开发。既然C++和C是兼容的,我认为完全没有理由使用C语言,而不使用C++进行开发。

即使是很小的问题,使用C++的“模板支持的基于对象”的编程范式也是首选的开发方式。

另一方面,在整个类库的外部,如果我们希望向其他语言提供接口,那么我们还应当提供C语言的API函数作为接口。

C语言是程序世界的世界语。

使用C++的基本类型,struct,STL库的Vector,STL的string::c_str()等都可以得到C语言兼容的接口。还不能使用异常。因为C语言不支持异常,而且C++本身的异常,在不同的编译器中也可能不兼容。

总之

1,使用C++开发,只在外部接口中使用C语言开发。使用“模板支持的基于对象”的编程范式,或者面向对象的编程范式。不要使用面向过程的编程范式。

2,尽量把代码放到类中,而不是使用全局或者命名空间的变量。

3,尽量不要使用操作符重载。

4,必须注意到C++不像C语言那样面向机器,不能对C++对象的内存布局进行假设。不能根据内存内的数据直接构建对象。不要进行内存操作。

5,C++还是很面向机器的。很多语言规则都规定了内存的布局,必须按照规则定义、初始化等等。这和Java,.NET,Ruby等语言不同。用惯高级语言的程序员特别需要注意C++和C对程序员的繁琐要求。

C/C++的设计哲学中,始终把自己作为一门系统编程语言,针对机器进行了很多优化。因此,对于人,就很不照顾了。很多规则很不人性化。但没办法,你必须适应它们!

它们就是为了高效而生的。它们就是汇编的替代者。

Java语言优劣考

Java是一门静态强类型面向对象的编程语言。它是C++和Smalltalk取长补短的产物。

Java是静态编译的强类型语言。你必须声明变量的类型,以便编译器能够检查代码的类型是否正确。这和C++是相同的。Java是一门类型非常安全的编程语言。

Java只支持一种编程范式:面向对象编程范式。对于过时的面向过程编程范式并不支持。也不支持基于对象的编程范式,也没有模板。

原因可能是,当java在90年代中期刚刚诞生时,面向过程的编程已被唾弃。而C++的基于对象的编程方式,由于没有和模板相互结合,而名声扫地。C++对于面向对象的编程范式的支持又比较差。

于是,汲取经验教训之后, Java作为一门纯正的面向对象编程语言诞生了。

Java使用面向对象的编程范式实现了动态多态,实现了抽象化的编程方式。取得了巨大的成功。

Java语言中,除了基本类型是值类型之外,没有任何值类型,你也不能创建任何值类型。这样,基于对象编程这条路就被卡死了。

虽然丧失了值类型的效率,但是也避免了基于对象编程的大量错误。

Java语言中所有方法也都是虚函数。这也是为了保证纯正的面向对象编程。

Java语言是静态面向对象编程范式的顶峰。使用面向接口的抽象编程,是有效使用java开发的唯一途径!

另一方面,Java实际上是一门动态语言。它是动态解释执行的。和Ruby,JavaScript等一样。

这使java具备了运行时的灵活性。可以实现自省,反射等C++等传统静态语言无法实现的功能。

.NET语言优劣考

.NET是java的兄弟。是微软因为被Sun排除在java之外而开发的一套语言。主要包括C#,VB.net,C++/CLI等语言。

它的设计理念基本和java相同,也是一个支持静态面向对象编程范式的平台。

对于.NET语言平台,我选择C#和C++/CLI这两种语言进行论述。VB.NET和C#类似,这里就不再多说了。

C#

C#.net还支持值类型,也就是基于对象的编程范式。(当然,.NET框架也是支持值类型的)

C#.net的泛型类型替换是在运行时执行的。对于引用类型(在堆内存中创建实例的类型),它使用类型强制转换,而不是C++模板的源代码生成来实现参数化类型。

对于值类型,则使用类似于C++模板的MSIL中间代码生成机制实现。

顺便提一下,java的泛型实现和C#的机制类似。也是使用强制类型转换实现。而且,Java中没有值类型,也不能对基本类型进行泛型操作,因此没有C#和C++中的源代码扩张问题。

但是,老实说,java的泛型机制确实太弱了!

C#语言首选的是面向对象编程范式。C#也可以使用泛型支持的基于对象的编程范式。

使用值类型,对于用惯面向对象编程范式的C#和java程序员来说有一定的难度。而且,提升的效率也并不很高。

同时,在语法层面上,C# 泛型是实现参数化类型的更简单方法,不具有 C++ 模板的复杂性。此外,C# 并不尝试提供 C++ 模板所提供的所有功能。

因此,C#泛型支持的基于对象编程要比模板支持的基于对象的编程要弱很多。

理念上,泛型编程有些不伦不类,有着太强的面向对象编程的气味。

C#中,使用泛型支持的基于对象的编程范式不如面向对象编程范式。

我认为,C#语言还是应该首先使用面向对象编程范式。

C++/CLI

C++/CLI是为了让C++使用.NET平台而提供的扩展机制。

.NET平台是类似于java的静态强类型动态执行的执行平台。是面向对象编程范式理念的框架。

C++/CLI使用了新的语法,使用C++/CLI进行.NET开发时,类似于C#编程。

同时,也可以使用模板进行C++/CLI编程。这是C++/CLI2005新增的功能。

使用C++/CLI进行.NET编程时,既可以使用C#样式的面向对象编程。也可以使用模板支持的基于对象的编程范式进行开发。

可以把模板支持的基于对象的编程范式和.NET的面向对象的编程范式结合起来使用。

C++/CLI可以同时使用原生C++和.NET编程。如果使用.NET框架执行,那么C++原生代码就会存放在生成的MSIL中间代码中,在运行时再使用C++编译器编译成机器码。

.NET的互操作机制

.NET运行时本身就是使用COM编写的,是一个COM服务器。因此,.NET和COM互操作是非常简单的。也可以使用COM技术,用C/C++直接调用.NET内的方法。

在互操作上。.NET比java实现得更好。不能从C语言调用Java方法,只能从java代码中使用JNI调用C方法。

总体评价

.NET是java的表兄弟。又做出了一下改变。

1,定义了.NET的汇编语言。基于.NET的汇编语言可以支持任何语言在.NET平台上执行。Java自然也可以作为一个平台。但是java平台的设计目标就是java这一种语言,因此没有定义汇编语言,只有java的机器码。

2,支持值类型。虽然用处不大,但是可以提高性能,也方便与C语言的函数库交互。

3,泛型的实现比java强大。

4,特别是C++/CLI,具有模板*.NET运行库的强大能力。

Ruby语言优劣考

Ruby是一种强类型的动态解释型语言。在Ruby中一切都是对象。

使用Duck Typing“像鸭子一样编程”的编程理念。Ruby有类型,但是变量不确定类型。这也实现了动态的多态能力。

不象Java,.NET等静态面向对象编程语言,不需要使用什么都不作,仅仅表示类型的规范的接口。Ruby中使用变量时不需要声明使用什么接口或者类型。

任何类型都可以,只要确实有这样的方法或者数据成员存在即可!

类似于C++的模板编程,只是C++的模板需要指定参数的类型。Ruby不需要指定变量的类型,因此不需要模板那样的机制。

Ruby这样不指定变量类型的语言使用起来非常灵活。

按照动态语言的观点,既然编译时不能完全找出运行时的错误,不如不要编译时检查,也不要编译。使用单元测试来寻找错误。

但是,C++,Java,.NET这样的编译时检查类型的语言也有自己的优点:

1,更加安全,编译时就会发现错误。

2,可以实现IDE的智能提示。而Ruby这样的语言就不可以。因为C++,Java的变量使用时都指定了类型,因此可以在IDE中智能提示可能的成员。

    而Ruby这样的动态语言的变量都没有指定类型,所以无法为你提供智能提示。

    使用Ruby,应该使用“动态类型语言”的基于对象的编程范式,使用隐式的接口。使用的类不需要有一个共同的基类。让各个实现类互相独立存在就行了。记住,这是和C++的模板支持下的基于对象的编程范式类似的基于对象(ADT抽象数据类型)的编程!

    不要试图用java,C#这样的语言的面向对象的编程思维方式来编写Ruby程序!

JavaScript语言优劣考

JavaScript是一门长期以来被忽视的语言。它的重要性和能力都被大大的低估了!

这是因为Java和.NET崛起以来,“静态类型语言”的面向对象的编程范式受到广泛的推崇。作为动态语言,函数式语言的JavaScript长期以来被广大Java,.NET程序员视为畸形怪胎!老实说,长久以来,我也一直是以厌恶的眼光看待它。多少次,它让我很抓狂。

直到现在,我还是没有学好JavaScript。尽管JavaScript已经诞生了这么多年,但是把JavaScript作为一门很有前途的动态强类型语言,函数式语言来看待还是新鲜事物。还没有见到很多关于这方面和设计模式的研究。

周爱民的《JAVASCRIPT语言精髓与编程实践》一书应该不错,但是我还没有看过。

JavaScript支持面向过程的编程范式

这是JavaScript使用最广泛的一种编程范式。简单、快速、有效。JavaScript代码需要通过网络传输到用户浏览器中,因此JavaScript的使用一般都是简单的几个数据提交和验证功能。如果使用Ruby那样的动态基于对象的编程范式编码显得有些小题大做,又浪费带宽。

JavaScript支持“动态类型语言”的基于对象的编程范式

如果JavaScript仅仅支持过时的面向过程的编程范式,那么JavaScript就真的是大家心目中的鸡肋了。

这些年来,广大程序员都忽视了JavaScript也是一门动态类型语言,还是一门函数语言!

我们完全可以向Ruby那样进行基于对象的开发。

现在,伴随着广大用户对户客户端的效果和AJAX技术的期待。JavaScript正在完成越来越大的任务。正在开发和传统语言类库类似的庞大类库。

如,EXT实现的用户界面库。和Java的Swing库很接近。这样巨大的系统,必须要使用基于对象的编程范式,再使用面向过程的编程范式不可想象!

把JavaScript当成Ruby来使用,这是我对你的忠告。

[题外话:

不过也许我的JavaScript技术永远不会很高。因为虽然我越来越欣赏JavaScript语言的机制。但是,我对用户界面的开发并不是很有兴趣。我认为用户界面是小道。底层的逻辑开发才更有价值,我也更加有兴趣。

]

总结

    现在再来看看篇首的“语言特性对比表”,也许你能够认同我对这些语言的观点了。

如果我需要进行原生系统开发,我会选择使用C++,使用模板支持的基于对象的编程范式进行编码。

如果需要给其它语言提供接口,我会用纯C语言实现一些接口函数,供其它语言调用。

如果需要Java语言进行开发,肯定要使用面向对象编程。需要大量使用接口,依赖于抽象。

如果需要使用.NET开发。那么我也会使用面向对象编程范式编码。很少使用值类型。

如果使用C++/CLI开发,我会使用模板开发原生C++程序,也会首选模板开发.NET程序。也可以像C#那样使用面向对象编程范式开发.NET程序。

我真的爱死模板了!这么多年来我还一直认为模板是个废柴呢!

如果要编写脚本,我会使用Ruby,“动态类型语言”的基于对象的编程范式。

Java和.NET平台上都在引入Ruby,Python等动态语言,也许很快就可以用它们开发Java和.NET程序了!

在浏览器上开发,当然得用JavaScript[很久以前,我使用VBScript这门语言—上了微软的当了。那时以为凡是微软的就是好的!]。

简单的需求,当然用面向过程范式开发。

大的项目,比如AJAX,地图,GUI等,使用“动态类型语言”的基于对象的编程范式开发。

PROLOG

人工智能领域常用的语言,开发自然语言分析,专家系统,以及所有和智能有关的程序,都非常拿手。

Visual Prolog

顾名思义,这是一个可以制作界面的Prolog,有试用版本下载,大概20M左右。这个prolog版本需要对谓词以及数据进行声明,就像C语言一样。因此在使用的时候比较复杂,不过更加适合编制较大的程序。编译出来的程序可以直接运行。

Amzi! Prolog

这个prolog版本包含解释器、编译器,不过编译出来的程序不能够直接运行,需要运行器运行。可以很方便的和其它语言(例如visual basic,java,C,CGI)连接,开发智能程序。解释器的运行效率较低。它所说使用的语法体系和visual prolog不同,程序需要进行适当的修改才能够在visual prolog中运行。

SWI Prolog

我没有怎么使用过这个版本的prolog解释器,不过它的运行速度要比amzi prolog的解释器快,和amzi的编译之后的程序差不多快,如果下载图形软件包XPCE的话,还可以开发有界面的程序。它的语法和amzi prolog相同,程序可以通用,不过内部谓词有些不同,有时候需要修改一下。 

Turbo Prolog

如果需要可以给我发邮件 Dos版本的prolog,有开发界面,可以编译成可执行文件,语法和visual-prolog相同,不过内部谓词有许多出入。  

B Prolog

好像是中国人开发的prolog软件,据说比其它的prolog运算速度都要快,我曾经在linux下面使用过这个prolog,也有window版的,不过没有什么集成开发环境。语法和其它的几个都不太相同,需要适当的修改程序才能够在此环境下运行。此prolog提供了许多测试速度的解谜题的程序,这个版本的prolog支持constraint程序设计。

Strawberry Prolog

1兆的容量,包括完整的开发界面,帮助,例程,提供了几个棋类游戏的源程序。可以直接开发有界面的prolog程序,共享版不能够编译,就解释执行吧。

Sicstus Prolog

Sicstus Prolog无疑是Prolog版本中最出色的,虽然它并不是免费软件,但是可以下载到有时间限制的试用版本,而且只要修改时间也可以无限期的使用下去(过期之后修改时间也不会有问题)。它语法与amzi prolog类似,都属于ISO标准,内部胃词丰富,提供了丰富的库,例如集合、图、带权图等等。支持unix和windows等各种操作系统平台。支持constraint程序设计。

LISP

人工智能语言的老大哥。语言格式只有一个形式:列表,所以也叫做表处理语言,这可不是一般的表,是可以包容任意结构的表,有了它,你还用c语言来写链表,二叉树的程序么?学习数据结构不妨使用lisp,让你更加关心算法,而不是数据如何在计算机内部表达。

XEmacs

http://web.archive.org/web/20030205031354/http://www.xemacs.org/ 与著名的guns emacs编辑器的起名,并且界面更加友善,内带emacs lisp, 和许多使用lisp编写的工具软件,例如calc, 是一个功能强大的计算器,支持符号运算,有全部的源程序,如果能够好好研究这些源程序,收获一定不小。

Allegro CL

common lisp http://web.archive.org/web/20030205031354/http://www.franz.com/ windows下的common lisp集成开发环境, 60天试用。

Lisp Work

common lisp http://www.xanalys.com/ 无限期使用,没有任何功能限制


SCHEME

这是lisp的一种方言,比lisp更加标准化。

MIT Scheme

http://web.archive.org/web/20030205031354/http://mitpress.mit.edu/sicp/ 这里有一本非常好的介绍编程技术的书,使用的语言是lisp/scheme。在这里还可以下载到Scheme的解释器,基本上是模仿emacs作的。

DrScheme

http://web.archive.org/web/20030205031354/http://www.drscheme.org/ DrScheme是一个Scheme语言的交互式的集成开发环境。非常适合于教学使用。支持多种语言级别(初级、中级、高级等等),有丰富的界面库,支持TCP/IP。内带详细的帮助和教程。


FUNCTION LANGUAGE

这是一类语言,叫做函数型程序设计语言。是一种非常高级的语言。一种基于λ演算和在70年代后期才发展起来的新语言类型。大多数程序设计语言明显地规定要执行操作的次序。次序的详细规定是很需要的,因为语言的语句对程序的变量有“作用”,如果改变这些作用的次序,就可以改变产生的最后值。但是函数型语言却没有这种性质。在这个意义上,函数型语言能建立可计算性的数学公式模型。让我们来看一个简单的例子: qsort :: [a] -> [a] | Ord a qsort [] = [] qsort [a:xs] = qsort [x \ x<-xs | x<a] ++ [a] ++ qsort [x \ x<-xs | x>=a]

这段程序就是快速排序的代码,你看有多么简洁,并且它的这个qsort可以对任何类型的数据进行排序(只要这种数据可以比较大小)。想读懂上面的程序么?那么下载下面的clean, 或者haskell,好好研究吧,祝你有新的发现。

Clean

http://web.archive.org/web/20030205031354/http://www.cs.kun.nl/~clean/ 并行的函数型语言,可以把源程序编译成exe文件,带有丰富的库,从tcp/ip, 到界面设计,到游戏开发,无一不全。

Haskell

http://web.archive.org/web/20030205031354/http://www.haskell.org/hugs/ hugs是haskell的免费编译器,语法和clean相似,不过是解释执行,因此易于学习。

OCaml

http://web.archive.org/web/20030205031354/http://www.ocaml.org/ 又一个函数型语言,速度很快,编译出来的程序速度和用C做出来的差不多快。

Mozart OZ

http://web.archive.org/web/20030205031354/http://www.mozart-oz.org/ mozart oz 是具有魔力的语言。它融合了目前几种流行的程序设计思想,我们叫它多范式语言。它是面向对象的语言,它是函数型的语言,它是约束逻辑(constraint)的语言,它是并发式的语言,它还是分布式的语言,几句话很难概括它的功能。最好去它的网站看看吧,下载一个慢慢研究? 他使用emacs作为开发界面,因此如果你想在windows下使用本语言,首先需要安装emacs for windows(也可以在mozart的网上找到,也可以去www.gnus.org去找,也可以安装xemacs), 如果你安装了emacs 那么你也就同时获得了emacs lisp, 呵呵,收获不小。 为了提起您的兴趣,请思考如下的问题如何编程解决,然后你可以在mozart中找到惊人简单的解决方案。 15个人每天出去玩,每天分为5组,每组3人,玩一个星期,使得任何两个人都曾经在一组中玩过,你如何安排?


J software

http://web.archive.org/web/20030205031354/http://www.jsoftware.com/ 不要和java搞混淆了。J是一种面向阵列的语言,也就是说矢量,矩阵,以及高次数组都是它的最基本的数据类型,J中引入了大批量的运算符,以及独特的算式分析方法,大幅度的扩展了数学算式的表达能力。 例如如果你要算从1加到100, 用c怎么做? J的程序是:+/i.100 对,就这么短,一个表达式解决了问题,事实上,使用表达式编写出来的程序异常简洁,虽然初看上去很难读懂,一旦掌握了J语言,你就会发现,原来你可以用只有c语言1/20的字符表达同样的功能。


FORTH

http://web.archive.org/web/20030205031354/http://cdtzx.51.net/pimage/www.jsoftware.com forth是一种可扩展的,交互式的语言。最初为小型的嵌入式电脑设计的,现在它几乎可以在任何主流的芯片上运行。 在电子表格,专家系统, 多用户数据库,和分布式实时控制系统中有广泛的应用。 表面来看,forth是一种基于堆栈的概念机。例如如果要计算 (3+4)*5 ,我们的程序就是:3 4 + 5 * . 首先把3和4入堆栈,然后调用+子程序,+把堆栈的最顶上两个元素取出(也就是3和4)进行加法运算,然后把结果入堆栈,然后把5入堆栈,然后调用*子程序,把最顶的2个元素,也就是7和5取出,并进行乘法运算,然后把结果入堆栈,最后的.把结果从堆栈中取出。 事实上这是一种简单有效的概念机。当然forth远远不止这些,它有什么样的功能,就由你去发掘了。


LOGO

被称为最佳的启蒙语言,事实上它的功能远远不止启蒙这么简单。一切别的语言能够完成的它也能够完成,只是更加简洁一些,通常logo是使用lisp编写的,我们就可以想象它的高度灵活性了。

MSW Logo

http://web.archive.org/web/20030205031354/http://www.softronix.com/ 这个网站还有个逻辑数字电路模拟的软件,很有意思,再也不用为什么触发器 门电路之类的发愁了。

Star Logo

http://web.archive.org/web/20030205031354/http://www.media.mit.edu/starlogo starlogo的网站如是说: StarLogo是一个可以编程的建模环境,用来研究分散系统的运行机制。所谓分散系统是指:没有组织者而组织,没有协调者而协调的系统。使用StarLogo你可以对许多现实世界中的现象进行建模并且观察研究,例如鸟群、交通、蚂蚁以及市场经济。 StarLogo是一种特殊的Logo语言,和传统的Logo语言一样,你可以通过向海龟发命令来作图。除此之外,Starlogo容许你并行的控制上千个海龟,并且为这些海龟设定不同的行为模式。StarLogo非常适合于研究人工生命。


PYTHON

http://web.archive.org/web/20030205031354/http://www.python.org/ python是一种解释型、交互式、面向对象的语言,我们经常拿它来和Tcl Perl Scheme Java来比较。它有非常清晰的语法,有模块,有类,异常处理,高级的动态数据结构。它比perl更加易学,功能更加强大。python采用动态数据结构,也就是说变量没有数据类型,这一点和Lisp十分相似,在python中所有事物都是对象(object),字符串、函数以至于类和模块。这种面向对象的概念和smalltalk很相似。并且自带了丰产丰富的模块库。对于初学者,python很适合于学习编程思想,而不会让读者为了繁杂的语法而头痛。对于高级用户,python是最出色的脚本语言,它可以很容易的内嵌某个软件中,作为那个软件的扩充,例如著名的3D设计软件blender就可以使用内嵌的python脚本语言来设计复杂动画。


SMALLTALK

可是面向对象的程序设计语言的鼻祖阿,并且正在蓬勃的发展,没有过时。它是纯面向对象的语言,就连整数也是对象。开放环境也非常集成,如果感兴趣可以到一下网站下载,绝对有耳目一新的感觉。举个例子,循环语句在smalltalk中是向一个整数对象发送消息:10 timesRepeat: [ teresa moveRight: 10 ].其中timesRepeat:为消息名称,10为接受消息的整数对象,[ teresa moveRight: 10 ].是消息的参数,这又是smalltalk强大的地方,它可以把一段程序作为参数传递给某个对象!!!

Squeak Smalltalk

http://web.archive.org/web/20030205031354/http://www.squeak.org/ 这是一个非常有趣的smalltalk版本,看上去就像在你的电脑上模拟了另外一套完成的窗口系统,这里面的窗口更加利害,你甚至可以旋转它,不看不知道,看了才发现还有这么奇妙的语言,这么奇妙的开发环境。10M左右

Cincom Smalltalk

http://web.archive.org/web/20030205031354/http://www.cincom.com/scripts/smalltalk.dll/home.ssp 这个版本比较实用,有详细的帮助,可以开发真正的windows程序。30M左右

Dolphin Smalltalk

http://web.archive.org/web/20030205031354/http://www.object-arts.com/ 这里提供的免费smalltalk版本只有3M不到,如果你想先尝试一下这种语言的话,可以下载这个。


PROGRAPH

http://web.archive.org/web/20030205031354/http://192.219.29.95/ Prograph可能是全球唯一的纯可视化语言。在这里程序用图表表示,编程序就是绘制图表。我没有看出这么做的优势在那里,不过对于初学编程的人的确有很大帮助,而且尝试新东西总是好的,也许这也是一个发展方向吧。 到上面的网站可以下载一个免费版本,可以解释运行,但是不能够编译。大小约为27M。


ICON

这个语言和图标没有什么关系,不要误解了。这是一种很神奇的语言,虽然目前已经有几年没有更新版本了,不过我觉得它的许多思想都是很先进的。 http://web.archive.org/web/20030205031354/http://www.cs.arizona.edu/icon/ 在语法形式上与c,pascal很相似,但是功能却更加强大,以下是它的一些特点: Icon的表达式可以产生一系列的值,而不是一个值。 面向目标的求值方式,可以自动的搜索正确的解答(这一点和prolog很像) 强大的字符串处理功能 当然,至于链表、集合、甚至词典(dictionary,也可以叫做hash表)都是它的基本数据类型。内存也是自动管理的,无需担心内存泄漏或者溢出等琐碎的问题。 他特别适合于文本分析、文本编辑、数据格式化、人工智能、专家系统、符号运算的方面的编程。 下面给几个简单的例子: every f(i to j) ---Icon for(k=i;k<=j;k++) f(k); ---C every write(find("or",sentence)) ---输出sentence中所有子字符串or的位置


BASIC

Basic版本到网络上一搜索一大堆,这里介绍的是一种最适合于编游戏的Basic。 http://web.archive.org/web/20030205031354/http://www.blitzbasic.com/ 有demo下载,2D,3D的都有,不能够编译成exe,但是可以解释执行,3D版本限制使用次数,如果需要破解,可给我发邮件。 这个basic专门针对游戏开发而设计,想快速开发游戏的懒人们赶快去下载一个吧。:) 2D的主要功能有: 高速绘制块、图像、圆、线条等图形图像 支持流行的图像格式:bmp,jpg,png 双缓冲绘制流畅的动画 碰撞检测,精确到点 游戏可以在windows中运行,也可以全屏运行 高速!


C & C++

不多说了a~!

原文地址:https://www.cnblogs.com/little-white/p/3471676.html