2013-07-19 7 views
8

Oprócz poważnych problemów z wydajnością, Scala jest bardzo potężnym językiem. Dlatego używam go często do skryptowanych zadań w Bashu. Czy istnieje sposób, aby po prostu wykonać plik * .scala dokładnie w taki sposób, w jaki robię pliki Python? O ile mi wiadomo, Python wykorzystuje kod bajtowy do uruchamiania programów, dokładnie tak, jak robi to JVM. Jednak nie ma nic o nazwie pythonc (jak skalac lub javac) muszę zadzwonić, aby to osiągnąć. Dlatego oczekuję, że Scala będzie mogła działać w podobny sposób.Skrypty ze Scala: Jak uruchomić nieskompilowany skrypt?

+1

Możliwa duplikat http://stackoverflow.com/questions/7620144? –

+2

Nie jestem pewien, jakie znaczenie ilościowe, aby dołączyć do „poważny”, ale Scala jest zbliżona do wyników innych języków JVM gdy stosowany bez szczególnej uwagi na wydajność i jest bardzo konkurencyjny z Java po zastosowaniu odpowiednich optymalizacji empirycznie ustalonych hot-spotów. Oczywiście, jeśli uwzględnisz czas rozruchu maszyny JVM, nie będzie to miało korzystnego wpływu na kod natywny lub nawet na konwencjonalne języki interpretowane, takie jak Python lub Perl. Ale kiedy skompilujesz kod za każdym razem, gdy uruchomisz "scenariusz", spróbuje on czyjejś cierpliwości - nie rób tego. –

Odpowiedz

2

nie używam Python, ale w Scala, najbardziej Scripty co mogę zrobić to w ten sposób:

thinkpux:~/proj/mini/forum > echo 'println(" 3 + 4 = " + (3 + 4))' | scala 
Welcome to Scala version 2.10.2 (Java HotSpot(TM) Server VM, Java 1.7.0_09). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> println(" 3 + 4 = " + (3 + 4)) 
3 + 4 = 7 

scala> thinkpux:~/proj/mini/forum > 

Jednak potem, nie mam zwrotne wizualne w bash, więc mam nazywać "jasne".

Ale nie ma żadnego problemu w pisaniu scenariusza i realizacji, że:

thinkpux:~/proj/mini/forum > echo 'println(" 3 + 4 = " + (3 + 4))' > print7.scala 
thinkpux:~/proj/mini/forum > scala print7.scala 
3 + 4 = 7 

Następnie, nie ma problemów z muszli.

Z klasy okalającego, kod nie zostanie wykonany:

thinkpux:~/proj/mini/forum > echo -e 'class Foo {\nprintln(" 3 + 4 = " + (3 + 4))\n}\n' 
class Foo { 
println(" 3 + 4 = " + (3 + 4)) 
} 

thinkpux:~/proj/mini/forum > scala Foo.scala 
thinkpux:~/proj/mini/forum > cat Foo.scala 
class Foo { 
println(" 3 + 4 = " + (3 + 4)) 
} 

Ale z instatiating klasę, można wykonać kod w nim, bez użycia znaną (mam nadzieję) „główny” sposób:

thinkpux:~/proj/mini/forum > echo -e 'class Foo {\nprintln(" 3 + 4 = " + (3 + 4))\n}\nval foo = new Foo()' > Foo.scala 
thinkpux:~/proj/mini/forum > cat Foo.scala 
class Foo { 
println(" 3 + 4 = " + (3 + 4)) 
} 
val foo = new Foo() 
thinkpux:~/proj/mini/forum > scala Foo.scala 
3 + 4 = 7 
17

scala man page podaje kilka przykładów, w jaki sposób uruchomić kod Scala fragmenty tak, jakby były to skrypt, zarówno dla Windows i platformach innych niż Windows (poniżej przykłady skopiowanych ze strony man):

Unix

#!/bin/sh 
    exec scala "$0" "[email protected]" 
    !# 
    Console.println("Hello, world!") 
    argv.toList foreach Console.println 

Okna

::#! 
    @echo off 
    call scala %0 %* 
    goto :eof 
    ::!# 
    Console.println("Hello, world!") 
    argv.toList foreach Console.println 

Aby przyspieszyć kolejnych przebiegów można buforować fragment skompilowany z opcją -savecompiled:

#!/bin/sh 
    exec scala -savecompiled "$0" "[email protected]" 
    !# 
    Console.println("Hello, world!") 
    argv.toList foreach Console.println 

Aktualizacja: jak Scala 2.11 (jak wspomniano w this similar answer), można teraz po prostu zrobić to na Unix:

#!/usr/bin/env scala 
println("Hello, world!") 
println(args.mkString(" "))