大數據語言Scala初識

大數據語言Scala初識

1、引入

最近因為Spark的興起,Scala也炙手可熱,個人並不認為它是一個新興的編程語言,雖然它提供了全新的語法,本文主要介紹Scala環境和幾種運行方式,以及通過實例觀察Scala和JAVA的關係,學習Scala主要參考Scala語法手冊和Scala實例。

2、Scala環境

Linux上可以使用類似於JDK環境安裝的方式,下載Scala,設置PATH,不過我在Scala官網上找了半天Linux包才在這裡找到。這種方式同樣適用於Windows,不過Windows可以在Scala官網上下載安裝包,並且可以下載基於eclipse等IDE的Scala IDE,Scala有兩種使用方式。

  • 類似於Python的方式直接作為交互式方式運行,直接運行scala命令就可以進入交互式環境,或者編寫一個scala腳本文件,在不進行編譯的情況下直接使用scala命令運行(類似於Python),不過scala不能像java源碼中那樣定義package。

  • 類似於Java的方式編譯運行,類似於java,scala還提供了scalac/scalap等工具,通過scalac編譯之後的scala文件生成.class文件,和javac的結果相同,然後可以使用scala命令執行程序,下面使用Hello World的實例分別展示這幾種方式的使用方式。

3、實例

1)交互式命令行

$ scalaWelcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_101).Type in expressions for evaluation. Or try :help.scala> println("Hello World !")Hello World !scala> var s = "Hello World !"s: String = Hello World !scala> println(s)Hello World !12345678910111213

2)scala作為腳本執行

var s = "Hello World !"println(s)hzfengyu@HIH-L-1888 MINGW64 /e/Scala$ scala ./helloWorld.scalaHello World !1234567

3)使用scala編譯執行

object HelloWorld { def main(args : Array[String]) : Unit = { var s = "Hello World !" println(s) }}1234567

直接使用scala執行:

$ scala ./HelloWorld.scalaHello World !123

編譯執行:

$ scalac -cp . ./HelloWorld.scalahzfengyu@HIH-L-1888 MINGW64 /e$ ls HelloWorld*'HelloWorld$.class' HelloWorld.class HelloWorld.scalahzfengyu@HIH-L-1888 MINGW64 /e$ scala -cp . HelloWorldHello World !12345678910

使用java命令執行:

$ java -cp . HelloWorldException in thread "main" java.lang.NoClassDefFoundError: scala/Predef$ at HelloWorld$.main(HelloWorld.scala:4) at HelloWorld.main(HelloWorld.scala)Caused by: java.lang.ClassNotFoundException: scala.Predef$ at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 2 more1234567891011

可以看出使用java來運行這個class缺少一些jar,因此我們嘗試將scala安裝包lib下面的jar加入到classpath中。It Works!

$ java -cp .:$SCALA_HOME/lib/* HelloWorldHello World !123

反編譯成Java:

通過這幾個實例可以看出,scala是基於java的,個人覺得它其實就是提供了一種新的編程語法,提供了scala自己的一些函數式編程的函數,然後通過編譯將其轉換成JVM能夠識別的class文件,所以使用java命令也是可以運行的,設置我們可以通過jad命令(不是jdk裡面的工具)將scala代碼反編譯成java代碼,在上面可以看到,HelloWorld.scala文件通過scalac編譯之後生成了兩個class文件,分別將它們反編譯。如下:

$ jad ./HelloWorld.class

Parsing ./HelloWorld.class…The class file version is 50.0 (only 45.3, 46.0 and 47.0 are supported)

Generating HelloWorld.jad

$ cat HelloWorld.jad// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.// Jad home page: http://www.geocities.com/kpdus/jad.html// Decompiler options: packimports(3)// Source File Name: HelloWorld.scalapublic final class HelloWorld{ public static void main(String args[]) { HelloWorld$.MODULE$.main(args); }}$ jad ./HelloWorld$.classParsing ./HelloWorld$.class...The class file version is 50.0 (only 45.3, 46.0 and 47.0 are supported)Generating HelloWorld$.jad$ cat HelloWorld$.jad// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.// Jad home page: http://www.geocities.com/kpdus/jad.html// Decompiler options: packimports(3)// Source File Name: HelloWorld.scalaimport scala.Predef$;public final class HelloWorld${ public void main(String args[]) { String s = "Hello World !"; Predef$.MODULE$.println(s); } private HelloWorld$() { } public static final HelloWorld$ MODULE$ = this; static { new HelloWorld$(); }}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748

這個反編譯回來的文件就是熟悉的java代碼了,可以看到它導入了scala.Predef$這個類,這個是scala語言包裡面的類,所以當我們使用java執行該程序,在classpath中加上scala包之後就可以把它當做一個普通java程序運行了。

4、總結

所以我覺得scalac類似於執行javac -cp $SCALA_HOME/lib的效果,scala類似於執行scala -cp $SCALA_HOME/lib的效果,而scala本身包含了編譯scala代碼功能,所以最簡單的接受scala的方式是可以把它當做一個java庫,這不過這個庫需要使用全新的語法寫代碼,然後使用特定的工具編譯程序。所以再熟悉JAVA的基礎上學習Scala還是有一點優勢的,不過乍一看Scala的代碼感覺天馬行空的,後面我們會通過實例來學習Scala語法和Scala的庫。


分享到:


相關文章: