首先,最近学习一些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个月菜鸟的一些片面和甚至错误的想法,仅供自己记录和回顾。