當前位置:首頁 » 編程軟體 » scala腳本

scala腳本

發布時間: 2022-12-15 05:26:47

腳本分幾種,用途都是什麼

腳本(script)是使用一種特定的描述性語言,依據一定的格式編寫的可執行文件,又稱作宏或批處理文件。腳本是批處理文件的延伸,是一種純文本保存的程序,一般來說的計算機腳本程序是確定的一系列控制計算機進行運算操作動作的組合,在其中可以實現一定的邏輯分支等。 腳本簡單地說就是一條條的文字命令,這些文字命令是可以看到的(如可以用記事本打開查看、編輯),腳本程序在執行時,是由系統的一個解釋器,將其一條條的翻譯成機器可識別的指令,並按程序順序執行。因為腳本在執行時多了一道翻譯的過程,所以它比二進製程序執行效率要稍低一些。 腳本通常可以由應用程序臨時調用並執行。各類腳本被廣泛地應用於網頁設計中,因為腳本不僅可以減小網頁的規模和提高網頁瀏覽速度,而且可以豐富網頁的表現,如動畫、聲音等。舉個最常見的例子,當點擊網頁上的Email地址時能自動調用Outlook Express或Foxmail這類郵箱軟體,就是通過腳本功能來實現的。也正因為腳本的這些特點,往往被一些別有用心的人所利用。例如在腳本中加入一些破壞計算機系統的命令,這樣當用戶瀏覽網頁時,一旦調用 這類腳本,便會使用戶的系統受到攻擊。所以用戶應根據對所訪問網頁的信任程度選擇安全等級,特別是對於那些本身內容就非法的網頁,更不要輕易允許使用腳本。通過「安全設置」對話框,選擇「腳本」選項下的各種設置就可以輕松實現對腳本的禁用和啟用。 計算機語言是為了各種目的和任務而開發的,一個常見任務就是把各種不同的已有組件連接起來以完成相關任務。大多腳本語言共性是:良好的快速開發,高效率的執行,解釋而非編譯執行,和其它語言編寫的程序組件之間通信功能很強大。 許多腳本語言用來執行一次性任務,尤其是系統管理方面。它可以把服務組件粘合起來,因此被廣泛用於GUI創建或者命令行,操作系統通常提供一些默認的腳本語言,即通常所謂shell腳本語言。 腳本通常以文本(如ASCII)保存,只在被調用時進行解釋或編譯。 有些腳本是為了特定領域設計的,但通常腳本都可以寫更通用的腳本。在大型項目中經常把腳本和其它低級編程語言一起使用,各自發揮優勢解決特定問題。腳本經常用於設計互動通信,它有許多可以單獨執行的命令,可以做很高級的操作,(如在傳統的Unix shell (sh)中,大多操作就是程序本身。) 這些高級命令簡化了代碼編寫過程。諸如內存自動管理和溢出檢查等性能問題可以不用考慮。在更低級或非腳本語言中,內存及變數管理和數據結構等耗費人工,為解決一個給定問題需要大量代碼,當然這樣能夠獲得更為細致的控制和優化。腳本缺少優化程序以提速或者降低內存的伸縮性。 綜上所述,腳本編程速度更快,且腳本文件明顯小於如同類C程序文件。這種靈活性是以執行效率為代價的。腳本通常是解釋執行的,速度可能很慢,且運行時更耗內存。在很多案例中,如編寫一些數十行的小腳本,它所帶來的編寫優勢就遠遠超過了運行時的劣勢,尤其是在當前程序員工資趨高和硬體成本趨低時。 然而,在腳本和傳統編程語言之間的界限越來越模糊,尤其是在一系列新語言及其集成暢出現時。在一些腳本語言中,有經驗的程序員可以進行大量優化工作。在大多現代系統中通常有多種合適的腳本語言可以選擇,所以推薦使用多種語言(包括C或匯編語言)編寫一種腳本。 常見的腳本語言:Scala、javaScript,VBScript,ActionScript,MAX Script,ASP,JSP,php,SQL,Perl,Shell,python,Ruby,JavaFX,Lua,AutoIt等。 [編輯本段]與其他編程語言的關系及特點 1.腳本語言(JavaScript,VBscript等)介於HTML和C,C++,Java,C#等編程語言之間。 HTML通常用於格式化和鏈結文本。而編程語言通常用於向機器發出一系列復雜的指令。 2.腳本語言與編程語言也有很多相似地方,其函數與編程語言比較相象一些,其也涉及到變數。與編程語言之間最大的區別是編程語言的語法和規則更為嚴格和復雜一些. 3.與程序代碼的關系:腳本也是一種語言,其同樣由程序代碼組成。 註:腳本語言一般都有相應的腳本引擎來解釋執行。 他們一般需要解釋器才能運行。Python、JAVASCRIPT,ASP,PHP,PERL,Nuva都是腳本語言。C/C++編譯、鏈接後,可形成獨立執行的exe文件。 4.腳本語言是一種解釋性的語言,例如Python、vbscript,javascript,installshield script,ActionScript等等,它不象c\c++等可以編譯成二進制代碼,以可執行文件的形式存在. 腳本語言不需要編譯,可以直接用,由解釋器來負責解釋。 5.腳本語言一般都是以文本形式存在,類似於一種命令. 舉個例子說,如果你建立了一個程序,叫aaa.exe,可以打開.aa為擴展名的文件. 你為.aa文件的編寫指定了一套規則(語法),當別人編寫了.aa文件後,你的程序用這種規則來理解編寫人的意圖,並作出回應.那麼,這一套規則就是腳本。 計算機腳本語言程序舉例 (1)JavaScript: ①用於HTML中: alert("Hello World") ②用於WSH中: WScript.Echo("Hello World") (2)ASP: <% Response.Write("Hello, world!") %> 或者: <% strHelloWorld = "Hello, world!" %> <%= strHelloWorld %> 或者簡單地寫成: <%= "Hello, world!" %> (3)PHP: <?php echo 'Hello, world!'; print 'Hello, world!'; ?> 或者 <?= "Hello World!"?> (4)PERL: #!/usr/local/bin/perl print "Hello, world!\n"; (5)Nuva: <.. "Hello, World!" Demo ..> <. //====================================== // Hello, World! (1) //====================================== ?? 'Hello, World!' /*====================================== Hello, World! (2) ======================================*/ function HelloWorld() ?? "Hello, World!"; end function HelloWorld(); /*====================================== Hello, World! (3) ======================================*/ class World() function Hello() ?? 'Hello, World!'; end function end class var n = World(); n.Hello(); .> (6)ActionScript: ①ActionScript 2.0版本: trace("Hello, world!"); ②ActionScript 3.0版本: package { import flash.display.TextField; import flash.display.MovieClip; import flash.filters.DropShadowFilter; public class HelloWorld extends MovieClip { public function HelloWorld() { var shad:DropShadowFilter = new DropShadowFilter(2, 45, 0x000000, 25, 3, 3, 2, 2); var txt:TextField = new TextField(); txt.textColor = 0xFFFFFF; txt.filters = [shad]; txt.width = 120; txt.x = Math.random()*300; txt.y = Math.random()*300; txt.selectable = false; txt.text = "Hello World! ["+Math.round(txt.x)+","+Math.round(txt.y)+"]"; addChild(txt); } } } (7)PostScript: PostScript是一種專門用來創建圖像的語言,常用於列印機。 /font /Courier findfont 24 scalefont font setfont 100 100 moveto (Hello World!) show showpage (8)AppleScript: say "Hello World!" (9)Bash: #!/usr/bin/env bash myvar="hello" myfunc() { local x local myvar="one two three" for x in $myvar do echo $x done } myfunc echo $myvar $x (10)Ruby #!/usr/bin/env ruby puts "Hello, world!"

㈡ Scala和java比較

1、 scala可以編寫腳本,編寫一個.scala的腳本代碼,直接用同scala x.scala進行執行。
但同時scala也可以類似java,通過scalac編譯為.class等形式,基於編譯執行。
2、 scala可以在互動式的命令中直接編碼運行。
3、 支持隱式變數定義,通過var關鍵詞定義一個變數,具體變數類型在賦值後,scala自行進行類型推斷。例如var a = List(1,2,3)
4、 常量定義用val 關鍵詞定義
5、 沒有靜態類型,通過object 定義單例類,main方法就是放在object類型中。

㈢ 如何運行scala腳本

腳本:

print("hello
world")

命令:

f:\Scala>scala -savecompiled hello.scala

hello world

腳本:

print("hello world" +args(0))

命令:

f:\Scala>scala -savecompiled hello.scala
hohoho----這個是參數

hello world

如果多個參數:

f:\Scala>scala -savecompiled hello.scala args1
args2

㈣ springboot 使用scala 開發

咋說呢 ,還是使用scala做springboot開發比較流暢一些
按道理來說根據打包模式 maven sbt gradle來說三種方式都可以
maven 是最簡單的
gradle 也比較簡單,但是我並沒有嘗試gradle
sbt 其實也還可以 ,你要找到方向基本就直到套路了,經過參考別人的博客,自己搭建了個demo 驗證是可以正常使用的,不過maven 版的打jar 使用還是有點問題,我嘗試使用多種方式指定主函數還是有問題
兩種方式的我都上傳到了github上,大家如果想模仿學習 可以git clone 下來泡一泡
https://github.com/mullerhai/scala-springboot-sbt
https://github.com/mullerhai/springboot-scala-maven

另外搭建邏輯 大家可以參考這篇博客 google搜出來的
https://afoo.me/posts/2015-07-21-scala-developers-springboot-guide.html

需要主要的,現在的springboot 的版本是2.0.5 release ,之前都是1.× ,不過大同小異,

springboot 本身是支持 java 8 kotlin groovy,大家也可以嘗試一下 kotlin ,kotlin 以後可能會崛起

說一下打包部署
正常來說我們做java 都會打個jar包 部署到生產環境上,
springboot 據說他打包的文件生成方式和普通的 是有差別的,確實,我點擊jar 解壓看到的和普通有很大差別,所以才會有一個 springboot-maven-plugin
有了這個插件所以 springboot部署成jar包比較簡單
但是吧 springboot對sbt 沒有特殊支持 也沒有這個插件,我耗費三體還是沒有實現主就是報這個錯

那我們說 springboot sbt scala 部署到底如何實現呢
其實在不打jar 包的情況下還是有多種實現的,比如 git 整個項目到生產環境,直接sbt run 就可以啟動整個項目
,另外還要說一下,springboot如果不啟動web ,比如做定時任務,使用sbt-assembly插件 其實打成jar包也是可以使用的
還有一種就是是使用sbt-native-package插件,這個插件超級強大,簡直可以用震驚!!!,他娘的,什麼都可以打包,就是打不成jar包,rpm docker image zip tar.gz
macos dmg win exe,這些他都可以

參考
https://stackoverflow.com/questions/45410630/spring-boot-how-can-i-build-a-runnable-jar-with-sbt

I solved the issue by moving to sbt-native-packager

plugins.sbt
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.2.0")
build.sbt
scriptClasspath := Seq("*")
mainClass in Compile := Some("com.x.app.XETL")
enablePlugins(JavaAppPackaging)
Running:
packaging sbt universal:stage
starting the app: target\universal\stage\bin\x.bat

這個會生產一個腳本,直接執行這個腳本就可以,不過有時候也會失敗,這個需要在

對於 maven scala springboot 項目來說,要想打成jar包運行,必須包含其中的兩個maven 插件,缺一個也不行

完整的

在 IDEA 裡面新建 SpringBoot 啟動配置,運行後啟動成功。
在 POM 目錄 執行 mvn spring-boot:run 運行項目,啟動成功;
線下環境 通過 java -jar jar_name.jar,運行成功;

https://stackoverflow.com/questions/38792031/springboot-making-jar-files-no-auto-configuration-classes-found-in-meta-inf

https://stackoverflow.com/questions/38792031/springboot-making-jar-files-no-auto-configuration-classes-found-in-meta-inf

用下面命令重新打包試試看

mvn clean package spring-boot:repackage -Dmaven.test.skip

在sbt 中
這兩個是罪魁禍首

一引用就出問題

㈤ 如何自動測試和發布Scala庫



可以用 Travis CI 和 sbt-best-practice 自動測試和發布 Scala 庫。

Travis CI 是個持續集成服務。一旦你的 Github 倉庫啟用了 Travis CI ,每當有人在倉庫推送代碼或者提交 Pull Request 時,就會觸發 Travis CI 執行一段腳本。

對於 Scala 項目來說,一般用 sbt 管理構建過程,所以我們會希望 Travis CI 被觸發以後,執行測試和發布的 sbt 任務。這樣就可以完成題主要求的所有功能了。

第一步:啟用 Travis CI

Travis CI 的構建過程配置在 .travis.yml 文件中。Scala 庫的 .travis.yml 應該寫成這樣:

# 告訴 Travis CI 應該用已經安裝了 Scala 的系統鏡像來執行本文件中配置的腳本language: scala# 應執行 sbt test 任務來進行自動測試script:
- sbt test# 如果存在 deploy.sbt 文件,就執行 sbt "release with-defaults" 任務來進行自動發布deploy:
skip_cleanup: true
provider: script
script: sbt "release with-defaults"
on:
condition: -e ./deploy.sbt
all_branches: true

有了 .travis.yml,你還需要訪問你在 Travis CI 的 Profile 頁面,為 Github 倉庫啟用 Travis CI。

創建 deploy.sbt 讀取 SECRET_GIST 環境變數

deploy.sbt 包含了發布 Scala 庫時的設置。我們啟用 Travis 和 SonatypeRelease ,然後讀取 SECRET_GIST 環境變數並載入 Secret Gist 中的 secret.sbt 文件

enablePlugins(Travis)enablePlugins(SonatypeRelease)lazy val secret = project settings(publishArtifact := false) configure { secret =>
sys.env.get("SECRET_GIST") match {
case Some(gitUri) =>
secret.addSbtFilesFromGit(gitUri, file("secret.sbt"))
case None =>
secret
}}

日常使用注意事項關於 deploy.sbt.disabled

把 .travis.yml 、 project/plugins.sbt 、 LICENSE 、 build.sbt 、 deploy.sbt 幾個文件推送到 Git 倉庫後, CI 會觸發自動測試和自動發布。每次發布成功後,sbt-best-practice 會自動把 deploy.sbt 改名為 deploy.sbt.disabled ,因此,如果將來再有提交,就只會觸發自動測試,而不會觸發自動發布。如果你想發布下一個新版本,手動把deploy.sbt.disabled 改名為 deploy.sbt 就能觸發 CI 執行自動發布流程了。

關於版本號

一旦觸發發布,CI 會自動修改 version.sbt 中記錄的版本號。比如你的倉庫中原本版本號是 1.0.0-SNAPSHOT ,觸發自動發布時, CI 會首先把版本號改為 1.0.0 然後標上 GIT tag,然後再把版本號改為 1.0.1-SNAPSHOT 。如果你希望下次發布的版本號是 1.5.0 ,那麼你需要在觸發下一次自動發布以前,手動把 version.sbt 中記錄的版本號改為 1.5.0-SNAPSHOT 。

相關鏈接

  • Scala - 一門多範式的編程語言,也是本文的涉及的全部技術的基礎。

  • scala-project-template - Scala項目模板,類似本文描述的結構,但改用私有 Git 倉庫來保存密碼而非 Secret Gist,因此 deploy.sbt 內容稍有不同。

  • Q.scala - 完整設置了自動測試和發布的 Scala 庫。

  • Sbt - Simple Build Tool, Scala 社區最為廣泛實用的構建工具。

  • sbt-best-practice - Sbt 插件,提供了本文提及的全部發布功能。

  • µTest - 一個簡單好用的 Scala 測試框架。

  • Travis CI - 為 Github 項目提供了持續集成服務。除了 Travis CI ,其他持續集成方案還有我司的 GoCD 、 Jenkins 、 Bamboo 等。相比這些方案,Travis CI 很精簡,完全省略了 pipeline 的概念,我很喜歡。開源項目可以免費使用 Travis CI。我見過的開源項目中最常見的持續集成服務就是 Travis CI。

㈥ 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是編程語言還是腳本語言

按傳統,程序語言分編譯語言和解釋語言。編譯語言要把源程序編譯成2進制可執行程序再運行。而解釋性語言,即所謂腳本語言,不需預先編譯,而可在解釋器的解釋下,直接解釋執行。
我不熟悉scala,看上去scala像似 是一種封裝式的東西,例如,封裝的 java 式的東西 要編譯成 bytecode 後執行。 類似 ruby, python 之類的東西也許可以解釋執行。scala 好像沒有自己的虛擬機,對 scala 的爭論 不少。

㈧ 怎麼在scala程序中添加apache依賴包ant

將編寫好的scala代碼編譯後,放到sprak上執行,下面是執行的腳本:
$SPARK_HOME/bin/spark-submit --class com.linker.demo.utils.UserClickCountAnalytics ./target/scala-2.10/sbtdemo1_2.10-1.0.jar

㈨ 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程序員,壓根不打算一切自己寫吶。

熱點內容
php壁紙源碼 發布:2025-07-08 03:04:26 瀏覽:319
android應用層 發布:2025-07-08 02:42:32 瀏覽:301
大唐存儲銷量 發布:2025-07-08 02:41:11 瀏覽:582
腳本怎麼打開 發布:2025-07-08 02:41:06 瀏覽:822
貴州電信iPtv升級伺服器地址 發布:2025-07-08 02:38:48 瀏覽:412
電腦怎麼鏈接本地伺服器 發布:2025-07-08 02:34:22 瀏覽:147
android調試webview 發布:2025-07-08 02:26:28 瀏覽:358
壓縮袋鞋子 發布:2025-07-08 02:21:30 瀏覽:752
為什麼安卓打吃雞感覺有延遲 發布:2025-07-08 02:09:32 瀏覽:168
課題組伺服器如何使用 發布:2025-07-08 02:09:27 瀏覽:44