亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

jeyhan / 1372人閱讀

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

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

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

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

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

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

// 禁止帶標(biāo)簽的continue語句
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語句)
其中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語句:第一個(gè)不帶標(biāo)簽而第二個(gè)帶標(biāo)簽
最終輸出結(jié)果如下:

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

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

這能有什么用?

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

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

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

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

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

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

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

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

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

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

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

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

注意事項(xiàng)

最重要的事情總是最后才說...

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

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

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

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

按道理講,除了java標(biāo)準(zhǔn)庫,kan-java是不需要依賴任何第三方庫的,不過項(xiàng)目中出現(xiàn)了對(duì)groovy-all的依賴,這僅僅是因?yàn)槲蚁雽?shí)踐一把"java和groovy混編開發(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://www.ezyhdfw.cn/yun/64304.html

相關(guān)文章

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

    摘要:原文鏈接有大量平均水平左右的工人可被選擇參與進(jìn)來這意味著好招人有成熟的大量的程序庫可供選擇這意味著大多數(shù)項(xiàng)目都是既有程序庫的拼裝,標(biāo)準(zhǔn)化程度高而定制化場(chǎng)景少開發(fā)工具測(cè)試工具問題排查工具完善,成熟基本上沒有團(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

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

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

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

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

    摘要:幸運(yùn)的是,為了完成獨(dú)特的任務(wù),無以計(jì)數(shù)的工具已經(jīng)被開發(fā)者發(fā)布。圖像顯示的是一個(gè)針對(duì)該框架的在線開發(fā)工具。是用創(chuàng)建的命令行工具,用于壓縮文件。是一組處理所有跟文件相關(guān)的工作的組件庫。是一個(gè)基于任務(wù)的命令行項(xiàng)目構(gòu)建工具。 JavaScript是一種靈活多變的腳本語言,它在全世界被廣泛的應(yīng)用在Web頁面和服務(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元查看
<