編程語言亂燉

TITLE: 編程語言亂燉

碼農最大的煩惱——編程語言太多。不是我不學習,這世界變化快!

有時候還是蠻懷念十幾、二十年前的軟件開發環境,好像你只要會C或C++就可以了。但時光早已不同,尤其是近年的語言趨勢更是呈現出許多新特性。這些新特性的流行,得益于2000年代的動態語言,比如PHP、Python、Ruby。而這些語言的日益流行,又得益于互聯網應用的興起。PHP在網站構建方面占據大半壁江山,Python因應互聯網數據量的噴發在科學計算領域得以重用,而RoR成就了多少初創公司的創業榮光。當年被人不看好的小腳本,卻在互聯網時代找到了大展身手的好時機。現在你不會一門動態語言都不好意思說自己是程序員了。

還必須提一下JavaScript,當年幾乎人人不待見的丑小鴨,誰能想到今天的地位如此突出呢?甚至還延伸出了Node.js這樣一個優質平臺。一時間多少JavaScript開發者希望借助它實現心中的“全棧”夢想。同樣,沒有互聯網,也就不會有JavaScript的大行其道。我認為,JavaScript在當代的價值,不會輸給十幾年前的Java。

動態語言的流行,也讓許多組織和個人認識到了其存在的價值——那就是開發效率大大提升。以前編程需要為1M、甚至幾百K的內存絞盡腦汁,運用各種Hack技巧。但遵從摩爾定律,硬件的發展速度非常快,于是,開發者逐漸將眼光轉到了開發效率上。動態語言中廣泛應用的filter、map和reduce等具有濃郁函數式風格的高階函數,被認為是提升開發效率的有效手段。當然,蘋果的Swift,同樣也大量應用了這些特性。

就目前編程語法發展過程的幾個關注點,我的理解如下:

不止是面向對象,函數式的回歸正在進行時。過去十幾年時間里,Java和C#兩種語言占據主流,面向對象編程被賦予至高無上地位。但現在大家越來越認識到,面向對象編程達到一定規模時,復雜度也伴之而來。因此,舊有的函數式風格又重出江湖,特別是一些函數式特性在動態語言中得到了良好驗證。現在,開發者對待面向對象與函數式兩種風格,已經不是非此即彼的印象了,而是認識到它們是可以相輔相成的,比如Scala。即使是Java,也開始引入一些函數式特性,更不用說先行一步的C#。再進一步,拋開風格之爭,遵從應用為先,從而采取實用的編程模式,比如Golang、Rust。
并發特性的增強。多核及大數據時代的來臨,現實對并發特性提出了新需求。新出現的系統級語言如Scala、Clojure、Erlang、Go及剛正式發布的Rust,都對并發特性給予極大關注,并各有各的解決方案。即使是動態語言如PHP、Python和Ruby等,也在這方面不斷嘗試。同樣的,函數式語言中的不可變性概念,能夠較好地符合并發實現的現實需求。

蘋果公司2014年開發者大會上推出的Swift語言,一經推出,便引起轟動。這是編譯器大師,LLVM的作者Chris Lanttner主持開發的,而且集眾多現代高級語言之長,更由蘋果公司大力扶持,可謂系出名門。因此一經推出,便在編程語言排行榜上躥紅。

SWIFT惹人喜愛的特性包括:

  • 簡潔明快的語法(連句尾的“;”都去掉了),像腳本語言生動而富于表現力;
  • 一個面向對象的C,且不受C語言兼容性的限制;
  • 可直接調用蘋果系統的Coca和Coca Touch框架,也就是說,可以直接編寫桌面(Mac)和移動端(IOS)
    程序;
  • 在Xcode內自帶REPL環境,可以實時查看運行結果;
  • 基于LLVM編譯器,具有工業級性能;
  • 擁有完整的面向對象、函數式編程、閉包、泛型等強大功能;
  • 是一個類型安全的語言;
  • 編譯器強大而友好,最大可能消滅bug;
    ……

這簡直是我追求的完美的實用語言。2015年底,Swifi他開源,還有什么理由不選它呢?當然,它還年輕,還面臨眾多成熟語言的強大挑戰。

再看JavaScript。話說ES6(EMCA Script version 6)在2015年發布了。經過持續幾年的磨礪,它已成為JS有史以來最實質的升級,新的語言和庫特性就像無主之寶,等待有識之士的發掘。新的語言特性涵蓋范圍甚廣,小到受歡迎的語法糖,例如箭頭函數(arrow functions)和簡單的字符串插值(string interpolation),大到燒腦的新概念,例如代理(proxies)和生成器(generators)。本來有了node.js的javascript已如虎添翼,現在ES6的到來使其更加強大。看來,將來的江湖,必將是Swifit與EMCAscript(Javascript)的對決!

好啦,我們將從各個角度審視一下各種編程語言,看看到底選擇哪個好。

從匯編到高級語言

計算機不能理解人類語言,只能理解為它們專門開發的程序語言。機器語言是機器指令的集合。機器指令展開來講就是一臺機器可以正確執行的命令。電子計算機的機器指令是一列二進制數字。計算機將之轉變為一列高低電平,以使計算機的電子器件受到驅動,進行運算。最初的機器語言就是打孔紙帶,后來是二進制源碼。但這些都非常難以編寫和閱讀,于是人們發明了匯編語言,這是面向寄存器操作的助記符組成的語言。今天主要是x86匯編和arm的匯編兩類,與芯片類型相關。在匯編語言中,用助記符(Mnemonics)代替機器指令的操作碼,用地址符號(Symbol)或標號(Label)代替指令或操作數的地址。

操作:寄存器BX的內容送到AX中
1000100111011000              //機器指令
mov ax,bx                    //匯編指令

此后,程序員們就用匯編指令編寫源程序。可是,計算機能讀懂的只有機器指令,那么如何讓計算機執行程序員用匯編指令編寫的程序呢?這時,就需要有一個能夠將匯編指令轉換成機器指令的翻譯程序,這樣的程序我們稱其為編譯器。程序員用匯編語言寫出源程序,再用匯編編譯器將其編譯為機器碼,由計算機最終執行。在不同的設備中,匯編語言對應著不同的機器語言指令集,通過匯編過程轉換成機器
指令。普遍地說,特定的匯編語言和特定的機器語言指令集是一一對應的,不同平臺之間不可直接移植。匯編語言是直接面向處理器(Processor)的程序設計語言。處理器是在指令的控制下工作的,處理器可以 識別的每一條指令稱為機器指令。每一種處理器都有自己可以識別的一整套指令,稱為指令集。處理器執行指令時,根據不同的指令采取不同的動作,完成不同的功能,既可以改變自己內部的工作狀
態,也能控制其它外圍電路的工作狀態。匯編語言的另一個特點就是它所操作的對象不是具體的數據,而 是寄存器或者存儲器,也就是說它是直接和寄存器和存儲器打交道,這也是為什么匯編語言的執行速度要比其它語言快,但同時這也使編程更加復雜,因為既然數據是存放在寄存器或存儲器中,那么必然就存在著尋址方式,也就是用什么方法找到所需要的數據。例如上面的例子,我們就不能像高級語言
一樣直接使用數據,而是先要從相應的寄存器AX、BX 中把數據取出。這也就增加了編程的復雜性,因為在高級語言中尋址這部分工作是由編譯系統來完成的,而在匯編語言中是由程序員自己來完成的,這無異增加了編程的復雜程度和程序的可讀性。
但匯編語言的操作太“基本”,還是不利于編寫應用程序,于是人們發明了高級語言。高級語言是面向要處理的“對象”,如數字、字符串和組合對象的語言,這些對象都要存放在內存里,因此 也向面向內存操作的語言。高級語言需要編譯器或解釋器來“翻譯”成機器語才能被計算機所理解和執行。因此,一門高級語言的性能取決于其編譯器或解釋器。如果你能搞出一個編譯器,就等于搞出一套高級語言。

程序設計語言的類型:

命令式語言。這種語言的語義基礎是模擬“數據存儲/數據操作”的圖靈機可計算模型,十分符合現代計算機體系結構的自然實現方式。其中產生操作的主要途徑是依賴語句或命令產生的副作用。現代流行的大多數語言都是這一類型,比如 Fortran、Pascal、Cobol、C、C++、Basic、Ada、Java、C# 等,各種腳本語言也被看作是此種類型。

函數式語言。這種語言的語義基礎是基于數學函數概念的值映射的λ算子可計算模型。這種語言非常適合于進行人工智能等工作的計算。典型的函數式語言如 Lisp、Haskell、ML、Scheme 、F#等。

邏輯式語言。這種語言的語義基礎是基于一組已知規則的形式邏輯系統。這種語言主要用在專家系統的實現中。最著名的邏輯式語言是 Prolog。

面向對象語言。現代語言中的大多數都提供面向對象的支持,但有些語言是直接建立在面向對象基本模型上的,語言的語法形式的語義就是基本對象操作。主要的純面向對象語言是 Smalltalk。現代融合了命令式和面向對象能力的語言主要是c++和java。這也是兩門主要的工業級程序設計語言。

雖然各種語言屬于不同的類型,但它們各自都不同程度地對其他類型的運算模式有所支持。

C

C語言是最具有代表性的高級語言,C系語言家族的鼻祖。C語言是典型的命令式語言和編譯型語言,也是學習任何高級語言的基礎,號稱程序語言的“普通話”,常年居于編程語言排行榜榜首。C語言非常接近系統底層,具有操作系統接口(特別是unix系統)和匯編接口,是編寫操作系統的語言,也被稱為“系統編程語言”。正因為接近系統底層,所以c語言執行效率非常高。C語言具有最廣大的硬件支持,可以運行在任何cpu和嵌入式SoC上,也具有最廣大的軟件支持,幾乎各種操作系統/數據庫/編譯器/圖形庫等都可以調用C語言或用C語言擴展。從這個意義上講,C語言是最“跨平臺”的語言。只要那種架構的處理器具有對應的C語言編譯器和庫,然后將C源代碼編譯、連接成目標二進制文件之后即可運行。

標準:ANSI C (美國國家標準委員會,1989);C11 (ISO/IEC9899: 2011)

?????C語言提供了很多數據類型,其基本類型包括字符、具有多種長度的整型和浮點數等。另外,還有通過指針、數組、結構和聯合派生的各種數據類型。表達式由運算符河操作數組成。任何一個表達式,包括賦值表達式或函數調用表達式,都可以是一個語句。C語言為實現結構良好的程序提供了基本的控制流結構:語句組、條件判斷(if-else)、多路選擇(switch)、循環(while,for)等。函數可以返回基本類型、結構、聯合或指針類型的值。任何函數都可以遞歸調用(但C不是函數式語言)。編譯的預處理階段將對程序文本進行宏替換,包含其他源文件以及進行條件編譯。

C語言的弱點:“沒有銀彈”。C語言當然也存在一些自身無法解決的問題。C語言的缺點主要表現在數據的封裝性上,這一點使得C在數據的安全性上有很大缺陷;C語言的語法限制不太嚴格,對變量的類型約束不嚴格,影響程序的安全性,對數組下標越界不作檢查等。從應用的角度,C語言比其他高級語言較難掌握;此外,作為C語言的一大特色,指針可以說是C語言優于其它高級語言的一個重要原因。就是因為它有指針,可以直接進行靠近硬件的操作,但是C的指針操作也給它帶來了很多不安全的因素。基本功能簡單,不提供直接處理諸如字符串、集合、列表或數組等復合對象的操作,沒有定義任何存儲器分配工具,也不提供堆和無用內存回收工具,也沒有多道程序設計、并行操作、同步和協同例程。這些“高級”功能都需要調用函數來完成(當然C語言有強大的函數庫)。C語言采用結構化編程方法,遵從自頂向下的原則。在操作系統和系統使用程序以及需要對硬件進行操作的場合,用C語言明顯優于其它高級語言,但在編寫大型程序時,由于C語言不是面向對象的,顯得力不從心。C語言的指針提供了對內存地址進行操作的能力,這既是強大的工具也對初學者構成了難點。另外,C程序的源代碼分散在各種頭文件和源文件中,變量可以只在函數內部有效,也可以在函數外部但僅在一個源文件中有效,還可以在整個程序中都有效。這對源程序的管理提出了挑戰。C的類型化和強編譯要求,既是減少錯誤的保證,使它不夠靈活。

C語言目前廣泛應用在系統編程(如操作系統擴展、底層庫、驅動程序等)、嵌入式編程(特別是為各種智能硬件)和語言教學領域。

編譯器

GCC,GNU組織開發的開源免費的編譯器
MinGW,Windows操作系統下的GCC
Clang,開源的BSD協議的基于LLVM的編譯器
Visual C++ :: cl.exe,Microsoft VC++自帶的編譯器

集成開發環境(IDE)

CodeBlocks,開源免費的C/C++ IDE
CodeLite,開源、跨平臺的C/C++集成開發環境
Orwell Dev-C++,可移植的C/C++IDE
C-Free
Light Table
Visual Stdio系列

Hello World

下面是一個在標準輸出設備 (stdout) 上,印出 "Hello, world!" 字符串的簡單程序。類似的程序,通常作為初學編程語言時的第一個程序:

#include <stdio.h>

int main(void)
{
    printf("Hello, world!");
    return 0;
}

C++

對于開發人員,他們一直被軟件開發的效率問題困擾,軟件如何得到更好更高效的維護?如何讓已有資源的得到更好的復用?答案是面向對象。面向對象程序設計在某種程度上通過強調可重復性解決了這一問題。向對象程序設計可以被視作一種在程序中包含各種獨立而又互相調用的單位和對象的思想,這與傳統的思想剛好相反:傳統的程序設計主張將程序看作一系列函數的集合,或者直接就是一系列對電腦下達的指令。面向對象程序設計中的每一個對象都應該能夠接受數據、處理數據并將數據傳達給其它對象,因此它們都可以被看作一個小型的“機器”,或者說是負有責任的角色。

為了彌補C語言在開發大型項目上的不足,1983年,貝爾實驗室的Bjarne Stroustrup在C語言基礎上推出了C++。 C++進一步擴充和完善了C語言,是一種面向對象的程序設計語言。

C語言是C++的基礎,C++和C語言在很多方面是兼容的。
C語言是一個結構化語言,它的重點在于算法與數據結構。C程序的設計首要考慮的是如何通過一個過程,對輸入(或環境條件)進行運算處理得到輸出(或實現過程(事物)控制)。C++,首要考慮的是如何構造一個對象模型,讓這個模型能夠契合與之對應的問題域,這樣就可以通過獲取對象的狀態信息得到輸出或實現過程(事物)控制。所以C語言和C++的最大區別在于它們解決問題的思想方法不一樣。
C++對C的“增強”,表現在六個方面:
(1) 類型檢查更為嚴格。
(2) 增加了面向對象的機制。
(3) 增加了泛型編程的機制(Template)。
(4) 增加了異常處理。
(5) 增加了運算符重載。
(6) 增加了標準模板庫(STL)。

C++又被稱為“帶類的C”(“C with Class”),研制者在C語言的基礎上加進去的特征主要有:類及派生類、共有和私有成員的區分、類的構造函數和析構函數、友元、內聯函數、賦值運算符的重載等。1985年公布的C++語言1.0版的內容中又添加了一些重要特征:虛函數的概念、函數和運算符的重載、引用、常量(constant)等。1989年推出的2.0版形成了更加完善的支持面向對象程序設計的C++語言,新增加的內容包括:類的保護成員、多重繼承、對象的初始化與賦值的遞歸機制、抽象類、靜態成員函數、const成員函數等。
1993年的C++語言3.0版本是C++語言的進一步完善,其中最重要的新特征是模板(template),此外解決了多重繼承產生的二義性問題和相應的構造函數與析構函數的處理等。

最新標準: C++ 11 《ISO/IEC 14882:2011》

C++語言最有意義的方面是支持面向對象的特征。雖然與C的兼容使得C++具有雙重特點,但他在概念上完全與C不同,更具面向對象的特征。
出于保證語言的簡潔和運行高效等方面的考慮,C++的很多特性都是以庫(如STL)或其他的形式提供的,而沒有直接添加到語言本身里。關于此類話題,Bjarne Stroustrup的《C++語言的設計和演化》(1994)里做了詳盡的陳述。
C++引入了面向對象的概念,使得開發人機交互類型的應用程序更為簡單、快捷。很多優秀的程序框架包括Boost、Qt、MFC、OWL、wxWidgets、WTL就是使用的C++。

缺點

C++由于語言本身復雜。C++的編譯系統受到C++的復雜性的影響,非常難于編寫,即使能夠使用的編譯器如果存在問題,可能難于被發現。
由于本身的復雜性,復雜的C++程序的正確性相當難于保證。
C++對于安全性也無法保證,所以,很容易依靠C++編譯出病毒來。

應用領域

其編程領域眾廣,常用于系統開、大型項目、引擎開發等應用領域,是至今為止最受廣大程序員受用的最強大編程語言之一

集成開發環境(IDE)
Microsoft Visual Studio(Visual C++)
當前流行的編譯器只有五種:Intel C++ 編譯器、微軟的cl.exe編譯器(捆綁于Visual Studio套裝中)、GNU的GCC編譯器(在Linux系統中叫G++)、LLVM的Clang編譯器(Xcode中包含)、Borland公司的bcc.exe編譯器(捆綁于Borland C++ Builder套裝中)。

Hello World

#inlcude <iostream>
int main()
{
    using namespace std;
    cout << "Hello World." << endl;
    return 0;
}

'C#'--微軟的C++

C#是微軟公司發布的一種面向對象的、運行于.NET Framework之上的高級程序設計語言。并定于在微軟職業開發者論壇(PDC)上登臺亮相。C#是微軟公司研究員Anders Hejlsberg的最新成果。C#看起來與Java有著驚人的相似;它包括了諸如單一繼承、接口、與Java幾乎同樣的語法和編譯成中間代碼再運行的過程。但是C#與Java有著明顯的不同,它借鑒了Delphi的一個特點,與COM(組件對象模型)是直接集成的,而且它是微軟公司 .NET windows網絡框架的主角。

C#是一種安全的、穩定的、簡單的、優雅的,由C和C++衍生出來的面向對象的編程語言。它在繼承C和C++強大功能的同時去掉了一些它們的復雜特性(例如沒有宏以及不允許多重繼承)。C#綜合了VB簡單的可視化操作和C++的高運行效率,以其強大的操作能力、優雅的語法風格、創新的語言特性和便捷的面向組件編程的支持成為.NET開發的首選語言。

C#是面向對象的編程語言。它使得程序員可以快速地編寫各種基于MICROSOFT .NET平臺的應用程序,MICROSOFT .NET提供了一系列的工具和服務來最大程度地開發利用計算與通訊領域。
C#使得C++程序員可以高效的開發程序,且因可調用由 C/C++ 編寫的本機原生函數,因此絕不損失C/C++原有的強大的功能。因為這種繼承關系,C#與C/C++具有極大的相似性,熟悉類似語言的開發者可以很快的轉向C#。

C#所開發的程序源代碼并不是編譯成能夠直接在操作系統上執行的二進制本地代碼。與Java類似,它被編譯成為中間代碼,然后通過.NETFramework的虛擬機——被稱之為通用語言運行時(CLR)——執行。 所有的.Net編程語言都被編譯成這種被稱為MSIL(Microsoft Intermediate Language )的中間代碼。因此雖然最終的程序在表面上仍然與傳統意義上的可執行文件都具有“.exe”的后綴名。但是實際上,如果計算機上沒有安裝.Net Framework,那么這些程序將不能夠被執行。 在程序執行時,.Net Framework將中間代碼翻譯成為二進制機器碼,從而使它得到正確的運行。最終的二進制代碼被存儲在一個緩沖區中。所以一旦程序使用了相同的代碼,那么將會調用緩沖區中的版本。這樣如果一個.Net程序第二次被運行,那么這種翻譯不需要進行第二次,速度明顯加快。

應用領域:Windows平臺的應用軟件(桌面應用軟件)。
集成開發環境(IDE)
Microsoft Visual Studio(Visual C++)

缺點:只能運行于Windows平臺的.netFramework上。基本就是.Net開發。

Java

Java是面向對象語言的后起之秀和典范。具有嚴謹的結構和眾多的框架,是目前企業應用最廣泛的語言。
Java編程語言的風格十分接近C、C++語言。Java是一個純粹的面向對象的程序設計語言,它繼承了 C++語言面向對象技術的核心。Java舍棄了C語言中容易引起錯誤的指針(以引用取代)、運算符重載(operator overloading)、多重繼承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的對象所占據的內存空間,使得程序員不用再為內存管理而擔憂。在 Java 1.5 版本中,Java 又引入了泛型編程(Generic Programming)、類型安全的枚舉、不定長參數和自動裝/拆箱等語言特性。

主要特性

Java語言是易學的。Java語言的語法與C語言和C++語言很接近,使得大多數程序員很容易學習和使用Java。另一方面,Java丟棄了C++中很少使用的、很難理解的、令人迷惑的那些特性,如操作符重載、多繼承、自動的強制類型轉換。特別地,Java語言不使用指針,而是引用。并提供了自動的廢料收集,使得程序員不必為內存管理而擔憂。

Java語言是強制面向對象的。Java語言提供類、接口和繼承等原語,為了簡單起見,只支持類之間的單繼承,但支持接口之間的多繼承,并支持類與接口之間的實現機制(關鍵字為implements)。Java語言全面支持動態綁定,而C++語言只對虛函數使用動態綁定。總之,Java語言是一個純的面向對象程序設計語言。

Java語言是分布式的。Java語言支持Internet應用的開發,在基本的Java應用編程接口中有一個網絡應用編程接口(java net),它提供了用于網絡應用編程的類庫,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(遠程方法激活)機制也是開發分布式應用的重要手段。

Java語言是健壯的。Java的強類型機制、異常處理、垃圾的自動收集等是Java程序健壯性的重要保證。對指針的丟棄是Java的明智選擇。Java的安全檢查機制使得Java更具健壯性。

Java語言是安全的。Java通常被用在網絡環境中,為此,Java提供了一個安全機制以防惡意代碼的攻擊。除了Java語言具有的許多安全特性以外,Java對通過網絡下載的類具有一個安全防范機制(類ClassLoader),如分配不同的名字空間以防替代本地的同名類、字節代碼檢查,并提供安全管理機制(類SecurityManager)讓Java應用設置安全哨兵。

Java語言是體系結構中立的。Java程序(后綴為java的文件)在Java平臺上被編譯為體系結構中立的字節碼格式(后綴為class的文件),然后可以在實現這個Java平臺的任何系統中運行。這種途徑適合于異構的網絡環境和軟件的分發。

Java語言是可移植的。這種可移植性來源于體系結構中立性,另外,Java還嚴格規定了各個基本數據類型的長度。Java系統本身也具有很強的可移植性,Java編譯器是用Java實現的,Java的運行環境是用ANSI C實現的。[8]
Java語言是解釋型的。如前所述,Java程序在Java平臺上被編譯為字節碼格式,然后可以在實現這個Java平臺的任何系統中運行。在運行時,Java平臺中的Java解釋器對這些字節碼進行解釋執行,執行過程中需要的類在聯接階段被載入到運行環境中。Java是性能略高的。與那些解釋型的高級腳本語言相比,Java的性能還是較優的。

Java語言是原生支持多線程的。在Java語言中,線程是一種特殊的對象,它必須由Thread類或其子(孫)類來創建。通常有兩種方法來創建線程:其一,使用型構為Thread(Runnable)的構造子將一個實現了Runnable接口的對象包裝成一個線程,其二,從Thread類派生出子類并重寫run方法,使用該子類創建的對象即為線程。值得注意的是Thread類已經實現了Runnable接口,因此,任何一個線程均有它的run方法,而run方法中包含了線程所要運行的代碼。線程的活動由一組方法來控制。Java語言支持多個線程的同時執行,并提供多線程之間的同步機制(關鍵字為synchronized)。

Java語言是動態的。Java語言的設計目標之一是適應于動態變化的環境。Java程序需要的類能夠動態地被載入到運行環境,也可以通過網絡來載入所需要的類。這也有利于軟件的升級。另外,Java中的類有一個運行時刻的表示,能進行運行時刻的類型檢查。

差異

熟悉C語言和C++語言的讀者一定想搞清楚這個問題,實際上,Java確實是從C語言和C++語言繼承了許多成份,甚至可以將Java看成是類C語言發展和衍生的產物。比如Java語言的變量聲明,操作符形式,參數傳遞,流程控制等方面和C語言、C++語言完全相同。盡管如此,Java和C語言,C++語言又有許多差別,主要表如下幾個方面:
Java中對內存的分配是動態的,它采用面向對象的機制,采用運算符new為每個對象分配內存空間,而且,實際內存還會隨程序運行情況而改變。程序運行中 Java系統自動對內存進行掃描,對長期不用的空間作為”垃圾”進行收集,使得系統資源得到更充分地利用.按照這種機制,程序員不必關注內存管理問題,這使Java程序的編寫變得簡單明了,并且避免了由于內存管理方面的差錯而導致系統出問題。而C語言通過malloc()和free()這兩個庫函數來分別實現分配內存和釋放內存空間的,C++語言中則通過運算符new和delete來分配和釋放內存。在C和C++這種機制中,程序員必須非常仔細地處理內存的使用問題。一方面,如果對己釋放的內存再作釋放或者對未曾分配的內存作釋放,都會造成死機;而另一方面,如果對長期不用的或不再使用的內存不釋放,則會浪費系統資源,甚至因此造成資源枯竭。
Java不在所有類之外定義全局變量,而是在某個類中定義一種公用靜態的變量來完成全局變量的功能。
Java不用goto語句,而是用try-catch-finally異常處理語句來代替goto語句處理出錯的功能。
Java不支持頭文件,而C語言和C++語言中都用頭文件來聲明類的原型、全局變量、庫函數等,這種采用頭文件的結構使得系統的運行維護相當繁雜。
Java不支持宏定義。Java只能使用關鍵字final來定義常量。
Java對每種數據類型都分配固定長度。比如,在Java中,int類型總是32位的,而在C語言和C++語言中,對于不同的平臺,同一個數據類型分配不同的字節數,同樣是int類型,在PC機中為二字節即16位,而在VAX-11中,則為32位。這使得C語言造成不可移植性,而Java則具有跨平臺性(平臺無關性)。
類型轉換不同。在C語言和C++語言中,可通過指針進行任意的類型轉換,常常帶來不安全性,而在Java中,運行時系統對對象的處理要進行類型相容性檢查,以防止不安全的轉換。
結構和聯合的處理。Java中根本就不允許類似C語言的結構體(struct)和聯合體(union)包含結構和聯合,所有的內容都封裝在類里面。
Java不再使用指針。指針是C語言和C++語言中最靈活,也最容易產生錯誤的數據類型。由指針所進行的內存地址操作常會造成不可預知的錯誤,同時通過指針對某個內存地址進行顯式類型轉換后,可以訪問一個C++中的私有成員,從而破壞安全性。而Java用“引用”的方式,對指針進行完全地控制,程序員不能直接進行任何指針操作。
避免平臺依賴。Java語言編寫的類庫可以在其它平臺的Java應用程序中使用,而不像C++語言必須運行于單一平臺。
在B/S開發方面,Java要遠遠優于C++。

最新版本:2014年3月19日,甲骨文公司發布Java 8.0的正式版。

應用

企業級web應用開發:J2EE(JSP,JavaBean,Servlet)+SSH(Struts,Spring,Hibernate)
安卓系統程序開發。

缺點

java 2009年 被Oracle收購,喪失了獨立性。Oracle對Java未來的態度難以預測。Java版本太多,有兼容性的問題。Java的代碼相對于其他的代碼來說過于冗長,這與它的輕便化聲明相違背。使用Swing平臺編寫的帶有GUI(圖形用戶接口)的程序和其他原始程序非常不同。性能問題:由于Java編譯器和虛擬機的不同對Java代碼的性能影響比語言本身的影響大的多,所以統一討論Java的程序的性能經常是有誤導性的。據IBM的數據,在同樣的硬件上2001年時的IBMJDK版本的性能是1996年的JDK版本的十倍左右。即使是在同一時期,不同公司的JDK和JRE的性能也不一樣,比如SUN、IBM、BEA等公司都有自己開發的JDK和JRE。

開發工具

IntelliJ IDEA【Java開發工具】
IntelliJ IDEA是JetBrains公司的產品,比老一代Java開發工具Eclipse更漂亮,更智能。Google官方Android開發工具Android Studio就是基于intellij IDEA開發的。Intellij IDEA擁有出色的界面設計,使用Darculah黑色界面主題會讓你愛不釋手。在智能代碼助手、代碼自動提示、重構、J2EE支持、Ant、JUnit、CVS整合、代碼審查、 創新的GUI設計等方面的功能可以說是超常的。IntelliJ IDEA分為商業版本,個人版本,與community社區版本。其中,community社區版本是免費的,但是功能性并不弱,對于學習者和個人開發者來說完全足夠了。

Eclipse 【Java開源開發工具】
Eclipse平臺是IBM向開放源碼社區捐贈的開發框架,它之所以出名并不是因為IBM宣稱投入開發的資金總數 —4千萬美元,而是因為如此巨大的投入所帶來的成果:一個成熟的、精心設計的以及可擴展的體系結構。

NetBeans【Java開源開發工具】
NetBeans IDE 是一個為軟件開發者提供的自由、開源的集成開發環境。您可以從中獲得您所需要的所有工具,用Java、C/C++ 甚至是Ruby 來創建專業的桌面應用程序、企業應用程序、web 和移動應用程序。此IDE 可以在多種平臺上運行,包括Windows、Linux、Mac OS X以及Solaris;它易于安裝且非常方便使用。

Hello World

下面看一個簡單的Java程序,它將打印字符串 Hello World

public class HelloWorld {
  public static void main(String []args) {
    System.out.println("Hello World"); // 打印 Hello World
 }
}

JavaScript

JavaScript一種解釋型腳本語言,是一種動態類型、弱類型、基于原型的語言,內置支持類型。它的解釋器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用于客戶端的腳本語言,最早是在HTML(標準通用標記語言下的一個應用)網頁上使用,用來給HTML網頁增加動態功能。

組成部分:其實Javascript技術分為三個組成部分。

  • ECMAScript,描述了該語言的語法和基本對象。
  • 文檔對象模型(DOM),描述處理網頁內容的方法和接口。
  • 瀏覽器對象模型(BOM),描述與瀏覽器進行交互的方法和接口。

JavaScript是一種屬于網絡的腳本語言,已經被廣泛用于Web應用開發,常用來為網頁添加各式各樣的動態功能,為用戶提供更流暢美觀的瀏覽效果。通常JavaScript腳本是通過嵌入在HTML中來實現自身的功能的。

  • 是一種解釋性腳本語言(代碼不進行預編譯)。
  • 主要用來向HTML(標準通用標記語言下的一個應用)頁面添加交互行為。[4]
  • 可以直接嵌入HTML頁面,但寫成單獨的js文件有利于結構和行為的分離。[4]
  • 跨平臺特性,在絕大多數瀏覽器的支持下,可以在多種平臺下運行(如Windows、Linux、Mac、Android、iOS等)。

JavaScript腳本語言同其他語言一樣,有它自身的基本數據類型,表達式和算術運算符及程序的基本程序框架。Node.js的推出,使得Javacript擺脫了瀏覽器的束縛,成為一種獨立的全功能語言。

關于對象操作:JavaScript不是一門純面向對象的語言,它沒有提供面向對象的許多功能,如類、接口、繼承等,因此把它稱為“基于對象”更合適些。

標準

發展初期,JavaScript的標準并未確定,同期有Netscape的JavaScript,微軟的JScript和CEnvi的ScriptEase三足鼎立。1997年,在ECMA(歐洲計算機制造商協會)的協調下,由Netscape、Sun、微軟、Borland組成的工作組確定統一標準:ECMA-262。ECMAScript和JavaScript的關系是,前者是后者的規格,后者是前者的一種實現(另外的ECMAScript方言還有Jscript和ActionScript)。在日常場合,這兩個詞是可以互換的。

ECMAScript 6(以下簡稱ES6)是JavaScript語言的下一代標準,已經在2015年6月正式發布了。它的目標,是使得JavaScript語言可以用來編寫復雜的大型應用程序,成為企業級開發語言。標準的制定者有計劃,以后每年發布一次標準,使用年份作為標準的版本。因為當前版本的ES6是在2015年發布的,所以又稱ECMAScript 2015。也就是說,ES6就是ES2015

優點

  • 簡單:JavaScript本來是為網頁設計人員開發的,語句簡潔,學起來非常簡單。但學精不容易。
  • WEB支持:天生的Web語言,無論在網頁瀏覽器中還是在服務器端,都如魚得水。而且還有眾多Web框架。
  • 解釋型:無須編譯,立即執行,改動源碼只需刷新一下瀏覽器,比起編譯型語言不知方便了多少。
  • 函數式語言:號稱“披著C外衣的LISP ”,函數是一等公民。
  • 基于對象:雖然不是完全面向對象,但其“對象”功能十分強大,通過列出對象的組成部分,就能簡單地創建出來,而且原生支持json。

缺點

  • 性能:比起編譯后生成的機器碼,解釋型語言“邊譯邊執行”,速度慢些。
  • 不便于編寫帶GUI的桌面程序。
  • 弱類型:沒有數據類型,解釋器不能檢測出類型錯誤。甚至沒有整型!所有數字都被表示為64位雙精度浮點數。也沒有字符類型,所有字符只能用包含一個字符的“字符串”來表示。
  • 不是完全面向對象:沒有“類”,基于原型繼承,對象直接從其他對象繼承屬性,這對于應用基于類的設計十分不便。
  • 全局變量:依賴于全局變量進行連接,函數外創建的變量默認為全局變量,容易導致錯誤。
  • 缺乏塊級作用域:沒有提供塊級作用域,代碼塊中聲明的變量在包含此代碼塊的函數的任何位置都是可見的。
    自動插入分號。
  • 對Unicode支持不全:JavaScript的字符是16位的,不足以覆蓋全部Unicode字符(有100多萬個)。
  • 偽數組:沒有真正的數組,雖然也具備數組的一些功能,但性能差些。

ES6的革命化升級

所幸,上述Javascript的各種缺點在最新版的EMCAScript6中得到了彌補。
ES6 包含了以下這些新特性:

  • Arrows 箭頭函數:箭頭函數是使用=>語法的函數簡寫形式。這在語法上與 C#、Java 8 和 CoffeeScript 的相關特性非常相似。它們同時支持表達式語句塊體和返回表達式的值的表達式體。與(普通的)函數所不同的是,箭頭函數和其上下文中的代碼共享同一個具有詞法作用域的this。
  • Classes 類:ES6 的類是在基于原型的面向對象模式之上的簡單語法糖,它有唯一的、便捷的聲明形式,這使得類模式更容易使用,并且鼓勵了互操作性。class定義的類支持基于原型的繼承、super 調用、實例和靜態方法以及構造函數。
  • Enhanced Object Literals 增強的對象字面量:對象字面量被擴展以支持以下特性:在構建的時候設置原型、foo: foo賦值的簡寫形式、定義方法、進行super 調用以及使用表達式計算屬性名稱等。這樣就使得對象字面量和類的聲明的聯系更加緊密,使得基于對象的設計更加便利。
  • Template Strings 模板字符串:模板字符串提供構造字符串的語法糖,這與Perl、Python等許多語言中的字符串插值功能非常相似,你也可以通過添加標簽(tag)來自定義構造字符串,避免注入攻擊,或者基于字符串構建更高層次的數據結構。
  • Destructuring 解構:解構允許在(變量-值)綁定時使用模式匹配,支持匹配數組和對象,解構支持失效弱化,與標準的對象查詢foo["bar"]相似,當查詢無結果時生成undefined值。
  • Default + Rest + Spread 默認參數+不定參數+參數展開:支持由被調用函數進行求值的參數默認值。 在函數調用時使用...運算符,可以將作為參數的數組拆解為連續的多個參數。 在函數定義時使用...運算符,則可以將函數尾部的多個參數綁定到一個數組中。 不定參數取代了arguments,并可更直接地應用于通常的用例中。
  • Let + Const 操作符:let 和 const 是具有塊級作用域的綁定用構造,let 是新的 var,只在塊級作用域內有效,const 是單賦值,聲明的是塊級作用域的常量。此兩種操作符具有靜態限制,可以防止出現“在賦值之前使用”的錯誤。
  • Iterators 迭代器 + For..Of 循環:迭代器對象允許像 CLI IEnumerable 或者 Java Iterable 一樣自定義迭代器。將for..in轉換為自定義的基于迭代器的形如for..of的迭代,不需要實現一個數組,支持像 LINQ 一樣的惰性設計模式。
  • Generators 生成器:生成器通過使用function和yield簡化迭代器的編寫, 形如function的函數聲明返回一個生成器實例,生成器是迭代器的子類型,迭代器包括附加的next和throw,這使得值可以回流到生成器中,所以,yield是一個返回或拋出值的表達式形式。
  • Unicode 統一碼:字符串支持新的Unicode文本形式,也增加了新的正則表達式修飾符u來處理碼位,同時,新的API可以在21bit碼位級別上處理字符串,增加這些支持后可以使用 Javascript 構建全球化的應用。
  • Modules 模塊:ES6 在語言層面上支持使用模塊來進行組件定義,將流行的JavaScript模塊加載器(AMD、CommonJS)中的模式固化到了語言中。運行時行為由宿主定義的默認加載器定義,隱式異步模型 - 直到(全部)請求的模塊均可用且經處理后,才會執行(當前模塊內的)代碼。
  • Module Loaders 模塊加載器:支持動態加載模塊,默認的模塊加載器是可配置的,也可以構建新的加載器,對在隔離和受限上下文中的代碼進行求值和加載。
  • Map + Set + Weakmap + Weakset 數據結構:用于實現常見算法的高效數據結構,WeakMaps提供不會泄露的對象鍵(對象作為鍵名,而且鍵名指向對象)索引表 注:所謂的不會泄露,指的是對應的對象可能會被自動回收,回收后WeakMaps自動移除對應的鍵值對,有助于防止內存泄露。
  • Proxies 代理:代理可以創造一個具備宿主對象全部可用行為的對象。可用于攔截、對象虛擬化、日志/分析等。
  • Symbols 符號:符號(Symbol) 能夠實現針對對象狀態的訪問控制,允許使用string(與ES5相同)或symbol作為鍵來訪問屬性。符號是一個新的原語類型,可選的description參數可以用于調試——但并不是符號身份的一部分。符號是獨一無二的(如同gensym(所產生的符號)),但不是私有的,因為它們可以通過類似Object.getOwnPropertySymbols的反射特性暴露出來。
  • Subclassable Built-ins 可子類化內建對象:在 ES6 中,內建對象,如Array、Date以及DOM元素可以被子類化。
  • Promises 對象:Promise是用來進行異步編程的庫。Promise是對一個“將來可能會變得可用”的值的第一類表示,Promise被使用在現有的許多JavaScript庫中。
  • Math + Number + String + Object APIs:新加入了許多庫,包括核心數學庫,進行數組轉換的協助函數,字符串 helper,以及用來進行拷貝的Object.assign。
  • Binary and Octal Literals 二進制和八進制字面量:加入對二進制(b)和八進制(o)字面量的支持。
  • Reflect 反射 API:完整的反射API。此API在對象上暴露了運行時級別的元操作,從效果上來說,這是一個反代理API,并允許調用與代理陷阱中相同的元操作。實現代理非常有用。
  • Tail Calls 尾遞歸調用:(ES6)保證遞歸尾部調用時棧不會無限增長,這使得遞歸算法在面對未作限制的輸入時,能夠安全地執行。

有了這些增強,JavaScript幾近完美。加之它天然的簡單性,在GitHub上的開發語言中一路領先。以至于有人總結了一條定律:“一切能用JavaScript編寫的程序最終都會被用JavaScript編寫“。

Swift

Swift是最年輕的通用計算機編程語言,現代語言集大成者,無縫集成Coca和CocaTouch圖形框架,蘋果公司的當家花旦,雖然植根于MAC/IOS系統,現已開源。

2010年的夏天,Chris Lattner 接到了一個不同尋常的任務:為 OS X 和 iOS 平臺開發下一代新的編程語言。那時候喬布斯還在以帶病之身掌控著龐大的蘋果帝國,他是否參與了這個研發計劃,我們不得而知,不過我想他至少應該知道此事,因為這個計劃是高度機密的,只有極少數人知道,最初的執行者也只有一個人,那就是 Chris Lattner。
從2010年的7月起,克里斯(Chris)就開始了無休止的思考、設計、編程和調試,他用了近一年的時間實現了大部分基礎語言結構,之后另一些語言專家加入進來持續改進。到了2013年,該項目成為了蘋果開發工具組的重中之重,克里斯帶領著他的團隊逐步完成了一門全新語言的語法設計、編譯器、運行時、框架、IDE 和文檔等相關工作,并在2014年的 WWDC 大會上首次登臺亮相便震驚了世界,這門語言的名字叫做:「Swift」。
根據克里斯個人博客(http://nondot.org/sabre/ )對 Swift 的描述,這門語言幾乎是他憑借一己之力完成的。這位著名的70后程序員同時還是 LLVM 項目的主要發起人與作者之一、Clang 編譯器的作者,可以說 Swift 語言和克里斯之前的軟件作品有著千絲萬縷的聯系。
同樣是70后程序員,差別怎么那么大呢?

關于作者
克里斯可以說是天才少年和好學生的代名詞,他在2000年本科畢業之后,繼續攻讀計算機碩士和博士。但克里斯并不是宅男,學習之余他手捧「龍書」游歷世界,成為德智體美勞全面發展的好學生。之后就是一篇又一篇的發表論文,碩士畢業論文即提出了一套完整的運行時編譯思想,奠定了 LLVM 的發展基礎,讀博期間 LLVM 編譯框架在他的領導下得到了長足的發展,已經可以基于 GCC 前端編譯器的語義分析結果進行編譯優化和代碼生成,所以克里斯在2005年畢業的時候已經是業界知名的編譯器專家了。
注:很多計算機專業的大學生經常問我在大學里學點什么好,看看克里斯就行了。以目前的科技信息開放程度,如果你在自己感興趣的領域里用心耕耘,再加上那么一點點天分,畢業時成為某一個專有領域的專家應該不是問題。那時就不是你滿世界去找工作了,而是工作滿世界來找你!

克里斯畢業的時候正是蘋果為了編譯器焦頭爛額的時候,因為蘋果之前的軟件產品都依賴于整條 GCC 編譯鏈,而開源界的這幫大爺并不買蘋果的帳,他們不愿意專門為了蘋果公司的要求優化和改進 GCC 代碼,所以蘋果一怒之下將編譯器后端直接替換為 LLVM,并且把克里斯招入麾下。克里斯進入了蘋果之后如魚得水,不僅大幅度優化和改進 LLVM 以適應 Objective-C 的語法變革和性能要求,同時發起了 CLang 項目,旨在全面替換 GCC。這個目標目前已經實現了,從 OS X10.9和 XCode 5開始,LLVM+GCC 已經被替換成了 LLVM+Clang。
Swift 是克里斯在 LLVM 和 Clang 之后第三個偉大的項目!

關于語言
2007年之前,Objective-C 一直是蘋果自家院落的小眾語言,但是 iOS 移動設備的爆發讓這門語言的普及率獲得了火箭一般的躥升速度,截止到今天,Objective-C 在編程語言排行榜上排名第三,江湖人稱三哥,大哥二哥分別是 C 和 Java 這樣的老牌語言。同時,蘋果在2012年和2013年分別對 Objective-C 進行了大規模的優化和升級改進,增加了各種現代語言的特性,讓編寫 App 更加容易,更多的程序員投入到了 App Store 的生態圈里……
在這種情況下,蘋果公司為什么會發布一門新語言呢?
這個問題沒有標準答案,不過我們可以試著去分析一下,談談蘋果的心路歷程……
Objective-C 是80年代初 Brad Cox 和 Tom Love 發明的,1988年喬布斯的 Next 公司獲得了這門編程語言語言的授權,并開發出了Objective-C 的語言庫和NEXTSTEP的開發環境。后來 Next 被蘋果收購,Objective-C 陰差陽錯成了蘋果的當家語言。掐指一算,三十年倏忽而過,OC 也成長為爺爺輩兒的編程語言了。
為了伺候好這位「爺爺」,蘋果煞費苦心,把 GCC 的編譯鏈先替換成 LLVM +GCC,又替換成 LLVM+Clang,做語法簡化、自動引用計數、增加 Blocks 和 GCD 多線程異步處理技術……終于,OC 在30年后重新煥發出勃勃生機,并占據了兵器譜排名第三的位置。但是,蘋果卻有點煩了,OC 改進了這么多年,怎么看都像是在修修補補,用 Blocks 去實現一個類似 Python 的 lambda 閉包功能,看起來總是那么別扭。好吧,既然已經全盤掌握了 LLVM 和 Clang,為什么我們不去基于現在的編譯器設計一門全新的語言呢?一門屬于蘋果的語言!你看,鄰居谷歌家里叫做 Go 的孩子不是玩耍正酣么?
于是 Swift 誕生了……
當然,事實的真相也可能是行動緩慢的喬老爺子把克里斯拉到一邊說:
「I want to be swift to……」
「 行了,您別說了,不就是想要 swift 嗎,我這就給您做一個去」
于是 Swift 誕生了……
語法
Swift 是一門博采眾長的現代語言,在設計的過程中,克里斯參考了Objective-C,Rust,Haskell,Ruby,Python,C#等優秀語言的特點,最終形成了目前 Swift 的語法特性。我在閱讀了官方教程和做了些代碼實驗之后,自我感覺會喜歡上這門語言,在這里簡單談點感想,更深入的內容需要你們自己去深入學習。
1、Swift 是面向 Cocoa 和 Cocoa Touch 的編程語言,編譯型語言,生產環境的代碼都需要 LLVM 編譯成本地代碼才能執行,但是Swift又具備很多動態語言的語法特性和交互方式。
2、Swift 是一門類型安全的語言,可以幫助開發者清楚的掌控代碼片段中的值類型。如果你期望輸入的是字符串,類型安全的特性會阻止開發者錯誤地為其傳遞一個整數。這一切使得開發者能夠更早的發現和修復錯誤。
3、支持各種高級語言特性,包括閉包、泛型、面向對象、多返回值、類型接口、元組、集合等。
4、Swift 能與 Objective-C 進行混合編程,但代碼分屬不同的文件。
5、全面的Unicode支持,你甚至可以用一只??作為變量名,實現以下操作:
let ?? = "大狗菠蘿"
for n in ??{
println( n )
}

控制臺會輸出「大狗菠蘿」四個字。
6、編程語句取消了大部分語言使用的「;」分隔符,只有一行寫多條語句時才需要分號。
7、很多人簡單閱讀了 Swift 的數據類型,就認為 Swift 沒有類似 Set、List 這樣的數據結構,其實Swift 提供了兩種 Collection 的數據類型:數組(Array)和字典(Dictionary),兩個數據類型的表達式都用中括號標識。其中數組可以存儲任意類型的變量,也可以強制聲明存儲同一種類型的變量。同時數組提供了類似 Set 功能,你可以修改、追加、替換和刪除數據的元素。另外,Swift 還提供了元組(Tuple)的功能支持函數多返回值。
8、Swift 沒有提供顯式的指針,參數傳遞根據數據類型的不同分為值類型和引用類型,值傳遞進行內存拷貝,引用傳遞最終傳遞的是一個指向原有對象的指針。這一點和 Java 的參數傳遞是類似的。需要注意的一點是,Swift 里的數組和字典雖然都是結構體(struct),但在參數傳遞過程中處理方式卻不一樣,默認 Array 是引用傳遞,Dictionary 是值傳遞。而在 Java 中,由于數組和 Map 都是對象,所以傳遞的都是指針。
在 Swift 中,如果你不想傳遞數組引用,可以用 copy() 方法先復制一份出來,另外,也可以用 unshare() 表示,本變量不傳遞指針。
9、閉包,Swift 終于提供了一種優雅的閉包解決方案,比如在排序函數 sort 中進行函數傳遞:
let names = ["D", "B", "R", "C", "A"]
func backwards(s1: String, s2: String) -> Bool {
return s1 > s2
}

var rnames = sort(names, backwards)

事實上更簡單的寫法是:
var rnames = sort( ["D", "B", "R", "C", "A"] ) { $0 > $1 }

10、可選變量(Optional)的引入主要是為了應對一個變量可能存在也可能是 nil 的情況,這種情況在很多高級語言里都存在。比如你想使用String的toInt方法將String轉化為 Int 類型,但是你并不知道這個轉化是否正常,這時候系統會返回一個可選變量,如果轉換成功就返回正常值,轉換失敗就返回 nil,如下:
let str = "123A"
let nn = str.toInt()

這是 nn 就是可選變量,想得到 nn 的值,可以通過 if 進行判斷并通過追加感嘆號獲取變量值,如下:
if nn {
println(nn!)
}

可選變量的引入解決了大部分需要顯式處理的異常,這部分工作也扔給編譯器去做了。想了解更多可選變量的用法,請閱讀蘋果的官方文檔。
11、Swift 中的 nil 和 Objective-C 中的 nil 不同。在 Objective-C 中,nil 是指向不存在對象的指針,而在 Swift 里,nil 不是指針,它表示特定類型的值不存在。所有類型的可選值都可以被設置為nil,不僅僅是對象類型。
12、Swift 沒有從語言層面支持異步和多核,不過可以直接在 Swift 中復用 GCD 的 API 實現異步功能。另外沒看到 Swift 的異常處理機制,可能有了可選變量,異常的使用會非常少吧。
13、還有一點不得不提:Swift特別適合教學,尤其在playground中。

基本上,Swift 絕對不是玩具語言,而是一門可以被大眾接受的工業級編程語言。相信假以時日,Swift 必將在 App 開發領域大放異彩。

但是,對于熱愛自由的人們,Swift還有兩點讓人不放心:蘋果的控制和生態依賴,以及編譯型語言的不靈活。

2015年12月4日,蘋果宣布Swifit開源,swift開源不到一天的時間,swift項目在github收到了13087個star,1351個fork。并且還在快速增長中...... 這表示了眾多開發者對swift這個語言的關注和熱情十分的高漲,并且全球的開發者都會為swift貢獻自己的代碼和力量。而且,很快,Ubuntu Linux支持Swift了。目前已經出現了很多Swift語言編寫的庫:網絡、圖形處理、數學、人工智能……很快Swift就會形成一個大的生態系統。

編程語言的一般架構

編程語言,作為人類指揮計算機工作的指令,一般就干這么幾件事:

  • 讀取人類的信息(輸入);
  • 處理人類的信息,執行必要的操作;
  • 將處理結果反饋給人類(輸出);

為了干這幾件事,必須:

  • 生成一套人機交互的界面(現在以圖形界面為主流);
  • 對人類輸入的信息,主要是數字和文本,進行處理;這又需要:
    -- 對信息進行校驗和過濾;
    -- 存儲輸入的信息(內存中):涉及數據結構
    -- 數學運算;
    -- 文本處理的方法;
    -- 綜合上述形成算法;
  • 程序本身的管理,涉及到:
    -- 語法;
    -- 功能單元的組織:函數式、對象化;
    -- 程序的錯誤檢查和測試;
  • 程序與操作系統之間的交互
  • 數據的持久化存儲(數據庫和文件)
    -- 文件的操作
    -- 數據庫的操作

看看各大語言在上述各層面的表現,就知道其優劣了。面向對象之所以盛行,就是因為其對象-類-接口-API的組織形式更靈活便捷。

在這里,我選取Java、JavaScript、Swift三種語言作為代表。

  • Swift,編譯型語言,面向過程與面向對象
  • JavaScript,解釋型語言,函數式語言
  • Java, 虛擬機型語言,面向對象

后面,我將在上述層面上對三大語言進行對比以分析各自優劣。

附: 多語言編程環境
要編寫一個程序,只需要一個文本編輯器,當然你可以使用全功能的IDE,各種語言都有自己強大的IDE,但文本編輯器更小巧靈活。我推薦Sublime Text,它支持多種語言,也有相應的插件。
編譯和運行:
C/C++/Object C用clang,這是比gcc更優秀的新一代編譯器,實現了快速編譯和較少內存占用;有診斷功能;兼容GCC。
編譯C文件:clang demo.c -o democ 編譯完成后會生成democ可執行文件,./democ即可運行。
編譯C++文件:clang++ demo.cpp -o democpp 編譯完成后會生成democpp可執行文件,./democpp即可
運行。
java的開發和編譯需要安裝JDK,里面包含了JRE和JVM。
編譯java文件: javac demo.java,生成demo.class,再java demo,就可以運行了。
javascript不需要編譯,在瀏覽器里可以直接運行,但獨立運行需要安裝node.js。

至于SWIFT語言,只能在Xcode的Playground里試驗了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370

推薦閱讀更多精彩內容

  • Swift的編程范式 編程范式是程序語言背后的思想。代表了程序語言的設計者認為程序應該如何被構建和執行。常見的編程...
    Bobby0322閱讀 2,607評論 4 43
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,142評論 4 61
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,579評論 25 707
  • 不得不說繪畫真的需要好筆,不然確實很難把細節畫出來也很容易走形,要提醒自己!而且最后涂色隨便找的藍色,結果藍色黑色...
    顧小軸閱讀 250評論 0 0
  • 站在高考后假期的尾巴上,總是會夢見那個無數次想要離開的教室,和那群可愛的人。我開始在這個承上啟下的位置上思考:高考...
    格格女王閱讀 708評論 7 6