2013-07-19 30 views
8

Ngoài các vấn đề về hiệu suất nghiêm trọng, Scala là một ngôn ngữ rất mạnh. Vì vậy, tôi hiện đang sử dụng nó thường xuyên cho các tác vụ kịch bản bên trong Bash. Có cách nào để chỉ thực hiện một tập tin * .scala chính xác cách tôi có thể làm với các tập tin Python? Theo như tôi biết, Python sử dụng bytecode để thực thi các chương trình, giống như JVM. Tuy nhiên, không có bất cứ điều gì gọi là pythonc (như scalac hoặc javac) tôi cần phải gọi để thực hiện điều này. Do đó tôi mong đợi Scala có thể hành động theo cách tương tự.Viết kịch bản bằng Scala: Cách khởi chạy tập lệnh chưa được biên dịch?

+1

trùng lặp có thể xảy ra của http://stackoverflow.com/questions/7620144? –

+2

Tôi không chắc chắn ý nghĩa định lượng để gắn vào "nghiêm trọng", nhưng Scala xấp xỉ hiệu suất của các ngôn ngữ JVM khác khi được sử dụng mà không chú ý đặc biệt đến hiệu suất và rất cạnh tranh với Java khi bạn áp dụng các tối ưu hóa thích hợp cho các điểm nóng được xác định theo kinh nghiệm. Tất nhiên, nếu bạn bao gồm thời gian khởi động JVM, nó không so sánh thuận lợi với mã gốc hoặc thậm chí các ngôn ngữ thông dịch thông thường như Python hoặc Perl. Nhưng khi bạn biên dịch mã mỗi khi bạn chạy một "tập lệnh", nó sẽ cố gắng kiên nhẫn của bất kỳ ai — Đừng làm vậy. –

Trả lời

2

tôi không sử dụng python, nhưng trong Scala, điều scripty nhất mà tôi có thể làm là thế này:

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 > 

Tuy nhiên, sau đó, tôi không có ý kiến ​​phản hồi thị giác trong bash, vì vậy tôi có để gọi 'rõ ràng'.

Nhưng không có vấn đề trong việc viết một kịch bản và thực hiện điều đó:

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

Sau đó, không có vấn đề với vỏ.

Với một lớp kèm theo, mã sẽ không được thực thi:

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)) 
} 

Nhưng với instatiating một lớp, bạn có thể thực thi mã trong nó, mà không sử dụng wellknown (hy vọng như vậy) cách 'chính':

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

các scala man page đưa ra một số ví dụ về cách để chạy các đoạn mã Scala như thể chúng là một kịch bản, cho cả Windows và các nền tảng không phải là Windows (sau đây ví dụ copy từ man page):

01.

Unix

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

của Windows

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

Đẩy nhanh tiến độ chạy tiếp theo bạn có thể cache đoạn biên soạn với các tùy chọn -savecompiled:

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

Cập nhật: như của Scala 2.11 (như đã nêu trong this similar answer), bạn có thể bây giờ chỉ cần làm điều này trên Unix:

#!/usr/bin/env scala 
println("Hello, world!") 
println(args.mkString(" ")) 
Các vấn đề liên quan