摘要:就是砍這是一個代碼動態編譯工具,也就是能夠把形式的代碼實時地編譯為字節碼的工具動態編譯工具,其實自發布以來,應該出現過很多,不過的特點在于就像它的名字一樣可以選擇性地砍掉任意語言特性也就是說這是一個可以在動態編譯代碼的同時,對語言語法
"kan-java" 就是 "砍-java"
這是一個java代碼動態編譯工具,也就是能夠把String形式的java代碼實時地編譯為字節碼的工具;
“動態編譯”工具,其實自jdk1.6發布以來,應該出現過很多,不過kan-java的特點在于 —— 就像它的名字一樣 —— 可以選擇性地砍掉任意語言特性;
也就是說 —— 這是一個可以在動態編譯java代碼的同時,對java語言語法做裁剪的動態編譯工具。
通過下面這個例子可以看出“裁剪”指的是什么意思:
// 禁止帶標簽的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代碼創建了一個KanJava編譯工具實例, 并指明想要砍掉labeledContinue特性(即帶標簽的continue語句)
其中readContent方法的返回結果如下:
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個continue語句:第一個不帶標簽而第二個帶標簽
最終輸出結果如下:
Error at row: 10, col: 22, reason: Continue statements with labels are not allowed.
即“帶標簽的continue語句”已被禁止了,在編譯過程中發現這種語句即會報錯, 其核心功能,概念上講就是這么簡單。
這能有什么用?擁有一個裁剪版本的java,這有怎樣的應用場景?
目前最直接的答案是"高性能的內部DSL"
即當我需要一個語法上非常接近普通過程式編程語言的DSL,但卻又不想或覺得沒必要自己從頭實現一個(外部DSL)的時候,就可以考慮以某種現成的過程式通用編程語言為藍本,通過裁剪其語法達到目的;
而當這種“現成的過程式通用編程語言”被選擇為java時,kan-java出場的時刻就到了, 試想一下,下面這樣“砍”會砍出來什么效果? ——
private static final KanJava kanJava = new KanJava(Feature.assertion, Feature.doWhileLoop, Feature.forLoop, Feature.labeledBreak, Feature.labeledContinue, Feature.nestedClass, Feature.whileLoop);
相信所有java程序員都可以猜到:你將得到一個“沒有assert語句、沒有do-while循環、沒有for循環、沒有帶標簽的break、沒有帶標簽的continue、沒有嵌套類、沒有while循環”的 —— java.
P.S. 如果你還堅信它是java的話 :)
而這些"內部DSL"最終將被編譯成字節碼運行,因此也有了高速運行的基礎;
所以說kan-java能夠成為“利用java實現高性能的內部DSL”的強大工具。
上面示例中的這種“砍”法并不夸張,這是從現實中的使用案例中截選出來的。
一些更實用 & 更高級的功能kan-java提供的api能夠將“砍語法”和“編譯為字節碼”拆分為兩個步驟;
這使得你可以 —— 比如說 —— 在用戶輸入的時候禁掉"import語句",而實際編譯的時候可以正常插入import語句后再編譯, 相信這種功能會很有用;
更普遍意義地講,kan-java實際上提供了一套"java語言語法靜態處理框架", 在此框架之上,“砍”語法其實只是冰山一角 —— 因為你還可以用它來“砍用法”,比如你并不想完全禁掉import語句,但希望禁止import一些特定的類;
再比如你不想完全禁止用戶new對象,但你能夠做到不讓用戶new特定的對象...
凡是能夠出現在代碼當中的任意結構,都可以被控制。
因此可以說,被發布出來的kan-java庫只是一個小小的核心,其更加廣闊的應用場景還有待猿們繼續擴充...
有沒有更加“高級(黑)”的話題? 當然有;因為在kan-java提供的這套框架之上不僅限于能“砍”,它還能“加”...
不過目前這個庫的主要目的還是提供一套“基于java的內部DSL構建工具”,其它的什么“用kan-java做源碼增強”,什么“用kan-java把java編譯到GPU上”這些黑科技就暫不展開了 :)
最重要的事情總是最后才說...
目前kan-java所支持的java基礎語法是1.6的,也就是說,你使用kan-java來“砍”語法的時候,是以java 1.6為基礎來砍的
不過這并不影響kan-java庫被放到更高版本的java環境中使用(above v1.6), 起碼大多數情況下是ok的;不過,如果真的遇到問題,還是最好能從源碼編譯一份對應當前java版本環境的kan-java庫(因為kan-java在實現上使用了com.sun包下的一些類, 這些類并不完全保證在不同版本java之間的兼容)
同樣因為kan-java使用了com.sun包下的類,我也只能假定kan-java只能在oracle hotspot jvm上運行
目前開放的可被“砍”的功能,只是源于目前我個人在實際項目中的需要而已;肯定還有更多可能的“花式砍法”,如果希望有,可以提出來,有興趣的我們可以共建
使用kan-java時,需確保tools.jar也在classpath中
按道理講,除了java標準庫,kan-java是不需要依賴任何第三方庫的,不過項目中出現了對groovy-all的依賴,這僅僅是因為我想實踐一把"java和groovy混編開發模式"的任性而已,不要太在意 :)
目前的發布版本為v0.1, maven依賴為:
com.github.pfmiles kan-java 0.1
原文鏈接:https://github.com/pfmiles/kan-java
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64304.html
摘要:原文鏈接有大量平均水平左右的工人可被選擇參與進來這意味著好招人有成熟的大量的程序庫可供選擇這意味著大多數項目都是既有程序庫的拼裝,標準化程度高而定制化場景少開發工具測試工具問題排查工具完善,成熟基本上沒有團隊愿意在時間緊任務重的項目情況 原文鏈接:http://pfmiles.github.io/blog/java-groovy-mixed/ 有大量平均水平左右的工人可被選擇、參與...
摘要:小組最開始由兩名程序員和,一名工程師三人組成,后續有人員擴充。其中是最具代表性的人物,如今被稱為語言之父。后于年月日對外公布這門編程語言,標志著的誕生。官方宣稱全世界有萬開發者。數據顯示目前處于榜首。 歡迎你來到Java的世界,作為Java的第一篇文章不可免俗的要做一次介紹,這些東西往往比較枯燥所以我盡可能寫的有故事趣味一點。對于初學者歷史或者特性的東西瀏覽一遍有所了解即可,即使不知所...
摘要:函數式編程最后介紹一下函數式編程。函數式編程是一種歷史悠久,而又在最近頗為熱門的話題。函數式編程在面向對象一詞誕生以前就已經存在,不過它在很長一段時間里都被隱藏于過程式編程面向對象也是過程式編程的一種的概念之下。 2.1 JavaScript特點 總結以下幾個特點: 解釋型語言 類似與C和Java的語法結構 動態語言 基于原型的面向對象 字面量的表現能力 函數式編程 解釋型語言:...
摘要:幸運的是,為了完成獨特的任務,無以計數的工具已經被開發者發布。圖像顯示的是一個針對該框架的在線開發工具。是用創建的命令行工具,用于壓縮文件。是一組處理所有跟文件相關的工作的組件庫。是一個基于任務的命令行項目構建工具。 JavaScript是一種靈活多變的腳本語言,它在全世界被廣泛的應用在Web頁面和服務器應用中。你可以因為任何目的去使用它,但是你需要一些工具。幸運的是,為了完成獨特的任...
閱讀 1289·2023-04-25 19:33
閱讀 1171·2021-10-21 09:39
閱讀 3644·2021-09-09 09:32
閱讀 2615·2019-08-30 10:58
閱讀 1602·2019-08-29 16:17
閱讀 873·2019-08-29 15:29
閱讀 2885·2019-08-26 11:55
閱讀 2659·2019-08-26 10:33