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