我经常碰到一些人在说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. Oracle:Redhat 7.4+Oracle Rac 11.2.0.4 执行root.sh报错处理

    一.报错信息 二.原因分析 因为RHEL 7使用systemd而不是initd运行进程和重启进程,而root.sh通过传统的initd运行ohasd进程 三.解决办法 在RHEL 7中ohasd需要被 ...

  2. Define the Data Model and Set the Initial Data 定义数据模型并设置初始数据

    This topic describes how to define the business model and the business logic for WinForms and ASP.NE ...

  3. kafka以及消息队列详解

    Kafka 是LinkedIn 开发的一个高性能.分布式的消息系统. 用途:广泛用于日志收集.流式数据处理.在线和离线消息分发等场景. 1. Kafka 将消息流按Topic 组织,保存消息的服务器称 ...

  4. 使用Wireshark进行DNS协议解析

    - 域名及解析过程 域名由一系列 - DNS协议报文格式 一次DNS过程包含一对请求报文和响应报文.请求和响应报文有统一的报文格式如下图: - DNS报文例子 一次DNS请求的过程: 包括请求和响应, ...

  5. git设置github的远程仓库的相关操作

        git能够把github作为远程仓库,本地可以进行推送有关变更,从而多人可以进行协作开发工作.    1  ssh-keygen -t rsa -C "your-email@163. ...

  6. laravel Error 笔记

    一.有关CSRF验证 1.网址访问POST请求,如 127.0.0.1:81/delUser?id=1  网页请求是默认是GET请求方式,看返回的数据信息就知道,数据是以GET方式发送的,所以若路由中 ...

  7. 获取oracle的建表DLL语句

    get_ddl('TABLE','表名','实例名') from dual   select dbms_metadata.get_ddl('TABLE','RMS_CITY','RMS') from ...

  8. 成功安装mysql后,为何服务管理器里找不到MYSQL服务名【转】

    解决方案:(参考以下命令) 1.打开cmd,切换到mysql的bin目录下 2. D:\Program Files\MySQL5.1\bin>mysqld.exe -install Servic ...

  9. 5-5 可视化库Seaborn-多变量分析绘图

      Parameters:¶ 参数 解释 变量 x,y,hue 数据集变量 变量名 date 数据集 数据集名 row,col 更多分类变量进行平铺显示 变量名 col_wrap 每行的最高平铺数 整 ...

  10. 【poj3207】Ikki's Story IV - Panda's Trick(2-sat)

    传送门 题意: 给出一个圆,圆上有\(n\)个点,依次为\(0,1,\cdots,n-1\). 现在要连接\(m\)对点,每次连接时可以直接从里面连,也可以从外面连. 最后问,连完这\(m\)对点后, ...