2009-11-06 217 views
10

我見過here,除了腳本語言之外,還有一種編程語言是腳本引擎。但我不明白它是如何工作的,所以我不知道它們的區別。什麼是腳本引擎?

例如,我在導入的庫中看到Java調用方法的代碼,但它與Python或Ruby代碼看起來「不夠」 - 都是腳本語言,對吧?我想這也與程序和麪向對象的範例有關,但最終我不明白他們爲什麼按照它們的方式分類。

編輯:關於作爲解釋器的腳本引擎...... Java不是解釋型語言嗎?我知道有編譯的字節碼,但仍然對我來說沒有意義。

+5

是的,Java(和C#)的典型實現在虛擬機中運行字節碼,也就是解釋器,就像Python或Ruby的典型實現(實際上它可以是_same_解釋器;-)。正如你所注意到的那樣,這個區別是相當糟糕的。 – 2009-11-06 23:36:41

+1

Java不是一種解釋型語言。您有一個名爲javac的編譯器和(虛擬)機器對象二進制文件,稱爲類文件。 – alphazero 2009-11-06 23:41:59

+1

Java不被視爲解釋型語言。你編寫Java代碼,然後你有一個明確的編譯步驟,在那裏Java代碼變成字節碼。然後在Java虛擬機中解釋字節碼。通常當人們說「解釋型語言」時,他們指的是一種語言,您可以直接運行代碼而無需顯式編譯步驟。 (「解釋者」可能會使用Just-In-Time編譯作爲速度優化。)這很模糊:即使是所謂的「編譯」語言,每個人都同意的語言也可以有解釋器。 (谷歌搜索「C解釋器」!) – steveha 2009-11-06 23:54:43

回答

12

「腳本語言」和「編程語言」之間並沒有硬而快的界限。 「腳本語言」的

屬性往往包括:

  • 垃圾回收的內存管理器,而無需顯式地分配和釋放對象

  • 簡單地執行命令的能力,沒有一堆的樣板代碼。 Java通常被用作反例。在Python中,您可以簡單地說print("Hello, world!"),但在Java中,您需要更多的語法(示例here是七行代碼)。

  • 與上面相關,通常在「腳本語言」中,您不必顯式聲明變量,而且您很少需要聲明變量的類型。一些腳本語言(比如Javascript)會強制類型放棄,而另一些(比如Python)強類型,並且會在類型不匹配時引發異常。

  • 不需要顯式的編譯或鏈接步驟;你只需編寫代碼並運行它。 (A「腳本語言」仍然可以剛剛在時間內編制; Python做這個,例如)

除了這些基本的「腳本語言」的範圍可以從一些原始的和瑣碎,像MS-DOS中的「批處理」語言,直至Python,Ruby等表達力強大的語言。

+1

,除了第一點:這不是真的;我知道的唯一不是垃圾回收的語言是C/C++。 – hasen 2009-11-07 09:43:24

+3

@hasanj,你是什麼意思「這不是真的」?我聲稱任何需要你自己'malloc()'和'free()'內存的語言都被取消爲「腳本語言」。我沒有聲稱「非腳本語言」必須強制你管理內存。 – steveha 2009-11-07 22:47:41

+0

@hasanj,如果你看看它,你會發現很多沒有垃圾回收的語言。 FORTRAN,Pascal和C/C++都可以想到,但有很多。當我第一次瞭解它時,AWK對我來說是一件大事,因爲你甚至不必聲明列表會有多長;你可以隨時加入它!確實,許多現代語言都會進行垃圾回收,但是當「腳本語言」首次出現時,垃圾回收的缺乏就成了一件大事。請閱讀下面的「歷史概述」:http://en.wikipedia.org/wiki/Scripting_language – steveha 2009-11-08 07:34:45

2

也許是最接近你正在談論什麼是interpreter

在計算機科學,口譯員 通常意味着 執行,即執行一個計算機程序,指令 用編程語言。 雖然解釋和編譯 是由 編程語言實現的兩種主要手段, 這些都不是完全不同的 類別,其中一個原因是 大多數口譯系統也 執行一些翻譯工作,只是 一樣的編譯器之一。

基本上是一個intepreter(如果你喜歡或腳本引擎)是負責在執行時轉動腳本成機器代碼(相對於它創建之前執行時間機器代碼的編譯器)的組件。

6

您基本上已經發現,腳本語言和「非腳本」語言之間的區別是非常人爲的。 Python可以編譯爲JVM字節碼(使用Jython),我相信Ruby也可以 - 那麼運行Python或Ruby代碼的「引擎」將成爲JVM,運行Java代碼的相同「引擎」(或Scala代碼等等)。與.NET和IronPython(或IronRuby)類似 - 那麼「引擎」就是微軟的CLR,就像C#,Boo等一樣。被稱爲「腳本」的語言通常是動態類型的......但是我從未聽說過用於其他重要動態類型語言的術語,例如Smalltalk,Mozart/OZ或Erlang ...... ;-)。

0

「腳本語言」可能被稱爲口語化。這個術語沒有很好的定義,你會發現關於哪些語言是腳本語言的一些不同意見。傳達語言屬性的模糊概念有時很有用(請參閱steveha's answer)。

「腳本語言」也可能指代語言的特定用法。例如,一個軟件可能會使用Lua作爲其腳本語言 - 最終用戶用來自動化(或「編寫腳本」)複雜任務的語言。

0

腳本/解釋語言和編譯語言之間的一個有用的區別是,您通常可以將腳本語言的解釋程序嵌入已編譯的項目中,例如遊戲引擎。

3

我知道你已經接受了答案,但是有一些含糊不清。

當提到腳本引擎時,我們通常指位於模板內部並生成文本輸出或文檔的小型嵌入式語言。例如Freemarker和Velocity通常被稱爲腳本引擎。 Erb也會坐在這裏,但奇怪的是經常不被稱爲腳本引擎。

腳本語言通常需要沒有編譯步驟,因此能夠更簡單地作爲一個運行,或者,從一個殼腳本。這包括諸如awk,perl,tcl,python,ruby等等。這些語言通常需要簡潔並且類型安全通常是可選的。 Windows支持多種語言,它的腳本主機設施。這爲Windows內的各種組件公開了腳本語言。

所以後來完全編譯語言如Java可能也會運行的字節碼和解釋,可以考慮,但問題是,有一個明確的編譯步驟,也沒有解釋(與Sun JRE反正),它提供了Java代碼的運行時可執行環境。

嵌入了其他語言(如VBA),上面的許多語言都可以嵌入。嵌入式語言也可以作爲主機應用程序的腳本引擎。

在我看來,腳本引擎解釋程序化指令,並依次指示更大的主機應用程序或系統。這些指令立即執行,不用擔心任何剩餘的指令。

許多Lisp在數據和代碼之間沒有區別,可能在運行時動態編譯。解釋,編譯和執行步驟可供Lisp程序員在程序員操作其他語言的數據時進行操作。