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?
Odpowiedz
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
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(" "))
Możliwa duplikat http://stackoverflow.com/questions/7620144? –
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. –