仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2180|回复: 20
打印 上一主题 下一主题

[学习教程] JAVA网站制作之XJ: 一个扩大Java言语的计划仓酷云

[复制链接]
小女巫 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:35:22 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
在ruby里才是一切皆对象。当然我不并不是很了解ruby,但是ruby确实是将语法简化得很好。Java向来是一种以稳定应万变的言语。在Java5中,annotation的引进使得Java在某些特别的使用场所(如企业使用)中可以举行定制。Annotations可被看做是用Java中心手艺来界说的"范畴特定言语"(DomainSpecificLanguages,DSLs)。

Annotation实质上是一种name-value情势的绑定,仅限于它们所能表达的意义。它们不克不及界说新的语法布局,比方为collection增添个"select"。现实上annotations的存在展现了Java自己必要DSL的兼容,可是却缺少可以完整完成DSL所需要的丰厚性。

在这里我们为使Java可以撑持自界说语义给出了一些倡议和计划。假如可以举行一些得当的"扩大"(extension),在不与现有的语法抵触的情形下而且保存向后兼容。比方:用一些语法界说类来发生新的语法布局,临时称之为"语义类",如许就可以够以现无方式在程序中得以完成。我们把这个计划称之:XJ(eXtensibleJava,可扩大Java)

XJ给Java带来了这个所谓的"语义类"。一个语义类也是一个有一般语法的的Java类,当Java剖析器碰到由语义类界说的语法布局,那末就用语义类中界说的语法来处置这些输出信息。假如剖析乐成,那这些语法能够分解为一个Java笼统语法树(AST:abstractsyntaxtree)。一个笼统语法树能够有一个尺度接口被Java编译器所利用当处置语法的时分。AST的新范例能够经由过程完成符合的接口来举行创立。

思索到JAVA中的一个复杂言语布局:根据某些前提从一个collection当选一个元素出来。一个利用新布局的例子以下所示:

Java代码

<br>

  • importlanguagemylang.Select;
  • publicPersongetChild(Vector<Person>people){
  • @SelectPersonpfrompeoplewherep.age<18{
  • returnp;
  • }
  • else{returnnull;}
  • }
  1. importlanguagemylang.Select;publicPersongetChild(Vector<Person>people){@SelectPersonpfrompeoplewherep.age<18{returnp;}else{returnnull;}}
复制代码

这个新的语法接口能够叫做"Select",用"@"标记界说在语法类饮用的的前缀。界说了一个Vector从当选出前提为年事小于18岁的人群。最初前往满意前提的值,大概前往空值。Select的语法界说以下。

Java代码

<br>

  • publicPersongetChild(Vector<Person>people){
  • for(inti=0;i<people.size();i++){
  • Personp=people.elementAt(i);
  • if(p.age<18)
  • returnp;
  • }
  • returnnull;
  • }
  1. publicPersongetChild(Vector<Person>people){for(inti=0;i<people.size();i++){Personp=people.elementAt(i);if(p.age<18)returnp;}returnnull;}
复制代码

同理,经由过程XJ,一个新的语法接口经由过程界说语义类来界说。一个语义类包含语法由Java剖析器来处置详细的程序语法而且前往一个AST。一旦一个语义类被界说,它就可以经由过程在语义界说标记"@"后界说从而在程序代码中被利用。select的布局界说以下:

Java代码

<br>

  • packagemylang;
  • importlanguagejava.syntax.Grammar;
  • importjava.syntax.AST;
  • importjava.syntax.Block;
  • importjava.syntax.Context;
  • importjava.syntax.Statement;
  • importjava.syntax.Sugar;
  • importjava.syntax.Type;
  • importjava.syntax.Var;
  • publicclassSelectextendsSugar{
  • privateTypetype;
  • privateVarvar;
  • privateASTcollection;
  • privateASTtest;
  • privateBlockbody;
  • privateBlockotherwise;
  • publicSelect(TypeT,Stringn,ASTc,ASTt,Blockb,Blocko){
  • type=T;
  • var=newVar(n);
  • collection=c;
  • test=t;
  • body=b;
  • otherwise=o;
  • }
  • //SelectGrammardefinition
  • @GrammarextendsStatement{
  • Select::=
  • T=Type
  • n=Name
  • "from"c=Exp
  • "when"t=Exp
  • b=Block
  • o=("else"Block|{returnnewBlock();})
  • {returnnewSelect(T,n,c,t,b,o);}.}
  • //Desugartoproduceanabstractsyntaxtree
  • publicASTdesugar(Contextcontext){
  • Class<T>cType=context.getType(collection);
  • if(isVector(cType))
  • returndesugarVector(cType,contect);
  • else//Morecases...
  • }

  • publicASTdesugarVector(Class<T>cType,Contextcontext){
  • Vardone=context.newVar();
  • Varcoll=context.newVar();
  • return
  • [|boolean<done>=false;
  • <cType>coll=<collection>;
  • for(inti=0;i<<coll>.size();i++){
  • <underlyingType(cType)><var>=<coll>.elementAt(i);
  • if(<test>){
  • <done>=true;
  • <body>;
  • }
  • }
  • if(!<done>)
  • <otherwise>;
  • |];
  • }
  • }
  1. packagemylang;importlanguagejava.syntax.Grammar;importjava.syntax.AST;importjava.syntax.Block;importjava.syntax.Context;importjava.syntax.Statement;importjava.syntax.Sugar;importjava.syntax.Type;importjava.syntax.Var;publicclassSelectextendsSugar{privateTypetype;privateVarvar;privateASTcollection;privateASTtest;privateBlockbody;privateBlockotherwise;publicSelect(TypeT,Stringn,ASTc,ASTt,Blockb,Blocko){type=T;var=newVar(n);collection=c;test=t;body=b;otherwise=o;}//SelectGrammardefinition@GrammarextendsStatement{Select::=T=Typen=Name"from"c=Exp"when"t=Expb=Blocko=("else"Block|{returnnewBlock();}){returnnewSelect(T,n,c,t,b,o);}.}//DesugartoproduceanabstractsyntaxtreepublicASTdesugar(Contextcontext){Class<T>cType=context.getType(collection);if(isVector(cType))returndesugarVector(cType,contect);else//Morecases...}publicASTdesugarVector(Class<T>cType,Contextcontext){Vardone=context.newVar();Varcoll=context.newVar();return[|boolean<done>=false;<cType>coll=<collection>;for(inti=0;i<<coll>.size();i++){<underlyingType(cType)><var>=<coll>.elementAt(i);if(<test>){<done>=true;<body>;}}if(!<done>)<otherwise>;|];}}
复制代码

从Select的语律例则界说能够看到一个优秀格局的语句是经由过程一个称号,关头字"from"及其表达式,关头字"when"及其表达式,和界说select块的注释。在注释后,还能够界说if-else之类的可选关头字。在select划定规矩中的每一个case中,剖析元素发生一个能够和称号可选联系关系的值。比方,和称号为"T"相干联的范例。别的,剖析划定规矩也包括前往值的Java语句。这些包括在{and}中,并且能够援用任安在前面界说的称号。由Selectrule前往终极了局是Select类的一个实例。

由语法所决意的前往值必需是java.syntax.AST类的一个实例。假如前往值是尺度JavaAST类的实例,那在语法类中不必要做特别处置。假如前往值是自界说语法类的实例,那末这个类必需完成AST接口,出处编译器翻译成JavaVM辨认的代码。更复杂易行的举措是用户自界说语义类从java.syntax.Sugar承继,而java.syntax.Sugar经由过程desugar办法完成了AST接口。desugar办法卖力把输出的信息注释为接口中已界说的AST(笼统语法树),

在这篇漫笔中我们先容了Java的扩大(XJ),次要是经由过程界说新的Java语法来对Java言语自己举行扩大。固然XJ还没有在Java中完成,可是它是XMF言语的次要特性。XMF言语已在贸易工具(XMF-Mosaic)中被利用并在2008年开源。关于本文更多的细节和例子能够参照这篇文章:超出Annotations:可扩大Java言语的企图。来自:http://www.javaeye.com/news/1924

有了这样一个呼声:让java代替C语言成为基本语言。这些足以说明java简单易学的这个优点。其次,java的功能强大,前面我也提到了,EJB3.0的推出使java成为了大型项目的首选。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-10 22:19

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表