成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

kan-java, 一個(gè)能裁剪語(yǔ)法特性的java動(dòng)態(tài)編譯工具

jeyhan / 1332人閱讀

摘要:就是砍這是一個(gè)代碼動(dòng)態(tài)編譯工具,也就是能夠把形式的代碼實(shí)時(shí)地編譯為字節(jié)碼的工具動(dòng)態(tài)編譯工具,其實(shí)自發(fā)布以來(lái),應(yīng)該出現(xiàn)過(guò)很多,不過(guò)的特點(diǎn)在于就像它的名字一樣可以選擇性地砍掉任意語(yǔ)言特性也就是說(shuō)這是一個(gè)可以在動(dòng)態(tài)編譯代碼的同時(shí),對(duì)語(yǔ)言語(yǔ)法

"kan-java" 就是 "砍-java"

這是一個(gè)java代碼動(dòng)態(tài)編譯工具,也就是能夠把String形式的java代碼實(shí)時(shí)地編譯為字節(jié)碼的工具;

“動(dòng)態(tài)編譯”工具,其實(shí)自jdk1.6發(fā)布以來(lái),應(yīng)該出現(xiàn)過(guò)很多,不過(guò)kan-java的特點(diǎn)在于 —— 就像它的名字一樣 —— 可以選擇性地砍掉任意語(yǔ)言特性;

也就是說(shuō) —— 這是一個(gè)可以在動(dòng)態(tài)編譯java代碼的同時(shí),對(duì)java語(yǔ)言語(yǔ)法做裁剪的動(dòng)態(tài)編譯工具。

通過(guò)下面這個(gè)例子可以看出“裁剪”指的是什么意思:

// 禁止帶標(biāo)簽的continue語(yǔ)句
void testLabeledContinue(){
    def kan = new KanJava(Feature.labeledContinue)
    def srcs = []
    srcs << new JavaSourceFile("TestLabeledContinue.java", "kanjava.test", readContent("testLabeledContinue/TestLabeledContinue.src"));
    def rst = kan.checkAndCompile(srcs)

    assertTrue !rst.isSuccess()
    assertTrue rst.errMsg != null
    assertTrue rst.classes == null
    println rst.errMsg
}

上述groovy代碼創(chuàng)建了一個(gè)KanJava編譯工具實(shí)例, 并指明想要砍掉labeledContinue特性(即帶標(biāo)簽的continue語(yǔ)句)
其中readContent方法的返回結(jié)果如下:

package kanjava.test;

public class TestLabeledContinue {

    public static void main(String... args) {
        for(int i=0;i<10;i++){
            if(i == 5) continue;
        }
        label: while(true){
            if(true) continue label;
        }
    }
}

上述代碼包含2個(gè)continue語(yǔ)句:第一個(gè)不帶標(biāo)簽而第二個(gè)帶標(biāo)簽
最終輸出結(jié)果如下:

Error at row: 10, col: 22, reason: Continue statements with labels are not allowed.

即“帶標(biāo)簽的continue語(yǔ)句”已被禁止了,在編譯過(guò)程中發(fā)現(xiàn)這種語(yǔ)句即會(huì)報(bào)錯(cuò), 其核心功能,概念上講就是這么簡(jiǎn)單。

這能有什么用?

擁有一個(gè)裁剪版本的java,這有怎樣的應(yīng)用場(chǎng)景?

目前最直接的答案是"高性能的內(nèi)部DSL"

即當(dāng)我需要一個(gè)語(yǔ)法上非常接近普通過(guò)程式編程語(yǔ)言的DSL,但卻又不想或覺(jué)得沒(méi)必要自己從頭實(shí)現(xiàn)一個(gè)(外部DSL)的時(shí)候,就可以考慮以某種現(xiàn)成的過(guò)程式通用編程語(yǔ)言為藍(lán)本,通過(guò)裁剪其語(yǔ)法達(dá)到目的;
而當(dāng)這種“現(xiàn)成的過(guò)程式通用編程語(yǔ)言”被選擇為java時(shí),kan-java出場(chǎng)的時(shí)刻就到了, 試想一下,下面這樣“砍”會(huì)砍出來(lái)什么效果? ——

private static final KanJava kanJava = new KanJava(Feature.assertion, 
                                                   Feature.doWhileLoop,
                                                   Feature.forLoop,
                                                   Feature.labeledBreak,
                                                   Feature.labeledContinue,
                                                   Feature.nestedClass,
                                                   Feature.whileLoop);

相信所有java程序員都可以猜到:你將得到一個(gè)“沒(méi)有assert語(yǔ)句、沒(méi)有do-while循環(huán)、沒(méi)有for循環(huán)、沒(méi)有帶標(biāo)簽的break、沒(méi)有帶標(biāo)簽的continue、沒(méi)有嵌套類、沒(méi)有while循環(huán)”的 —— java.
P.S. 如果你還堅(jiān)信它是java的話 :)

而這些"內(nèi)部DSL"最終將被編譯成字節(jié)碼運(yùn)行,因此也有了高速運(yùn)行的基礎(chǔ);
所以說(shuō)kan-java能夠成為“利用java實(shí)現(xiàn)高性能的內(nèi)部DSL”的強(qiáng)大工具。

上面示例中的這種“砍”法并不夸張,這是從現(xiàn)實(shí)中的使用案例中截選出來(lái)的。

一些更實(shí)用 & 更高級(jí)的功能

kan-java提供的api能夠?qū)ⅰ翱痴Z(yǔ)法”和“編譯為字節(jié)碼”拆分為兩個(gè)步驟;
這使得你可以 —— 比如說(shuō) —— 在用戶輸入的時(shí)候禁掉"import語(yǔ)句",而實(shí)際編譯的時(shí)候可以正常插入import語(yǔ)句后再編譯, 相信這種功能會(huì)很有用;

更普遍意義地講,kan-java實(shí)際上提供了一套"java語(yǔ)言語(yǔ)法靜態(tài)處理框架", 在此框架之上,“砍”語(yǔ)法其實(shí)只是冰山一角 —— 因?yàn)槟氵€可以用它來(lái)“砍用法”,比如你并不想完全禁掉import語(yǔ)句,但希望禁止import一些特定的類;
再比如你不想完全禁止用戶new對(duì)象,但你能夠做到不讓用戶new特定的對(duì)象...

凡是能夠出現(xiàn)在代碼當(dāng)中的任意結(jié)構(gòu),都可以被控制。
因此可以說(shuō),被發(fā)布出來(lái)的kan-java庫(kù)只是一個(gè)小小的核心,其更加廣闊的應(yīng)用場(chǎng)景還有待猿們繼續(xù)擴(kuò)充...

有沒(méi)有更加“高級(jí)(黑)”的話題? 當(dāng)然有;因?yàn)樵趉an-java提供的這套框架之上不僅限于能“砍”,它還能“加”...
不過(guò)目前這個(gè)庫(kù)的主要目的還是提供一套“基于java的內(nèi)部DSL構(gòu)建工具”,其它的什么“用kan-java做源碼增強(qiáng)”,什么“用kan-java把java編譯到GPU上”這些黑科技就暫不展開(kāi)了 :)

注意事項(xiàng)

最重要的事情總是最后才說(shuō)...

目前kan-java所支持的java基礎(chǔ)語(yǔ)法是1.6的,也就是說(shuō),你使用kan-java來(lái)“砍”語(yǔ)法的時(shí)候,是以java 1.6為基礎(chǔ)來(lái)砍的
不過(guò)這并不影響kan-java庫(kù)被放到更高版本的java環(huán)境中使用(above v1.6), 起碼大多數(shù)情況下是ok的;不過(guò),如果真的遇到問(wèn)題,還是最好能從源碼編譯一份對(duì)應(yīng)當(dāng)前java版本環(huán)境的kan-java庫(kù)(因?yàn)閗an-java在實(shí)現(xiàn)上使用了com.sun包下的一些類, 這些類并不完全保證在不同版本java之間的兼容)

同樣因?yàn)閗an-java使用了com.sun包下的類,我也只能假定kan-java只能在oracle hotspot jvm上運(yùn)行

目前開(kāi)放的可被“砍”的功能,只是源于目前我個(gè)人在實(shí)際項(xiàng)目中的需要而已;肯定還有更多可能的“花式砍法”,如果希望有,可以提出來(lái),有興趣的我們可以共建

使用kan-java時(shí),需確保tools.jar也在classpath中

按道理講,除了java標(biāo)準(zhǔn)庫(kù),kan-java是不需要依賴任何第三方庫(kù)的,不過(guò)項(xiàng)目中出現(xiàn)了對(duì)groovy-all的依賴,這僅僅是因?yàn)槲蚁雽?shí)踐一把"java和groovy混編開(kāi)發(fā)模式"的任性而已,不要太在意 :)

目前的發(fā)布版本為v0.1, maven依賴為:


    com.github.pfmiles
    kan-java
    0.1

原文鏈接:https://github.com/pfmiles/kan-java

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64304.html

相關(guān)文章

  • Java與groovy混編 —— 一種兼顧接口清晰和實(shí)現(xiàn)敏捷開(kāi)發(fā)方式

    摘要:原文鏈接有大量平均水平左右的工人可被選擇參與進(jìn)來(lái)這意味著好招人有成熟的大量的程序庫(kù)可供選擇這意味著大多數(shù)項(xiàng)目都是既有程序庫(kù)的拼裝,標(biāo)準(zhǔn)化程度高而定制化場(chǎng)景少開(kāi)發(fā)工具測(cè)試工具問(wèn)題排查工具完善,成熟基本上沒(méi)有團(tuán)隊(duì)愿意在時(shí)間緊任務(wù)重的項(xiàng)目情況 原文鏈接:http://pfmiles.github.io/blog/java-groovy-mixed/ 有大量平均水平左右的工人可被選擇、參與...

    LittleLiByte 評(píng)論0 收藏0
  • 【精致Java教程】01:認(rèn)識(shí)Java

    摘要:小組最開(kāi)始由兩名程序員和,一名工程師三人組成,后續(xù)有人員擴(kuò)充。其中是最具代表性的人物,如今被稱為語(yǔ)言之父。后于年月日對(duì)外公布這門編程語(yǔ)言,標(biāo)志著的誕生。官方宣稱全世界有萬(wàn)開(kāi)發(fā)者。數(shù)據(jù)顯示目前處于榜首。 歡迎你來(lái)到Java的世界,作為Java的第一篇文章不可免俗的要做一次介紹,這些東西往往比較枯燥所以我盡可能寫的有故事趣味一點(diǎn)。對(duì)于初學(xué)者歷史或者特性的東西瀏覽一遍有所了解即可,即使不知所...

    keithxiaoy 評(píng)論0 收藏0
  • JavaScript編程全解 —— 基礎(chǔ)

    摘要:函數(shù)式編程最后介紹一下函數(shù)式編程。函數(shù)式編程是一種歷史悠久,而又在最近頗為熱門的話題。函數(shù)式編程在面向?qū)ο笠辉~誕生以前就已經(jīng)存在,不過(guò)它在很長(zhǎng)一段時(shí)間里都被隱藏于過(guò)程式編程面向?qū)ο笠彩沁^(guò)程式編程的一種的概念之下。 2.1 JavaScript特點(diǎn) 總結(jié)以下幾個(gè)特點(diǎn): 解釋型語(yǔ)言 類似與C和Java的語(yǔ)法結(jié)構(gòu) 動(dòng)態(tài)語(yǔ)言 基于原型的面向?qū)ο?字面量的表現(xiàn)能力 函數(shù)式編程 解釋型語(yǔ)言:...

    CoreDump 評(píng)論0 收藏0
  • 45個(gè)必備JavaScript Web開(kāi)發(fā)工具

    摘要:幸運(yùn)的是,為了完成獨(dú)特的任務(wù),無(wú)以計(jì)數(shù)的工具已經(jīng)被開(kāi)發(fā)者發(fā)布。圖像顯示的是一個(gè)針對(duì)該框架的在線開(kāi)發(fā)工具。是用創(chuàng)建的命令行工具,用于壓縮文件。是一組處理所有跟文件相關(guān)的工作的組件庫(kù)。是一個(gè)基于任務(wù)的命令行項(xiàng)目構(gòu)建工具。 JavaScript是一種靈活多變的腳本語(yǔ)言,它在全世界被廣泛的應(yīng)用在Web頁(yè)面和服務(wù)器應(yīng)用中。你可以因?yàn)槿魏文康娜ナ褂盟悄阈枰恍┕ぞ?。幸運(yùn)的是,為了完成獨(dú)特的任...

    不知名網(wǎng)友 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

jeyhan

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<