阅读更多

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

发表评论

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

相关推荐

  • 浮点数的精度损失

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

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

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

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

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

  • 浮点数(float、double)精度损失问题

    以前简单了解过浮点数的精度损失问题,但是没有系统整理过。😂。

  • 精度损失的研究

    高位数据赋值低位,比如 int型数据赋值 char型数据,既16位赋值8位,取其低八位赋值,高位数据丢失。 计算机是用二进制表示数的,存储的位长有限,只能截掉,所以误差就产生了。所以在一些要求四舍五入严格精度的场合,最好把浮点数转换为整数来计算,否则可能在某些特殊的情况下产生意外的计算错误 转载于:https://www.cnblogs.com/my-life/archive/2013/0...

  • python解决浮点数运算精度损失的方法

    python解决浮点数运算精度损失的方法

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

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

  • 编程语言中浮点型精度损失问题(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

  • 解决精度损失问题

    package com.tapi.esb.common.rule.logic;import java.math.BigDecimal;/** * TOPMathUtil * @author lubin * */ public class MathUtil { /** * 两个double相加,解决精度损失问题 * @param a * @param b

  • java浮点数精度损失原理和解决

    我所在的公司近期要做一个打赏的功能,比如说发一张照片其他人可以对这张照片进行打赏,给些小钱。我的工作是负责给客户端下发打赏消息。工作完工之后客户端同学说有个问题,我下发的打赏金额是string类型的,他们觉得double才对。于是我就去找老大问这个能不能改成double类型,老大说这个应该是string才对的,我说金额不是数字么,然后老大笑着说你回去好好想想。。。。。。   (二逼版开头:天下没

  • C++解决数据精度问题,对浮点数保存指定位小数

          ------ 更新日期  2018年5月13日 21:41:46     1、背景        对浮点数保存指定位小数。比如,  1.123456.   要保存1位小数,,调用方法后, 保存的结果为: 1.1。 再比如,1.98765,  保存2位小数的结果为: 2.00.   2、 解决方案        A、添加头文件   #include <ss...

  • 定点化

     用整数来模拟浮点数 其实就是线性的映射,根据数据的动态范围把浮点映射到int8, int16或int32, 比如浮点数A,a=max(abs(A)),若要把A映射成-128~127的数,需要: A_fix = A*(127 / a) ,即A=A_fix *a / 127; 如果B也是同样的浮点数,那么 A * B = A_fix* B_fix * a * b / (127

  • 浮点数计算造成的精度丢失问题

    double d = 2.4; System.out.println(d);     输出的是2.4,而不是2.3999999999999999。也就是说,不进行浮点计算的时候,在十进制里浮点数能正确显示。这更印证了我以上的想法,即如果浮点数参与了计算,那么浮点数二进制与十进制间的转换过程就会变得不可预知,并且变得不可逆。     事实上,浮点数并不适合用于精确计算,而适合进行科学计算。这里有...

  • 浮点数精度丢失的原因和解决办法

    文章目录二进制浮点数转换为十进制浮点数十进制浮点数转换为二进制浮点数浮点数的存储float类型在计算机中的存储形式中指数为什么要加127,而double类型要加1023?浮点数精度丢失的原因 二进制浮点数转换为十进制浮点数 十进制浮点数转换为二进制浮点数 浮点数的存储 float类型在计算机中的存储形式中指数为什么要加127,而double类型要加1023? 以float为例,计算机表示单精度浮点数时,是用8位去存储指数部分,即表示0-255,但我们同样需要有负指数,正负指数的位数量为了均等,各自一

  • 关于浮点型运算精度丢失问题

    先看图: 那么问题来了,为什么两个浮点型相加精度会丢失呢??? 原来是因为是float型还是double型他们都是浮点数,而计算机是二进制的,浮点数一定会失去精度的。 提示:十进制值通常没有完全相同的二进制表示形式;十进制数的二进制表示形式可能不精确。只能无限接近于那个值。 那如果我们在做项目的时候,涉及到金额,那精度是不能丢失的。如果你的支付宝或微信余额是0.9999985545465,你会怎么想? 这时候,我们就要用到Java里面的BigDecima。 【BigDecimal是什..

  • 【解惑】剖析float型的内存存储和精度丢失问题

    问题提出:12.0f-11.9f=0.10000038,"减不尽"为什么?   现在我们就详细剖析一下浮点型运算为什么会造成精度丢失?   1、小数的二进制表示问题        首先我们要搞清楚下面两个问题:      (1)  十进制整数如何转化为二进制数            算法很简单。举个例子,11表示成二进制数:             ...

Global site tag (gtag.js) - Google Analytics