python跨平台原理是什么_Unity 跨平台原理学习总结

什么是跨平台

所谓程序是运行于硬件之上的,比如最常见的CPU,程序是一堆二进制,各类硬件会对这堆二进制进行解释与执行,稍有规模的软件的开发不可能完全只写汇编,我们往往需要高级编程语言。但是不同的硬件需要的机器码是不同的,而且各个操作系统装载需要的可执行文件格式也不一样,总之我们需要针对各个平台的可执行文件。但是我们希望能够只开发一份源代码,但是能部署软件到多个不同平台(这里的平台只操作系统 + 硬件,比如Linux + x86)。这就是最基本的跨平台,为什么说是最基本,因为事实上,不同平台上除了机器码格式,可执行文件格式之外,各个平台间还有诸如编译器,API库、显示器、输入设备之类五花八门的区别,实际软件想要真的能跨平台使用需要开发者费相当大的功夫。这不是本文要讨论的内容,以下提及的跨平台都是指满足最基本的运行条件(能被操作系统装载,执行,简单地说,能跑就行 )。

跨平台机制的分类

AOT

类似于C/C++之类的语言,被称为 AOT(Ahead Of Time),各类编译器比如gcc会将源代码编译成平台相应的 native code。大概是下面这样AOT脚本语言跨平台原理

脚本语言

除了 AOT 式的语言,还有类似 Lua/Python 这种解释性的脚本语言。源代码并不会编译为 native code,而且直接通过虚拟机(或者说解释器)来执行。运行在不同平台上的虚拟机,可以执行同一份脚本,以此来实现跨平台。脚本语言跨平台原理

JIT

除了上述的静态编译与执行脚本之外,还有介于两者之间的第三者。类似 Java/C# 的语言,会将源代码编译为某种中间语言(比如java字节码和CIL),然后虚拟机会在运行时将器编译为相应native code,然后执行,这种机制被称为JIT(Just In Time),因为编译生成的中间语言可以在多个平台的虚拟机上执行,所以可以实现跨平台。JIT语言跨平台原理

一般就性能而言 AOT > JIT > 脚本语言。

Unity 的跨平台机制

CIL与CLR

.Net标准定义了所谓CIL(Common Intermediate Language),可以将各种语言编译成统一的中间语言 CIL,然后运行在可以运行在各个平台的CLR(Common Language Runtime)上,这里的CIL就是上文提及的中间语言,CLR就是虚拟机。

Mono

上文提及了CIL与CLR是一套标准,而Mono即是实现了该标准的一套实现,核心即是将各种高级语言编译成IL的编译器,以及运行IL的CLR。Unity 的跨平台即是基于Mono,开发时的写的各种类型的脚本语言(C#、JavaScript...) 都会被 Mono 的编译器编译为 IL,然后在各个平台上的 Mono 虚拟机上运行,这样就实现了跨平台的机制。

不支持JIT的平台

故事到这里还没有完,部分平台,比如 ios ,禁止 JIT 的使用。因此事实上如果希望将代码部署到这些平台,则不能在语言中使用需要 JIT 的特性(比如用反射生成模板之类的).。而且也不能直接通过部署IL到对应平台的虚拟机上运行。 对于这些平台,Unity 的做法是直接用 JIT 将 IL 编译为对应平台的 native code,然后直接部署 native code。

IL2CPP

IL2CPP (Intermediate Language To C++)是 Unity 支持的另一种脚本后端(scripting backend)的机制。和 mono 不同的是,编译生成中间语言之后会将 IL 转换为 C++(事实上中间还会做一些裁剪工作),然后再通过各个平台的编译器编译成相应的 native code。

这套东西被搞出来据说是因为 Unity 授权的 Mono 版本太老了,bug太多, Unity官方被搞得心力交瘁,于是就整了这货。因为 C++ 编译器的各种优化操作所以生成的 native code 相比起 Mono 性能上会有优势,不过因为 C++ 编译器那慢得令人窒息的速度所以出包也会慢得多(其实翻译的过程也很慢,甚至往往比编译慢。。。),不过官方也推出了一些优化方案。虽然没有了 Mono 虚拟机,但是 Unity 会把一个叫 libil2cpp 的库一起打包,这里面支持了GC之类的东西,让我觉得骚的地方是,转成C++后,居然还可以使用部分反射,应该也和这个库有关,不过代码裁剪(code stripping)就会变得麻烦,一段代码没有被显示引用,但是可能会被通过反射引用。我们可以选择裁剪级别,越高包体越小,不过风险越大(裁剪掉实际会访问的代码)。而且高级别对版本也有要求,此外还可以用一些 Attribute 或者配置来声明不希望被裁剪的代码,更多详情参考这里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值