阅读更多

9顶
3踩

操作系统
Xamarin团队(前身为Mono团队)近来一直在尝试使用C#移植Android操作系统,并完全替代其中的Java代码。之前,该团队推出了Mono for Android,使得开发者可以使用C#来开发Android应用,提高已有.Net代码的重用率。

Xamarin团队称:
引用
Java并不是Android平台上开发原生应用的唯一方法,甚至不是最好的方法,我们为Android开发者带来了一个新的实现方式(Mono for Android)来替代Java,这是一个开源的.NET实现,可以让开发者使用C#创建更高效、更省电的Android应用程序,并能充分利用C#和.NET开发平台上的资源,跨平台共享除界面之外的代码,减少开发成本。

现在Xamarin在此基础上更进了一步,完全移除了Android中的Java/Dalvik虚拟机,用“更为成熟”的C#/Mono虚拟机替换,带来了XobotOS 操作系统。

XobotOS

XobotOS是Xamarin的研究项目,目的是探索将Android 4.0从Java/Dalvik移植到C#,并探索移植后的性能和内存占用情况。

Xamarin称,经过长时间的努力,目前已经将大部分的Android层完全改写为C#。下图是XobotOS在Linux工作站上的运行截图,完全没有Java的存在。



实现方式

Android的核心代码由数百万行Java代码构成,而XobotOS项目还需要和Android的新版本保持同步(事实上,XobotOS的工作从Android 2.x已经开始),工作量之巨大,只能通过机器自动转换来实现。

该团队利用了一个自动转换Java到C#的工具——Sharpen,并进行了许多改进,使该工具更加成熟,目前Sharpen的源码已随XobotOS发布。

性能对比

运行于Mono上的Android,与Dalvik相比,性能究竟如何?Xamarin团队称:

引用
一直以来,微软不断改进C#,使其代码优化更加容易。通过引入值类型,使得小型对象耗能更低。另外,虚拟方法现在是选择性加入,使得虚拟机性能优化更加容易。

在泛型实现上,Java和C#分道扬镳,Java采用了完全向后兼容,而C#在运行时上提供了支持,C#的做法更简单易用、高效和完善。

再则,Java和C#在语法和执行环境上都在不断改进,增加了大量的新特性,如动态编程、异步支持、迭代器、函数式编程组件、并行化等,而其中大量的特性来自于Don Syme(微软F#项目负责人)的研究。

另外,在过去10年时间中,Mono作为一个虚拟机已经逐渐成熟,现在已经是第8代产品了。



以上这些都是影响性能的因素。下图通过一个简单的二叉树实现,来对比Java/Dalvik和C#/Mono在结构体和泛型影响下的性能差别。



未来计划

Xamarin称,公司的目标是提供最好的移动应用开发平台,因此XobotOS不会是工作重心,不过这是一项非常有趣的实验,其中一些技术也可以用于未来的产品中。这些技术包括:

  • 直接访问Skia图形库:目前Mono for Android通过Java访问底层图形库,通过XobotOS中的代码,可以使用Mono的P/Invoke直接访问Skia的原生渲染代码。
  • Java/C#转换工具:新版Sharpen已经作为XobotOS的一部分发布。
  • 使用C#代码替换Java代码:对于一些性能瓶颈的地方,可以使用C#来代替Java。
源代码

Xamarin团队已经将XobotOS的源代码发布在Github上。

XobotOS中各组件的源码基于这些组件上游供应商规定的许可协议,C#版本的Android基于Apache 2许可协议。XobotOS中还包含了Java/C#转换工具Sharpen的源代码,基于GPL许可协议。

地址:https://github.com/xamarin/XobotOS

Via xamarin
  • 大小: 61.3 KB
  • 大小: 61.2 KB
  • 大小: 20.7 KB
9
3
评论 共 17 条 请登录后发表评论
17 楼 allenny 2012-05-10 22:53
ray_linn 写道
allenny 写道
然后呢?现有的程序可以在上面跑吗?不能的话我干吗要刷这个ROM?


废话,用C#实现一个dalvik,自然要兼容其伪代码。

用C#实现JVM执行java字节码,你牛!
16 楼 relinson 2012-05-09 23:44
妈的还是收费的 没法用
15 楼 geminiyellow 2012-05-09 07:37
14 楼 ray_linn 2012-05-08 22:35
kingbinchow 写道
只是兼容罢了。。。回头google把android规范改了。。。那这个就是四不像了



扯淡,你把davlik规范改了,以前的android app都一样死菜。
13 楼 剑圣小弟 2012-05-08 18:41
无聊~  
12 楼 kingbinchow 2012-05-08 15:03
只是兼容罢了。。。回头google把android规范改了。。。那这个就是四不像了
11 楼 yzongjie 2012-05-08 14:58
phenom 写道
路过。。。
oracle-google-microsoft



呵呵,,,看着吧,再说了,这可是 java developer 不愿看到的
10 楼 ray_linn 2012-05-08 11:11
allenny 写道
然后呢?现有的程序可以在上面跑吗?不能的话我干吗要刷这个ROM?


废话,用C#实现一个dalvik,自然要兼容其伪代码。
9 楼 shuaiji 2012-05-08 09:45
以后也许会引发 Oracle 和 MS 的战争
8 楼 bitray 2012-05-08 09:29
ORACLE还不赶紧继续发力啊?不过C#跨平台确实很无聊啊
7 楼 allenny 2012-05-08 00:27
然后呢?现有的程序可以在上面跑吗?不能的话我干吗要刷这个ROM?
6 楼 vvvpig 2012-05-07 23:58
其实比较牛的应该是自动转换Java到C#的工具——Sharpen,如果转换效果还可以的,实际上net可以使用的开源框架就可以有很多了
5 楼 Frankie199 2012-05-07 21:44
老外的想法总是很奇怪,可能这就是创新吧
4 楼 ray_linn 2012-05-07 20:46
如果还能支持 WPF 的话,就可以把 google 那个垃圾 xml 标签丢垃圾桶去
3 楼 nemohq 2012-05-07 18:58
那Oracle怎么办啊。这还在和谷歌PK呢,结果那边用C#做出一个Android,让Oracle情何以堪!
2 楼 redsea 2012-05-07 17:08
性能比较应该多给一点结果, 现在给出的结果, 恰好是 Java 一直做得差被诟病的地方.

不知道其他地方会如何.
1 楼 phenom 2012-05-07 17:04
路过。。。
oracle-google-microsoft

发表评论

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

相关推荐

  • 浅谈linux kernel对于浮点运算的支持

    目前大多数CPU都支持浮点运算单元FPU,FPU作为一个单独的协处理器放置在处理器核外,但是对于嵌入式处理器,浮点运算本来就少用,有些嵌入式处理器就会去掉浮点协处理器。 X86处理器一般都是有FPU的。而ARM PPC MIPS处理器就会出现没有FPU的现象。 linux kernel如何处理浮点运算,我们就分为带FPU的处理器和不带FPU的处理器来讨论。 (以下为个人知识总结,研究不深,错误之处希望大家指正,共同学习) 一 对于带FPU的处理器 1 对于linux kernel来说,kernel本身编译默认使用了-msoft-float选项,默认编译为软浮点程序,软浮点含义是有gcc编译器模

  • bc命令 浮点运算

    bc的英文全拼为“ Binary Calculator ”,是一种支持任意精度的交互执行的计算器语言。bash内置了对整数四则运算的支持,但是并不支持浮点运算,而bc命令可以很方便的进行浮点运算,当然整数运算也不再话下。 语法格式:bc [选项] 常用参数: -i 强制进入交互式模式 -l 定义使用的标准数学库 -w 定义使用的标准数学库 -q 打印正常的GNU bc环境信息 参考实例 算术操作高级运算bc命令它可以执行浮点运算和一些高级函数: [root@linuxcool ~]# echo 1.212*3 | bc 3.636 设定小数精度(数值范围)

  • Javascript 浮点运算精度问题分析与解决

    浮点数的精度问题不是JavaScript特有的,因为有些小数以二进制表示位数是无穷的

  • 浮点运算与定点运算

    在数字信号处理器DSP 中,根据运算方式的不同,可分为浮点运算与定点运算 。顾名思 义,浮点运算在运算过程中,小数点的位置是变动的。定点运算则是不变。浮点运算的优 点是表示数的动态范围大,精度也可以很细。缺点是硬件复杂。定点运算的优点是运算速 度快,硬件相对简单。缺点是运算过程中容易溢出,产生误差。 不管是浮点运算还是定点运算 ,两者都存在有限字长效应。即DSP的处理字长一般是16bit 或者32bit,有限长度的字长总不能精确地表示某些小数。以小数0.1为例,转成二进制就 是0.0001100110011

  • 浮点数的精度损失

    对浮点型数据还不够了解?快进来,包你进步。

  • java 可能损失精度_Java损失精度的原因及解决办法

    本文主要描述java损失精度的原因,在工作中多多少少都会遇到这个问题,遇到这个问题最好的解决办法就是用java.math.BigDecimal,用BigDecimal类型不会出现损失精度问题,在涉及到财务方面及其它精确计算的时候必用BigDecimal,BigDecimal相关用法请点击这个链接查看BigDecimal详解。1.Java损失精度问题1.1造成损失精度的原因(1)强制类型转换损失精度...

  • 关于float丢失精度

    关于float丢失精度 在实际中遇到一个问题: 当float类型的一个数的整数部分特别大时,如4399670.00在计算时,这个数只保留两位小数,此时,这个数参加运算时,就会丢失小数级别的精度。0.15,0.25会被当做0.00。这是因为整数部分太长,float只占4个字节所造成的。此时,把计算相关的类型换成double即可。 代码: float X = 0; doub...

  • 为什么浮点类型的数值会精度丢失?

    在开发过程中,我们经常会发现浮点类型的数值会精度丢失,比如:System.out.println(2.0 - 1.1)我们肯定觉得应该输出0.9,但是程序输出的是0.8999999999999999在java程序中,JDK提供了BigDecimal类,以解决精度丢失这一问题,但到底是什么原因呢?这种舍入误差的主要原因是浮点数值采用二进制系统表示 ,而在二进制系统中无法精确地表示分数 1 / 10。...

  • 浮点数运算丢失精度

    今天碰到了这样一个情况, 使我又去翻阅了原来课本, 在Pthon中如果输入下面这段程序: print(sys.float_info.max - 1.0) print(sys.float_info.max) 结果如下: 结果发现, 这数字根本没有变化. 本来这没什么, 看这数字, 10的308次方, 也就是说, 减去的1是在308位之后了, 这里没有变化很正常嘛. 但是下面的现象就不能解释了: a = sys.float_info.max - 1.0 b = sys.float_info.max prin

  • 浮点数精度丢失分析及解决

    Java语言在处理浮点数,其实现逻辑与整数不同,如果使用不当可能会造成精度丢失、计算不准确、死循环等问题,严重的话,会造成经济损失。本文将从浮点数精度丢失入手,详细介绍下浮点数的原理及使用。

  • 浮点数值计算精度丢失问题剖析及解决方法

    Java和JavaScript的精度丢失解决方案。

  • 编程语言中浮点型精度损失问题(C#和Java)

    看下面一段Java代码: double sum = 0; double d = 1064.8; sum += d; System.out.println(sum); sum += d; System.out.println(sum); sum += d; System...

  • 浮点数操作精度损失

    众所周知,浮点数操作是有精度损失的。这里对精度损失的原因进行跟踪。 废话少说,先上代码: import java.math.BigDecimal; public class Main { static void parseFloatDetails(float v) { int i = Float.floatToRawIntBits(v); int s

  • 关于float,double的精度丢失

    1.疑惑 由于对float或double 的使用不当,可能会出现精度丢失的问题。问题大概情况可以通过如下代码理解:   Java代码  public class FloatDouble {          /**功能:打印float和double浮点数十进制和二进制表示       * @author mike       * @param args

  • double 转float 损失精度

    (一)32位平台: 分为有符号型与无符号型。 有符号型: short 在内存中占两个字节,范围为-2^15~(2^15-1) int 在内存中占四个字节,范围为-2^31~(2^31-1) long在内存中占四个字节,范围为-2^31~2^31-1 无符号型:最高位不表示符号位 unsigned short 在内存中占两个字节,范围为0~2^16-1 unsigned int 在内存中占四个字节,...

  • Java细节:浮点数精度丢失问题的原因

    我们知道整数类型没有精度丢失的问题,但是浮点数有精度丢失的问题,下面我们来探究一下其精度丢失的原因所在。 浮点数,分单精度(float)和双精度(double): float ,介于 -3.402823e38 和 +3.402823e38 之间的32位数字; double ,介于 -1.79769313486232e308 和 +1.79769313486232e308 之间的64位数字; 我们...

  • float,double等精度丢失问题

    问题提出:12.0f-11.9f=0.10000038,"减不尽"为什么? 来自MSDN的解释: http://msdn.microsoft.com/zh-cn/c151dt3s.aspx 为何浮点数可能丢失精度浮点十进制值通常没有完全相同的二进制表示形式。 这是 CPU 所采用的浮点数据表示形式的副作用。 为此,可能会经历一些精度丢失,并且一些浮点运算可能会产生意外的结果。 ...

  • 浮点数运算时精度损失的解决方案--BigDecimal

    下面是处理浮点数运算的工具类,现在不是很全,后期会随着应用而完善 import java.math.BigDecimal; import java.math.RoundingMode; /** * @author :hwweic * @date :Created in 2019/11/24 15:34 * @description : * * @version: 1.0 */ p...

Global site tag (gtag.js) - Google Analytics