導讀 | 對於處在編程世界的咱們來講,如今已經走到了一個轉折點。十年前,程序員們對動態語言趨之若鶩。對咱們中的大部分人來講,動態語言不只使編程變得更加簡單,同時也意味着一種時尚。 |
時至今日,動態語言再也不享有特別的青睞,如今的程序員使用新語言和舊語言的搭配來開發項目。我不由要問,爲了保持自身的競爭力,哪些編程語言是程序員們最須要永久掌握的?
在咱們討論哪些編程語言在將來會吃香這個問題以前,先來看看不一樣編程語言之間的的異同。php
靜態語言 vs. 動態語言html
當咱們說到動態語言時,這個「動態」實際上說的是變量類型。使用動態語言編寫程序的時候,能夠聲明一個變量,在程序運行的過程當中又能夠改變這個變量的類型。與動態語言相對的是靜態語言,或者叫強類型語言。好比C++和Java就是強類型的語言,而JavaScript,PHP和Perl是動態類型的語言。linux
在C++中,聲明變量的時候必須同時指定變量的類型。在程序運行的過程當中,若是試圖去改變這個變量的類型,編譯器就會報錯。這在Java中也是同樣。程序員
可是JavaScript不同,在JavaScript程序運行過程當中能夠改變變量的類型。事實上,在聲明變量的時候就不須要指定這個變量的類型,在使用變量的時候,能夠先把一個整數賦值給這個變量,而後又用一個字符串覆蓋這個整數,這在動態類型的語言中都是容許的。數據庫
儘管動態語言在最近才大行其道,可實際上這個概念在50年前就已經提出來了。編程
垃圾回收機制瀏覽器
隨着動態語言的發展,人們對函數式語言的興趣也愈來愈大。在函數式語言中,函數自己能夠被存儲在變量中,存儲在變量中的函數又能夠做爲參數傳遞給另外的函數。如今的大多數語言都在必定程度上支持函數式編程。好比說C++,C++容許程序員將指針傳遞給函數。JavaScript等一些語言使函數的傳遞變得更加容易。因此,通常認爲C++不是一個真正意義上的函數式語言,而認爲JavaScript是函數式語言,而Haskell通常被認爲是函數式語言的絕佳示例。服務器
垃圾回收機制編程語言
理論上來講,只要你正確書寫代碼,你就不會有任何bugs。這聽起來很美好。可實際上,當你和許多其餘程序員合做完成一個大項目時,有一個bug會常常出現,這就是內存泄露。你定義了一個變量,使用完這個變量以後卻沒有及時回收這部份內存,這時咱們就說發生了內存泄露。若是發生了內存泄露又沒有及時發現,隨着程序運行時間的增長,程序愈來愈大,直到消耗完系統的全部內存,而後系統崩潰。sounds terrible!函數式編程
你可能會說,每次使用變量以後及時釋放內存,內存泄露不就不會發生了?想法是好的,可實際狀況可能比這要複雜的多。好比說,你申請了一個鏈表來存儲數據,這個鏈表被傳遞到另一個函數,這個函數是別人編寫的,在別人編寫的這個函數中,將這個鏈表複製了一份,可是你並不知道,你說是應該刪除這個鏈表仍是繼續保留?基於這種狀況,程序員們想到了一個變通的辦法:將內存回收的工做交給系統來作。當你再也不使用某個變量,系統經過掃描內存找到這個再也不使用的內存,而後主動回收,這就叫作垃圾回收機制。對新開發出來的語言來講,這是一個很是重要的特徵。垃圾回收背後的思想是使編程更加容易,從而讓程序員將精力放在創造偉大的軟件之上。
須要說明的是,確實存在幾種不一樣的垃圾回收機制:一種是系統按期掃描內存,發現那些再也不使用的內存;另一種是系統爲每個變量保留一個tab,一旦發現變量再也不使用,立刻刪除之。從技術上來講,後者並非一種垃圾回收機制,而是「引用計數」,可是達到的效果是一致的。
虛擬機
當Java在20世紀90年代中期橫空出世的時候,人們對它不是直接將代碼編譯成彙編語言這一點十分在乎。和C++相反,Java在編譯的時候先把程序編譯成一個叫字節碼的中間代碼。在運行的時候,系統調用虛擬機執行字節碼,有時候甚至只是將字節碼編譯成彙編代碼。這種編譯方式剛剛出來的時候,程序員們抱怨其速度慢,固然如今已經不成問題。許多語言採用虛擬機的方式運行,好比說前面提到的Java、C#等。如今這種類型的語言在速度上獲得了長足的發展。
編程語言
說了這麼多,那麼程序員到底應該學習哪些語言呢?下面列舉了五種在將來工做中有豐富需求的語言。除此以外,我還列舉了第六種語言,做爲一個「honorable mention」。
JavaScript,HTML5和CSS3:從技術上來講,HTML5並非一種語言,而是一項技術,這項技術和CSS三、JavaScript一塊兒使你可以構建基於Web的應用。你能夠建立運行在瀏覽器中的軟件,這樣作的好處是,你構建的應用將會擁有史無前例的移植性——幾乎能夠在全部的設備上運行,包括手機。幾年前,Facebook開始使用HTML5來構建他們的手機應用,他們超前了這個時代,那時HTML5還不成熟。一段時間後,他們迴歸了傳統模式。過去兩年中,瀏覽器紛紛開始實現最好的HTML5技術,對JavaScript的需求隨之增長。若是想保持你的競爭力,這是一項你必須學習的技術。(在服務器端,不少大公司以Node.js的方式使用JavaScript)。
JavaScript示例:
下面這個例子展現了JavaScript是怎麼將一個函數存儲到變量中,而後又傳遞給另一個函數的。JavaScript方面的資源很是多,權威指南,參考Mozilla Developer Network,新手教程,參考如下網站。
var myfunc = function() { alert(‘hi’); }; setTimeout(myfunc, 2000);
C#:在15年前,Microsoft創造了C#,從那時起,C#不斷髮展壯大。C#的語法相似於Java(同時也相似於C++)。C#編程軟件首選Visual Studio,免費版和付費版都有。
C#是一種強類型的語言,帶有一個虛擬機。最初的發行版對函數式編程的支持很是少,在2006先後,Microsoft爲這門語言加入了一些函數式編程的特徵。和Java同樣,C#也有本身的垃圾回收機制。
C# 示例:
示例定義了一個叫作Program的類,Program包含一個叫作Main的函數。程序從Main函數開始運行。Main函數定義了一個強類型的整形變量x,而且在屏幕上打印x的值。學習C#方面的更多知識,移步Microsoft’s official site。
using System; class Program { static void Main() { int x = 1000; Console.WriteLine(x); } }
Java:Java即將迎來本身的20歲生日,時至今日,Java還在不斷的發展、成熟。在2004年,個人一位同事說這是一門「玩具語言」。經歷了早期的成長之痛後,Java早已不是一門玩具語言:它支撐起了不計其數的網站和數據庫,開源office套件也是用Java開發的。如今來看,Java的前景依舊一片光明。
Java是一種強類型的語言,運行在自帶垃圾回收機制的虛擬機中。儘管不是一種函數式語言,仍是帶有一些函數式編程的特徵。
Java示例:
Java和C#在不少方面相似。在Java程序中,從main函數開始運行。像上面提到的C#示例同樣,在main函數中定義了一個整形的強類型變量x,而且在屏幕上打印x的值。學習更多Java知識,參考official documentation。
public class HelloWorld { public static void main(String[] args) { int x = 1000; System.out.println(x); } }
PHP:PHP是一種易用的通用編程語言。其語法和Java、C++相似。在一個很是簡單的層次上來講,PHP用於在網頁中嵌入可變化的文本內容。好比說,在你的網頁中可能存在打印當前日期的PHP代碼,當你把網頁代碼送到瀏覽器,相應的PHP代碼就會在屏幕上打印出當前日期。PHP能作的遠比在網頁上打印日期多。PHP的類庫可以操做數據庫(幾乎你能想到的任何數據庫都能處理),能進行科學計算,能處理文本。PHP的將來依舊一片光明。
PHP示例:
PHP代碼嵌入在HTML文檔之中。這段PHP代碼將時區設置爲Los Angeles,而後打印出當前時間。瀏覽器解析HTML文檔的時候,PHP代碼部分被代碼的輸出結果所取代。因此最終顯示在屏幕上的是「Hello! The current time is」,後面是當前時間。學習更多PHP相關知識,參考這個網站。
<html>
<body>
Hello! The current time is
<?php
date_default_timezone_set(‘America/Los_Angeles’);
echo (strftime(‘%c’));
?>
</body>
</html>
Swif:這是一門全新的語言,蘋果製造。通常來講我不會推薦人們學習一門全新的語言。可是要知道咱們說的是蘋果,而且如今你已經能使用這門全新的語言來建立iOS應用了。事實上,已經有跡象顯示Swift將會成爲iOS平臺編程的將來。Swift的語法很是像JavaScript,可是沒有分號和括號。
Swift是一種強類型的語言,運行在帶垃圾回收機制的虛擬機中。
Swift示例:
示例中定義了一個叫作str的變量,存儲一個字符串。儘管沒有明確指出str的類型,可是Swift是強類型的,編譯器經過賦值語句右邊的字符串判斷出str是字符串類型。學習Swift的更多知識,參考蘋果官網的相關頁面。
var str = 「Hello, World!」 println (str)
另一種語言
Erlang是愛立信的工程師在1986年發明的編程語言。這原本是通訊領域專用的編程語言,如今已經發展成一門通用的編程語言,而且在基於雲的、高性能的並行計算中大行其道。如今人們使用Erlang編寫出了一些強大的軟件,好比說CouchDB和Riak。這是一門不同凡響的語言,其處理字符串的方式很是奇怪,可是也很容易學習。
咱們應該學習Erlang嗎?雖然須要Erlang的工做很少。可是,若是你真正掌握了這門語言,那你極可能獲得一份極好的工做。這是一個抉擇。在真正掌握這門語言以前,你須要投入大量的精力,一旦你學成,回報也很高。
Erlang 示例:
下面的示例來自這篇博客,這是「hello world」示例的複雜版本。記住,Erlang是一門成熟的語言,若是你真的打算學習這門語言,參考前面提到的博客和這個網站。
-module(hello). -export([start/0]). start() -> spawn(fun() -> loop() end). loop() -> receive hello -> io:format(「Hello, World!~n」), loop(); goodbye -> ok
寫在最後
程序員確定是在哪都能找到工做,但不必定是你特別喜歡的職位,關鍵還在於學習真正能用得着的技術,找到那份屬於你的好工做。學習JavaScript、C#、Java、PHP(甚至包括C++)不會有錯。若是你開始學習Swift,將來的就業形式一片大好。若是你想嘗試一把高性能編程,看看Erlang,儘管須要Erlang的工做可能不會立刻出現。無論你如今在致力於哪一門語言,都要腳踏實地的學到精,這是關鍵。