[基础] - 从xx语言是跨平台的说起
我经常碰到一些人在说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语言是跨平台的说起的更多相关文章
- 20165101 学习基础和C语言基础调查
学习基础和C语言基础调查 技能学习心得 看了15级学长学姐丰富的技能之后,我感到很惭愧.我的课外技能可以说是很糟糕.唱歌的话,小时候还可以用假声唱一下,变声之后就是高音上不去,低音下不来.体育更是差劲 ...
- JAVA语言的跨平台性和JDK,JRE与JVM
Java虚拟机--JVM ~JVM:java虚拟机简称JVM是运行所有java程序的假想计算机,是java程序的运行环境,是java最具有吸引力的特性之一,我们编写的java代码,都运行在JVM之上 ...
- [转]概率基础和R语言
概率基础和R语言 R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒.直到大数据的爆发,R语 ...
- 狗屁不通的“视频专辑:零基础学习C语言(小甲鱼版)”(2)
前文链接:狗屁不通的“视频专辑:零基础学习C语言(小甲鱼版)”(1) 小甲鱼在很多情况下是跟着谭浩强鹦鹉学舌,所以谭浩强书中的很多错误他又重复了一次.这样,加上他自己的错误,错谬之处难以胜数. 由于拙 ...
- 20165318 预备作业二 学习基础和C语言基础调查
20165318 学习基础和C语言基础调查 技能学习经验 我们这一代人,或多或少的都上过各种兴趣班,舞蹈钢琴画画书法,我也是如此.可这些技能中,唯一能拿的出手的就是舞蹈了.按照<优秀的教学方法- ...
- 20165230 学习基础和C语言基础调查
20165230 学习基础和C语言基础调查 技能学习经验 我擅长弹钢琴.小时候我曾上过很多兴趣班,比如钢琴.跳舞.书法.绘画等等,唯一坚持至今的只有钢琴.仔细一算学习钢琴至今已有12年,不能说已经精通 ...
- 20165237 学习基础和C语言基础调查
学习基础和C语言基础调查 一.技能学习与特长 你有什么技能比大多人(超过90%以上)更好? 我的爱好和技能说实话挺广泛的.如果要挑出来一个很擅长的话,我觉得应该是钢琴. 针对这个技能的获取你有什么成功 ...
- 20165234 预备作业2 学习基础和C语言基础调查
学习基础和C语言基础调查 一.技能学习经验及体会 你有什么技能比大多人(超过90%以上)更好? 看到这个问题,我仔细想了想,好像的确没有什么特别出众的技能,但是我想到了许多我个人的爱好. 我从小喜欢五 ...
- 20165337学习基础和C语言基础调查
20165337学习基础和C语言基础调查 你有什么技能比大多人(超过90%以上)更好? 讲道理我感觉我自己没有什么能比90%以上的人都做得好的技能,我就瘸子里面拔将军挑一个我自认为还不错的技能吧. 我 ...
随机推荐
- CAS(比较并交换)
一.CAS(无锁的执行者) CAS包含3个参数:内存值 V 旧的预期值 A 新值 B 当且仅当V值等于A值时,将V的值改为B值,如果V值和A值不同,说明已经有其他线程做了更新,则当前线程什么都不 ...
- 转.HTML中img标签的src属性绝对路径问题解决办法,完全解决!
HTML中img标签的src属性绝对路径问题解决办法,完全解决 需求:有时候自己的项目img的src路径需要用到本地某文件夹下的图片,而不是直接使用项目根目录下的图片. 场景:eclipse,to ...
- 深浅拷贝的应用-copy、mutableCopy
ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController //如果想让li ...
- 登录界面storyboard的一种布局方法
布局思想:三个大点的背景视图宽高相等间距一定(30),左右距父视图距离一定(50),则宽度确定,水平方向位置确定 竖直方向:高度与宽度成一定比例,上边距父视图距离一定,竖直方向的位置和大小也确定了.输 ...
- git设置github的远程仓库的相关操作
git能够把github作为远程仓库,本地可以进行推送有关变更,从而多人可以进行协作开发工作. 1 ssh-keygen -t rsa -C "your-email@163. ...
- LayoutSubviews的调用
1.当view被添加到另一个view上时调用 2.布局子控件时调用 3.屏幕旋转的时候调用 4.当view的尺寸大小改变的时候调用
- [转]Eclipse插件开发之基础篇(1) 插件开发的基础知识
原文地址:http://www.cnblogs.com/liuzhuo/archive/2010/08/13/eclipse_plugin_1_0_2.html 名词翻译 有一些名词在翻译的过程中可能 ...
- JDK10源码分析之HashMap
HashMap在工作中大量使用,但是具体原理和实现是如何的呢?技术细节是什么?带着很多疑问,我们来看下JDK10源码吧. 1.数据结构 采用Node<K,V>[]数组,其中,Node< ...
- spark streaming整合kafka
版本说明:spark:2.2.0: kafka:0.10.0.0 object StreamingDemo { def main(args: Array[String]): Unit = { Logg ...
- 【CobaltStrike】对CobaltStrike内置功能模块的了解
对CobaltStrike内置功能模块的了解 0x00 右键功能列表 Interact 打开beacon Access dump hashes 获取hash Elevate 提权 Golden Tic ...