关于高级语言编译、操作系统、硬件的关系思考(二)

来源:互联网 发布:java获取服务器外网ip 编辑:程序博客网 时间:2024/05/16 23:02

首先,最近学习一些java的基础,并且准备转向安卓学习,但是本人有个缺点,常常考虑问题太过深入,以至于不能释怀去继续学习,这其实对一个新人来说,并不是一件好事,有时候需要尽快入门,才能有助于我们走的更远,首先,列举几个如题目中相关的疑问:

1、 高级语言,如java、c,是否可以直接通过编译器转换为硬件识别的机器码?

为什么有这个疑问呢,因为学习高级语言一直在强调跨平台性,本来我以为只是指操作系统,后来了解其实也包括硬件系统,即使这样

如果编译器也可以实现把高级语言变成机器码,至多出现一些硬件不兼容问题,但是没有所谓跨操作系统的问题了。

举例个人电脑,大部分即可以装windwos系统,也可以安装linux系统,但是硬件是同一个,如果我们机器上java或者c程序能够通过一个编译器直接转换为

硬件对应的指令集,那么就解决了跨操作系统的问题,也就是同一个程序可以在不同的操作系统上运行,因为我跳过它,直接和硬件打交道。

我想一定是可以通过一个强大的编译器去实现的,反正我暂时想不到不能实现的原因。那一定时由于某种现实的考虑,促使后来的高级语言没有怎么做

而是高度的依赖操作系统去构建整个运行环境。


2、接着谈谈为什么高级编程语言要依赖操作系统?

因为在网上没有找到明确的说法,但是我自己推断的原因是这样,因为不同硬件的指令集不一样的,所以如果高级语言直接编译成机器码,编译器需要兼容

到不同的指令集,这样才能保证程序在不同的机器上运行;而操作系统在这方面做了很多工作,就是对不同硬件指令集的兼容,如CPU,这样操作系统才能

在不同cpu的电脑上正常安装和运行。所以作为一个高级语言有没有必要重新实现这种兼容工作,比如是否可以参照windows和linux系统的实现,并把它加入自身的编译器中

,对于这个可能我不置可否。但最终它还是选择依赖于操作系统,也就是调用操作系统提供的API。


3、既然你依赖与操作系统,那么不同操作系统提供api不一样,怎么跨操作系统,简单的说,在不同操作上,是否要对应写一份程序 ?

比如java是通过虚拟机实现的跨平台的,也就是只编写一个程序,但是它去不同平台上运行的时候,其实带了对应的jvm,不同的操作系统由对应jvm

去帮这一个程序去解释,而不同的jvm由sum公司去实现和更新,而且它会把对不同操作系统的底层调用(API)进行封装,对开发者却提供了统一的Java API,这样就

减少程序员去了解操作系统API的差异性;

而C++言语,我不是很了解 ,但是好像是通过不同的编译器,在对应的操作系统上重新编译一下,从而实现的跨平台的,其实我觉得本质上没有太多差距。而且我不知道

c++是否有自己统一的API,如果也可以直接调用操作系统(因为windows和linux都是c编写的),会出现调用一个API,在windows中存在,在linux不存在或者不是这个名称,

那么在linux下编译时就会出现问题,需要重构源码。

4、关于java为什么不直接在jvm中执行.java文件,就是java  xxx.java,而是首先通过javac xxx.java编译成二进制文件xxx.class,然后在jvm执行class文件。

网上很多人说是跨平台,其实跨平台是用不同jvm执行同一个文件 ,从而翻译给不同平台。其实完全可以jvm去执行java源文件,但在虚拟机中处理时,

可以把java文件转换成class,然后再去执行,就是合并这两个。但是这里面有一个问题,我们知道编译时需要检查语法错误等等,如果合并,每次执行一个文件都需要去

重新检查一次,这会降低效率,而分离以后,在执行编译后的文件时,就不需要再去重复检查,而且变成而二进制流文件,也增加文件的安全性。 


以后都是2个月菜鸟的一些片面和甚至错误的想法,仅供自己记录和回顾。

0 0
原创粉丝点击