【原创】《学习指导》

【原创】《学习指导》【才疏学浅,如有写错的地方,感谢您批评指正!】

 

1、语言与编译器是可以相互独立的(或者说,语言与编译器是解耦的)。例如:
①C/C++可以用GCC进行编译;也可以用CLang进行编译;也可以操控QT框架,进行软件开发。
②Shell语言(目前常用的是Bash Shell)可以用Unix进行编译,实现对Unix的操控;也可以用Linux进行编译,实现对Linux的操控;也可以用Windows进行编译,实现对Windows的操控。

 

2、所以:
(1)对于同一个语言,在不同的编译器上,它的编译原理并不一定完全相同。编译输出的机器语言,也不一定完全相同。
(2)编译输出的不一定完全相同的机器语言,递交给同一个操作系统上,则这个操作系统控制计算机硬件资源的原理,也会变得不一定完全相同。
(3)就算是完全相同的机器语言,递交给不同的操作系统上,不同的操作系统控制计算机硬件资源的原理,也不一定完全相同。
(4)况且,本就不一定完全相同的机器语言,又递交给不同的操作系统上,不同的操作系统控制计算机硬件资源的原理,就更不一定完全相同了。

3、所以:
(1)程序员关注的重点是“语言层”,去用编程语言实现业务逻辑,以达到工作赚钱的目的。
(2)研究员关注的重点是“编译层”、“系统层”、“硬件层”,去考虑如何制造出更高效的编译器、操作系统、计算机体系结构、……,以达到对专业知识的认知更深入的目的。

——————————————————
【拓展阅读】《计算机的软硬件层级》

<1>执行操作系统(executive operating system)是指是机器运行的操作系统,是直接运行于计算机硬件之上,管理和控制计算机硬件与软件资源的最基本的系统软件,是连接用户和计算机的桥梁。
任何其他软件或系统都必须在操作系统的支持下才能运行。[如无特殊说明,下文中“操作系统”指的就是“执行操作系统”]
操作系统比 [编译器、连接器、汇编器、……等] 更为底层。

<2>编译器、连接器、汇编器、……等 [下文粗略地简称为:编译器],它们都属于系统软件(操作系统也属于系统软件),但不是操作系统的组成部分。

<3>用户不可越过操作系统直接控制计算机硬件,所以他必须通过操作系统这个中介才能控制到计算机硬件。
操作系统能够读懂和执行的是机器语言。用户要与操作系统沟通,要么直接写机器语言,要么将高级语言编译成机器语言。
而要将高级语言编译成机器语言,就要用到编译器。这个时候,编译器便诞生了。

<4>世界上第一个操作系统可以说是全手写的。
然后,程序员用这个操作系统「决定作用」地演化生成了各种软件(含各种操作系统、系统软件、应用软件)。
但是,后来逐渐演化出各种强大的软件开发工具以后,程序员用这些开发工具又「反作用」地去生成操作系统。
现在的操作系统基本上都不是手写的了,而是采用自举(bootstrapping)、移植(porting)等方式实现的。

<5>总结:计算机从底层~高层的结构次序为:硬件、执行操作系统、机器语言、编译器、高级语言、用户。

【点拨】
①就是因为执行操作系统在本质上其实就是01代码,所以编译器只能通过机器语言才能跟它进行“融合”,以实现“交流”和控制嘛。
②如果你写出一个不与操作系统进行“交流”,直接对硬件进行控制的01代码,试图绕开操作系统直接控制硬件。那此时,你写的这个01代码,其实就是在充当操作系统的角色。这个01代码就可以视为是一个操作系统。
③另外,现代操作系统都不允许用户态程序操作硬件。但是,RTOS(实时操作系统)上就随意了。

——————————————————
【拓展阅读】《机器语言失传了吗?该如何学习?》

<1>汇编语言的书籍现在还是有很多的。汇编语言就是机器语言的符号化,所以如果你会汇编语言的话,那机器语言也能进行对应的学习和掌握。

<2>教如何写个操作系统的书也有很多。
①但是不建议去学习重做操作系统,毕竟现在已经有可用的操作系统了。
②况且开发操作系统得和各种硬件打交道,这样的开发难度和工作量都是很吃力的。
③如果有钻研精神,那就另说,可以去钻研试试。

 

【才疏学浅,如有写错的地方,感谢您批评指正!】

posted @ 2021-04-25 01:25  BearKuma1069  阅读(247)  评论(0)    收藏  举报