導航:首頁 > 源碼編譯 > scala編譯太慢

scala編譯太慢

發布時間:2024-01-05 14:24:46

❶ 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編程語言簡介

Scala編程語言近來抓住了很多開發者的眼球 如果你粗略瀏覽Scala的網站 你會覺得Scala是一種純粹的面向對象編程語言 而又無縫地結合了命令式和函數式的編程風格 Christopher Diggins認為

不太久之前編程語言還可以毫無疑義地歸類成 命令式 或者 函數式 Scala代表了一個新的語言品種 它抹平了這些人為劃分的界限

根據David Rupp在博客中的說法 Scala可能是下下一代Java 這么高的評價讓人不禁想看看它到底是什麼東西

Scala有幾項關鍵特性表明了它的面向對象的本質 例如 Scala中的每個值都是一個對象 包括基本數據類型(即布爾值 數字等)在內 連函數也是對象 另外 類可以被子類化 而且Scala還提供了基於mixin的乎遲讓組合(mixin based position)

與只支持單繼承的語言相比 Scala具有更廣泛意義上的類重用 Scala允許定義新類的時候重用 一個類中新增的成員定義(即相較於其父類的差異之處) Scala稱之為mixin類組合

Scala還包含了若干函數式語言的關鍵概念 包括高階函數(Higher Order Function) 局部套用(Currying) 嵌套函數(Nested Function) 序列解讀(Sequence Comprehensions)等等

Scala是靜態類型的 這就允許它提供泛型類 內部類 甚至多態方法(Polymorphic Method) 另外值得一提的是 Scala被特意設計成能夠與Java和 NET互操作 Scala當前版本還不能在 NET上運行(雖然上一版可以) 但按照計劃將來可以在 NET上運行

Scala可以與Java互操作 它用scalac這個編譯器把源文件編譯成Java的class文件(即在JVM上運行的位元組碼) 你可以從Scala中調用所有的Java類庫 也同樣可以從Java應用程序中調用Scala的代碼 用David Rupp的話來說

它也可以訪問現存的數之不盡的Java類庫 這讓(潛在地)遷移到Scala更加容易

這讓Scala得以使用為Java 或者 編寫的巨量的Java類庫和框架 Scala會經常性地針對這幾個版本的Java進行測試 Scala可能也可以在更早版本的Java上運行 但沒有經過正式的測試 Scala以BSD許可發布 並且數年前就已經被認為相當穩定了

說了這么多 我們還沒有回答一個問題 為什麼我要使用Scala? Scala的設計始終貫穿著一個理念

創造一種更好地支持組件的語言 (《The Scala Programming Language》 Donna Malayeri)

也就是說軟體應該由可重用的部件構造而成 Scala旨在提供一種編程語言 能夠統一和一般化分別來自面向對象和函數式兩種不同風格的關鍵概念歲局

藉著這個目標與設計 Scala得以提供一些出眾的特性 包括

* 面旦叢向對象風格

* 函數式風格

* 更高層的並發模型

Scala把Erlang風格的基於actor的並發帶進了JVM 開發者現在可以利用Scala的actor模型在JVM上設計具伸縮性的並發應用程序 它會自動獲得多核心處理器帶來的優勢 而不必依照復雜的Java線程模型來編寫程序

* 輕量級的函數語法

o 高階

o 嵌套

o 局部套用(Currying)

o 匿名

* 與XML集成

o 可在Scala程序中直接書寫XML

o 可將XML轉換成Scala類

* 與Java無縫地互操作

Scala的風格和特性已經吸引了大量的開發者 比如Debasish Ghosh就覺得

我已經把玩了Scala好一陣子 可以說我絕對享受這個語言的創新之處

lishixin/Article/program/Java/hx/201311/26873

❸ 大數據學習編程么

大數據前景是很不錯的,像大數據這樣的專業還是一線城市比較好,師資力量跟得上、就業的薪資也是可觀的,學大數據面授班的時間大約半年,學大數據可以按照路線圖的順序,

❹ kotlin語言什麼時候出來的

應該是2011年7月

維基網路上的內容:

2011年7月,JetBrains推出Kotlin項目,這是一個面向JVM的新語言,它已被開發一年之久。[4]JetBrains負責人Dmitry Jemerov說,大多數語言沒有他們正在尋找的特性,Scala除外。但是,他指出了Scala的編譯時間慢這一明顯缺陷。[4]Kotlin的既定目標之一是像Java一樣快速編譯。2012年2月,JetBrains以Apache 2許可證開源此項目。[5]

Jetbrains希望這個新語言能夠推動IntelliJ IDEA的銷售。[6]

Kotlin v1.0於2016年2月15日發布。[7]這被認為是第一個官方穩定版本,並且JetBrains已准備從該版本開始的長期向後兼容性。

在Google I/O2017中,Google宣布在Android上為Kotlin提供一等支持。[8]

❺ R,Python,Scala和Java,到底該使用哪一種大數據編程語言

R語言:它的有點在於簡單易上手,通過R語言,你可以從復雜的數據集中篩選你想要的數據,從負責的模型函數中操作數據,建立有序的圖表呈現數字,只需要幾行代碼就可以了,比如說,像是好動版本的Excel表格。
Pythom語言:Python結合了R語言的快速,處理復雜數據的能力以及更務實的語言特質,迅速地成為主流,也更簡單和直觀了,尤其是近幾年的成長很快。在數據處理范疇內,通常在規模與復雜之間要有個取捨,Python以折中的姿態出現,是相當好的數據處理工具。
java語言:java沒有和Python和R語言一樣好的可視化功能,也不是統計建模的最佳工具,但是如果你需要建立一個龐大的系統,使用過去的原型,java是最基本的選擇了。
Hadoop pand
Hive:為了迎合大量數據處理的需求,以java為基礎的大數據開始了。Hadoop為一批數據處理,發展以java為基礎的架構關鍵,相對於其他處理工具,Hadoop慢許多,但是無比的准確可被後端資料庫分析廣泛使用,和Hive搭配的很好。
Scala:另一個以java為基礎的語言,和java很像,對任何想要進行大規模的機械學習或是建立高階的演算法,Scala是逐漸興起的工具,善於呈現且擁有建立可靠系統的能力。
Kafkaand Storm:是一個特別快速的查詢信息系統,缺點是太快了,因此在實施操作時會犯錯,有時候會漏掉東西。使用Scala寫出來的架構,大幅增加他在串流處理的受歡迎程度。

❻ Scala這個有知道的嗎,怎麼樣啊

Scala是一門多範式語言,一般常用的範式有:命令式 和 函數式,由於Scala是一門多範式語言,所以通俗來說我們可以說Scala是一門命令式編程語言同時也是函數式編程語言。

命令式:命令式是植根於馮·諾依曼體系的,一個命令式程序就是一個馮·諾依曼機的指令序列,給機器提供一條又一條的命令序列讓其原封不動的執行。通俗來說就是按照指令順序一步一步執行。

函數式:又稱泛函編程,它將計算機的計算視為數據中的函數計算。函數式編程最重要的基礎是λ(lambda)演算,λ演算對函數式編程語言有著巨大的影響。典型的函數式語言包括Erlang和Lisp等。

為什麼要用函數式:

目前來說CPU的性能發展大體上是在同等面積上集成更多的晶體管等集成電路,隨著納米技術的不斷提高,CPU能夠集成的計算單元也越來越多,但終歸是有上限的。所以在之後,單核的發展逐漸走向了多核的發展,以多核來達到性能的提升。

目前計算機的CPU基本上都是多核CPU,在使用命令式編程的時候就設涉及到多線程之間的狀態共享,需要鎖機制實現並發的控制,而鎖機制雖然保證了安全性,但是卻對性能來說是一個阻礙。

而函數式編程不會再多個線程之間共享狀態,不需要用鎖機制,可以更好的並行處理,充分利用多核CPU的並行處理能力。

如,電信行業多數使用Erlang來進行開發,就是看中了函數式編程的並行處理能力。

Scala的特點

閱讀全文

與scala編譯太慢相關的資料

熱點內容
建興app怎麼變成黑色了 瀏覽:47
文件壓縮包如何加密文件 瀏覽:183
2010提出的演算法 瀏覽:672
冰櫃壓縮機的壽命 瀏覽:105
辦公室采訪程序員 瀏覽:569
美橙雲伺服器購買 瀏覽:754
漢語詞典pdf下載 瀏覽:353
android公網ip 瀏覽:613
要塞1地圖放哪個文件夾 瀏覽:850
凡科建站怎麼弄伺服器 瀏覽:939
蘋果手機怎麼設置app播放 瀏覽:202
下載網站源碼用什麼瀏覽器 瀏覽:241
六線譜pdf 瀏覽:156
linuxmysqlsock 瀏覽:239
人教版數學pdf下載 瀏覽:460
文檔安全加密系統 瀏覽:492
數控銑床編程簡單數字 瀏覽:788
編程電纜如何重啟 瀏覽:121
myqq命令行發消息 瀏覽:365
日產逍客怎麼使用app升窗 瀏覽:503