为什么Java可以跨平台,而其他语言不行
你好
我是大福 你现在看的是大福笔记
今天复习了Java语言的概述
内容包括Java 语言的历史、语言特点及平台版本 JRE和JDK的区别
这篇文章的主题是总结下对Java语言特点中的跨平台原理.
在这之前,我们先了解下计算机语言为什么不能跨平台.
跨平台分两个层面 硬件层面 系统层面
先说硬件层面
计算机只能识别由"0"和"1"组成的二进制数.
那么随便给计算机一组0101的二进制数计算机就能识别么?
当然不是!
以人为例
人是可以识别声音的。
这样一个场景:房间里坐着3个人,分别是中国人、韩国人和美国人。
现在你需要分别和他们打招呼。
怎么办,跑到每个人面前吼一声可以不?
搞不好,人家会以为你在骂他.
所以这时就需要分开来了
中国人说:你好
韩国人说:阿尼哈撒哟
美国人说:Hello
这样人家才能知道是打招呼,而不是在骂他.
因为他们只能接受特定的打招呼的语言.
那回到计算机!
每台计算机出厂的时候就预先设定好它能识别的一组指令存放在计算机中叫指令集。而每家公司出厂的计算机设定的指令集又可能不同,所以需要针对特定的计算机编写特定的程序。
就和上面列子一样,3种不同的计算机可能需要写3套程序。
同样一件事情需要做3次,如果再有几种计算机可能还有更多次,麻不麻烦?自己感觉下
那硬件层面是否可以跨平台?
答案是肯定的,最好的例子就是AMD和Intel.
既然上面的问题是由于不同的计算机厂商设置不同的指令集产生的,那把指令集统一就可以解决上面硬件层面的跨平台问题.
所以AMD和Intel现在都统一支持x86指令集(64位的叫x64).这样只需要针对特定的指令集编写程序就行.从而解决了硬件层面的跨平台.
其实硬件层面的跨平台不是我们该操心的,只有操作系统才是直接运行在硬件上.
我们编写的是应用程序,应用程序是运行在操作系统上,所以系统层面的跨平台才是我们关注的.
硬件层面的跨平台都解决了,系统层面怎么又出来了跨平台问题?
我们以Windows、Linux和Mac为例,看下图
Windows Linux和Mac通过X86指令集可以控制AMD和Intel CPU
那我们写的应用程序运行在这3个系统上有什么问题
这里我们以C语言来说明下
有句话叫"一次编写,到处编译",说的就是C语言这类编译型语言.
意思是只需要编写一次C语言的源文件,然后在不同的操作系统上编译一次就可以使用.
如果只是编译一下,也挺省事的.
那这个理念是否可以实现?
理论上可以.
为什么是理论上?
如果是使用C标准库中提供的API接口进行编程,那么"一次编写,到处编译"是完全可以实现的.
可是C标准库中实现的接口实在太少了,不够用!
这样每个操作系统厂家又扩展了自己的系统类库.
比如Windows下的MFC(微软基础类库)你在Windows下编写程序调用MFC下的接口,编译和运行是没问题的。但到Linux下就会编译不过,因为编译器找不到MFC的接口.那这个代码在Linux就使用不了.
这就产生了计算机语言跨平台的问题.本质上来说不是语言不能跨平台,而是语言编写过程中所使用的系统库不能跨平台.
难道C语言就不能夸平台了吗? 可以研究下QT
接下来我们来说说Java怎么解决这个问题,实现跨平台.
先看下Java的编写执行过程
从上图我们可以看出Java的编写过程:
首先编写Java源文件,通过Java编译器生成后缀为.class的字节码文件,这文件不和特定的操作系统相关,然后通过JVM解释执行.
所以Java也叫解释型语言.
Java跨平台的重点就在JVM上,由于.class字节码文件不和特定的操作系统相关需要解释执行.
那么只要能解释执行.class文件就可以执行Java程序.
所以曾经的SUN公司在不同的操作系统上开发出不同的JVM用于解释执行Java程序.以此实现Java 的跨平台.
从而得出 Java语言是跨平台的,但JVM是不跨平台的.
那是不是只有Java是跨平台的呢?
PHP、Python、Ruby、Perl 均在旁边笑而不语
我是大福 每天进步一点点
明天见
为什么Java可以跨平台,而其他语言不行的更多相关文章
- 如何理解JAVA的跨平台特性
1.java的跨平台,是指java在运行时是凌驾于os之上,是在jvm中运行的,跟os没有直接联系. 2.java跨平台主要是由java的编译方式决定的,因为java是通过jvm先编译再执行,它编译的 ...
- JAVA与编译语言及解释语言的关系
转自JAVA结合了编译和解释执行的优点 编译型语言是一次性编译成机器码,脱离开发环境独立运行,所以运行效率较高,但是由于编译成的是特定平台上机器码,所以可移植性差. 编译型语言的典型代表有C.C++. ...
- Java的跨平台原理
JAVA的跨平台原理 JAVA的跨平台原理 Java是一种简单易用.完全面向对象.有平台无关性.安全可靠的.主要面向Internet的开发工具.Java自从1995年正式面世以来,它的快速发展已经使整 ...
- Java【初识篇】语言概述
什么是计算机语言 语言:是人与人之间用于沟通的一种方式.例如:中国人与中国人用普通话沟通.而中国人要和英国人交流,就要学习英语.计算机语言(编程语言):人与计算机交流的方式.如果人要与计算机交流,那么 ...
- 关于java的跨平台特性
Write once, compile anywhere,“一次编译,到处运行”的著名口号大家想必都听说过吧一次编译:把java代码(.java文件)通过编译器转换成字节码(.class文件)(符合j ...
- 跨平台、跨语言应用开发,Elements 介绍
目录 1,Elements 介绍 2,Elements 版本 3,Elements 能干嘛 4,Elements IDES 5,Elements 工具 1,Elements 介绍 RemObject ...
- C、C++、C#、Java、php、python语言的内在特性及区别
C.C++.C#.Java.PHP.Python语言的内在特性及区别: C语言,它既有高级语言的特点,又具有汇编语言的特点,它是结构式语言.C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作 ...
- Knowledge Point 20180506 深究Java的跨平台特性
本章主题:从骨子里看Java的跨平台;本文内容部分摘自https://www.cnblogs.com/roger-yu/p/5827452.html 有过基础Java知识的开发人员都知道Java是跨平 ...
- Java学习-033-JavaWeb_002 -- 网页标记语言JSP基础知识
JSP 是 Sun 公司提倡的一门网页技术标准.在 HTML 文件中,加入 Java 代码就构成了 JSP 网页,当 Web 服务器访问 JSP 请求的时候,首先执行其中的 Java 程序源码,然后以 ...
随机推荐
- Mysql安装脚本
Mysql PS:要先看懂脚本在复制粘贴运行脚本,每个人的环境不一样 #/bin/bash #--------变量 #num=` + ` now_lujing=`pwd` #------------- ...
- iOS友盟三方登陆
Umeng三方登陆个人总结 Demo地址:https://github.com/haozheMa/UmengThirdLoginDemo这里仅以微信.QQ和新浪微博作为例子首先根据官方文档 导入以下依 ...
- vim中c/c++源码跳转
在使用vim阅读c/c++代码的时候,代码跳转很重要, 在学习redis代码的时候遇到这个问题. 网上查找之后通过实践发现cscope比较好用,可以很方便的实现跳转 1. 安装cscope sudo ...
- 必须熟悉的vim快捷键操作
转载请表明出处http://www.dabu.info/?p=801 Vim/Vi 没有菜单,只有命令 Vim/Vi 工作模式介绍:插入模式 和 命令模式 是vi的两个基本模式.——插入模式 ,是用 ...
- 【转】 Vim多行缩进及高级命令
学习别人的帖子,把内容变成自己的就是成长,此处MARK下 Vim多行缩进技巧 1.按v进入visual状态,选择多行,用>或<缩进或缩出 2. 通常根据语言特征使用自动缩进排版:在命令状态 ...
- ASP.NET脚本过滤-防止跨站脚本攻击[转]
ASP.Net 1.1后引入了对提交表单自动检查是否存在XSS(跨站脚本攻击)的能力.当用户试图用<xxxx>之类的输入影响页面返回结果的时候,ASP.Net的引擎会引发一个HttpReq ...
- 在GitHub上创建上传下载开源项目代码
1.注册GitHub帐号,创建GitHub项目代码仓库 1.1.注册GitHub帐号 在使GitHub之前,需要先登录其官网注册一个免费使用的账号.登录 https://github.com/join ...
- 在Eclipse中配置tomcat
为了在Eclipse中进行struts2的测试,才发现自己机器上的Eclipse没有集成Tomcat,在网上找了半天,不是这个插件没有下载地址,就是那个有好多注意事项或者版本问题. 结果,自己到tom ...
- iOS 文本属性
http://blog.csdn.net/hello_hwc/article/details/46731991
- SVN下载分支、合并分支
http://www.cnblogs.com/armyfai/p/3985660.html(不知道实际工作中怎么使用,有好多步骤感觉不是太理解) 从远处把库fork到本地,会有一个库文件夹 服务器库结 ...