随便写的,便于以后做论证
关于操作系统和编译器
操作系统,用来管理硬件和软件。
假如由我来设计,怎么做?
首先,让设备导入。
程序:分别检测:内存 -> 主板 -> CPU -> 硬盘 -> 显示器 -> 键盘 -> 鼠标
反馈信号 有 证明:相关硬件 存在
导入驱动程序:位置指针 (programs include reading/writting interface to access to hardware)
(驱动程序 一级 API )
设备导入 成功
反馈信号 无 证明:相关硬件 不存在
利用 主板 BIOS int调用 打字信息 :出错! 相关硬件不存在
(BIOS int调用程序 零级 API)
设备运作 失败
其次,使设备可以运做。
事前工作 [
让设备运做,事先得编写好运做程序。
如对内存:编写内存管理程序,实现内存读写操作程序( 可视为:对其驱动程序API的调用封装);
内存读写操作程序 = 内存驱动读写程序API + 内存管理逻辑
其他设备同于内存,都事先写好各自的运做程序。
]
把全部的硬件运做程序导入,保存在内存中(已实现对运做程序的调用),记录各硬件运做程序指针,以便调用。(运做程序 二级 API);
完成以上,硬件处于可运做状态。
再次 ,输写一个操作系统0号程序。
事先工作[
用c编写0号程序:
main() {
/* 调用CPU 的运做程序实现
* 多线程管理
*/
启动多线程程序;//一个线程一个shell,线程分为操作系统1号程序,2号程序,3号程序.....N号程序;
}
]
以某种方式导入0号程序。
第四: 装入虚拟机程序 。
所谓虚拟机程序大家可能很熟悉了,比若Windows,Linux,Unix
虚拟机程序调用 ===>运做程序 二级 API ,行成硬件虚拟机下的运做程序 ,可以把它看成 [虚拟机运做程序 三级API];
把虚拟机安装在操作系统1号程序下,让它每次都第一个启动;
第五:虚拟机的管理逻辑思想。
自从虚拟机有了[虚拟机运做程序 三级API],它也就有了各种资源的控制权,成为操作系统的代理。
windows 和linux 有区别。windows我不熟悉, 若 linux ,它逻辑可不是简单几句话可以说清楚,
我还没有到那水平。windows是嫁接在DOS 上的,以上四步有DOS 来完成;而Linux 则不然,它是很
直接的,把以上四步都直接自己做了。
但是,可以想,在启动 linux的时候,提供了很多 console 信息,可以比较明显的看出以上步骤的
执行。
linux 把操作系统的活都给干了,那就不能叫它为虚拟机了,而应该叫它为操作系统。
第六 关闭设备运做程序。
==========================================
编译器
我觉的掌握好一计算机语言,就是掌握该语言的编译器设计思想。
我写好一个 test.java程序,存在 /home/Java/ 下
# javac test.java
在/home/Java/多出一个test.class文件。
这个 javac 是不是应该纯粹是一个, 词法语法分析器,翻译成JVM 读的二进制文件,然后调用
[虚拟机运做程序 三级API]做文件保存。
运行 # java test.class
这个 java 要做连接工作(makefile),翻译工作(词法语法分析),翻译成本地CPU二进制文件。除
此之外,我想,还应该有其他工作。java程序内存中,有静态数据、堆,栈的概念。而操作系统,
划给应该程序的内存中只有,程序data块,静态数据块和栈,我想java编译器至少要自己从栈中再
划出一块给堆。
对内存操作,感觉好象要用汇编语言来写,其实不用,操作系统已经事先把各段应用内存指针写好了
那样可以用C 语言,调用[运做程序 二级API]来写。
假如以上说法正确,那么用C 汇编后运行的程序,和java汇编后运行的程序,他们在内存的数据结构
组织方式应该是不同的了???因为2个是2种不同的语言。
但是从操作系统角度看,应该是数据结构相同的。有人可以回答我吗?肯定是我概念搞混了。
========
我自己的回答:
编译器要做两个任务,第一是把某种语言翻译成机器语言;第二,让这种机器语言成为可以运行的程序。
那JAVA 来说,由对象class 构成 ,class包括成员变量和成员方法,其成员变量和方法要在对应的内存中
给他们开辟空间,假如对空间开辟不给予一定规划,那内存中的组织结构会非常的混乱,程序可能就会无法
或者效率很低的运行。这就是运行环境。《编译原理》课程中基本上有运行环境的介绍,对于其结构说明
基本上分为三类,C 和JAVA 编译器构建运行环境虽然说都是基于栈式的,但是其实现的管理逻辑估计肯定
是不相同的,编译器要对代码区域(由程序1,程序2....等静态代码构成)、全局数据区域、数据区域(由
程序1活动记录1,程序2活动记录2...等构成)进行管理。
假如让我设计一个编译器,我会制定一种新语言规则,实现其语法词法分析,但是如何构建我的运行环境
倒是觉的有点难,估计,这段运行环境代码要用汇编语言和C 语言合起来写。
有了编译器,新的语言在设计程序时候再也不用考虑程序的内存组织的具体形式了,对设计者而言,成为
透明的了。
这给人感觉,好象每个程序的运行时候,就得加上一段代码,也就是组织内存的代码,对于JAVA 而言,
自己的设计程序,在执行运行的时候,就得给我的代码最前面加上Java.dll里的内存组织管理程序。
操作系统先是给整个硬件,比如给内存划分了系统和用户区域,规定了他们的大小,对于系统这块的运行
次序,操作系统本身就可以对其内存进行组织,而对于用户区域的具体怎么划分,操作系统就管不到了,但是
操作系统会唤醒用户区域程序的编译器,告诉它程序要运行,你要把程序的运行环境在该用户区域里搞起来。
这样解释的话,我们来看一下HotSpot ,我们一运行java.exe程序(比如:# java /home/myjava.class),
在lanucher的java.c 里,第一件事就是先把jvm.dll导进来,jvm.dll的源程序我没有看见,估计就是一些运行
环境的管理程序,当然还有其他的一些什么,比如连接,垃圾回收,代码安全性检测啊什么的(自己猜的)。
有了这个前提条件,我的myjava.class 才可以运行。
================
编译器的弟弟是解释器
这两个觉的应该差不多的,只是在设计逻辑上不同,当然程序区别还是很明显的,因为解释语言在运行时,
同时进行“编译”和运行,好象不产生中间代码的样子(?),速度上肯定会稍微的慢些,所以,对有些
“小程序语言”来说,设计成解释语言,还是不错的。现在流行动态语言,我个人理解就是些“小程序语言”,
他们具有灵活性,因为每次运行的时,它都得进行“编译”,无中间代码的拖累,估计每次生产的运行环境
都会是有不少差距的,像JavaScript的弱变量定义,虽然编译器也可以这么做,但对编译器而言,代价可能非常
的大,牺牲效率性,还不如让解释语言来做。这样两者结合使用,可以顾全大局,同时也体现,程序的模块化设计
思想。
JAVA 非常特殊,从原理上讲她即有编译又有解释。