1. 程式人生 > >伺服器後端的程式語言

伺服器後端的程式語言

本文為 csdn cedricliang 編纂翻譯,如有轉載,請於原文篇頭出標明譯者及原文出處,以示尊重!

原文:http://blog.csdn.net/cedricliang/article/details/48437437

對於那些需要web服務的初創公司裡的大型新專案,我會選擇何種後端程式語言呢?在客戶端側有CSS、html和JavaScript(包括CoffeeScript和TypeScript這類衍生語言)可供選擇。而對於儲存,我曾經用過MySQLRedis,這也基本夠用了。但是選擇伺服器端的語言卻沒那麼容易。我曾經使用了好長時間的PHP,因為在我剛開始程式設計時候,它最簡單,成本也最低。但是時過境遷,現在的我不用再擔心昂貴的伺服器託管費用了。儘管我對web專案的經驗沒那麼多,但我還是想分享自己的一些看法。

定義:後端與安全性

事先宣告一下:我只討論後端。所謂的後端,指的是處理伺服器請求的資料接入層。它需要肩負著處理很多請求(大於100請求每秒)和快速處理請求(平均處理時間小於300ms)的職責。而那些可以被提前計算,或者是不需要直接展示給客戶端的繁重計算的工作,則並不適合用後端進行處理。這些工作可以通過其他的語言通過另外的方式實現。後端也並不直接處理對使用者的展現,這是前端應該做的。但是後端開發者,應該對如何給前端提供資料有著清晰的認知。我所見過最清晰的方式就是在前後端之間使用純Restful API進行互動。

後端語言也應該很容易校驗前端發來的資料,方便的連線資料庫,以及從檔案系統儲存或是獲取檔案。

在接下來的篇幅中,我會描述語言的安全性。但這並不意味著你不能用不安全的語言寫出安全的程式碼,而是不同語言編譯器能夠保證你的程式碼不出現某些特定的bug。舉例而言,C的編譯器並不進行邊界檢查,因此它是一種非常不安全的語言。而那些可以被自動工具檢查出來的錯誤包括:

  • 語法錯誤
  • 讀越界
  • 記憶體溢位(C/C++並不檢查,但在java中幾乎不可能)
  • 未被使用的變數
  • 型別問題:這個問題略微有些模稜兩可,因為在每種語言你都能寫出強型別的程式碼。但是在一些語言中,型別更為常見。有些語言同樣也使用型別系統來發現錯誤。舉例而言,php從這個意義上來說十分不安全。連123=="123ab"都可以為true。 Python稍微安全一點,但你卻可以隨意的返回值。Java相比之下安全多了。Haskel從這個層面來說更加安全,因為它的強型別系統會拒絕執行任何無意義的表示式,同時也不會進行任何形式的強制轉換。

在程式的執行時,也有一些錯誤會被發現。而在不同的語言中,對這種執行時錯誤的處理完全不同。舉例來說,C和C++會默默的失敗。(就像這個連結裡說的) 這當然是很不好的。相比C/C++對越界錯誤的忽略,Rust則會發出明顯的提示。(之前的heartbleed是一個典型的例子,可以看看這篇文章

當然了,所有這些問題都可以通過良好的測試來發現。但是,能夠被自動化的過程越多,當你測試不那麼充分的時候,可能發生的意外也就越少。

Java

Java是跑在Java虛擬機器的面向物件的語言。對於商業網站而言,java是使用最廣泛的語言。為什麼呢?

  • java比較成熟:1995年就已出現 
    • 很多大學都會教授Java,很多人也因此至少對它一知半解。所以公司尋找Java的開發者也並不困難。儘管那些號稱瞭解Java的人可能都是泛泛之輩。
    • Java是由Oracle開發的。因此當遇到的問題的時候,可以向他們尋求技術支援。

上述是Java的優點,那麼它的缺點呢:

  • 非常笨拙的語法。為了完成一個功能,你可能要打很多字。。當然自動補全是必不可少的,但是要打的東西還是不少。程式碼越多,維護起來成本越高。
  • 要把一個工具跑起來難度很高
  • 那些被設計用來擴充套件的super-abstract結構,事實上可能永遠不會被用到。
  • 因為沒有指標的存在,Java不能訪問越界的陣列,所以比C/C++安全一些。那些煩惱你的記憶體溢位也幾乎不存在了。但是付出的代價就是,語法更加的複雜,而且你如果一不小心,就會掉入Java中得不安全的陷阱。
  • 速度和記憶體使用量:Java在速度上並不突出,而在記憶體使用上則是相當的多。但是這並沒給它的大範圍使用帶來太多的問題。感興趣的可以看看這篇文章

對於Java還可以參考以下文章:

Javascript: Node.js

Node.js自從2009年釋出一下,使用十分廣泛。Node.js具有非同步,事件驅動以及可擴充套件的特性。Node.js應用是由JavaScript開發的,因此它具有JavaScript的所有優點:

  • 享受到了JavaScript V8引擎的好處
  • 靈活而輕量級的語法
  • 跟Java一樣,JavaScript出現在1995年。所以語言本身發展歷史很長,相對穩定。 
    • 很多開發者都或多或少的瞭解一些JavaScript
    • 生態系統很成熟 

還有什麼要補充的?

  • JavaScript不太安全。即使很小的語法錯誤也只會在執行的時候暴露出來。因此單元測試十分重要。
  • Node.js被LinkedIn,Yahoo!, Uber, Paypal使用
  • 有很多人從Node.js轉向了Go 1 2 3

參考:

Go

Go是由Google開發的,靜態型別的編譯語言。它直到2009年才出現,十分短暫。

  • Go提供了那些你進行web開發需要的基本工具 
  • 有不錯的教程和一些web開發的材料
  • 有一些任務在Go語言中超過預期的複雜,比如排序,詳見link
  • Go有一些跟其他語言完全不同的diffuser,比如如果你想宣告一個public方法,那這個方法的第一個字母一定要是大寫的。還有未被使用的變數會導致編譯錯誤。

參考:

C

C#是由微軟開發的具有靜態型別的編譯語言。但是它卻有很多動態特性。 它出現在2000年。而針對web開發的框架ASP.NET直到2002年才釋出。

C#的生態系統包括:

我對C#/ASP.NET的理解並不深入,因此無法更詳盡的分析它的優略。

Python

python是現在在用的最古老的語言之一。它最早出現於1991年。Python是具有動態的型別,面向物件的解釋性語言。而且它具有函式程式設計的特性。 
儘管我曾經在很多專案中使用過Python,但並不包括web專案。因此那些重要的工具和框架可能會被遺漏:

  • 生態系統: 
  • 有些使用Python的開發者切換到了Go 1 2
  • Flask和Django配合Pypy(原始碼), 效能會更高。
  • 那些使用Python的成熟公司: 

我認為Python最主要的優勢在於程式碼容易撰寫,而且可讀性很高。我對Python顯然是有偏愛的,而且我堅信很多人和我有著同樣的觀點。

PHP

PHP是動態型別的伺服器端語言,它在1995年被推出。

PHP最大的優勢是學習門檻低。它基本可以在任何地方被執行,託管和非常簡單。Wikipedia使用的就是PHP,所以很明顯使用PHP來建立可用的大型網站是可行的。 
這裡寫圖片描述

Hack

Hack是由Facebook在2014年開發的程式語言。它是PHP的變體。它與PHP最主要的不同在於:

  • 函式引數和返回值是指定型別的
  • Hack並不完全支援PHP的一些特性source,比如goto、可變變數、字串自增,這有時候也挺好的。

參考:

Rust

Rust是很安全的語言,但是對於它在生產環境的使用,仍有疑慮。

參考:

其他

Ruby with Rails: 我知道它應用廣泛,但是我對Ruby的瞭解並不充分。Ruby的語法與Python類似。

參考

結論

仔細想來,對我來說以下的語言更適合我做後端:

  • Go:很快,而且是編譯型的
  • node.js: 很好的可擴充套件性
  • Python: 這是我最瞭解的語言。除此之外,它有非常清晰的語法,很好的社群開發的變法風格,以及易讀性。

對我來說不適合的語言:

  • PHP: 因為語言的不一致,導致建立穩定的後端沒那麼簡單。
  • C#: 這個語言太以微軟為中心了
  • Java:語法有點拖沓,成本高。

其他語言可能也是很好的選擇,只是我知之甚少。我對rust在後端使用的可行性非常好奇。Hack語言非常年輕,讓我們對它未來的發展拭目以待。