go语言 不支持动态加载_动态语言支持
go語言 不支持動(dòng)態(tài)加載
本文是我們名為“ 高級Java ”的學(xué)院課程的一部分。
本課程旨在幫助您最有效地使用Java。 它討論了高級主題,包括對象創(chuàng)建,并發(fā),序列化,反射等。 它將指導(dǎo)您完成Java掌握的旅程! 在這里查看 !
目錄
1.簡介 2.動(dòng)態(tài)語言支持 3.腳本API 4. JVM上JavaScript 5.在JVM上使用Groovy 6. JVM上的Ruby 7. JVM上的Python 8.使用腳本API 9.接下來 10.下載代碼1.簡介
在本教程的這一部分中,我們的注意力將完全集中在Java中的腳本和動(dòng)態(tài)語言支持上。 從Java 7開始,JVM就直接支持現(xiàn)代動(dòng)態(tài)語言(通常也稱為腳本語言),并且Java 8版本對該空間進(jìn)行了進(jìn)一步的增強(qiáng)。
動(dòng)態(tài)語言的優(yōu)勢之一是程序的行為是在運(yùn)行時(shí)定義的,而不是在編譯時(shí)定義的。 在這些語言中, Ruby ( https://www.ruby-lang.org/en/ ), Python ( https://www.python.org/ )和JavaScript ( http://en.wikipedia.org/wiki/ JavaScript )已廣受歡迎,并且是目前使用最廣泛的JavaScript 。 我們將研究Java腳本API如何為將這些語言集成到現(xiàn)有Java應(yīng)用程序中提供一種方法。
2.動(dòng)態(tài)語言支持
眾所周知,Java是一種靜態(tài)類型的語言。 這意味著在編譯時(shí)可以獲得類,其成員,方法參數(shù)和返回值的所有類型信息。 使用所有這些詳細(xì)信息,Java編譯器會(huì)發(fā)出強(qiáng)類型的字節(jié)碼,然后JVM可以在運(yùn)行時(shí)對其進(jìn)行有效地解釋。
但是,動(dòng)態(tài)語言在運(yùn)行時(shí)而不是編譯時(shí)執(zhí)行類型檢查。 處理動(dòng)態(tài)語言的挑戰(zhàn)是如何實(shí)現(xiàn)一個(gè)運(yùn)行時(shí)系統(tǒng),該系統(tǒng)可以選擇一種最合適的方法實(shí)現(xiàn),以在程序編譯后進(jìn)行調(diào)用。
長期以來,JVM一直沒有對動(dòng)態(tài)類型語言的特殊支持。 但是Java 7版本引入了新的invokedynamic指令,該指令使運(yùn)行時(shí)系統(tǒng)(JVM)能夠自定義調(diào)用站點(diǎn)(調(diào)用方法的位置)與方法實(shí)現(xiàn)之間的鏈接。 它確實(shí)為在JVM平臺(tái)上提供有效的動(dòng)態(tài)語言支持和實(shí)施打開了一扇門。
3.腳本API
作為2006年發(fā)行的Java 6的一部分,新的腳本API已在javax.script包下引入。 這個(gè)可擴(kuò)展的API旨在插入大多數(shù)腳本語言(提供腳本引擎實(shí)現(xiàn))并在JVM平臺(tái)上運(yùn)行。
實(shí)際上,Java腳本API非常小而且非常簡單。 開始使用腳本API的第一步是創(chuàng)建ScriptEngineManager類的新實(shí)例。 ScriptEngineManager提供了從正在運(yùn)行的應(yīng)用程序類路徑中按名稱搜索和檢索可用腳本引擎的功能。
每個(gè)腳本引擎使用各自的ScriptEngine實(shí)現(xiàn)表示,并且實(shí)質(zhì)上提供了使用eval()函數(shù)家族(具有多個(gè)重載版本)執(zhí)行腳本的能力。 已經(jīng)有很多流行的腳本(動(dòng)態(tài))語言已經(jīng)提供了對Java腳本API的支持,在本教程的下一部分中,我們將通過玩JavaScript , Groovy , Ruby / JRuby和Python / Jython來了解該API在實(shí)踐中的效果。 。
4. JVM上JavaScript
我們并非偶然地開始使用JavaScript語言,因?yàn)樗荍ava標(biāo)準(zhǔn)庫腳本API支持的最早的腳本語言之一。 而且,從總體上講,它是每個(gè)Web瀏覽器都能理解的單一編程語言。
eval()函數(shù)以最簡單的形式執(zhí)行腳本,并以純Java字符串的形式傳遞給腳本。 該腳本沒有與評估者(或調(diào)用者)共享的狀態(tài),并且是獨(dú)立的代碼段。 但是,在典型的實(shí)際應(yīng)用程序中,這種情況非常罕見,并且經(jīng)常需要將一些變量或?qū)傩蕴峁┙o腳本才能執(zhí)行一些有意義的計(jì)算或操作。 話雖如此,讓我們看一個(gè)使用簡單變量綁定評估真實(shí)JavaScript函數(shù)調(diào)用的快速示例:
final ScriptEngineManager factory = new ScriptEngineManager(); final ScriptEngine engine = factory.getEngineByName( "JavaScript" );final Bindings bindings = engine.createBindings(); bindings.put( "str", "Calling JavaScript" ); bindings.put( "engine", engine );engine.eval( "print(str + ' from ' + engine.getClass().getSimpleName() )", bindings );執(zhí)行后,將在控制臺(tái)上打印以下輸出:
Calling JavaScript from RhinoScriptEngine相當(dāng)長一段時(shí)間以來 , Rhino一直是JVM上可用的單個(gè)JavaScript腳本引擎。 但是Java 8版本帶來了名為NashornJavaScript腳本引擎的全新實(shí)現(xiàn)( http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html )。
從API的角度來看,并沒有太多的區(qū)別,但是內(nèi)部實(shí)現(xiàn)有很大的不同,從而保證了更好的性能。 這是使用Nashorn JavaScript引擎重寫的同一示例:
final ScriptEngineManager factory = new ScriptEngineManager(); final ScriptEngine engine = factory.getEngineByName( "Nashorn" );final Bindings bindings = engine.createBindings(); bindings.put( "engine", engine );engine.eval( "print(str + ' from ' + engine.getClass().getSimpleName() )", bindings );以下輸出將打印在控制臺(tái)上(請注意這次不同的腳本引擎實(shí)現(xiàn)):
Calling JavaScript from NashornScriptEngine盡管如此,我們看過JavaScript代碼片段的例子卻是微不足道的。 實(shí)際上,您可以使用重載的eval()函數(shù)調(diào)用來評估整個(gè)JavaScript文件,并僅在JavaScript中實(shí)現(xiàn)相當(dāng)復(fù)雜的算法。 在接下來的部分中,我們將在探索其他腳本語言時(shí)看到這些示例。
5.在JVM上使用Groovy
Groovy ( http://groovy.codehaus.org )是JVM平臺(tái)最成功的動(dòng)態(tài)語言之一。 它通常與Java并行使用,但是它也提供Java腳本API引擎實(shí)現(xiàn),并且可以與JavaScript相似的方式使用。
讓我們通過開發(fā)一個(gè)小的獨(dú)立腳本,使這個(gè)Groovy示例更加有意義和有趣,該腳本在控制臺(tái)上打印出通過調(diào)用Java應(yīng)用程序與其共享的藏書中每本書的一些詳細(xì)信息。
Book類非常簡單,只有兩個(gè)屬性,author和title:
public class Book {private final String author;private final String title;public Book(final String author, final String title) {this.author = author;this.title = title;}public String getAuthor() {return author;}public String getTitle() {return title;} }Groovy腳本(僅命名為script.groovy )使用一些漂亮的語言功能(例如閉包和字符串插值)將書籍屬性輸出到控制臺(tái):
books.each { println "Book '$it.title' is written by $it.author" }println "Executed by ${engine.getClass().simpleName}" println "Free memory (bytes): " + Runtime.getRuntime().freeMemory()現(xiàn)在,讓我們使用Java腳本API和預(yù)定義的書籍集合(當(dāng)然,有關(guān)Groovy的所有內(nèi)容)執(zhí)行此Groovy腳本:
final ScriptEngineManager factory = new ScriptEngineManager(); final ScriptEngine engine = factory.getEngineByName( "Groovy" );final Collection< Book > books = Arrays.asList(new Book( "Venkat Subramaniam", "Programming Groovy 2" ),new Book( "Ken Kousen", "Making Java Groovy" ));final Bindings bindings = engine.createBindings(); bindings.put( "books", books ); bindings.put( "engine", engine );try( final Reader reader = new InputStreamReader( Book.class.getResourceAsStream("/script.groovy" ) ) ) {engine.eval( reader, bindings ); }請注意, Groovy腳本引擎具有對Java標(biāo)準(zhǔn)庫的完全訪問權(quán)限,并且不需要任何附加綁定。 為了確認(rèn)這一點(diǎn),上述Groovy腳本的最后一行通過調(diào)用Runtime.getRuntime()靜態(tài)方法訪問當(dāng)前的運(yùn)行時(shí)環(huán)境,并打印出可用于運(yùn)行JVM的可用堆數(shù)量(以字節(jié)為單位)。 以下示例輸出將出現(xiàn)在控制臺(tái)上:
Book 'Programming Groovy 2' is written by Venkat Subramaniam Book 'Making Java Groovy' is written by Ken Kousen Executed by GroovyScriptEngineImpl Free memory (bytes): 153427528自Groovy推出以來已有10年了。 由于具有創(chuàng)新的語言功能(類似于Java語法)以及與現(xiàn)有Java代碼的出色互操作性,它很快變得非常流行。 看起來lambda和Java 8中的Stream API的引入使Groovy的選擇不太吸引人,但是Java開發(fā)人員仍然廣泛使用它。
6. JVM上的Ruby
幾年前, Ruby ( https://www.ruby-lang.org/en/ )是用于Web應(yīng)用程序開發(fā)的最流行的動(dòng)態(tài)語言。 盡管如今它的流行程度已逐漸消失,但Ruby及其生態(tài)系統(tǒng)在現(xiàn)代Web應(yīng)用程序開發(fā)中帶來了許多創(chuàng)新,啟發(fā)了許多其他編程語言和框架的創(chuàng)建和發(fā)展。
JRuby ( http://jruby.org/ )是JVM平臺(tái)的Ruby編程語言的實(shí)現(xiàn)。 與Groovy相似,它還提供了與現(xiàn)有Java代碼的出色互操作性,從而保留了Ruby語言語法的美感。
讓我們用Ruby語言(名稱為script.jruby )從“ JVM上的Groovy”部分重寫Groovy腳本,并使用Java腳本API對其進(jìn)行評估。
$books.each do |it| java.lang.System.out.println( "Book '" + it.title + "' is written by " + it.author ) endjava.lang.System.out.println( "Executed by " + $engine.getClass().simpleName ) java.lang.System.out.println( "Free memory (bytes): " + java.lang.Runtime.getRuntime().freeMemory().to_s )腳本評估代碼基本保持不變,只是腳本引擎和示例書籍集合有所不同,而這一切都與Ruby有關(guān)。
final ScriptEngineManager factory = new ScriptEngineManager(); final ScriptEngine engine = factory.getEngineByName( "jruby" );final Collection< Book > books = Arrays.asList(new Book( "Sandi Metz", "Practical Object-Oriented Design in Ruby" ),new Book( "Paolo Perrotta", "Metaprogramming Ruby 2" ));final Bindings bindings = engine.createBindings(); bindings.put( "books", books ); bindings.put( "engine", engine );try( final Reader reader = new InputStreamReader( Book.class.getResourceAsStream("/script.jruby" ) ) ) {engine.eval( reader, bindings ); }以下示例輸出將出現(xiàn)在控制臺(tái)上:
Book 'Practical Object-Oriented Design in Ruby' is written by Sandi Metz Book 'Metaprogramming Ruby 2' is written by Paolo Perrotta Executed by JRubyEngine Free memory (bytes): 142717584從上面的JRuby代碼片段可以看出,使用標(biāo)準(zhǔn)Java庫中的類有點(diǎn)冗長,并且必須以程序包名稱作為前綴(有一些技巧可以避免這種情況,但是我們不做這些特定的細(xì)節(jié))。
7. JVM上的Python
我們最后一個(gè)但并非最不重要的示例將展示在JVM平臺(tái)上的Python ( https://www.python.org/ )語言實(shí)現(xiàn),稱為Jython ( http://www.jython.org/ )。
Python語言最近獲得了廣泛的關(guān)注,并且其流行程度每天都在增長。 它被科學(xué)界廣泛使用,并具有從網(wǎng)絡(luò)開發(fā)到自然語言處理的大量庫和框架。
遵循與Ruby相同的路徑,我們將使用Python語言(名稱為script.py )從JVM部分的Groovy重寫示例腳本,并使用Java腳本API對其進(jìn)行評估。
from java.lang import Runtimefor it in books: print "Book '%s' is written by %s" % (it.title, it.author)print "Executed by " + engine.getClass().simpleName print "Free memory (bytes): " + str( Runtime.getRuntime().freeMemory() )讓我們實(shí)例化Jython腳本引擎,并使用已經(jīng)熟悉的Java腳本API執(zhí)行上面的Python腳本。
final ScriptEngineManager factory = new ScriptEngineManager(); final ScriptEngine engine = factory.getEngineByName( "jython" );final Collection< Book > books = Arrays.asList(new Book( "Mark Lutz", "Learning Python" ),new Book( "Jamie Chan", "Learn Python in One Day and Learn It Well" ));final Bindings bindings = engine.createBindings(); bindings.put( "books", books ); bindings.put( "engine", engine );try( final Reader reader = new InputStreamReader( Book.class.getResourceAsStream("/script.py" ) ) ) {engine.eval( reader, bindings ); }以下示例輸出將在控制臺(tái)上打印出來:
Book 'Learning Python' is written by Mark Lutz Book 'Learn Python in One Day and Learn It Well' is written by Jamie Chan Executed by PyScriptEngine Free memory (bytes): 132743352Python作為編程語言的強(qiáng)大之處在于其簡單性和陡峭的學(xué)習(xí)曲線。 隨著一大批Python開發(fā)人員的加入,以某種可擴(kuò)展性機(jī)制將Python腳本語言集成到Java應(yīng)用程序中的能力聽起來像是一個(gè)有趣的主意。
8.使用腳本API
Java 腳本API是通過可擴(kuò)展的腳本支持來豐富Java應(yīng)用程序的好方法,只需選擇您的語言即可。 這也是插入域?qū)S谜Z言 (DSL)的最簡單方法,并允許業(yè)務(wù)專家以最方便的方式表達(dá)其意圖。
JVM本身的最新更改(請參見“ 動(dòng)態(tài)語言支持”部分)使它成為適用于不同動(dòng)態(tài)(腳本)語言實(shí)現(xiàn)的更友好的運(yùn)行時(shí)平臺(tái)。 毫無疑問,將來會(huì)有越來越多的腳本語言引擎可用,這為與新的和現(xiàn)有的Java應(yīng)用程序無縫集成打開了大門。
9.接下來
從這一部分開始,我們實(shí)際上是在開始有關(guān)Ja??va作為語言和JVM作為高級運(yùn)行時(shí)執(zhí)行平臺(tái)的高級概念的討論。 在本教程的下一部分中,我們將研究Java Compiler API和Java Compiler Tree API,以學(xué)習(xí)如何在運(yùn)行時(shí)操作Java源代碼。
9.下載代碼
這是動(dòng)態(tài)語言支持課程,是高級Java課程的第12部分。 您可以在此處下載源代碼: advanced-java-part-12
翻譯自: https://www.javacodegeeks.com/2015/09/dynamic-languages-support.html
go語言 不支持動(dòng)態(tài)加載
總結(jié)
以上是生活随笔為你收集整理的go语言 不支持动态加载_动态语言支持的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ps反转选项的快捷键(ps快速反转快捷键
- 下一篇: jooq和jdbc_将jOOQ与JDBC