我经常碰到一些人在说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平台下执行的过程及其逻辑,希望能做到。

[基础] - 从xx语言是跨平台的说起的更多相关文章

  1. 20165101 学习基础和C语言基础调查

    学习基础和C语言基础调查 技能学习心得 看了15级学长学姐丰富的技能之后,我感到很惭愧.我的课外技能可以说是很糟糕.唱歌的话,小时候还可以用假声唱一下,变声之后就是高音上不去,低音下不来.体育更是差劲 ...

  2. JAVA语言的跨平台性和JDK,JRE与JVM

    Java虚拟机--JVM ~JVM:java虚拟机简称JVM是运行所有java程序的假想计算机,是java程序的运行环境,是java最具有吸引力的特性之一,我们编写的java代码,都运行在JVM之上 ...

  3. [转]概率基础和R语言

    概率基础和R语言 R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒.直到大数据的爆发,R语 ...

  4. 狗屁不通的“视频专辑:零基础学习C语言(小甲鱼版)”(2)

    前文链接:狗屁不通的“视频专辑:零基础学习C语言(小甲鱼版)”(1) 小甲鱼在很多情况下是跟着谭浩强鹦鹉学舌,所以谭浩强书中的很多错误他又重复了一次.这样,加上他自己的错误,错谬之处难以胜数. 由于拙 ...

  5. 20165318 预备作业二 学习基础和C语言基础调查

    20165318 学习基础和C语言基础调查 技能学习经验 我们这一代人,或多或少的都上过各种兴趣班,舞蹈钢琴画画书法,我也是如此.可这些技能中,唯一能拿的出手的就是舞蹈了.按照<优秀的教学方法- ...

  6. 20165230 学习基础和C语言基础调查

    20165230 学习基础和C语言基础调查 技能学习经验 我擅长弹钢琴.小时候我曾上过很多兴趣班,比如钢琴.跳舞.书法.绘画等等,唯一坚持至今的只有钢琴.仔细一算学习钢琴至今已有12年,不能说已经精通 ...

  7. 20165237 学习基础和C语言基础调查

    学习基础和C语言基础调查 一.技能学习与特长 你有什么技能比大多人(超过90%以上)更好? 我的爱好和技能说实话挺广泛的.如果要挑出来一个很擅长的话,我觉得应该是钢琴. 针对这个技能的获取你有什么成功 ...

  8. 20165234 预备作业2 学习基础和C语言基础调查

    学习基础和C语言基础调查 一.技能学习经验及体会 你有什么技能比大多人(超过90%以上)更好? 看到这个问题,我仔细想了想,好像的确没有什么特别出众的技能,但是我想到了许多我个人的爱好. 我从小喜欢五 ...

  9. 20165337学习基础和C语言基础调查

    20165337学习基础和C语言基础调查 你有什么技能比大多人(超过90%以上)更好? 讲道理我感觉我自己没有什么能比90%以上的人都做得好的技能,我就瘸子里面拔将军挑一个我自认为还不错的技能吧. 我 ...

随机推荐

  1. vuepress1.x入门使用

    要点: 1.用npm操作会有各种问题,用yarn取代之; 2.yarn可以用npm全局安装,而npm是node环境自带,node环境去官网下载安装; 3.没有必要全局安装vuepress 操作: 1. ...

  2. 顺F速运国际版,你的密码漏点了

    - 加密情况分析 对APP的分析过程,当然首先是安装,使用,抓包啦. 同样地,登录,抓包看看. 使用账号密码登录. - 壳呢? 虽然直接解密了顺F国际版的加密数据,但还是有必要看看它的APK. 经过分 ...

  3. 配置VS Code+React开发环境

    1.安装node+npm 2.安装VS Code 3.选择工作区文件夹——右键点击在终端中打开 4.按照Using React in Visual Studio Code的文档进行操作 npm ins ...

  4. [b0039] python 归纳 (二四)_多进程数据共享和同步_锁Lock&RLock

    # -*- coding: utf-8 -*- """ 多进程 锁使用 逻辑: 10个进程各种睡眠2秒,然后打印. 不加锁同时打印出来,总共2秒,加锁一个接一个打印,总共 ...

  5. SparkSql 整合 Hive

    SparkSql整合Hive 需要Hive的元数据,hive的元数据存储在Mysql里,sparkSql替换了yarn,不需要启动yarn,需要启动hdfs 首先你得有hive,然后你得有spark, ...

  6. 我写了个项目,帮你学习HTTP接口测试!

    端午节我写了一个项目,帮助你学习HTTP接口测试. GitHub地址: https://github.com/defnngj/learning-API-test 整个项目基于Flask和 Reques ...

  7. Hive性能调优(一)----文件存储格式及压缩方式选择

    合理使用文件存储格式 建表时,尽量使用 orc.parquet 这些列式存储格式,因为列式存储的表,每一列的数据在物理上是存储在一起的,Hive查询时会只遍历需要列数据,大大减少处理的数据量. 采用合 ...

  8. MSSQL添加外键

    alter table 需要建立外键的表 with check/nocheck add constraint 外键名字 foreign key (需要建立外键的字段名) references 外键表( ...

  9. Windows 跟 Linux 文件共享:Samba 设置

    用 Samba  服务器 https://my.oschina.net/u/3783115/blog/1919892?from=timeline https://blog.51cto.com/1372 ...

  10. Shell命令-用户用户组管理之passwd、chage

    文件及内容处理 - passwd.chage 1. passwd:修改用户密码 passwd命令的功能说明 passwd命令用来更改使用者的密码 passwd命令的语法格式 passwd [-k] [ ...