WIN9x是纯粹的汇编写的,由于代码量太巨,所以漏洞很多,稳定性也很差。
基于NT的windows(WIN2K,XP,2003,VISTA),主要是用C写的(少量与硬件交互的代码因为C无法实现所以用汇编写的);其中 WINDOWS 2000大概有20余万行代码,其中80%是用C编写; 部分汇编,底层接口都是用汇编编写的; 还有部分是使用c++编写的。
Linux,Unix内核基本上是用C完成的,少量与硬件交互的代码因为C无法实现,所以用汇编写的,没有使用C++代码.但是,现在linux有些高级特性是也有采用用c++写的。 Linux,Unix平台上的很多GNU软件也全部是用C写出来的。
综合上面的, 我们可以看出, 不管是windows还是Linux/Unix,其操作系统的核心都是使用大量的C语言和一些汇编语言写成的。
其发展脉络是这样的:因为计算机值能识别二进制的机器码,所以, 最开始的程序都是使用机器码来写的(打孔机就是证明),难度很大。后来,使用机器码写了一个程序,该程序可以解释一些最简单字符指令,将这些字符指令转换成对应的机器码,然后在计算机上执行,这个就是汇编器的初始版本,利用这些简单的字符指令,大大简化了代码的编写,不用像以前那样必须写大量的机器码了,仅仅需要找到这些机器码对应的字符指令码就可以了,这些指令再被汇编器翻译成大量的机器码。利用这些简单的指令,可以做很多事情了,包括处理额外的一些字符指令,并将其转换成机器码这样的事情,这样一来, 我们就可以使用这些简单的字符指令写一个处理额外字符指令的程序,利用初始版本的汇编器翻译成机器码,就得到了一个扩展版本的汇编器,该版本的汇编器与初始版本的汇编器相比,能处理更多的额外字符指令,通过多次迭代,最终可以得到一个比较完备的汇编器(能处理所有的汇编指令)。 这就是汇编器的来历。 有了汇编器,我们就可以使用汇编指令来编写各种汇编程序了。 我们发现,汇编器本身的最初版本(只能处理简单的汇编指令)是使用二进制机器码编写的,剩下的大部分(能处理额外的大部分汇编指令)都是使用汇编语言本身编写的。 所以, 我们看到, 在所有的汇编程序的世界中, 除了汇编器本身是由机器码和汇编码写的以外,汇编代码还可以用来实现很多的其它功能,例如很多系统级别的工具软件,其中就包括各种和硬件打交道的驱动程序等等, 以及各种编译器,例如:C语言编译器 。类似的,C编译器的核心也是由汇编语言写成的,甚至还可以包括一些机器码,但是大部分还是通过迭代来使用C语言编写的,C编译器能处理的数据结构和语言规则比汇编语言更丰富,更高级了,更接近人的可读性了,这些数据结构和语言规则就是C语言标准了。这样一来,就有了更多的选择,既可以选择机器码,汇编,也可以选择C语言来写程序了。
这样,使用C语言作为主要的语言,外加汇编语言作为各种底层驱动或者与硬件有关的部分的代码的编写,就可以写成很多系统管理的程序,慢慢地, 把这些程序集成起来, 就写成了各种操作系统的核心,包括windos, linux/unix 等。windos, linux/unix 等的核心都是由c语言,汇编语言来写成的。
有了操作系统的核心以后,我们就可以使用已有的语言来开发各种操作系统管理软件了,将这些合起来,就形成了操作系统。
有了操作系统以后,我们就可以使用已有的语言,写成更加高级的语言的编译器和各种sdk工具,这样,就得到了一种新的高级语言了, 我们以后写代码的时候就可以使用这种高级语言了,这样,从更高的层次来写代码,就会简化了很多底层的细节,大大提高了效率,当然,还是那句话,高级语言由于需要经过各个编译器的层层转换处理,性能会比较的低一些,而且离底层也越来越远,失去了对底层的控制,也就意味着如果想要进行更加细致的控制就不可能了,因为你能使用的智能是高级语言的编译器所能支持的语言规范了,所以,有时候, 在某些特殊情况下,还是有必要使用底层语言来实现一些特殊的功能的。
当然,这些选择各有优缺点,需要根据自己所需要实现的功能更强调哪一方面来选择不同的语言。 越是底层,实现同样的功能,能使用的数据结构和语言规则就越少, 所需的代码量就越大,就越难以写,但是,由于需要的转换和处理就更少,而且离底层硬件越近,所以性能也越快,所以,除非特别强调性能或者需要访问底层(例如直接访问硬件等),大部分情况下,是采用高层的语言来编写程序,经过各级编译处理以后最后转换成机器码来执行的。
这样一来,我们就可以使用已有的语言开发更加高级别的编译器,从而支持更加高级别的语言了。
例如C++编译器的核心就是使用C语言开发的,其中可能包括一些汇编代码,但是其完备版本仍然是经过多次迭代的C++来写成的。也就是说,C++编译器主要是由C++语言编写的,其初始版本(也就是核心)是由C语言外加一些汇编语言写成的。 这样,有了C++编译器,我们就可以有更多的语言选择了。 对于C++运行时环境,可以选择c语言或者汇编写,但是大部分还是由c++写成的。 当然, 开发C++编译器就像开发所有的编译器一样,各个不同的公司都可以来做这件事情, 这样就产生了很多种C++的编译器(就像有很多种汇编器和C语言编译器一样),比较著名的就有微软的Microsoft C++ ,Borland 公司的Borland C++等等。 这些c++编译器可能实现不同的C++语言的数据类型和语法,所以,后来。一个国际的标准机构就站出来制定了一个C++语言的标准,所有的编译器都实现这些标准,当然实际上,这些编译器除了实现C++标准以外,往往还会增加一些自己特殊的辅助功能, 也就是说,各个编译器都是可以用来编译符合规范的语言的,此外,这些不同的编译器可能还有各种不同的一些特色辅助功能,在编译代码的优化,性能方面可能还有一点点小的区别。 有了这些语言,我们就可以用它们来写各种程序了,包括这些语言的ide等。
类似的,我们现在有了汇编语言,C语言,C++语言, 就可以使用这些语言来开发各种其它的编译器了,例如Sun公司最开始就是完全使用C语言开发了java编译器javac, 后来, 改成以就是使用c++开发javac的核心,外加java语言本身来开发了javac的其它大部分。
实际上也就是说,你可以使用任意的已有语言来开发新语言的编译器(一般是使用某种已有语言,至于选择哪种语言则根据需要可以随意选择,开发新编译器的核心部分,然后采用多层迭代的新语言来开发编译器的其它主要部分;当然,也可以完全使用已有语言来开发新的编译器),对于已有低级语言来说,新语言的编译器对低级语言的编译器来说,无非就是使用该低级语言写成的一个程序而已。所以, 我们不管看到什么高级语言,都会知道,该语言的编译器都是基于某种已有的低级语言加上该语言本身来写成的。然后,只要在操作系统上安装了该语言的编译器以及其所依赖的低级语言的编译器, 在该操作系统上就可以使用该新语言来开发各种程序, 包括更高级语言的编译器了。
例如: delphi的编译器是用的 C++编写的。PASCAL语言的编译器用C写的等等。
语言根据翻译的方式的不同,语言分为编译型语言和解释型语言,所有的脚本语言(例如:JAVASCRIPT,ASP,PHP,PERL等)都属于解释型语言,它由一个解释器(也叫解释引擎)来每次读入一句代码,翻译一句,执行一句,反复循环。而编译型语言则是将所有的代码一次性编译成可执行文件(exe),如何执行的。
参考:
计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能值型高级语言编写的程序。
翻译的方式有两种,一个是编译,一个是解释。两种方式只是翻译的时间不同。编译型语言写的程序执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高。
解释则不同,解释性语言的程序不需要编译,省了道工序,解释性语言在运行程序的时候才翻译,比如解释性basic语言,专门有一个解释器能够直接执行basic程序,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次,效率比较低。
什么是脚本语言?
1.脚本语言(JavaScript,VBscript等)介于HTML和C,C++,Java,C#等编程语言之间。
HTML通常用于格式化和链结文本。而编程语言通常用于向机器发出一系列复杂的指令。
2.脚本语言与编程语言也有很多相似地方,其函数与编程语言比较相象一些,其也涉及到变量。与编程语言之间最大的区别是编程语言的语法和规则更为严格和复杂一些.
3.与程序代码的关系:脚本也是一种语言,其同样由程序代码组成。
注:脚本语言一般都有相应的脚本引擎来解释执行。 他们一般需要解释器才能运行。JAVASCRIPT,ASP,PHP,PERL都是脚本语言。C/C++编译、链接后,可形成独立执行的exe文件。
4.脚本语言是一种解释性的语言,例如vbscript,javascript,installshield script等等,它不象c/c++等可以编译成二进制代码,以可执行文件的形式存在.
脚本语言不需要编译,可以直接用,由解释器来负责解释。
5.脚本语言一般都是以文本形式存在,类似于一种命令.
举个例子说,如果你建立了一个程序,叫aaa.exe,可以打开.aa为扩展名的文件.
你为.aa文件的编写指定了一套规则(语法),当别人编写了.aa文件后,你的程序用这种规则来理解编写人的意图,并作出回应.那么,这一套规则就是脚本语言.
java很特殊,java程序也需要编译,但是没有直接编译称为机器语言,而是编译称为字节码,然后用解释方式执行字节码。Java既可以被编译,也可以被解释。通过编译器,可以把Java程序翻译成一种中间代码 - 称为字节码 - 可以被Java解释器解释的独立于平台的代码。通过解释器,每条Java字节指令被分析,然后在计算机上运行。只需编译一次,程序运行时解释执行。下图说明了它是如何工作的:
可以把Java字节码看作运行在Java虚拟机(Java VM)上的机器代码指令。每中Java解释器,不管是Java开发工具还是可以运行Java小应用程序的Web浏览器,都是一种Java VM的实例。JavaVM也可以由硬件实现。
Java字节码使“写一次,到处运行”成为可能。可以在任何有Java编译器的平台上把Java程序编译成字节码。这个字节码可以运行在任何Java VM上。例如,同一个Java程序可以运行在WindowsNT、Solaris和Macintosh上。
Java平台
平台是程序运行的硬件或软件环境。Java平台与大多数其它平台不同之处在于它是运行于其它基于硬件平台的纯软件平台。大多数其它平台是硬件和操作系统的结合。
Java平台由两部分组成:
我们已经介绍了Java VM,它是Java平台的基础,可以移植到各种基于硬件的平台上。Java API是软件组件的集合,它们提供了很多有用的功能,如图
形用户界面(GUI)。Java API被分组为相关组件的库(包)。
下图描述了一个运行在Java平台上的Java程序,如应用程序(application)或小应用程序(applet)。如图中显示的,JavaAPI和VM把Java程序从硬件依赖中分离出来。
作为一种独立于平台的环境,Java比本地代码慢一些。然而,聪明的编译器、很好地调制过的解释器和即时字节码编译器可以在不牺牲可移植性的条件下使Java的表现接近本地代码。
下面以java为例做详细说明。
然后,在OS核心的基础之上,使用C语言开发一些操作系统的工具(例如Linux/Unix下的很多GUN工具和很多的编译器)。 以Linux/Unix OS为例, 其核心都是使用汇编语言和C语言编写的,然后,基于核心,使用C语言,开发出了C++编译器和C++的运行时环境,有了C++编译器,就可以在该操作系统上使用C++语言来编写一些比较高级的工具软件了,例如,系统管理工具等。 开发出的这些C++代码经过
C++编译器编译以后, 在C++运行时环境中运行, 就可以提供系统管理工具给用户使用了。 同样, 用户自己也可以使用C++编写各种软件,然后类似的编译运行了。
高级语言的编译器可以用低级语言编写。C语言的编译器一般由汇编语言编写,汇编的只能由机器语言写
现代计算机系统内的编译器一般是这样写出来的,假定我们把这种语言成为L:
1)用低一级的语言L1编写一个最初版本的编译器CL2,用于编译高一级的语言L2。(最低级的语言就是机器代码)
2)用最初版本的编译器CL2所支持的部分L2语言编写一个扩展版本的L2的编译器CL2‘
3)用CL2编译CL2’,得到优化版本的编译器。
4)迭代多次,得到完备版本的L2的编译器。
5)用最终版本的编译器编译所有的L2程序
对上述过程的解释:计算机的CPU只能处理二进制的机器码,内存中存放的也只能是二进制的符号,在最开始的时候,人们是使用机器码来写代码的(例如最初的打卡机),后来,用机器码写了一个程序,该程序能够读入一些简单的字符,并且将这些简单的字符经过处理后转换成二进制的机器码,放到计算机中去执行,这个就是最初的汇编器,它所能处理(翻译)的那些字符命令的集合就成为汇编语言; 有了这些基本的汇编字符指令,就可以使用这些指令来简化代码的编写了,例如:以前做同样的一个处理,用机器码需要写很多机器码,现在如果用等效的汇编指令写的话,值需要较少的指令,而且这些指令经过二进制的汇编器处理以后,就生成了一模一样的二进制机器码。
这样的话, 就可以利用这些仅有的指令,写一些汇编程序,实现一些功能了。利用这些汇编指令,我们可以写一些处理额外字符指令的汇编代码,这些代码结果二进制汇编器处理后,得到一个新的二进制程序,该程序将能够处理这些额外的字符指令,这就是一个扩展的汇编器,使用类似的迭代,就可以逐步完善汇编器的功能了。 所有的编译器都是如此的。
编译器说白了就是语言翻译,对于高级语言,你要想让它运行,那么必须有这种语言的编译器或解释器。
当汇编语言产生的时候,汇编器(用现在的观点来看,因为汇编器是一对一的,所以一般不称之为编译器了)是用机器语言写的。之后因为有了汇编器,那么就可以汇编语言来自举写更高一级语言的编译器了。
之后的编译器同理。
Linux Kernel的源代码有200多MB,编译以后大概有几十M,而整个的WindowsXP源代码有几个G呢,编译后大概有600M。
基于操作系统的软件的编写所使用的语言,那就很多了,不同的软件可能用不同的语言。