代碼藝術:編程語言了解

我一直認為,代碼應該是繼電子遊戲之後的第十大藝術,為什麼呢? 寫代碼就像畫畫和雕塑一樣都是藝術活動,只是懂這門藝術的人真是太少了,我大學期間學習了簡單的前端代碼,設計了自己的網站,能感覺到學習一種計算機語言帶給人潛移默化的影響,包括思維,邏輯等等,今天總結了一些主流的計算機語言的簡介以及自己遇到的一些小白問題,作為一個小白的閱讀筆記總結,和大家(小白)分享,大牛無視。

(一)2016年世界編程語言使用率排行榜

先來看看這份數據,這張圖表列舉了今年各種編程語言的使用率和熱度。

問題(一):C、C++、C#、和java的區別

簡單地說,它們不是一種語言,語法有差別,編程時具體用到的類庫或者函數庫也不一樣。雖然它們不是一種語言,不過它們卻也有所聯繫。廣泛地說,C可以看作其他三種語言的源語言,因為其他三種語言幾乎都是從C而來的,無論從數據類型還是控制語句看,其他三種語言都有從C得來的跡象。

其中C++則一般看作是對C語言的擴展。因為C語言沒有面向對象的語法結構,而當時業界又迫切需要面向對象的編程特性,所以貝爾實驗室的開發者就為C添加了面向對象的結構。現在C++已經不只是C的擴展了,它已經完全可以被看作一種新的編程語言。雖然C的特性以及庫函數仍然被C++支持,不過C++擁有自己的獨立的類庫體系,功能相當強大。

Java語言是一種完全的面向對象語言,雖然它的底層(運行時庫)是用C語言開發的,可是並不依賴於C。因為Java的運行是在運行時庫的支持下進行的,所以運行效率比起可以更接近底層的C/C++來說效率會有所影響,不過Java的類庫採用很好的設計理念設計,非常好用,也非常實用,已經成為業界的一種標準開發語言。它的跨平台的特性尤其讓很多開發者歡迎,你只需要開發一次就能在所有安裝了Java運行時庫的系統上運行。Java發展了十幾年了,可以應用領域非常之廣泛,Web開發有JSP,J2EE,桌面領域現在有JavaFX。

C#是微軟開發的一種編程語言,語法類似Java,幾乎就是從Java的翻版。運行原理和Java也類似,也是通過運行時庫的支持運行。不過支持的平台還很有限。JAVA幾乎被所有平台支持,而C#目前只被Windows和Linux支持,Windows下的支持當然是由微軟自己開發的,而Linux下的支持則有MONO支持。實際上,MONO也是把C#應用轉化為JAVA應用而已,所以本質上,C#仍然只是被微軟自己的操作系統支持。應用平台受到限制,是它最大的缺點。

C/C++的優點在於與底層比較接近,可以控制的粒度更加精細,是開發系統級應用的最佳選擇。關於缺點,我想正是源於其優點,因為它們能控制的編程元素粒度精細,所以編程比較困難,煩瑣,容易出錯。

Java和C#都比較高級,可以看作高級語言的高級語言,優點是開發容易,但運行效率不如更為底層的C/C++。

具體選擇使用的時候,可以根據實際的項目需要選擇。運行效率要求高的,底層控制要求高的用C/C++,否則可以選擇Java或C#;跨平台的要求高的可以用Java。

關於跨平台,C/C++也是很好的語言,因為所有平台都支持,不同的是,不同平台支持的實現不同,類庫不同,要編寫跨平台的程序,需要選擇跨平台的類庫,如標準類庫,如果標準類庫的支持不夠也只需要附加編寫一個跨平台的支持類庫。1,java是在C++上的藍本上實現上,去除了C++的指針都內容,將很多的東西搬到了類庫中,首次實現了虛擬機概念——因此跨平台特性十分強。而C#則借鑒了java的優點,也實現了虛擬機與類庫。同樣沒了指針——官方雖然也說在C++基礎之上,但借鑒不少java的東西。

2,java實現了開源,有諸多開源項目可以使用,而C#近年來雖有不少優秀的開源項目,但相比java還是差的太多。

3,在api方面,C#對windows有原生的支持,相對來說較為好一些。注釋方面也強,同時在IDE的智能感知方面也較java強,也正是這種特點導致C#的元數據非常大,打包後文件過大,性能上也因為元數據大量存在而導致有所下降。同時對於編譯器來說,java有林林總總的不同廠家編譯器,而,.net卻只是windows一家獨大。所以從編角度上來看,.net更易於統一,而java則有更多的選擇。

4,在組件方面,目前來說.net稍優,它是基於COM+形成,三者之間是相互供鑒,目前來說.net還是稍佔優劣。

5,難度方面,.net主要是力求程序員的簡單,類庫較為完整,主要是程序員對.net類庫的熟悉。而java類庫並不十分完整,但是開源極多,構件極多,比如ejb,j2ee等等,主要集中在構件的學習與開源項目的尋找上。

幾種語言內容都很多,在這裡就不詳細列舉了,要學好每一種都需要花費相當大的精力,祝你能有所成就!

這裡補充位置五這種語言:Python、Php、Ruby、JavaScript、Perl.

Python

Python具有豐富和強大的庫。它常被昵稱為膠水語言,能夠把用其他語言製作的各種模塊(尤其是C/C++)很輕鬆地聯結在一起。常見的一種應用情形是,使用Python快速生成程序的原型(有時甚至是程序的最終界面),然後對其中[2]有特別要求的部分,用更合適的語言改寫,比如3D遊戲中的圖形渲染模塊,性能要求特別高,就可以用C/C++重寫,而後封裝為Python可以調用的擴展類庫。需要注意的是在您使用擴展類庫時可能需要考慮平台問題,某些可能不提供跨平台的實現。

優點:簡單,易學,速度快,免費、開源,高層語言,可移植性,解釋性,面向對象,可擴展性,可嵌入性,豐富的庫。

缺點:單行語句和命令行輸出問題,獨特的語法,運行速度慢。

應用:系統編程,圖形處理,數學處理,文本處理,資料庫編程,網路編程,多媒體應用……

Perl

Perl借取了C、sed、awk、shell腳本語言以及很多其他程序語言的特性,其中最重要的特性是它內部集成了正則表達式的功能,以及巨大的第三方代碼庫CPAN。簡而言之,Perl像C一樣強大,像awk、sed等腳本描述語言一樣方便,被Perl語言愛好者稱之為「一種擁有各種語言功能的夢幻腳本語言」、「Unix中的王牌工具」。

Perl的強大之處是CPAN檔案庫提供的各種模塊,你想實現什麼功能,原則上你可以在檔案庫里搜索需要的模塊。

缺點

也正是因為Perl的靈活性和「過度」的冗餘語法,也因此獲得了write-only的「美譽」,因為許多Perl程序的代碼令人難以閱讀,實現相同功能的程序代碼長度可以相差十倍百倍。但Perl同樣可以將代碼書寫得像Python或Ruby等語言一樣優雅。

很多時候,perl.exe進程會佔用很多的內存空間,雖然只是一時,但是感覺不好。

王牌語言的局限性:也許你以前並不知道,Perl是另外一種極其流行的開源解釋性編程語言。如果你曾經嘗試過用Perl語言編寫一個大程序,你一定會自己回答這個問題。在規模較小的時候,Perl程序是簡單的。它可以勝任於小型的應用程序和腳本,「使工作完成」。然而,當你想開始寫一些大一點的程序的時候,Perl程序就變得不實用了。我是通過為Yahoo編寫大型Perl程序的經驗得出這樣的總結的!與Perl相比,Python程序一定會更簡單、更清晰、更易於編寫,從而也更加易懂、易維護。我確實也很喜歡Perl,用它來做一些日常的各種事情。不過當我要寫一個程序的時候,我總是想到使用Python,這對我來說已經成了十分自然的事。Perl已經經歷了多次大的修正和改變,遺憾的是,即將發布的Perl 6似乎仍然沒有在這個方面做什麼改進。我感到Perl唯一也是十分重要的優勢是它龐大的CPAN庫——綜合Perl存檔網路。就如同這個名字所指的意思一樣,這是一個巨大的Perl模塊集,它大得讓人難以置信——你幾乎用這些模塊在計算機上做任何事情。Perl的模塊比Python多的原因之一是Perl擁有更加悠久的歷史。或許我會在comp.lang.python上建議把Perl模塊移植到Python上的計劃。另外,新的Parrot虛擬機按設計可以運行完全重新設計的Perl 6也可以運行Python和其他解釋性語言如Ruby、PHP和Tcl等等。這意味著你將來或許可以在Python上使用所有Perl的模塊。這將成為兩全其美的事——強大的CPAN庫與強大的Python語言結合在一起。我們將拭目以待。

Php

PHP(外文名:PHP: Hypertext Preprocessor,中文名:「超文本預處理器」)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。PHP獨特的語法混合了C、Java、Perl以及PHP自創的語法。它可以比CGI或者Perl更快速地執行動態網頁。用PHP做出的動態頁面與其他的編程語言相比,PHP是將程序嵌入到HTML(標準通用標記語言下的一個應用)文檔中去執行,執行效率比完全生成HTML標記的CGI要高許多;PHP還可以執行編譯後代碼,編譯可以達到加密和優化代碼運行,使代碼運行更快。(PHP於1994年由Rasmus Lerdorf創建,剛剛開始是Rasmus Lerdorf為了要維護個人網頁而製作的一個簡單的用Perl語言編寫的程序。這些工具程序用來顯示Rasmus Lerdorf的個人履歷,以及統計網頁流量。後來又用C語言重新編寫,包括可以訪問資料庫。他將這些程序和一些表單直譯器整合起來,稱為PHP/FI。PHP/FI可以和資料庫連接,產生簡單的動態網頁程序。)

PHP能做什麼:通過PHP,您可以不受限於只輸出HTML。您還能夠輸出圖像、PDF文件、甚至Flash影片。您也可以輸出任何文本,比如XHTML和XML。

PHP能夠生成動態頁面內容

PHP能夠創建、打開、讀取、寫入、刪除以及關閉伺服器上的文件

PHP能夠接收表單數據

PHP能夠發送並取回cookies

PHP能夠添加、刪除、修改資料庫中的數據

PHP能夠限制用戶訪問網站中的某些頁面

PHP能夠對數據進行加密

為什麼使用PHP:

PHP運行於各種平台(Windows,

Linux, Unix, Mac OS X等等)

PHP兼容幾乎所有伺服器(Apache,

IIS等等)

PHP支持多種資料庫

PHP是免費的。

PHP易於學習,並可高效地運行在伺服器端

Ruby

Ruby,一種為簡單快捷的面向對象編程(面向對象程序設計)而創的腳本語言,在20世紀90年代由日本人松本行弘(Yukihiro Matsumoto)開發,遵守GPL協議和Ruby License。它的靈感與特性來自於Perl、Smalltalk、Eiffel、Ada以及Lisp語言。由Ruby語言本身還發展出了JRuby(Java平台)、IronRuby(.NET平台)等其他平台的Ruby語言替代品。Ruby的作者於1993年2月24日開始編寫Ruby,直至1995年12月才正式公開發佈於fj(新聞組)。因為Perl發音與6月誕生石pearl(珍珠)相同,因此Ruby以7月誕生石ruby(紅寶石)命名。

優點:語法簡單

普通的面向對象功能(類,方法調用等)

特殊的面向對象功能(Mixin,特殊方法等)

操作符重載

錯誤處理功能

迭代器和閉包

垃圾回收

動態載入(取決於系統架構)

可移植性高.不僅可以運行在多數UNIX上,還可以運行在DOS,Windows,Mac,BeOS等平台上

適合於快速開發,一般開發效率是JAVA的5倍

語言用途

·Ruby是開源的,在Web上免費提供,但需要一個許可證。[3]

·Ruby是一種通用的、解釋的編程語言。

·Ruby是一種真正的面向對象編程語言。

·Ruby是一種類似於Python和Perl的伺服器端腳本語言。

·Ruby可以用來編寫通用網關介面(CGI)腳本。

·Ruby可以被嵌入到超文本標記語言(HTML)。

·Ruby語法簡單,這使得新的開發人員能夠快速輕鬆地學習Ruby。

·Ruby與C++和Perl等許多編程語言有著類似的語法。

·Ruby可擴展性強,用Ruby編寫的大程序易於維護。

·Ruby可用於開發的Internet和Intranet應用程序。

·Ruby可以安裝在Windows和POSIX環境中。

·Ruby支持許多GUI工具,比如Tcl/Tk、GTK和OpenGL。

·Ruby可以很容易地連接到DB2、MySQL、Oracle和Sybase。

·Ruby有豐富的內置函數,可以直接在Ruby腳本中使用。[3]

JavaScript

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

問題(二):演算法和數據結構的區別

首先,數據結構是一門計算機語言學的基礎學科,它不屬於任何一門語言,其體現的是幾乎所有標準語言的演算法的思想。上面的概念有一些模糊,我們現在來具體說一說,相信你們的數據結構使用的是一門具體的語言比如C/C++語言來說明,那是為了輔助的學習數據結構,而數據結構本身不屬於任何語言(相信你把書上的程序敲到電腦裡面是不能通過的吧,其只是描述了過程,要調試程序,還需要修改和增加一些東西)。你們的書上開始應該在講究數據的物理存儲結構/邏輯存儲結構等概念,說明數據結構首先就是「數據的結構」,在內存上的存儲方式,就是物理的存儲結構,在程序使用人員的思想上它是邏輯的,比如:你們在C/C++中學習到鏈表,那麼鏈表是什麼一個概念,你們使用指針制向下一個結點的首地址,讓他們串聯起來,形成一個接一個的結點,就像顯示生活中的火車一樣。而這只是對於程序員的概念,但是在內存中存儲的方式是怎樣的那?對於你程序員來說這是「透明」的,其內部分配空間在那裡,都是隨機的,而內存中也沒有一個又一根的線將他們串聯起來,所以,這是一個物理與邏輯的概念,對於我們程序員只需要知道這些就可以了,而我們主要要研究的是「邏輯結構」。

我可以給你一個我自己總結的一個概念:所有的演算法必須基於數據結構生存。也就是說,我們對於任何演算法的編寫,必須依賴一個已經存在的數據結構來對它進行操作,數據結構成為演算法的操作對象,這也是為什麼演算法和數據結構兩門分類不分家的概念,演算法在沒有數據結構的情況下,沒有任何存在的意義;而數據結構沒有演算法就等於是一個屍體而沒有靈魂。估計這個對於演算法的初學者可能有點暈,我們在具體的說一些東西吧:

我們在數據結構中最簡單的是什麼:我個人把書籍中線性表更加細化一層(這裡是為了便於理解在這樣說的):單個元素,比如:int i;這個i就是一個數據結構,它是一個什麼樣的數據結構,就是一個類型為int的變數,我們可以對它進行加法/減法/乘法/除法/自加等等一系列操作,當然對於單個元素我們對它的數據結構和演算法的研究沒有什麼意義,因為它本來就是原子的,某些具體運算上可能演算法存在比較小的差異;而提升一個層次:就是我們的線性表(一般包含有:順序表/鏈表)那麼我們研究這樣兩種數據結構主要就是要研究它的什麼東西那?一般我們主要研究他們以結構為單位(就是結點)的增加/刪除/修改/檢索(查詢)四個操作(為什麼有這樣的操作,我在下面說到),我們一般把「增加/刪除/修改」都把它稱為更新,對於一個結點,若要進行更新一類的操作比如:刪除,對於順序表來說是使用下標訪問方式,那麼我們在刪除了一個元素後需要將這個元素後的所有元素後的所有元素全部向前移動,這個時間是對於越長的順序表,時間越長的,而對於鏈表,沒有順序的概念,其刪除元素只需要將前一個結點的指針指向被刪除點的下一個結點,將空間使用free()函數進行釋放,還原給操作系統。當執行檢索操作的時候,由於順序表直接使用下標進行隨機訪問,而鏈表需要從頭開始訪問一一匹配才可以得到使用的元素,這個時間也是和鏈表的結點個數成正比的。所以我們每一種數據結構對於不同的演算法會產生不同的效果,各自沒有絕對的好,也沒有絕對的不好,他們都有自己的應用價值和方式;這樣我們就可以在實際的項目開發中,對於內部的演算法時間和空間以及項目所能提供的硬體能力進行綜合評估,以讓自己的演算法能夠更加好。

(在這裡只提到了基於數據結構的一個方面就是:速度,其實演算法的要素還應該包括:穩定性、健壯性、正確性、有窮性、可理解性、有輸入和輸出等等)

為什麼要以結點方式進行這些亂七八糟的操作那?首先明確一個概念就是:對於過程化程序設計語言所提供的都是一些基礎第一信息,比如一些關鍵字/保留字/運算符/分界符。而我們需要用程序解決現實生活中的問題,比如我們要程序記錄某公司人員的情況變化,那麼人員這個數據類型,在程序設計語言中是沒有的,那麼我們需要對人員的內部信息定義(不可能完全,只是我們需要那些就定義那些),比如:年齡/性別/姓名/出生日期/民族/工作單位/職稱/職務/工資狀態等,那麼就可以用一些C/C++語言描述了,如年齡我們就可以進行如下定義:

int age;/*age變數,表示人員公司人員的年齡*/

同理進行其他的定義,我們用結構體或類把他們封裝成自定義數據類型或類的形式,這樣用他們定義的就是一個人的對象的了,它內部包含了很多的模板數據了。

我就我個人的經歷估計的代碼量應該10000以內的(我個人的經理:只是建議,從你的第一行代碼開始算,不論程序正確與否,不論那一門語言,作為一個標準程序員需要十萬行的代碼的功底(這個是我在大學二年級感覺有一定時候的大致數據,不一定適合其他人),而十萬行代碼功底一般需要四門基礎遠支撐,若老師沒有教,可以自學一些語言)。

最後兩個跟蘋果有關的語言:objective-c 和swift

objective-c:Objective-C是非常實用的語言。它是一個用C寫成很小的運行庫,令應用程序的尺寸增加很小,和大部分OO系統使用極大的VM執行時間會取代了整個系統的運作相反。Objective-C寫成的程序通常不會比其原始碼大很多。而其函式庫(通常沒附在軟體發行本)亦和Smalltalk系統要使用極大的內存來開啟一個窗口的情況相反。因此,Objective-C它完全兼容標準C語言(C++對C語言的兼容僅在於大部分語法上,而在ABI(Application Binary Interface)上,還需要使用extern "C"這種顯式聲明來與C函數進行兼容),而在此基礎上增加了面向對象編程語言的特性以及Smalltalk消息機制。

評價:很強大的編程語言有點類似於C++ ,但是也有java 的影子,。它的熱度完全是由基於Objective-C編寫的熱門iOS應用帶起來。當初也是喬老爺子一眼相中了OC,才有了OC的今天。

swift:C 語言是一款經典的高級程序語言。它的升級版,Objective-C,是蘋果多年來的選擇。人們用Objective-C 開發應用已經30 多年,而C 語言的壽命更久,已經差不多40 歲了,也是該是更新的時候了。

在這些程序語言之中,有一類叫做「腳本語言」,例如 Python,編寫和測試的過程相對容易,但功能並不是特彆強大,實際作用並不理想。假如你要編寫一個遊戲,需要完全利用設備的性能,那麼它就不是最佳選擇。使用傳統的程序語言,例如 Objective-C,可以更好利用設備的性能,並且開發出更加複雜的應用。但傳統語言比較難掌握,編譯和測試過程也更麻煩。

Swift 借鑒了各種語言的長處,並改進了它們的缺點。Swift 使用現有的Cocoa 和Cocoa Touch 框架,可與Objective-C 兼容,開發過程中可以隨時切換。Swift 具有更快、更安全、交互性更強等特點,將為開發者帶來全新體驗。

蘋果表示,至少從幾個關鍵指標來看,Swift程序的執行速度比Python和Objective-C程序更快。並且,Swift 支持Xcode 開發環境,可以像腳本語言一樣,具有實時預覽功能。開發者在輸入代碼後,右邊屏幕會實時顯示代碼效果。此外,開發者還可以看到應用程序運行過程中的代碼效果,從而使測試過程更加方便。

問題(三):一些大型網路遊戲和網頁遊戲,一個PC軟體和Android 和 ios 上的應用都是用什麼語言開發的。

先說PC端的軟體一般所用的語言:PC端:Windows一般用c/c++/c#/java……

mac用oc/c/c++,swift,;linux用c/c++/java……

手機:Android用Java,iOS用oc/c++,swift,WP用c#/c++/c。

問題(四):大型的網路遊戲和網頁遊戲一般用什麼編程語言

斑點狗個人覺得,還是自己去百度問吧,知識很重要,但是獲取知識的動力能力才是最重要的,這個世界是平的,信息壁壘已經很少,………………。

問題(三):很多計算機語言都是圖靈完備語言,為什麼市場上還有這麼多變成語言的?

回答:圖靈完備只保證計算的可行性,不保證計算的效率,也不保證代碼的可理解性和可維護性。各個領域有不同的需求,如科學計算中需要有浮點數計算、並行計算的能力;商業應用中需要有可持續化、數據分析的能力;系統編程中需要對底層的資源進行控制、甚至有實時的要求。這些需求之間是存在衝突的,需要語言的設計者來進行取捨。雖然有的語言在設計之初就注重了通用性,但也有的語言在設計和實現的時候會針對某一領域進行優化的設計,如Matlab, R, SQL等等。而有針對性的優化就能有效的降低解決問題的複雜度(編程複雜度、計算複雜度,等等)。新生領域的不斷湧現導致的新的需求,也誘導了新語言的誕生。

即使是通用語言,也存在性能和開發成本的取捨,如C/C++這樣的編譯型保證了性能,但需要更高的開發成本;Python一類的腳本語言雖然降低了開發成本,但需要在性能上作出犧牲。具體的選擇需要看實際的需求。

還有的就是歷史原因了,像在前端裡面能用的基本上也只有Javascript了。

最後, 給大家一個建議,如果你是一個愛閱讀的文藝青年,如果你興趣和時間的話,建議利用空閑時間去學習或者了解一門計算機語言。它必將會給你帶來不一樣的提升!

最後講一個笑話:你們知道祈求代碼不出bug該拜哪個神仙?我:有人說拜雍正:因為雍正專治「八阿哥(bug)」 哈哈

本文為頭條號作者發布,不代表今日頭條立場。


推薦閱讀:

AppleScript類自然語言與非英語語法設計
Python 004-02:字元串
大數據時代對編程有什麼影響?
Python 工匠:編寫條件分支代碼的技巧
Python 005:循環語句

TAG:編程語言 | 編程 | 藝術 | 語言 | 代碼 | 了解 |