Scala vs F#:函數(shù)式編程特性大比拼(二)
原創(chuàng)【51CTO譯文】在前文里,51CTO從函數(shù)、賦值、Lambda表達(dá)式、模式匹配、列表推導(dǎo)和混合實(shí)現(xiàn)多重繼承來對Scala和F#進(jìn)行對比。而比較Scala和F#編程語言時(shí),開發(fā)人員最感興趣的可能是開發(fā)環(huán)境的對比,如:
◆為Web,GUI和數(shù)據(jù)庫開發(fā)提供的框架
◆對面向?qū)ο蟮闹С?/p>
◆運(yùn)行時(shí)環(huán)境的特性
F#是微軟主持開發(fā)的函數(shù)式編程語言,只能運(yùn)行在Windows平臺上,而開源的Scala可以運(yùn)行在所有平臺上,不過Scala最終是被編譯成Java字節(jié)碼的,因此需要通過Java虛擬機(jī)進(jìn)行解釋執(zhí)行。
應(yīng)用程序開發(fā)框架
F#是一個(gè).NET通用語言運(yùn)行時(shí)(CLR)兼容的語言,適合開發(fā)各種常見的應(yīng)用系統(tǒng),實(shí)際上,.NET開發(fā)人員可以在Visual Studio(2008和更高版本)中象開發(fā)C#,C++或Visual Basic程序一樣,開發(fā)、調(diào)試、測試和以CLR可執(zhí)行程序形式部署F#程序。(您可以參考51CTO推薦:詳細(xì)介紹Visual Studio 2010F#使用)
F#和其它.NET語言的區(qū)別是它的函數(shù)執(zhí)行是不變的,無狀態(tài)的,這個(gè)特性使得F#更適合科學(xué)計(jì)算,大規(guī)模并行計(jì)算和高性能計(jì)算應(yīng)用。除了函數(shù)式編程特定的任務(wù)和語法外,F(xiàn)#也可以訪問.NET DLL,訪問和使用方式均與其它.NET語言無差別。
Scala作為一個(gè)開源的,兼容Java且編譯成Java的語音,可用在任何支持Java的操作系統(tǒng)上,Scala開發(fā)插件和語法定義文件也可用大部分流行的文本編輯器和IDE創(chuàng)建,包括Netbeans,Eclipse和IntelliJ的IDEA。
數(shù)據(jù)庫操作
F#數(shù)據(jù)庫訪問程序是語言的核心部分,它們是通過System.Data and System.Data.SqlClient庫訪問數(shù)據(jù)庫的,F(xiàn)#數(shù)據(jù)庫訪問實(shí)現(xiàn)取決于底層ADO.NET機(jī)制和.NET運(yùn)行時(shí)的配置。
由于Scala運(yùn)行在Java虛擬機(jī)(JVM)上,它利用Java的JDBC訪問數(shù)據(jù)庫,數(shù)據(jù)庫例行程序要么直接通過JDBC調(diào)用,要么通過Java或其它第三方數(shù)據(jù)庫擴(kuò)展調(diào)用,有幾個(gè)第三方開源的庫可用,但我不敢肯定它們已經(jīng)成熟和穩(wěn)定。
GUI開發(fā)
使用F#進(jìn)行GUI開發(fā)是通過.NET的WinForm庫支持的,GUI開發(fā)API位于System.Drawing and System.Windows.Forms庫中,它是一個(gè)標(biāo)準(zhǔn)的共享.NET DDL。
使用Scala進(jìn)行GUI開發(fā)是通過Java Swing實(shí)現(xiàn)的,訪問Swing組件和API都使用Scala語法,因此Scala程序員開發(fā)Swing感覺會很自然。
Web開發(fā)
使用F#進(jìn)行Web開發(fā),就象數(shù)據(jù)庫開發(fā)和GUI開發(fā)一樣,它是通過.NET System.Web庫完成的,ASP開發(fā)人員可以指定F#作為服務(wù)器端語言,執(zhí)行HTTP處理邏輯。
Scala沒有任何專門的Web開發(fā)組件,但有基于Scala的第三方Web開發(fā)框架,在撰寫本文時(shí),Lift Web框架是最有名的Scala Web開發(fā)框架。
面向?qū)ο筇匦?/strong>
雖然F#是一個(gè)函數(shù)式編程語言,但它也支持常見的面向?qū)ο螅∣O)的特性,如單繼承類,多重繼承接口和參數(shù)多態(tài)等。和C#和Visual Basic類似,F(xiàn)#也支持委派,通過語言提供的Invoke委派方法提供對對象屬性的隱式訪問,但和Scala不一樣,F(xiàn)#不支持任何形式的多類繼承。
Scala一種混合函數(shù)式編程和面向?qū)ο缶幊田L(fēng)格的語言,因此它的函數(shù)和函數(shù)編程特性是***類語言結(jié)構(gòu),面向?qū)ο蟮囊彩?,Scala中的每一個(gè)值都是對象,此外,Scala支持參數(shù)多態(tài),枚舉和偽多重繼承。
在我看來,F(xiàn)#和Scala中面向?qū)ο筇匦?**的差別是Scala支持偽多重繼承。
#p#
編譯和程序的執(zhí)行
F#編譯器和運(yùn)行時(shí)都是.exe或.msi格式,目前只支持Windows平臺,要在Mac或Linux平臺上運(yùn)行F#唯一的辦法是使用Mono .NET CLR實(shí)現(xiàn),F(xiàn)#程序的擴(kuò)展名是.fs,在Windows平臺上編譯后是.exe文件,開發(fā)工具一般使用Visual Studio 2008(或更高版本),但也可以用其它編輯器創(chuàng)建,或使用獨(dú)立的CLR編譯器編譯。
F#的安裝是通過installFSharp.msi或fsharp.zip實(shí)現(xiàn)的,它包含了一個(gè)交互式編譯器,因此F#程序可以通過控制臺編寫和執(zhí)行。
Scala只需要下載一個(gè)JAR文件就可以了,當(dāng)然也有二進(jìn)制分發(fā)包,無論哪種形式,Scala編譯器/解釋器都運(yùn)行在JVM之上。
Scala需要Java 1.5或更高版本,但這里也有一個(gè)專為Java 1.4制作的版本。
Scala程序也可以通過交互式解釋器REPL(read-eval-print-loop)交互運(yùn)行,序也可以和其它類文件一起編譯成Jar文件,然后作為Java程序調(diào)用。
典型應(yīng)用和適用領(lǐng)域
F#是最近才加入到.NET語言大家族中的,因此它仍然處于初級階段,微軟研究院內(nèi)部在使用F#進(jìn)行日志分析和自定義搜索任務(wù),但微軟計(jì)劃將F#作為多核和高性能計(jì)算的專用語言。
據(jù)傳,在編程社區(qū) – 特別是那些熟悉函數(shù)編程和ML編程衍生語言的社區(qū)中,對F#的反應(yīng)非常積極,但由于它只能運(yùn)行在.NET平臺上,可能會形成一個(gè)障礙,因?yàn)橹髁鞯目茖W(xué)和高性能平臺都是基于Linux的。
在Scala和F#之間,Scala的使用程度遠(yuǎn)遠(yuǎn)超過了F#,Twitter的整個(gè)信息處理系統(tǒng)都是用Scala實(shí)現(xiàn)的,很多高知名度的組織,如西門子,索尼,施樂和美國航天局都在各種小規(guī)模項(xiàng)目中使用了Scala。
因?yàn)镾cala與Java集成非常靈活,它可以用于任何類型的項(xiàng)目中,根據(jù)歷史經(jīng)驗(yàn),Scala憑借其簡潔的語法,可以大量減少代碼行數(shù)。
性能
雖然Java虛擬機(jī)可運(yùn)行在所有平臺上,但它不能為Scala帶來明顯的性能優(yōu)勢,甚至沒有提供開箱即用的優(yōu)化配置,但F#在.NET和Windows平臺上卻可以事先優(yōu)化,在Windows上.NET運(yùn)行時(shí)環(huán)境范圍內(nèi),F(xiàn)#很可能受益于CLR專門針對它的內(nèi)部優(yōu)化。
由于F#天生并不支持Linux,因此比較Linux平臺上Scala和F#的性能可能會有失公平,有些中立人士表示Linux上的Mono CLR比Windows平臺上的.NET CLR要慢得多,根據(jù)專業(yè)級的基準(zhǔn)測試,在Linux上,F(xiàn)#比Scala慢三倍。
原文出處:www.developer.com/
原文名:Scala vs. F#, Round 2: Application Programming Features
作者:Edmon Begoli
【51CTO譯稿,非經(jīng)授權(quán)謝絕轉(zhuǎn)載,合作媒體轉(zhuǎn)載請注明原文出處、作者及51CTO譯稿和譯者!】
【編輯推薦】