把編程語言比喻成車:
Ada 是輛丑到極點但是永遠不會出故障的坦克。
C 是輛賽車,它能跑得超乎想像得快,不過每跑個 50 英里就會拋錨。
Cobol 號稱是輛車,不過沒有哪個有自尊心的駕駛員肯承認曾經開過。
C# 是輛競爭模式的家庭旅行車。一旦你開過它,你就不會再用其他競品廠商的產品了。
C++ 是輛大馬力版本的 C 型賽車,它額外提供了成打的特性,而且每跑 250 英里才會拋錨,不過當它真出問題的時候,沒有人能找到究竟是哪兒壞了。
Eiffel 是輛內置了法國口音駕駛說明的汽車。他會幫你快速地找到錯誤並從中學到東西,不過你要是敢跟他爭論的話,他會罵你然後把你從車里扔出去。[來自 Daniel Prager ,稍有修改]
Erlang 是一個車隊,它們會互相協作把你送到任何你想去的地方。想要每隻腳各自操縱一輛車還是需要一些練習的,不過一旦學會了之後你就可以駕駛著它們通往其他方式難以企及的地方了。還有,你用了那麼多輛車,所以就算有幾輛壞掉也沒什麼可擔心的。
Forth 是你親手用套件組裝出來的車。你這輛車不論長相還是功能都沒必要和別人的一樣。不過,Forth 型號的車只能倒著走。
[Digg.com 網站上的評論,來自 256byteram(我忍不住要把它加上):]
FORTH LOVE IF HONK THEN !(譯註:抱歉我實在不知道這句話是啥意思……)
Fortran 是輛非常原始的車。它能跑得很快,前提是你要始終在完全筆直的道路上開。據說學開 Fortran 型汽車會導致你再也沒法學開其他型號的汽車了。
java
Java 是輛家庭旅行車。它駕駛起來很容易,開起來速度也不會太快,不至於傷到你自己。
版本1:Haskell 是輛設計極端優雅漂亮的車,傳聞它能開到非常極端的地形中去。當你試圖駕駛它的時候,它並不是真的沿著道路在前進的;實際上,它是不斷把自己和道路進行復制,每次成功復制之後,車在路上都會比上一次更遠一點。應該還是有可能按照傳統的方式來駕駛它的,不過你的數學能力不足以找出這個辦法來。
版本2:Haskell 並不是輛真的車,它是一個抽象的機器,能夠詳細地告訴你駕駛這個過程應該是什麼樣子的,如果你願意的話。你必須把這個抽象的機器放到另一台實際的機器裡面才能開動它,別問這個實際的機器是怎麼運行的。還有一種方法,你可以用多台抽象的機器造出另一台抽象的機器,然後把它交給那台實際的機器,這樣就能一個接一個地完成你的旅途了。[Monadic 的版本]
版本1:Lisp 看起來像一輛車,不過經過足夠的改裝,就能把它變成非常有效的一架飛機或一艘潛艇。
版本2:一開始它看起來一點兒都不像一輛車,不過時不時地你也能看到有人在開著它轉悠。終於有一天你決定多了解一下它,然後你意識到它其實是一輛能造出更多汽車的汽車。你把這個發現告訴了朋友,不過他們都大笑著說這些車看起來太奇怪了。至今你仍在車庫里留著一輛,期待著哪天能把它開上路去。[來自 Paul Tanimoto]
Mathematica 是輛設計得很好的車,它從 Lisp 型汽車那裡借鑒了大量的東西,卻連一點兒應得的贊揚都不給它。它能通過方程計算出到達目的地最高效的路徑,只不過這要花上一大筆錢。
是輛設計給新手用的短途旅行車,通常都是開往那些 Mathmatica 型汽車常去的地方。在那些地方這車開起來非常舒服,不過只要你偏離了路線,哪怕只有一點點,它就會變得非常難以駕馭,以致於很多勢利的司機根本就不承認它是一輛車。
Ocaml 是輛非常性感的歐洲車。它不像 C 那麼快,但它從不出故障,所以結果你反而會花更短的時間到達目的地。不過因為這是法國,所有的控制裝置都不在它們平時該在的地方。
Perl 應該是輛挺酷的車,不過駕駛員手冊卻難以理解。另外,就算你能找到方法去駕駛一輛 Perl 型號的車,你也開不起來別人的 Perl 型汽車。
PHP 是輛熱狗車(Oscar Mayer Wienermobile),它非常古怪、又難以駕馭,但是所有人卻還是想開它。[來自 digg.com 網站的 CosmicJustice]
版本1:Prolog 是全自動的:你告訴它你的目的地是什麼樣子的,然後剩下的駕駛工作它就全搞定了。[Paul Graham附加的:]不過,大多數情況下,確認目的地所花的工夫,和你直接開過去也差不多了。
版本2:Prolog 這輛車上裝了一個獨特的試錯型 GPS 系統。在通往目的地的路上,它會一直往前開,如果走到死胡同了,它就調頭回來再試試別的路,如此不斷往復,一直到目的地為止。[我忘了是誰建議的這一條]
python 是輛非常棒的給初學者用的車,就算沒有駕照也能開。除非你想開得超級快,或者想開去很危險的地方,否則你可能永遠都用不到別的車。
Ruby 這輛車是因為一次 Perl、Python 和 Smalltalk 三車相撞事故產生的。一個日本的機師找到了這些車的碎片然後拼成了一輛車,很多司機都覺得這比那三輛車加在一起還要好。不過也有些司機會發牢騷說 Ruby 型汽車的好多控制器都是重復的、甚至有三份,而這些重復的控制器在某些特別的情況下又稍有不同,這會讓這車開起來更麻煩。據傳說重新設計的工作已經在進行中了。
Smalltalk 是輛小型汽車,原本是設計給那些打算學駕駛的人用的,不過因為它設計得太棒了,即使那些有經驗的老司機都喜歡開它。它速度並沒有很快,不過你可以把它的任何一個零部件拿下來改造改造,讓它更符合你的期待。古怪的事情是,你其實並沒有真正地駕駛它,你只是發了條消息讓它去什麼地方,然後它要麼就開過去了,要麼就告訴你它不懂你在說啥。
版本1:匯編就只是個發動機。你得自己把車子造出來,還得在它跑的時候手動給它加油。不過只要你足夠小心,它就能像來自地獄的蝙蝠(a bat out of hell)一樣飛速前進。
版本2:匯編:你自己就是那輛車。
如果編程語言是種武器:
C 語言是 M1 式加蘭德步槍,很老但可靠。
C++是雙截棍,揮舞起來很強悍,很吸引人,但需要你多年的磨練來掌握,很多人希望改用別的武器。
Java 是 M240 通用彈夾式自動機槍,有時它的彈夾是圓的,但有時候不是,如果不是,當你開火時,會遇到 NullPointerException 問題,槍就會爆炸,你被炸死。
Scala 是 M240 通用機槍的變種,但它的使用手冊是用一種看不懂的方言寫的,很多人懷疑那隻是一些夢話。
JavaScript 是一把寶劍,但沒有劍柄。
Go 語言是一種自製的「if err != nil」發令槍,每一次發射後,你都必須要檢查它是否真的發射了。
Rust 語言是一種 3D 列印出的槍。將來也許真的能派上用場。
bash 是一個十分礙手的錘子,你掄起它時會發現所有東西看起來都像釘子,尤其是你的指頭。
Ruby 是一把外嵌紅寶石的寶刀,人們使用它通常是因為看起來很炫。
PHP 是水管子,你通常會把它的一段接到汽車的排氣管,另一端插進車窗里,然後你坐進車里,開動引擎。
Mathematica 是一種地球低軌道粒子大炮,它也許能夠干出很神奇的事情,但只有付得起費用的人才能使用它。
C#是一種強悍的激光大炮,架在一頭驢子上,如果從驢子上卸下來,它好像就發不出激光。
Prolog 語言是一種人工智慧武器,你告訴它要做什麼,它會照做不誤,但之後,它會弄幾個終結者出來,燒掉你的房子。
Lisp 語言是一把剃須刀,有很多款式。只有尋求刺激和危險的人才會使用它。
希望可以幫到您,謝謝!
㈡ Scala 是一門怎樣的語言,具有哪些優勢
曾經有人問Java的創始人高斯林這樣一個問題,「除了Java語言以外,您現在還使用JVM平台上的哪種編程語言?」他毫不猶豫的說是Scala。
Scala到底是什麼?在目前眾多的JVM語言當中,Scala無疑是最引人注意的語言之一。Scala是一個靜態語言,更適合大型工程項目,Scala直接編譯成Java位元組碼,性能接近Java。Scala是一個多範式的語言,你可以混合使用函數式和面向對象編程,混合使用可變類和不變類,混合使用Actor和傳統的Java並發庫。
短短一個月的時間,Scala於本月沖進了TIOBE的前五十名。一個 Twitter 的開發人員說過,Scala 將會成為現代 Web2.0 的發起語言。LinkedIn 也用這種語言。同樣許多其他大的公司如 Sony Picture, EDF, SAP 也開始使用這種語言。為什麼Scala發展這么迅猛,可以獲得如此熱烈的社區支持。
曾冠東還表示,Scala不是Java的殺手,它無法取代Java的地位,也突破不了JVM的限制、Java實現不了的功能它也實現不了。我們可以將Scala形象的理解成大量語法糖的Java。
Scala 開發團隊發布了最新的2.9.2穩定版本,Scala 語言的特性有許多,例如高階函數和對象、抽象類型綁定,actor 使得函數在 Scala 中能是一個子類成為可能,Scala 中的設計模式使得面向對象和函數編程無縫結合。Akka 是一個用 Scala 編寫的庫,用於簡化編寫容錯的、高可伸縮性的 Java 和 Scala 的 Actor 模型應用。它已經成功運用在電信行業。Spark 是一種可擴展的數據分析平台,它整合了內存計算的基元,因此,相對於 Hadoop 的集群存儲方法,它在性能方面更具優勢。Spark 是在 Scala 語言中實現的,並且利用了該語言,為數據處理提供了獨一無二的環境。Scala 編譯器可以生成位元組碼,直接運行在使用JVM上。該語言(它實際上代表了可擴展語言)被定義為可直接集成到語言中的簡單擴展。
Scala作為一門靜態語言,它的主要特性有哪些?
· Scala是面向對象的
Scala是一個純面向對象語言,在某種意義上來講所有數值都是對象。對象的類型和行為是由class和trait來描述的。Class的抽象可由子類化和一種靈活的基於mixin的組合機制(它可作為多重繼承的簡單替代方案)來擴展。
· Scala是函數式的
Scala還是一個函數式語言,在某種意義上來講所有函數都是數值。Scala為定義匿名函數提供了一種輕量級的語法,它支持高階(higher-order)函數、允許函數嵌套、支持局部套用(currying)。Scala的case類及其內置支持的模式匹配模型代數類型在許多函數式編程語言中都被使用。
· Scala是靜態類型的
Scala配備了一套富有表現力的類型系統,該抽象概念以一種安全的和一致的方式被使用。
· Scala是可擴展的
Scala的設計承認了實踐事實,領域特定應用開發通常需要領域特定語言擴展。Scala提供了一個獨特的語言組合機制,這可以更加容易地以類庫的形式增加新的語言結構:
任何方式可以被用作中綴(infix)或後綴(postfix)操作符閉包按照所期望的類型(目標類型)自動地被構造
兩者結合使用可方便地定義新語句,無需擴展語法,也無需使用類似宏的元編程工具。
· Scala可與Java和.NET進行互操作
Scala設計時就考慮了與流行編程環境良好交互,如Java 2運行時環境(JRE)和 .NET框架(CLR)。特別是與主流面向對象語言,如Java和C#盡量無縫交互。Scala有像Java和C#一樣的編譯模型(獨立編譯,動態裝載類),允許訪問成千上萬的高質量類庫。
在並發性方面,與 Scala 在 .NET 領域中的姐妹語言 F# 相似,Scala 是針對 「並發性問題」 的解決方案之一,讓開發人員能夠更加輕松地專注於問題的實質,而不用考慮並發編程的低級細節。Actor 編程模式讓高度並行應用程序的開發更加簡單。Scala把Erlang風格的基於actor的並發帶進了JVM。我們可以利用Scala的actor模型在JVM上設計具伸縮性的並發應用程序,以自動獲得多核心處理器帶來的優勢,而不必依照復雜的Java線程模型來編寫程序。Scala 為並發性提供了兩種級別的支持,這與其他與 Java 相關的主題極為類似:
首先,對底層庫的完全訪問(比如說 java.util.concurrent)以及對 「傳統」 Java 並發性語義的支持(比如說監控程序和wait()/notifyAll())。其次,這些基本機制上面有一個抽象層
Scala 提供了在穩定的高性能平台(Java 虛擬機)上生成的能力同時也是一門敏捷性語言。這一類型的語言也有其他的選擇,例如 Jython, JRuby, Groovy 和 Clojure, 但是這些都是運行在 JVM 上的動態類型語言。Open Class 的效果讓大家會覺得Scala是動態語言,但它是選擇隱式轉換來實現的,這也正好證明了Scala是靜態語言。隱式轉換(Implicit conversion)使 Scala 具有類型安全性,正如擴展方法(extension method)之於 C#,開放類(open class)之於 ruby。即:向未曾定義的類型添加方法(如字元串、列表、整數)。這是使得 Scala 符合 DSL(特定領域語言)模型的特性之一。
Scala結合了面向對象和函數編程的優勢,函數編程的一個好處就是你能夠像運用一個數據那樣運用函數,可以用來定義真正高層級的庫,或者去定義新的領域特殊語言(DSL)。
在談及Java與Scala的對比時,曾冠東表示,Scala能調用絕大部分的Java,而Java調用Scala獨有的東西會比較難。Java 擁有非常強的概念規范,因此任何一個 Java 程序之間具有非常多的相似之處,並且這樣能夠方便的進行程序員交替。但是 Scala 並沒有這樣的統一性,因為這是一門很有表現力的語言。現場曾冠東為我們演示了實際案例,如下圖所示:
正所謂,金無足赤,人無完人。Scala對二進制不兼容,語法也越來越復雜,不能突破Bytecode的限制、編譯速度有所緩慢。當它被廣泛用於單元測試、開發工具、Socket開發、以及面對多核挑戰的並發應用。總而言之,Scala是一種函數式面向對象語言,它融匯了許多前所未有的特性,而同時又運行於JVM之上。正如JRuby 創建者之一Charles Nutter 所宣稱的那樣Scala就是 Java 王位的合法繼承人。隨著開發者對Scala的興趣日增,以及越來越多的工具支持,無疑Scala語言將成為廣大軟體工程師手上一件必不可少的工具。更多精彩內容,請關注專題:http://www.it168.com/remen/qcon/
㈢ Scala語言的主要應用領域與作用
Scala的特性
1.面向對象特性
Scala是一種純面向對象的語言,每一個值都是對象。對象的數據類型以及行為由類和特徵(Trait)描述。類抽象機制的擴展有兩種途徑。一種途徑是子類繼承,另一種途徑是靈活的混入(Mixin)機制。這兩種途徑能避免多重繼承的種種問題。
2.函數式編程
Scala也是一種函數式語言,其函數也能當成值來使用。Scala提供了輕量級的語法用以定義匿名函數,支持高階函數,允許嵌套多層函數,並支持柯里化。Scala的CaseClass及其內置的模式匹配相當於函數式編程語言中常用的代數類型(AlgebraicType)。
更進一步,程序員可以利用Scala的模式匹配,編寫類似正則表達式的代碼處理XML數據。在這些情形中,順序容器的推導式(comprehension)功能對編寫公式化查詢非常有用。
由於JVM不支持尾部遞歸,Scala也不能完全支持尾部遞歸優化。不過,在簡單的情況下,Scala編譯器可以把尾部遞歸優化成循環。
4.靜態類型
Scala是具備類型系統,通過編譯時的檢查,保證代碼的安全性和一致性。類型系統具體支持以下特性:
泛型類,型變注釋(VarianceAnnotation),類型繼承結構的上限和下限,把類別和抽象類型作為對象成員,復合類型,引用自己時顯式指定類型,視圖,多態方法。
5.擴展性
Scala的設計承認一個事實,即在實踐中,某個領域特定的應用程序開發往往需要特定於該領域的語言擴展。Scala提供了許多獨特的語言機制,可以以庫的形式輕易無縫添加新的語言結構:
任何方法可用作前綴或後綴操作符,可以根據預期類型自動構造閉包。聯合使用以上兩個特性,使你可以定義新的語句而無須擴展語法也無須使用宏之類的元編程特性。
5.使用Scala的框架
Lift是一個開源的Web應用框架,旨在提供類似RubyonRails的東西。因為Lift使用了Scala,所以Lift應用程序可以使用所有的Java庫和Web容器。
scala語言主要應用領域
cala運行於JVM之上,並且它可以訪問任何的java類庫並且與java框架進行互操作,scala也大量重用了java類型和類庫。
大數據的開發語言是Scala的原因:
1:大數據的本身是計算數據,而Scala即有面向對象組織項目工程的能力,又有計算數據的功能。
2:現在大數據事實上的計算標准框架Spark,它是用Scala開發的,因為計算數據,Scala它是函數式編程,它實現演算法非常簡潔優雅。
例:kafka,它是一個消息中間件,如果外部數據要流進大數據中心,我們一般都要用kafka作適配器,那如果大數據中心的數據流到外部,也是用kafka(如Spark計算的數據要交給HBASE或MySql,期間我們都會用kafka),很多的大數據組件都是用的Scala編寫的,所以,如果你想成為一個較高級的大數據開發高手,你一定要掌握Scala。
㈣ Scala 是一門怎樣的語言,具有哪些優缺點
以前在這個版塊也答過關於Scala的問題,但那更多的是知識普及,而沒有談Scala是什麼,做什麼,以及有怎樣的特點。
Scala可怕的地方在於人人都能對它說上一二,但是不一定每個人都能明白。查看這個版塊的帖子,有人把它當做Java的延伸版(一個UPenn賓大的學生Justin Kim ——此人目前在沃頓混得風生水起,當著我的面說Scala是在JVM上的腳本語言),有人把它當做JVM上的C++,有人覺得這是面對對象語言和函數語言的簡單混合,有人覺得這就是Haskell,而且也還不如Haskell強。對Scala的偏見(或者是錯誤的見地)達到了很高的地步,Martin Odersky馬丁·奧德斯基(Scala的發明者,EPFL教授)在今年夏天的Scala Day舊金山大會上發出了這張著名的玩笑照片:
gt;
這個圖片上的翻譯是:「Scala唯一的作用是將人引向Haskell」(原諒我沒法完全直譯)。馬丁·奧德斯基以此作為一個笑話,說他該把Scala改一下名字,叫做Hascalator,還請人設計了一個Logo。
不同的語言有不同的特點,同時也帶來不同的優勢。如果不能理解Scala的特點,就不可能知道如何運用Scala,以及發揮其最大的優勢。一些語言有很顯而易見的優勢,也很容易理解,比如Python,Python的哲學(Zen of Python PEP 20 -- The Zen of Python),我很早的時候曾經覺得有道理,尤其是One way to do it(一種方法做一件事情),理由是對任何任務,雖然可以採用很多方法,但總有最好的一種方法,通過在語言或者哲學層面這樣定義後,能簡化程序員的任務,從而達到提高效率的方法。但經過一段時間的思考後,我突然發現Python其實並不是「一種方法做一件事」的哲學,而是「一種方法做一百萬件事情」的哲學:極其有限的數據結構(只有四個: List, Tuple, Dictionary, Sets),以及不能查看時間復雜度的訪問方法,比如鼓勵人們使用for x in list。
這種處理方式能達到Python最初的打算:發明一種每個人都能使用的簡易語言,但是對於追求速度和效率的程序員而言,這幾乎是略帶噩夢性質的。當然,這不是說Python很慢,通過各種優化(比如NumPy/SciPy中的),以及Cython這樣的將Python直接翻譯為C/C++語言又重新通過C_Mole方式讀回Python環境的編譯器,性能可以得到不少提升,但是仍舊,Python並不追求快。
再舉一個語言的例子:Java。Java的特性或者優勢何在?Java的第一個優勢在於它是第一個系統提供模塊化(mole)設計的語言(在此之前有Smalltalk存在,該貨是OOP的鼻祖)。在Java之前,炒程序員魷魚是很困難的事情,那些C/C++程序員,以及而且尤其是那些Lisp程序員,一旦炒掉他們,新來的人沒有十天半個月,甚至半年,是不可能搞懂前任人士的代碼的。每個人的代碼有自己的邏輯,自己的思路,寫上個數萬行任誰來看都頭疼。這也是為什麼Paul Graham保羅·格雷厄姆(寫了《黑客與畫家》)講他給雅虎做了一個用Lisp寫成的在線商店的案例,在他離開後,雅虎根本沒法維護他寫的代碼,因為數萬行Lisp沒人能弄得很清楚。
Java的模塊化,給企業、大公司帶來了第一道曙光,模塊化之後,這些公司不再給程序員一整個任務,而是一大塊任務的一小塊。介面一定義,虛擬類一定義,換誰上都可以,管你是保羅·格雷厄姆這樣的明星程序員,還是一個新來的大學生,程序員不聽話就直接開除,反正模塊化之後,開除程序員的成本大大降低,這也是為什麼谷歌、甲骨文(這貨最後收購了Java)一類的公司大規模的推崇Java,還一度提出了模塊化人事管理的理念(把人當模塊化的積木一樣隨時移進移出)。
過度企業化後,這延展出了Java的第二個特性,束縛手腳。保羅·格雷厄姆在《黑客與畫家》中寫道,Java屬於B&D(捆綁與束縛)類型的語言。為何束縛手腳?因為要讓新手和明星程序員寫出類似質量的代碼,盡可能的抹消人的才華對程序的影響。不同於C/C++,老手和新手寫出的Java代碼不會有上百倍的耗時差距。但同樣也導致了Java的一個弱點——不容易優化。很多優化Java代碼的程序員必須要對JVM(虛擬機)進行優化,實際上增大了很多任務難度。
通過Python和Java這兩個語言的優缺點,返回來看Scala,就能瞬間明白Scala的定位了。
首先,Scala不把程序員當傻子。當馬丁·奧德斯基宣布Scala 2.12將要簡化語法,推出Scala "Don Giovanni"項目的時候,在視頻中說的很清楚:「Scala現在是為聰明人創造的,以後也是為聰明人服務的。」所以不同於Python讓程序員用一種方法做所有事情,Scala提供一整套工具,讓程序員自由選擇,無論是mutable數據結構,immutable數據結構,並行(parallel)數據結構。然後在這些選擇中,Scala再針對他們進行演算法層面的特殊優化。Scala相信程序員的聰明才智,讓程序員自行選擇合適的結構,以針對變化萬千的任務需求,這點是Scala做得極好的地方。
再者,有人會說immutable數據結構佔用內存,或者速度很慢。這是真的,但這不是Scala的錯,而是這些結構就是這樣定義的。這里講的是Scala集合的運行速度,是一個來自Goldman Sachs的程序員講他們為Java寫的集合庫(GSCollection)速度和內存消耗,但同時比較了gs-collection(goldmansachs/gs-collections · GitHub),Java,和Scala庫的速度。最後Scala的可變集合mutable原生庫完爆Java,和gs-collection基本持平。
Scala的第二個優勢,相較於Java而言,則是相信程序員的優化能力。在Scala with Style講話中(),馬丁·奧德斯基說:「很多程序員會告訴我,他們一般會重構他們的Scala代碼兩三次,甚至三四次。」這聽起來似乎非常的沒有效率,但Scala就是這樣的語言,每一次重構,代碼的性能或者是可讀性都會有極高的提升。
之前就有人提到過,Scala新手和老手寫出來的代碼完全會呈現兩種不同的風格,甚至新人根本不能讀懂有經驗的Scala程序員所寫的代碼,有人於是戲稱:「太好了,這樣的話我們部門的實習生就不能亂碰我寫的代碼啦!」但其實不僅風格不同,執行效率差距也一定是巨大的。Scala提供一整套工具,但是要明白什麼時候用拿一種工具,哪些演算法能夠隨意調用,哪些演算法不能,這一定要依靠經驗、研究和學習以及對源代碼的理解才能得知。最簡單的例子,Scala的foreach()方法是高度優化過了的(尤其針對Range結構和Vector結構),但是fold()就不一定了。或者當受到誘惑想用zipWithIndex()的時候,一定要明白這是兩次循環,最好改用Vector(...).indices.foreach()的方法,或者用.view來推遲執行。
像這樣的地方還有很多。所以在這個層面上來講,簡直和C++非常的相似。從另外一個層面來講,不僅僅是要理解語言層面的優化,Scala作為一個社區而言,是非常追求運行速度的。Ruby社區就完全不同了,Ruby曾經是推特的主要語言。推特的團隊找到了Ruby團隊,說,你們能不能讓Ruby運行的快一點,我們有這個這個和這個建議。Ruby直接把這些建議拒絕了,因為它們會增加語言復雜度,讓Ruby不能繼續做一個「fun」(好玩)的語言。而Python直接就立志做一個「Simple」(簡單)的語言了。於是推特只好將後台換做Scala和Java的結合。有一位在推特工作的知乎友人在我的一個回答下留言說推特換用Scala後,TypeSafe(Scala的母公司)還送去了一個蛋糕。
為了追求速度,Scala社區是絕對不會管所謂的「簡單」或者是「好玩」,怎樣有效率就怎樣弄。與其專注於JVM的改進,Scala社區大部分在編譯器上下功夫,比如很著名的Miniboxing(Miniboxing),這是一個編譯器增進器。Miniboxing做的是什麼呢?只做一件事:防止auto-boxing和auto-unboxing。所有的泛型,尤其是原生類泛型(Primitive Types),諸如Int、Double等等,在進行各種操作的時候會自動取出和裝回它們所屬的類中去——這個我解釋的不太好,但是可以看這里(Java 自動裝箱與拆箱(Autoboxing and unboxing))。
Miniboxing這樣的插件可以讓所有的原生類泛型再也不用自動裝拆箱,從而將Scala的運行速度提升1.5倍到22倍()。當然這樣的東西可不是白來的,這是馬丁·奧德斯基的PhD博士學生做的一個研究項目,然後為OOPSLA寫了一篇論文(),所以怪不得這玩意Scala可以有,但其他語言想要有都沒有。
另一個Scala的很大優勢就是所謂的Macro——宏。宏本身作為元編程而言,其實和運行速度是沒有什麼太大關系的,反而,因為對反射(Reflect)的利用,可能會影響到速度。但Scala社區對宏的理解顯然和最初的設計理念有偏差。因為Scala本身是沒有傳統意義的循環的(for-loop),所以很多時候循環必須利用while或者foreach。但是部分追求效率的Scala程序員們利用宏為Scala寫了一個傳統循環,叫做cfor,被收錄在Spire(non/spire · GitHub)數學計算庫中。cfor的寫法如下:
import spire.syntax.cfor._// print numbers 1 through 10cfor(0)(_ < 10, _ + 1) { i =>
println(i)}
而這玩意運行效率如何呢?文章中做了一次測評,將cfor和zip寫的一個演算法作比較——在公布結果之前,我想說的是,zip並不是一個高度優化的方法,所以本身就慢很多,cfor用了26.1毫秒運行,zip方法用了7.4 秒運行,這幾乎是284倍的速度差距。
通過這兩點,Scala的一個優勢就很明顯了——多樣化。當需要寫簡單的代碼,像Python一樣當腳本語言使用時,Scala提供大量的原生方法和數據結構,可以很輕松的寫出比較復雜的操作。但當需要速度的時候,又可以通過重構來獲取數十倍或者上百倍的速度提升。通過Miniboxing一類的編譯器增強器,Scala在某些操作的速度是必定超過Java的。
Scala的第二個優勢就是——一幫勤勞勇敢的PhD博士生。二十一世紀的程序語言和二十世紀的程序語言已經不能比擬了。那個年代的普通人(甚至是學生)還能任意發明一下語言,稍微把編譯器優化幾次就能上得了廳堂(比如那一大堆Lisp方言),到了這個年代,編譯技術已經達到了很復雜的程度(虛擬機技術也是如此),優化和語義理解,程序語言的定義與延展,再也不是隨便任何人都能搞定的工作了。作為編程語言方面的教授,馬丁·奧德斯基不斷的將最前沿的學術界成果轉移到Scala這個語言中,還讓他的博士學生發展出新的,讓語言運行得更快的方法,這些都是其他語言,尤其是Python、Ruby、甚至是Go都沒有的優勢。
當然,說了這么多,總會有人說了,Scala如果像C++一樣難,又追求速度的話,為什麼不直接去學C++,原因很簡單——現在有很多在JVM上面寫成的軟體啊!大家又不是Haskell程序員,壓根不打算一切自己寫吶。
㈤ scala與python區別有哪些
Scala是一門多範式的編程語言,一種類似java的編程語言,設計初衷是實現可伸縮的語言、並集成面向對象編程和函數式編程的各種特性。
Python是一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言。Python的設計具有很強的可讀性,相比其他語言經常使用英文關鍵字,其他語言的一些標點符號,它具有比其他語言更有特色語法結構。
scala與Python的區別:
1、性能對比
由於Scala是基於JVM的數據分析和處理,Scala比Python快10倍。當編寫Python代碼用且調用Spark庫時,性能是平庸的,但如果程序涉及到比Python編碼還要多的處理時,則要比Scala等效代碼慢得多。Python解釋器PyPy內置一個JIT(及時)編譯器,它很快,但它不提供各種Python C擴展支持。在這樣的情況下,對庫的C擴展CPython解釋器優於PyPy解釋器。
使用Python在Spark的性能開銷超過Scala,但其重要性取決於您在做什麼。當內核數量較少時,Scala比Python快。隨著核數的增加,Scala的性能優勢開始縮小。
當大量的處理其工作時,性能不是選擇編程語言的主要驅動因素。然而,當有重要的處理邏輯時,性能是一個主要因素,Scala絕對比Python提供更好的性能,用於針對Spark程序。
相關推薦:《Python基礎教程》
2、學習曲線
在用Scala語言編寫Spark程序時有幾個語法糖,所以大數據專業人員在學習Spark時需要非常小心。程序員可能會發現Scala語法有時會讓人發瘋。Scala中的一些庫很難定義隨機的符號運算符,而這些代碼可以由沒有經驗的程序員理解。在使用Scala時,開發人員需要關注代碼的可讀性。與Scala相比,Java或Python是一個靈活的語法復雜的語言。對Scala開發人員的需求越來越大,因為大數據公司重視能在Spark中掌握數據分析和處理的高效而健壯的開發人員。
Python是為Java程序員學習相對容易的因為它的語法和標准庫。然而,Python是不是一個高度並行和可擴展的像SoundCloud或推特系統的理想選擇。
學習Scala豐富了程序員對類型系統中各種新抽象的認識,新的函數編程特性和不可變數據。
3、並發性
大數據系統的復雜多樣的基礎結構需要一種編程語言,它有能力集成多個資料庫和服務。在大數據的生態系統中,Scala勝在Play框架提供了許多非同步庫和容易集成的各種並發原語,比如Akka。Scala使開發人員編寫高效的、可讀性和可維護性的服務而不是。相反,Python不支持的重量級進程並行在用uWSGI時,但它不支持真正的多線程。
當使用Python寫Spark程序時,不管進程有多少線程,每次只有一個CPU在Python進程中處於活動狀態。這有助於每個CPU核心只處理一個進程,但糟糕的是,每當部署新代碼時,需要重新啟動更多的進程,還需要額外的內存開銷。Scala在這些方面更高效,更容易共事。
4、類型安全
當用Spark編程時,開發人員需要根據變化的需求不斷地重新編碼代碼。Scala是靜態類型語言,盡管它看起來像一種動態類型語言,因為它具有優雅的類型推斷機制。作為靜態類型語言,Scala仍然提供編譯器來捕獲編譯時錯誤。
重構像Scala這樣的靜態類型語言的程序代碼比重構像Python這樣的動態語言代碼要容易得多且簡單。開發人員在修改Python程序代碼後常常會遇到困難,因為它造成的bug比修復程序原有的bug要多。所以最好是緩慢而安全地使用Scala,而不是快速的、死地使用Python。
對於小型的特殊實驗,Python是一種有效的選擇,但它並不像靜態語言那樣有效地擴展到大型軟體工程中。
5、易用性
Scala和Python語言在Sparkcontext中有同樣的表達,因此通過使用Scala或Python可以實現所需的功能。無論哪種方式,程序員都會創建一個Sparkcontext並調用函數。Python是一種比Scala更便於用戶使用的語言。Python不那麼冗長,開發人員很容易用Python編寫腳本來調用Spark。易用性是一個主觀因素,因為它取決於程序員的個人偏好。
6、高級特性
Scala編程語言有幾個存在類型、宏和隱式。Scala的晦澀難懂的語法可能很難對開發人員可能無法理解的高級特性進行實驗。然而,Scala的優勢在於在重要的框架和庫中使用這些強大的特性。
話雖如此,Scala沒有足夠的數據科學工具和庫,如Python用於機器學習和自然語言處理。Sparkmlib–機器學習庫只有較少的ML演算法但他們是理想的大數據處理。Scala缺乏良好的可視化和本地數據轉換。Scala無疑是Spark streaming特性的最佳選擇,因為Python 通過pySpark 調用Spark.streaming不像Scala那樣先進和成熟。
總結
「Scala速度更快,使用方便 但上手難,而Python則較慢,但很容易使用。」
Spark框架是用Scala編寫的,所以了解Scala編程語言有助於大數據開發人員輕松地挖掘源代碼,如果某些功能不能像預期的那樣發揮作用。使用Python增加了更多問題和bug的可能性,因為2種不同語言之間的轉換是困難的。為Spark使用Scala提供對Spark框架的最新特性的訪問,因為它們首先在Scala中可用,然後移植到Python中。
根據Spark決定Scala和Python取決於最適合項目需要的特性,因為每種語言都有自己的優點和缺點。在使用Apache Spark編程語言之前,開發者必須學習Scala和Python來熟悉它們的特性。學習了Python和Scala之後,決定何時使用Scala來Spark以及何時使用Python來調用Spark是相當容易的。Apache Spark編程語言的選擇完全取決於要解決的問題。
㈥ scala是什麼是一種編程語言嗎
java 虛擬機上開發的編程語言 就好比 ruby 是基於C語言上開發
java虛擬機上開發的語言很多比如 groovy
scala不但效率高 並且支持函數式編程
理解函數式編程對你將來編程有很大幫助
groovy 之父曾經說過 如果他再早幾年看到scala編程這本書 他就不會開發groovy這門語言了 scala將在某一天替代java
jruby 之父說過 scala就像是java合法的王位繼承人
推薦你看scala編程 這本書 我最近也在看 才看到100多頁 但被它的語法驚呆了
㈦ 學習scala有哪些好的資源
為什麼學習函數式編程
在閱讀DDD巨著《Patterns, Principles, and Practices of Domain-Driven Design》的過程中,Scott在第5章提到了使用函數式編程語言配合貧血模型去實踐DDD的一種思路,這激發了我的無限遐想。
在開發領域,我們已經擁有了許多的抽象方法論和大量的實現技術。但我個人認為,這一切歸根結底,都是人類思維在開發領域的具體表達方式。而人類在認識和分析所要解決的業務領域問題時,思考的內容不外乎由兩個部分組成:『業務流程』與『業務規則』。前者,回答了業務活動中先做什麼後做什麼的問題;後者,則回答了遇到什麼情況時應該怎麼做的問題。兩者結合後,得到我們需要的業務結果,或者叫作「實現業務目標」。
再想想目前學習和掌握的面向對象的一系列方法,又是如何將上述思維結果映射到中去的呢?我認為是這樣的:
對於業務流程,我們將其表達為若干對象之間的合作,比如UML里序列圖的對象與消息,進而具化為具體的類及其職責,比如類及其若干業務方法。
對於業務規則,我們將其表達為若乾的判斷邏輯,比如UML流程圖里的判斷分支,進而具化為業務方法里的if-else語句,或者再復雜一點,表達為工廠、策略等設計模式的實際運用。
然後,我認為,對於復雜業務規則的梳理,可以象數學歸納法一樣進行演繹:假設一個函數y=f(x),給定x的定義域,確定y的值域。特別是在排列組合等方面的一些問題,也經常採用遞歸的方式來解決。所以,從這個角度講,函數式編程更貼近人類思維習慣,所以讓我自然而然地把目光轉向了它。
為什麼選擇Scala
在選擇具體的函數式編程語言時,我首先想到的是它最好是同時能支持面向對象編程的。因為即便LISP作為函數式編程語言的先祖,誕生已長達半個世紀,但單純的函數式編程語言與面向對象編程語言相比,在抽象領域概念、組合系統模塊、實現信息隱蔽等方面存在一定的差距,所以一直沒有成為開發的主流。
信息隱蔽原理:在西安電子科大蔡希堯與陳平老師於1993年合作出版的《面向對象技術》一書中是這樣描述的:把需求和求解的方法分離;把相關信息——數據結構和演算法,集中在一個模塊之中,和其他模塊隔離,它們不能隨便訪問這個模塊內部的信息。
其次,由於我的語言路線是從Pascal → C → C++ → C#,所以我希望能選擇一種風格近似於C、強類型的函數式編程語言。在比較了F#、R、ErLang等幾種常見的函數式編程語言之後,我最終選擇了Scala。
Scala有何優勢
註:以下內容,節選翻譯或參考自《Programming in Scala》第1章、第3章,《Programming Scala》第6章,不算完整意義上的個人心得。
函數式編程的優勢
純的函數是沒有副作用的。無論何時何地,對於一個函數y=f(x),給定x必定得到y,不會因此產生二義結果。因此無論對於代碼測試還是並發,由於給定輸入必定得到預期輸出,而不受其他因素干擾,所以能有效減少Bug產生。
在函數式編程里,大量使用immutable的值。這意味著函數運算的結果總會創建一個新的實例,避免了通常並發環境下為防止數據共享沖突而採取的保護機制。盡管這需要額外的Copy操作,但Scala針對性地提供了高效的Copy實現,以及延遲計算等彌補機制。
函數是一等公民。函數作為表達式的一部分,可以藉由函數之間的嵌套、組合,實現復雜的判斷邏輯。
Scala語言本身的優勢
Scala是面向對象與函數式編程的混合語言,所以能有效結合二者的優點。
Scala屬於Java生態圈,可以在JVM上與Java一起編譯運行,所以許多Java的框架、工具都可以直接應用於Scala語言編寫的項目。
Scala視一切數據類型皆為對象,且支持閉包、lambda、by-name參數等特性,語法簡潔明快。
Scala使用Actor作為並發模型,與Akka框架自然契合。這是一種區別於傳統的、基於數據共享、以鎖為主要機制的並發模型,其特點在於以Actor為基本單位、沒有數據共享、基於消息傳遞實現Actor之間的協作,因此可以有效避免死鎖、減少競爭。
最後,如果有朝一日要轉向大數據領域,有Spark這樣的大型框架作為支撐。知乎:與 Hadoop 對比,如何看待 Spark 技術?
Scala對實踐DDD有何意義
說了那麼多,我的根本目的還是要將Scala作為實現DDD的主要武器。那麼試想一下,Scala在我們實現DDD的過程中能有哪些幫助呢?我暫且胡侃亂謅如下:
表示值對象、領域事件等元素更直觀。值對象、領域事件在DDD里都應該是immutable的,以往多採取POCO形式表示,現在改用Scala里的val以及case class表示,在語法層面就直觀地表明是不可修改的。
在類的方法層面實現CQRS時有語法支持。用Scala里的Function(返回類型為非Unit)對應CQRS里uery,保證類的方法沒有副作用;用Procere(返回類型為Unit)對應CQRS里的Command,明確表明這一類方法會產生修改狀態等副作用。這同樣從語法層面就能對二者進行明確區分。
模式匹配豐富了函數操作。除了正則表達式,Scala形式多樣的模式匹配語法,為提取數據、完成數據分組聚合等運算、實現邏輯判斷提供了強大支持。比如定義def sum_count(ints:Seq[Int) = (ints.sum, ints.size)這樣一個函數後,我們可以這樣調用,以得到一個1至6的整數序列的整數值合計,及該序列的尺寸:val(sum, count) = sum_count(List(1, 2, 3, 4, 5, 6))。
為實現DSL提供有力支持。Scala自帶有解析框架,加上靈活的函數語法支持,要自己實現一套DSL及其相應的語法解析器將不再困難。比如在配置文件里這樣的一條配置語句,表示退休條件為年齡達到60周歲或者工齡屆滿30年:retire = (Age >= 60) || (ServiceLength >= 30)。以往的方式是自己寫一個語法解析器,把這條文本轉換成相應的Specification對象,然後扔給聚合去使用。現在有了Scala的幫助,就使編寫語法解析器這一環節的工作量大大減少。
合理的高階函數設計,使規則編寫得到簡化。比如規則、費用報銷規則,以往可能需要若干層的if-else嵌套,現在則將通過高階函數得到大幅簡化。對此,我強烈劉光聰先生的Refactoring to Functions,你會在劉先生的重構過程中發現高階函數的強大。
Actor為高效並發打下基礎。Actor
內部完全自治,自帶用於存儲消息的mailbox,與其他Actor只能通過消息進行交互,每個Actor都是並發的一個基本單位。這些特點,非常適合於
採取Event
Sourcing方式實現的DDD。每個聚合都好比一個Actor,在聚合內部始終保持數據的強一致性,而在聚合之間交互的領域事件則好比Actor之間
的消息,聚合之間藉由領域事件和Saga保證數據的最終一致性。
Trait成為AOP利器。Trait是Scala的另一大特色,它就象AOP織入一樣,能動態地給某個類型注入方法或者結構。比如配合類Circuit和with後面那4個Trait的定義,val circuit = new Circuit with Adders with Multiplexers with Flipflops with MultiCoreProcessors這樣就創建了一個帶有加法器、乘法器、觸發器和多核處理器的元件。
隱式實現為類型擴展提供支持。對應C#里的靜態擴展方法,Scala通過implicit為實現數據類型的方法擴展提供了便捷,成為Trait之外的另一個功能擴展手段。
能降低常見BDD框架的學習成本。盡管這一點可能比較牽強,但我正在努力摸索如何將BDD與DDD結合,而常見的Cucumber、Spock等一些BDD框架,其語法與Scala比較相近,所以我才有如此一說。
有哪些Scala學習資料
以下是我目前主要的學習資料,並衷心歡迎各位留言補充。
書籍
Programming in Scala:由Scala語言的設計師Martin Odersky編寫,循序漸進,配合了大量實例,入門必讀吧。
Programming Scala:視角與上面那本有點不一樣,沒有Scala語言基礎會感覺很困難,適合掌握了基本語法後溫故而知新。
在線文檔與
Scala 官方文檔:Scala的,作為尋找資料的出發點是不錯的。
Scala 課堂:中文版的Scala基本語法在線課堂。
Scala Synatax Primer:由Jim McBeath整理的Scala語法概要,可以當字典用。
The Neophyte』s Guide to Scala:很出名的一個Scala入門指南,以Scala中的提取器Extractor作為實例開始。
Scala 初學指南:這是上面那本指南的中譯本。
Effective Scala:中文版的Scala高效編程
SBT中文入門指南:Scala Build Tool
社區
Scala 中文社區:不算活躍,原因你懂的。
Scala User:Scala入門者聚集地,沒有Stack Overflow那麼嚴格,但也需要點爬牆的身手。
SDK及IDE
Java SE:先裝這個
Scala SDK:再裝這個
SBT:然後裝這個
IntelliJ IDEA:最後裝這個,就能比較方便地開始Scala編程了
寫在最後
最
近讀的書很多也很雜,DDD、BDD、Scala、Cucumber以及Java基礎等等都有涉及,真恨不得一口吃成個大胖子。由於時間和精力有限,所以
現在知識消化很成問題,遲遲沒有進入學以致用的環節,只能先這樣紙上談兵了,好歹先把自己在學習過程中的一些思考、看到的好東西先記載下來,以備將來之
需。