偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

在.NET平臺(tái)上使用Scala語(yǔ)言(下):分析

開(kāi)發(fā) 后端
上一篇文章里我們簡(jiǎn)單嘗試了在Scala里編寫(xiě).NET應(yīng)用程序。這個(gè)過(guò)程并不困難,因?yàn)樗坪鮏cala官方已經(jīng)對(duì)此已經(jīng)有較好的支持了。我們要做的只是“獲取工具”,“編譯成IL”,最后再“生成程序集”即可。那么,這些工具究竟做了些什么,Scala究竟又是如何支持.NET平臺(tái)的,它的可用性究竟如何,我們還需要進(jìn)一步的分析及嘗試。

上一篇文章里我們簡(jiǎn)單嘗試了在Scala里編寫(xiě).NET應(yīng)用程序。這個(gè)過(guò)程并不困難,因?yàn)樗坪鮏cala官方已經(jīng)對(duì)此已經(jīng)有較好的支持了。我們要做的只是“獲取工具”,“編譯成IL”,最后再“生成程序集”即可。那么,這些工具究竟做了些什么,Scala究竟又是如何支持.NET平臺(tái)的,它的可用性究竟如何,我們還需要進(jìn)一步的分析及嘗試。

現(xiàn)在看第一個(gè)問(wèn)題。我們知道從Scala源代碼生成IL文件的腳本是scalac-net.bat。如果需要了解它做的事情,最直接的方法莫過(guò)于查看其中的內(nèi)容。如果要看明白它的代碼,可能需要我們對(duì)cmd命令有些了解——不過(guò)我也只是略知一二罷了,如果您對(duì)其了解不多其實(shí)也沒(méi)有太大關(guān)系。經(jīng)過(guò)合理推測(cè),我們知道scalac-net.bat本身不會(huì)有什么功能,它只是調(diào)用編譯器而已。因此,這個(gè)腳本文件的職責(zé),無(wú)非是收集參數(shù)并執(zhí)行編譯器。于是我們打開(kāi)scalac-net.bat,在眾多for/if之中可以發(fā)現(xiàn)它最后執(zhí)行了這樣一個(gè)命令:

  1. %_JAVACMD% -Xbootclasspath/a:"%_BOOT_CLASSPATH%" %_JAVA_OPTS% %_PROPS% -cp "%_EXTENSION_CLASSPATH%" scala.tools.nsc.Main -target:msil %_ARGS% 

那么我們?cè)僬{(diào)用scalac-net.bat的時(shí)候這行命令究竟是什么呢?對(duì)于此類(lèi)問(wèn)題,我們可以再它前面加上ECHO命令,即:

  1. ECHO %_JAVACMD% -Xbootclasspath/a:"%_BOOT_CLASSPATH%" %_JAVA_OPTS% %_PROPS% -cp "%_EXTENSION_CLASSPATH%" scala.tools.nsc.Main -target:msil %_ARGS% 

ECHO可以視為cmd的print命令,我們可以用它來(lái)觀察和學(xué)習(xí)腳本。再次運(yùn)行,便可以看到編譯器的調(diào)用方式了:

  1. D:\scala-2.7.7.final\code> ..\bin\scalac-net.bat test.scala  
  2. java -Xbootclasspath/a:"D:\SCALA-~1.FIN\bin\..\lib\scala-library.jar" -Xmx256M -Xms16M -Dscala.home="D:\SCALA-~1.FIN\bin\.." -Denv.classpath="" -Dmsil.libpath="D:\SCALA-~1.FIN\bin\..\lib\predef.dll;D:\SCALA-~1.FIN\bin\..\lib\scalaruntime.dll;D:\SCALA-~1.FIN\bin\..\lib\mscorlib.dll" -Dmsil.ilasm="c:\Windows\Microsoft.NET\Framework\v2.0.50727\ilasm.exe"  -cp "D:\SCALA-~1.FIN\bin\..\lib\mscorlib.dll;D:\SCALA-~1.FIN\bin\..\lib\predef.dll;D:\SCALA-~1.FIN\bin\..\lib\sbaz-tests.jar;D:\SCALA-~1.FIN\bin\..\lib\sbaz.jar;D:\SCALA-~1.FIN\bin\..\lib\scala-compiler.jar;D:\SCALA-~1.FIN\bin\..\lib\scala-dbc.jar;D:\SCALA-~1.FIN\bin\..\lib\scala-library.jar;D:\SCALA-~1.FIN\bin\..\lib\scala-swing.jar;D:\SCALA-~1.FIN\bin\..\lib\scalaruntime.dll" scala.tools.nsc.Main -target:msil test.scala 

可以看出,這是在運(yùn)行一個(gè)java程序,并且提供了很多參數(shù)。不過(guò)參數(shù)很多,內(nèi)容也很亂。不過(guò)亂的原因在于其中對(duì)于各式命令或者庫(kù)文件的引用都使用的完整路徑。經(jīng)過(guò)換行,相對(duì)路徑調(diào)整,并去除一些明顯無(wú)用的參數(shù)內(nèi)容(如-cp,即classpath里的dll文件),我們發(fā)現(xiàn)其實(shí)大約這樣的:

  1. D:\scala-2.7.7.final\code> ..\bin\scalac-net.bat test.scala  
  2. java  
  3. -Xbootclasspath/a:"..\lib\scala-library.jar" 
  4. -Xmx256M  
  5. -Xms16M  
  6. -Dscala.home=".." 
  7. -Denv.classpath="" 
  8. -Dmsil.libpath="..\lib\predef.dll;..\lib\scalaruntime.dll;..\lib\mscorlib.dll" 
  9. -Dmsil.ilasm="c:\Windows\Microsoft.NET\Framework\v2.0.50727\ilasm.exe" 
  10. -cp "..\lib\sbaz-tests.jar;..\lib\sbaz.jar;..\lib\scala-compiler.jar;..\lib\scala-dbc.jar;..\lib\scala-library.jar;..\lib\scala-swing.jar;" 
  11. scala.tools.nsc.Main  
  12. -target:msil  
  13. test.scala 

您可以執(zhí)行整理后的命令,效果一致。經(jīng)過(guò)一番摸索,再配合scalac.bat -help的輸出,我們可以觀察出命令的具體意義,例如:

  • Scala編譯器其實(shí)是一個(gè)Java程序,入口是scala.tools.nsc.Main
  • -Dmsil.libpath表明編譯時(shí)所引用的.NET程序集。
  • -Dmsil.ilasm表明ilasm.exe文件的路徑,如果需要直接生成程序集則需要進(jìn)行指定。

那么假設(shè)我們已經(jīng)編譯生成了一個(gè)test.exe文件,現(xiàn)在使用.NET Reflector來(lái)觀察它的信息:

可見(jiàn)test.exe依賴(lài)另外三個(gè)程序集,它們按照依賴(lài)關(guān)系分別是:

  1. mscorlib.dll:定義了一個(gè)程序的基礎(chǔ)需求。
  2. scalaruntime.dll:依賴(lài)mscorlib.dll,定義了Scala語(yǔ)言中的各種基礎(chǔ)類(lèi)型。
  3. predef.dll:依賴(lài)mscorlib.dll及scalaruntime.dll,定義了scala的基礎(chǔ)類(lèi)庫(kù)。

看上去并沒(méi)有什么問(wèn)題,不是嗎?但是,經(jīng)過(guò)簡(jiǎn)單的思考,似乎又不是那么一回事情。好比,您是否覺(jué)得一個(gè)Scala程序的依賴(lài)實(shí)在少了一些?例如您平時(shí)寫(xiě)程序時(shí)能否僅僅依賴(lài)mscorlib.dll,而不使用System.dll或System.Core.dll等其他程序集?那么,為什么Scala便可以?xún)H僅基于mscorlib.dll而構(gòu)建predef.dll呢?為此,我們簡(jiǎn)單比較一下predef.dll與Java平臺(tái)上Scala的標(biāo)準(zhǔn)庫(kù)——scala-library.jar。首先是predef.dll:

其次是scala-library.jar中的定義:

可以看出,Scala標(biāo)準(zhǔn)庫(kù)中定義了比predef.dll中更多的類(lèi)庫(kù)。例如Scala一直引以為傲的Actor類(lèi)庫(kù),即scala.actors命名空間。換句話說(shuō),.NET平臺(tái)上的Scala并不支持Java平臺(tái)上的許多高級(jí)功能——這樣似乎可以理解為什么它只需依賴(lài)mscorlib.dll就足夠了。不過(guò)“標(biāo)準(zhǔn)類(lèi)庫(kù)少”是壞事還是好事倒也不能輕易下結(jié)論。

如果說(shuō)這是壞事——類(lèi)庫(kù)少自然是壞事。那么“好事”又從何談起呢?我的理解是:Scala畢竟是為Java平臺(tái)設(shè)計(jì)的語(yǔ)言,它本可不必對(duì).NET提供支持。也就是說(shuō),.NET平臺(tái)只是Scala的“副業(yè)”。如果說(shuō),因?yàn)镮L和Java Code相近(或者說(shuō)有很大程度的“包含”關(guān)系),那么編譯器在寫(xiě)起來(lái)相對(duì)問(wèn)題不大,但“類(lèi)庫(kù)”就無(wú)法討巧了。如果.NET類(lèi)庫(kù)跟得太緊,那么我反而要懷疑它的質(zhì)量是否成熟。在使用Scala時(shí),我主要關(guān)注的其實(shí)是“編譯器”及最終生成的IL,我并沒(méi)有期望能夠使用Scala在.NET平臺(tái)上編寫(xiě)程序。對(duì)此,編譯器是否成熟對(duì)我們來(lái)說(shuō)可能更加重要。因此,.NET類(lèi)庫(kù)少也并不是壞事——畢竟.NET Framework已經(jīng)提供了足夠的功能,不是嗎?

是嗎?

如果您比較心細(xì),您應(yīng)該已經(jīng)從第一幅圖中看出問(wèn)題來(lái)了。我特意將焦點(diǎn)放在mscorlib.dll上,目的便是展示它的版本信息,即:

  1. mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 

如果您關(guān)注一下平時(shí)寫(xiě)程序時(shí)所使用的mscorlib.dll,會(huì)發(fā)現(xiàn)它是這樣的:

  1. mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e 

為什么會(huì)不一樣?那是因?yàn)镾cala所使用的mscorlib.dll是“自己帶來(lái)的”,并不是系統(tǒng)安裝的.NET Framework。那么它究竟是什么呢?展開(kāi)后便可一目了然:

因?yàn)樗⒉皇俏④浱峁┑?NET Framework,而是Mono平臺(tái)提供的.NET類(lèi)庫(kù)!如果您使用.NET Reflector來(lái)查看其中某些類(lèi)庫(kù)的具體實(shí)現(xiàn),會(huì)發(fā)現(xiàn)它和.NET Framework中實(shí)現(xiàn)有很明顯的不同(如字符串的連接操作)。

有朋友可能會(huì)想,這問(wèn)題應(yīng)該不大,只要在編譯時(shí)提供機(jī)器上安裝的程序集不就可以了嗎?但問(wèn)題是,微軟發(fā)布的.NET Framework,他們都是依賴(lài)于mscorlib.dll——這是每個(gè).NET程序的核心,例如其中定義了一些基礎(chǔ)數(shù)據(jù)類(lèi)型。想象一下,Scala編譯器使用的是Mono里定義的String類(lèi)型,那么如何把它傳遞給MS .NET里定義的方法呢?要知道后者使用的可是MS .NET里的String!

經(jīng)過(guò)多番嘗試,我無(wú)法讓Scala編譯器使用MS .NET里的程序集——即便是再簡(jiǎn)單的case。當(dāng)然,目前我還無(wú)法確定這是Scala編譯器的問(wèn)題,亦或的確只是類(lèi)庫(kù)的關(guān)系。不知道修改一下Scala的編譯器或是基于Mono進(jìn)行編譯能否成功,我會(huì)再進(jìn)行更多嘗試——如果某一天您發(fā)現(xiàn)我又寫(xiě)了一篇“下”,而現(xiàn)在這篇變成了“中”……也是非常正常的事情。:)

原文鏈接:http://www.cnblogs.com/JeffreyZhao/archive/2009/12/21/scala-for-dotnet-2-analysis.html

【編輯推薦】

  1. 在.NET平臺(tái)上使用Scala語(yǔ)言(上):初嘗
  2. 詳細(xì)介紹Scala面向?qū)ο缶幊?/a>
  3. Scala登陸.NET平臺(tái)
  4. Scala語(yǔ)言編程入門(mén)指南
  5. “Scala” 一個(gè)有趣的語(yǔ)言
責(zé)任編輯:林師授 來(lái)源: 趙劼的博客
相關(guān)推薦

2012-04-25 14:12:12

JavaScala

2012-04-26 13:37:43

ScalaJavaQCon

2017-03-20 17:20:35

iOSTensorFlow

2013-08-27 10:31:05

Headless模式Java SE設(shè)計(jì)模式

2011-07-20 09:27:37

Scala

2010-06-09 17:46:53

2017-02-23 13:51:05

2011-07-28 15:07:23

iOS猜數(shù)游戲

2010-05-19 16:53:31

MySQL代碼

2019-06-19 16:05:51

AppImageFlathubLinux

2020-02-18 09:45:44

云計(jì)算云平臺(tái)IT

2011-08-23 09:16:19

Python

2015-07-08 11:28:53

云服務(wù)平臺(tái)Docker MachDocker

2012-08-22 11:12:11

Ubuntu

2011-09-07 09:51:27

Javascript

2012-06-08 09:28:15

EclipseScalaAndroid

2009-07-08 12:43:59

Scala ServlScala語(yǔ)言

2013-07-09 09:43:04

函數(shù)式思維函數(shù)式編程編程

2019-10-09 08:00:17

Kubernetes容器云平臺(tái)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)