我经常碰到一些人在说xx语言跨平台而yy语言不是(为避免不必要的纷争,在此不写具体语言但不影响阅读),从而来表明自己使用xx语言进行程序开发进而在编程语言鄙视链上高高在上很有优越感。

大概是从Java 提出的“Write once, Run anywhere”这个口号开始,跨平台的概念开始流行起来了(我不完全确定时间点是不是高度重合,所以使用了“大概”这个词)。

这里我拿Java语言举例子来说明一下,从编码开始到真正执行的过程是:编写源代码(.java)文件->编译器编译成字节码(.class)文件->各种部署或分发->在计算机上开始执行->计算机加载资源->发现是Java编程的程序->调用JVM->JVM解析.class文件->JVM执行程序。我们可以看出程序执行过程中真正由计算机本身执行的步骤有加载资源到调用JVM部分,当JVM开始解析.class文件并执行的过程并不是直接交付给计算机执行的而是均有JVM来负责,这也是为什么这种JVM程序运行机制叫做托管环境。

那么Java具体是怎么实现跨平台的呢?当然是由Java的开发商(先是Sun后是Oracle)实现了各个操作系统平台(Windows,Linux和Mac系列)的JVM,需要实现哪个平台的支持部署时安装上该平台所对应的JVM(JVM以及其需要lib合起来被称为JRE)即可实现Java程序在该平台的运行能力。所以从严格意义上来讲,Java语言开发的程序本身不是跨平台的但JVM有各个平台对应的版本,Java可以在各个平台下运行;从程序员开发程序的角度来看我们也可以简化为Java程序具有跨平台的能力。事实上当程序交付给JVM(JRE)执行的时候其并不关注程序是不是由Java语言编写成的,其仅仅是解释并执行类文件(.class),这样为JVM执行其他语言编写的程序提供了便利。

那其他语言有跨平台的能力吗,比如C语言?C语言从开发到运行的过程相对于Java的过程有所不同:开发源代码文件(.c)->编译器编译源代码->运行。在编译器编译源代码的过程中没有编译为中间结果而是编程成了相对应的机器码(或Windows或Linux或Unix等),当程序执行的时候直接由CPU解释执行,所以C语言开发的程序在这种执行机制下是不具备跨平台执行的能力的。

那么还有没有其他类似的程序执行机制的吗?当然有了,比如以C#为主的.NET系编程语言,其跨平台的原理和Java基本相同,不过虚拟机不叫JVM而是叫CLR(Common Language Runtime),从名字上我们可以看出Common的是不限制各种编程语言,只要该语言编译器能编程成符合CLR执行标准规范的中间层(类似Java语言体系中的.class)即可这个中间层的名称叫IL,全称是MSIL(Microsoft intermediate Language),而这套标准规范就是CLS(Common Language Specification)。但是微软出于某些考虑在.NET推出的10多年中仅仅实现了在Windows平台下的CLR而始终没推出基于Linux平台的CLR,虽然也有其他公司尝试推出MONO,但力度不大也没太多的工业界影响力。在2014年之后微软推出了.NET Core,并同步推出了各个平台相应的Runtime。

截止到目前,Java的相关专利均有其公司持有,任何对这些专利有抵触的地方都可能有被诉讼法律的风险,比如当年微软针对性的优化Java在Windows平台下执行性能和效率专门开发的Visual J++套件就是因为专利的问题被Sun公司起诉并获赔的。

而C#等.NET体系的编程标准均为ECMA标准,这里我简单列一下其链接不再详述:

Common Language Infrastructure(ecma-335)

C# Language Specification(ecma-334)

任何有实力有想法的公司或个人均可以基于这些开发标准进行相应的开发,不过大部分的公司处于竞争不过微软的地位而不在这方面多投入资源,但也有极个别的公司曾经尝试过,比如Borland公司的Delphi.NET。

有过Java和C#,有关跨平台,有关.NET Core等等,这些有很多可以说的,不是短短的几篇文章能描述清楚,有需要了解这些情况的同学还是优先看各种官方文档,我们只能从各种二手资料中推断演绎。

后续还计划写一篇.NET 程序在Windows平台下执行的过程及其逻辑,希望能做到。

最新文章

  1. AngularJS 依赖注入
  2. Android中AIDL的理解与使用(二)——跨应用绑定Service并通信
  3. 迁移学习( Transfer Learning )
  4. 开始ASP.NET MVC5之旅
  5. Joda-time是java处理时间非常棒的jar
  6. bootstrap日期控件在火狐下的模态框中选择时间下拉菜单无效的解决办法
  7. 【Hadoop】Hive HSQ 使用 && 自定义HQL函数
  8. 关于分区技术的索引 index
  9. A Linear Time Majority Vote Algorithm
  10. python进阶3--文件系统
  11. css模块化及CSS Modules使用详解
  12. Log4j日志框架学习零到壹(一)
  13. Zookeeper 集群安装配置,超详细,速度收藏!
  14. OPENSSL编程 第二十章 椭圆曲线
  15. Win10系列:C#应用控件基础21
  16. 安卓开发_深入理解Handler消息传递机制
  17. 异常+远程控制Linux-14
  18. debian9部署ownCloud
  19. C# 获取config文件 实体转换
  20. 判断一个字符是否为数字的两种方法(C/C++)

热门文章

  1. java报错问题记录
  2. CSS3 动画--- CSS3 animation
  3. Dynamics 365 We API ODATA语法根据父记录查询子记录,根据子记录查询父记录(附上根据团队,队列名称查成员)
  4. DataGuard搭建逻辑StandBy
  5. Python—函数的参数传递
  6. [PHP] vscode配置SFTP扩展同步文件
  7. Linux 查看端口机服务
  8. Flask request接口获取参数
  9. MATLAB常见的学习率下降策略
  10. Pwnable-random