论坛首页 编程语言技术论坛

IKVM 编程武林之.NET派的北冥神功

浏览 27878 次
该帖已经被评为良好帖
作者 正文
   发表时间:2009-12-24   最后修改:2009-12-24
在编程武林中,Java派成立较久底子雄厚,虽然掌门人Sun已经老态龙钟,镇山之技的Java语言已经被后进的新秀.NET派的C#压得喘不过气来,甚至有时候Sun老大还得跑到.NET派潜伏学艺。但是百足之虫,死而不僵,一众Java派的拥趸们自认虽然Java渐渐技不如人,但是Java派成立日久,从Java演化过来的七十二门绝技绝非武林暴发户.NET派所能比拟,其中几大支派如apache,springsource各有绝技,而衍生出的帮会、黑社会等等更是不计其数,.NET派望尘莫及。

然而江湖传言有不世神功叫北冥神功,“北冥有鱼,其名为鲲,鲲之大,不知其几千里也……”,能够容纳几千里的大鱼必定是非常广阔的海洋,因而北冥神功正是寓含了广大恢宏之意,也体现了神功的威力。“可以吸取他人的内力以供己用,是迅速提升功力的捷径。内力既厚,天下武功无不为我所用,犹如北冥,大舟小舟无不载,大鱼小鱼无不容。”

.NET派的几位高人闭关苦练,竟然悟出北冥神功,此神功后曰:IKVM.NET.

江湖后辈小子Ray Linn偶习此神功,得心得一二,不敢自珍,特此记之,以壮大我.NET门派,千秋万代,一统江湖。

那日Ray偶来到apache支派,却看到Apache弟子们各施绝技,好不热闹. Ray对Apache绝技手痒已久,想来得习IKVM.NET已有时日,斗胆上前叫阵。迎战者哪Apache派中的小弟子,江湖人称:commons.collection.

二人拳脚来去,Ray却懒得与之多动手脚,随即默念真言:
ikvmc -assembly:commons -target:library -version:1.0.0.0 commons-collections-3.2.1.jar  


collection陡然萎靡在地,想是一身内功尽被Ray所吸去,Apache派人等尽皆失色,“我等苦练十余载,内力尽为汝一夕取去”,莫敢上前。

Ray回转.NET派,试练collection的神功,借助IKVM.OpenJDK.Core之神器,神功即成,试演如下:

using System;

using org.apache.commons.collections;
using org.apache.commons.collections.functors;

namespace MyLib
{
    class Program
    {
        static void Main(string[] args)
        {
            String name = "Tim";
            Predicate nameJohn = new EqualPredicate( "John" );
            Predicate nameTim = new EqualPredicate( "Tim" );
            Predicate instanceString = new InstanceofPredicate(typeof(String) );
            Predicate instanceDouble = new InstanceofPredicate(typeof(Double));
            Console.Out.WriteLine( "Is Name John?: " + nameJohn.evaluate( name ) );
            Console.Out.WriteLine("Is Name Tim?: " + nameTim.evaluate(name));
            Console.Out.WriteLine( "Is this a String?: " + instanceString.evaluate( name ) );
            Console.Out.WriteLine( "Is this a Double?: " + instanceDouble.evaluate( name ) );

        }
    }
}



相较原有神功:
import org.apache.commons.collection.Predicate;
import org.apache.commons.collection.functors.*;
String name = "Tim";
Predicate nameJohn = new EqualPredicate( "John" );
Predicate nameTim = new EqualPredicate( "Tim" );
Predicate instanceString = new InstanceofPredicate( String.class );
Predicate instanceDouble = new InstanceofPredicate( Double.class );
// Testing all predicates for "Tim"
System.out.println( "Is Name John?: " + nameJohn.evaluate( name ) );
System.out.println( "Is Name Tim?: " + nameTim.evaluate( name ) );
System.out.println( "Is this a String?: " + instanceString.evaluate( name ) );
System.out.println( "Is this a Double?: " + instanceDouble.evaluate( name ) );


竟然绝无二致。

偌大Java江湖,从此为我.NET所用,哇哈哈。
   发表时间:2009-12-24  
楼主的故事很精彩~~
0 请登录后投票
   发表时间:2009-12-24  
嘿嘿,这文字有趣~
不知道Ray大大有没有兴趣顺手拿Ja.NET来对比下看看?
0 请登录后投票
   发表时间:2009-12-25   最后修改:2009-12-28
ja.net和Ikvm.net都是在.net CLR之上又虚拟了java的虚拟机,并提供了兼容某些版本的java
就目前而言,二者提供了Java虚拟机都相当强大,比如ikvm尽管目前版本才0.4,但是竟然可以磕磕盼盼跑起了jboss 4.05..(有一些exception,主要是某些类型转换出错),而且大部分war发布正常。





若假以时日,在windows平台上,完全丢弃java虚拟机也未曾不可。


ja.net和IKVM比较:

1. IKVM和ja.net都提供了运行java class的能力,也提供将java代码编译成assembly的能力,但IKVM提供了更简单的转换jar到assembly的方法,略胜一筹。

2. IKVM的兼容度更高,在测试中,ja.net虽然宣称可以运行JDK编译后的class,但是java -vmdir:drlvm HelloWorld 却直接报告不支持Windows 6.1 (Win 7).(default java是运行.net版class,vmdir:drlvm运行的则是java虚拟机),这点和ikvm差别很大。
    IKVM直接可以运行java class。

3.ja.net的javac不带-java,实际生成的class是assembly.

  • 大小: 100.8 KB
0 请登录后投票
   发表时间:2009-12-26  
介个,,,想起gcj了。

明儿翻翻有没有java上的.net虚拟机实现。
assembly-il转bytecode
0 请登录后投票
   发表时间:2009-12-26  
如此宵小之徒:http://blog.csdn.net/liangdiwei/archive/2009/12/24/5072233.aspx
0 请登录后投票
   发表时间:2009-12-26  
ray_linn 写道
如此宵小之徒:http://blog.csdn.net/liangdiwei/archive/2009/12/24/5072233.aspx

这也是你们门派的...
0 请登录后投票
   发表时间:2009-12-26   最后修改:2009-12-26
kimmking 写道
介个,,,想起gcj了。

明儿翻翻有没有java上的.net虚拟机实现。
assembly-il转bytecode



ms 只有一篇论文:ILJc。

从指令上看CLR有更多的指令大概有220条,而JVM只有200条指令。

从特点上看CLR有更多特性,比如泛型的实例化就很难处理

从语法上看.net更丰富多彩,比如linq,dynamic这些东西,无疑给ILJc制造了许多困难。

0 请登录后投票
   发表时间:2009-12-27  
ray_linn 写道


从语法上看.net更丰富多彩,比如linq,dynamic这些东西,无疑给ILJc制造了许多困难。


linq,dynamic与IL和CLR无关,这些东西要转成jvm上的.class倒并非难事,只是java不直接提供语言支持罢了。
比较麻烦的是泛型,比如jvm是做不到类似typeof(IEnumerable<object>)这种事情的。
0 请登录后投票
   发表时间:2009-12-27  
幸存者 写道
ray_linn 写道


从语法上看.net更丰富多彩,比如linq,dynamic这些东西,无疑给ILJc制造了许多困难。


linq,dynamic与IL和CLR无关,这些东西要转成jvm上的.class倒并非难事,只是java不直接提供语言支持罢了。
比较麻烦的是泛型,比如jvm是做不到类似typeof(IEnumerable<object>)这种事情的。



我说的就是这个意思,由于java不提供语言支持,意味着必须写一个更复杂的编译器。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics