阅读更多

12顶
0踩

编程语言

原创新闻 XJ: 一个扩展Java语言的方案

2008-04-16 16:50 by 正式记者 levis2000 评论(5) 有5136人浏览
Java历来是一种以不变应万变的语言。在Java 5中,annotation的引入使得Java在某些特殊的应用场合(如企业应用)中能够进行定制。Annotations 可被看作是用Java核心技术来定义的"领域特定语言"(Domain Specific Languages,DSLs)。

Annotation本质上是一种 name-value 形式的绑定,仅限于它们所能表达的意义。它们不能定义新的语法结构,例如为collection增加个"select"。事实上annotations的存在揭示了Java本身需要DSL的兼容,但是却缺乏能够完全实现DSL所必要的丰富性。

在这里我们为使Java能够支持自定义语义给出了一些建议和方案。如果能够进行一些适当的"扩展"(extension),在不与现有的语法冲突的情况下并且保留向后兼容。例如:用一些语法定义类来产生新的语法结构,姑且称之为 "语义类",这样就能够以现有方式在程序中得以实现。我们把这个方案称之: XJ (eXtensible Java,可扩展Java)

XJ给Java带来了这个所谓的"语义类"。一个语义类也是一个有通常语法的的Java类,当Java解析器遇到由语义类定义的语法结构,那么就用语义类中定义的语法来处理这些输入信息。如果解析成功,那这些语法可以合成为一个Java抽象语法树(AST:abstract syntax tree )。一个抽象语法树可以有一个标准接口被Java编译器所使用当处理语法的时候。AST的新类型可以通过实现合适的接口来进行创建。

考虑到JAVA中的一个简单语言结构:依据某些条件从一个collection中选一个元素出来。一个使用新结构的例子如下所示:

import language mylang.Select;
public Person getChild(Vector<Person> people) { 
 @Select Person p from people where p.age < 18 {
    return p;  
 } 
 else { return null; }
}


这个新的语法接口可以叫做"Select",用"@"符号定义在语法类饮用的的前缀。定义了一个Vector从中选出条件为年纪小于18岁的人群。最后返回满足条件的值,或者返回空值。Select的语法定义如下。

public Person getChild(Vector<Person> people) {  
 for(int i = 0; i < people.size(); i++) {    
  Person p = people.elementAt(i);    
  if(p.age < 18)      
    return p;  
 }  
 return null;
}


同理,通过XJ,一个新的语法接口通过定义语义类来定义。一个语义类包括语法由Java解析器来处理具体的程序语法并且返回一个AST。一旦一个语义类被定义,它就能通过在语义定义符号"@"后定义从而在程序代码中被使用。select的结构定义如下:

package mylang;
import language java.syntax.Grammar;
import java.syntax.AST;
import java.syntax.Block;
import java.syntax.Context;
import java.syntax.Statement;
import java.syntax.Sugar;
import java.syntax.Type;
import java.syntax.Var;
public class Select extends Sugar {  
  private Type type;  
  private Var var; 
  private AST collection;  
  private AST test;  
  private Block body;  
  private Block otherwise;  
  public Select(Type T,String n,AST c,AST t,Block b,Block o){
    type = T;    
    var = new Var(n);    
    collection = c;    
    test = t;    
    body = b;    
    otherwise = o;  
  }  
  // Select Grammar definition  
  @Grammar extends Statement {    
    Select ::=      
      T = Type      
      n = Name      
      'from' c = Exp      
      'when' t = Exp      
      b = Block      
      o = ('else' Block | { return new Block(); })      
      { return new Select(T,n,c,t,b,o); }.  }  
   // Desugar to produce an abstract syntax tree  
   public AST desugar(Context context) {
     Class<T> cType = context.getType(collection);    
     if(isVector(cType))      
       return desugarVector(cType,contect);    
     else // More cases...  
   }  

   public AST desugarVector(Class<T> cType,Context context) {
     Var done = context.newVar();    
     Var coll = context.newVar();    
     return 
         [| boolean <done> = false;              
         <cType> coll = <collection>;              
         for(int i = 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}中,而且可以引用任何在后面定义的名称。由Select rule返回最终结果是Select类的一个实例。

由语法所决定的返回值必须是java.syntax.AST类的一个实例。如果返回值是标准Java AST类的实例,那在语法类中不需要做特殊处理。如果返回值是自定义语法类的实例,那么这个类必须实现AST接口,来由编译器翻译成Java VM识别的代码。更简单易行的办法是用户自定义语义类从java.syntax.Sugar继承,而java.syntax.Sugar通过desugar方法实现了AST接口。desugar方法负责把输入的信息解释为接口中已经定义的AST(抽象语法树),

在这篇短文中我们介绍了Java的扩展(XJ),主要是通过定义新的Java语法来对Java语言本身进行扩展。虽然XJ还没有在Java中实现,但是它是XMF语言的主要特征。XMF语言已经在商业工具(XMF-Mosaic)中被使用并在2008年开源。关于本文更多的细节和例子可以参照这篇文章:超越Annotations:可扩展Java语言的计划



来自: theserverside
12
0
评论 共 5 条 请登录后发表评论
5 楼 tkivdrip 2010-01-17 12:32
哇 什么东西啊?
4 楼 piggy 2008-12-04 08:34
有没有测试过性能?
3 楼 cuiyi.crazy 2008-04-18 01:33
这个我不喜欢
最不喜欢的就是扩展
2 楼 QQbyte 2008-04-17 10:29
一种可能的方案
1 楼 zjumty 2008-04-17 10:03
太复杂了, java已经不不能再复杂了!

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 编译语言和解释语言

    1. 编译型语言:程序源码经过编译过程,直接生成机器可执行的程序。例如C++经过编译链接生成的.exe(二进制代码),生成的可执行程序可以直接在计算机上运行。 C/C++、Pascal/ObjectPascal(Delphi)、VB等基本都可视为编译语言 解释型语言:程序在运行的时候才翻译成机器语言。程序运行中包含“解释“过程的都是解释型语言。只要不是"直接编译成机器指令并直接运行机器

  • 编程语言之争:Python、Java、C++,你更爱哪一个?

    在编程语言的世界里,Python、Java和C++各具特色,吸引了不同类型的开发者。Python以其简洁易用而受到初学者青睐,Java凭借跨平台特性广泛应用于企业级开发,而C++则因高性能和控制力深入游戏和系统编程。每种语言都有其独特魅力,你更爱哪一个?让我们一起探讨它们的优缺点与应用场景。

  • 编程语言的不同分类

    一、编译型语言与解释型语言 通常我们编写的代码都是高级程序语言,计算机无法理解,那么当我们运行程序之前,要把我们编写的代码翻译成机器语言。这个翻译有两种执行类型,一种是编译,一种是解释。 C、C++是编译型语言;Python、JavaScript、Matlab是解释型语言;Java、C#兼具编译与解释两种特性。 编译型语言 编译型语言指的是程序运行之前,先执行一个编译过程,将源代码翻译成机器指令,其结果是生成一个可执行文件(exe),并保存在本地。这个过程包括预处理、编译、汇编、链接过程。 而之后我们当我们

  • python,java,c++等的优缺点,python和c和java应用领域

    Java、Python和C++都是面向对象的编程语言,因为历史发展的原因,都各自有其试用范围。Java由于其优越的跨平台可移植性,在Web开发中是主流语言Python中Turtle画蝴蝶。在加上手机Android系统的发展,使得Java开发人员的需求量很大。同时,Java现在也用来开发手游。Java的语法相对规范。Python是动态形的灵活的解释性语言,从软件开发到Web开发,Python都有在被使用。因为他的解释性,适合轻量级开发。Python是比较好学的语言。

  • 萌新,C++、Java、Python 选择哪个好?

    大学那会也被这个问题被困惑了大半年,直到毕业拿了几个大厂offer 才发现语言的选择也就那一回事,我猜不少人刚入门的人依然被这个问题困扰着,所以决定认真分享一波我的经历。 如果你还处于大一,大二,或者刚刚入门阶段,那么我认为,语言的选择并不重要,更重要的是底层/通用基础的学习,例如数据结构,算法,计算机网络这些,因为这些语言,是存在很多相同的特性的,例如你学习了 C++,后面要转 Java,那么其实还是可以很快就上手的。 而且,等到了差不多毕业去应聘校招的时候,其实公司并不会对语言有严格的要求,例如你要面

  • c++,java,python学习哪个简单发展还好?

    c++,java,python学习哪个简单发展还好?

  • Java 与 C++、Python 和其他流行语言的比较

    PHP 是一种用于 Web 开发的服务器端脚本语言,支持面向对象编程和函数式编程,被广泛应用于网站和应用程序的开发。Ruby 是一种高级、动态、解释型编程语言,支持面向对象编程和函数式编程,被广泛应用于数据科学、Web 开发和自动化脚本等领域。总的来说,Java 和 C++ 是两种不同类型的编程语言,Java 更加适合开发大规模的应用程序,C++ 更加适合需要高性能的领域。Java、C++、Python 和其他流行语言都是广泛使用的编程语言,它们各自具有一些独特的特点和适用场景。

  • 编译型语言,解释型语言和脚本语言的对比

    1 三种类型的定义:     编译型语言:C,C++。编译后成为机器语言,以后执行的时候就不需要编译了,     解释型语言;JAVA,C#。在运行的时候将程序翻译为机器语言,虽然Java程序在运行之前也有一个编译过程,但是并不是将程序编译成机器语言,而是将它编译成字节码(可以理解为一个中间语言)。在运行的时候,由JVM将字节码再翻译成机器语言。    脚本语言:python,php,Jav

  • c语言既可以编译 也可以解释,操作系统思考 第一章 编译

    第一章 编译1.1 编译语言和解释语言人们通常把编程语言描述为编译语言或者解释语言。前者的意思是程序被翻译成机器语言,之后由硬件执行;而后者的意思是程序被软件解释器读取并执行。例如,C被认为是编译语言,而Python被认为是解释语言。但是二者之间的界限并不总是那么明显。首先,许多语言既可以编译执行也可以解释执行。例如,存在C的解释器,和Python的编译器。其次,类似Java的语言混合了这两种方法...

  • 学Python需要学Java、c++等其他编程语言吗?

    1. 27岁女生可以学Python吗?\2. 学Python需要学Java、c++等其他编程语言吗?\3. 只学Python找工作容易吗?\4. 学Python自学还是培训呢?下面一起来进入正题。

  • 总结C语言、Python、Java三者的一些区别

    1 .C是一种面向过程的语言,python和java面向对象 2 .C语言是编译语言,而Python和Java是解释型语言, 编译语言在运行的时候通过预处理、编译器编译等转化成机器语言(一种低级语言),生成可执行文件,运行的效率高,速度快;而解释型语言则是在程序每次运行的时候一句一句把程序运行,所以效率相比较偏低运行慢。相比较而言,C语言更加适合去写追求运行效率的和底层运行有关的东西 3 .常用I...

  • C/C++、Java、Python谁是编译型语言,谁是解释型语言?

    最近各大互联网公司线上笔试,编程题目里的编译器只支持C/C++、Java,甚至有的支持javaScrpit和Pascal,就是不支持Python。让一直以来用惯了Python的我直吐血,于是今天痛定思痛还是熟悉一下Java,免得继续被虐。学习的过程中,看到这样一个争论“Java、Python谁是编译型语言,谁是解释性语言?”。我在网上查了很多资料,也结合了自己的理解,下面与大家分享一下。 总的来说...

  • 超详细很实用入门必看:Java,C与Python三种大热编程语言比较分析与建议

    在当今互联网时代,编程语言正在变得越来越重要。许多人已经意识到,学习编程语言不仅可以帮助他们在职场上更有竞争力,还有助于实现自己的想法和梦想。但是对于初学者来说,如何选择编程语言可能是一项艰巨的任务。在众多编程语言中,Java、Python和C是最受欢迎和广泛使用的三种,接下来本文将对这三种编程语言的优缺点,以及就业前景和未来职位给出介绍分析与学习建议。目录一、Java1.优点2.缺点二、Python1.优点2.缺点三、C1.优点2.缺点就业前景和未来职位分析学习指导和推荐书籍最后补充一下三种的比较分析Ja

  • 【后端】主流后端语言:JAVA、C、C++、GO、PYTHON

    软件开发领域,语言本身在各自领域都有适用场景,有许多流行的编程语言可供选择,每种语言都有其独特的特点和适用场景。

  • 什么是编译型语言和解释型语言

    什么是编译型语言和解释型语言 计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以使用任何高级语言编写的程序若想被计算机运行,都必须将其转换成计算机语言,也就是机器码。 计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以使用任何高级语言编写的程序若想被计算机运行,都必须将其转换成计算机语言,也就是机器码。而这种转换的方式有两种: ...

  • 解释型和编译型的区别

    解释性和编译型 解释型:程序执行一步就翻译一步,好比有个翻译每说一句话都翻译一句,如果重新执行程序就需要重新开始一步一步从头翻译。效率比较低 编译型:在程序执行前将代码全部编译成计算机可以识别的语言,下次执行就不用编译了,比如王者荣耀,这样的语言代表c语言。效率更高 java既是编译型又是解释型,首先把代码java文件编译成二进制文件,然后虚拟机中的解释器会在程序执行时每执行一步就解释一步。 ...

  • 解释型语言与编译型语言的区别

    编译型语言,在程序执行之前,有一个单独的编译过程,将程序翻译成机器语言,以后执行这个程序的时候,就不用再进行翻译了。 解释型语言,是在运行的时候将程序翻译成机器语言,所以运行速度相对于编译型语言要慢。 C/C++ 等都是编译型语言,而Java,C#等都是解释型语言。 虽然Java程序在运行之前也有一个编译过程,但是并不是将程序编译成机器语言,而是将它编译成字节码(可以理解为一个中间语言)。...

  • c java 和 python的区别-总结几点C/C++、Java与Python的区别

    1.c++、java和python都是面向对象的编程语言,但是c++和java都是强类型语言,而python是一种弱类型语言2.垃圾回收机制:c++需要程序员收到回收,而java和python都有自己的垃圾回收机制GC。具体两者又有不同,python的垃圾收集机制主要是用的是引用计数方式。3.c和java中变量的存储是真实值,而python总存储的是引用,所以python不用声明类型名称,它的输入...

  • 编译型语言和解释型语言的区别?

    计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以使用任何高级语言编写的程序若想被计算机运行,都必须将其转换成计算机语言,也就是机器码。而这种转换的方式有两种: 1.编译 2.解释 由此高级语言也分为编译型语言和解释型语言。 主要区别在于,前者源程序编译后即可在该平台运行,后者是在运行期间才编译。所以前者运行速度快,后者跨平台性好。 编译型语言 使用专门的编译器,针对特定的平台,将高级语言源代码一次性的编译成可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式

Global site tag (gtag.js) - Google Analytics