各類編程語言介紹,應用,性能等

主流編程語言優缺點

 

前言java

 

本文的目的並不是是想挑起語言之爭,而是但願經過客觀地分析每一種主流語言的能力,辨明其長短,讓程序員可以揚長避短,有效地使用各類語言。讓各類語言可以各安其位,爲你更好的服務。python

程序員應當成爲語言的主人,而不是語言的奴隸。linux

 

 

 

 

正文程序員

 

這裏,我將比較一下幾種主流編程語言:C,C++,Java,.NET,Ruby,JavaScript。web

其餘主流編程語言,如Pascal,Delphi,我不太熟悉。但願熟悉的朋友可以補全對這些語言的評價。算法

至於Basic,它的版本差別很大,並且能力不太全面,這裏也不作評價。數據庫

 

 

語言特性對比表編程

 

             C           C++        Java          .NET              Ruby        JavaScriptwindows

類型           無類型        強類型        強類型         強類型       強類型         強類型設計模式

靜態/動態        靜態     靜態   靜態檢驗類型動態解釋執行       動態        動態

支持面向過程   是               是               否                否                否               是

支持基於對象   否               是               否                是                 是              是

支持範型      否                否              是                是                 否              否

支持模板      否                是               否               否                 否              否

支持面向對象   否                是              是                是                 否              否

 

 

可能你對於我這樣的語言評價有些疑問,請首先看個人另外一篇文章基於對象和麪向對象編程範式辨析和主流編程語言中的應用  理清相關的概念。我對與面向對象和基於對象的定義和流行的定義不太同樣。

 

 

 

 

C語言優劣考

 

C語言由來

 

讓咱們先回顧一下歷史。

電腦使用CPU指令,經過寄存器,內存等物件執行計算。最先的編程,是直接使用表明CPU指令的機器碼編寫的。

直接使用二進制的數據編程,固然很容易出錯。

因而,人們後來發明了一種方法,就是使用英語單詞做爲助記符,表明各條CPU指令。

這就是彙編語言。如今,程序員可使用英語單詞進行編程,而後使用一個解釋程序,把彙編指令翻譯成機器語言,再交給計算機執行。

1970年,UNIX操做系統的研製者丹尼斯·裏奇(Dennis Ritchie)和肯·湯普遜(Ken Thompson)爲了更好地編寫操做系統,發明了C語言。

C語言比彙編語言更先進。它使用了面向過程的編程範式。同時它還是一門十分接近彙編語言,面向機器的編程語言。適合編寫操做系統和其餘直接操縱硬件硬件的編程。

 

 

面向過程編程範式

 

下面是我查到的過程式設計的定義:

過程式設計:

一、自上而下(top-down)的設計方式:是一個自頂向下,逐步求精的過程;

二、以main函數歸納出整個應用程序須要作的事情,而main函數由對一系列的子函數的調用組成;

      main中的每個子函數均可以被精煉成更小的函數。重複這個過程,便可完成一個過程式的設計;

三、特徵是以函數爲中心,以函數做爲劃分程序的基本單位,數據每每處於從屬地位。

 

過程式設計的優勢:易於掌握與理解,符合人們的思惟習慣;

過程式設計的缺點:

一、不能適應問題比較複雜,或者需求常常變化的狀況;

二、數據與操做分離開,對數據與操做的修改變得很困難;

三、程序架構的依賴關係不合理: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~!

相關文章
相關標籤/搜索