首页 > 编程语言 >读《程序是怎样跑起来的》七、八章有感

读《程序是怎样跑起来的》七、八章有感

时间:2024-02-25 22:36:27浏览次数:25  
标签:八章 有感 Windows 代码 程序 编译器 本地 源代码 CPU

在第七章中主要了解到了程序的运行环境。
运行环境=操作系统+硬件
应用的运行环境通常是用类似于Windows(OS)和AT兼容机(硬件)这样的OS和硬件的种类来表示的。不同的硬件种类需要不同的操作系统。同一类型的硬件可以选择安装多种操作系统。例如,同样的AT兼容机中,既可以安装Windows,也可以安装Linux等操作系统。正因如此,Office2007的运行环境中,把硬件和操作系统的种类这两方面内容都列了出来。不过,Windows及Linux操作系统也存在多种版本。根据应用的具体情况,有时只有在特定版本的操作系统上才能运行。从程序的运行环境这一角度来考量硬件时,CPU的种类是特别重要的参数。为了保证Office2007的正常运行,需要具备Pentium等被称为x86的CPU(微处理器)。CPU只能解释其自身固有的机器语言。不同的CPU能解释的机器语言的的种类也是不同的。例如,CPU有x86、MIPS、SPARC、PowerPC等几种类型,它们各自的机器语言是完全不同的。机器语言的程序称为本地代码。程序员用C语言等编写的程序,在编写阶段仅仅是文本文件。文本文件在任何环境下都能显示和编辑,我们称之为源代码。通过对源代码进行编译,就可以得到本地代码。在市面上出售的用于Windows的应用软件包CD-ROM中,收录的就不是源代码,而是本地代码。
Windows克服了CPU以外的硬件差异。计算机的硬件不仅仅有CPU构成,还包括用于存储程序指令和数据的内存,以及通过I/O连接的键盘、显示器、硬盘、打印机等外围设备。在Windows的应用软件中,键盘输入、显示器输出等并不是直接向硬件发送指令、而是通过向Windows发送指令来间接实现的。因此,程序员就不用注意内存和I/O地址的不同构成了。因为Windows操作的是硬件而非应用软件,而且针对不同的机型,这些硬件的构成也是有差异的。不过,Windows本身则需要为不同的机型分别提供专用的版本,比如用于AT兼容机的Windows,用于PC-9081的Windows等。而即便是Windows,也依然无法吸收CPU类型的差异。这是因为,市面上销售的Windows应用软件,都是用特定的CPU的本地代码来完成的。
应用程序向操作系统传递指令的途径称为API。Windows及Unix系统操作系统的API,提供了任何应用程序都可以利用的函数组合。因为不同操作系统的API是有差异的,因此,将同样的应用程序移植到其他操作系统时,就必须要重写应用中利用到API的部分。像键盘输入、鼠标输入、显示器输出、文件输入输出等同外围设备进行输入输出操作的功能,都是通过API提供的。在同类型操作系统下,不管硬件如何,API基本上没有差异。程序(本地代码)的运行环境是由操作系统和硬件来决定的。
利用虚拟机获取其他操作系统环境。通过利用虚拟机,我们就可以在Macintosh的Mac操作系统上运行Windows应用了。Virtual PC for MAC可以使Macintosh这一硬件变得同AT兼容机一样,从而能在硬件上安装Windows。除虚拟机的方法外,还有一种方法能够提供不依赖于特定硬件及操作系统的程序运行环境,那就是Java。Java有两个层面的意思,一个是作为编程语言Java,另一个是作为程序运行环境的Java。同其他编程语言相同,Java也是将Java语法记述的源代码编译后运行。不过,编译后生成的并不是特定CPU使用的本地代码,而是名为字节代码的程序。字节代码的运行环境就称为Java虚拟机。Java虚拟机是一边把Java字节代码诼一转换成本地代码一边运行的。
在第八章中了解了将源代码转换到本地代码的流程。
CPU可以解析和运行的程序形式称为本地代码。通过编译源代码得到本地代码。源代码完成后,就可以编译生成可执行文件了。负责实现该功能的是编译器。计算机只能运行本地代码。用某种编程语言编写的程序就成为源代码,保存源代码的文件成为源文件。用C语言编写的源文件的扩展名通常是“.c”。CPU能直接解析并运行的不是源代码而是本地代码的程序。作为计算机电脑的Pentium等CPU,也只能解释已经转换成本地代码的程序内容。本地这个术语有“母语的”意思。对CPU来说,母语就是机器语言,而转换成机器语言的程序就是本地代码。用任何编程语言编写的源代码,最后都要翻译成本地代码,否则CPU就不能理解。也就是说,即使使用不同编程语言编写的代码,转换成本低代码后,也都变成用同一种语言来表示了。
Windows中EXE文件的程序内容,使用的就是本地代码,本地代码的内容是人类无法理解的,正因如此,才有了用人类容易理解的C语言等编程语言来编译源代码。
能够把C语言等高级编程语言编写的源代码转换成本地代码的程序称为编译器。每个编写源代码的编程语言都需要其专用的编译器。将C语言编写的源代码转换成本地代码的编译器称为C编译器。编译器首先读入代码的内容,然后再把源代码转换成本地代码。编译器中好像有一个源代码同本地代码的对应表但实际上,仅仅靠对应表是无法生成本地代码的。读入的源代码还要经过语法解析、句法解析、语义解析等,才能生成本地代码。根据CPU类型的不同,本地代码的类型也不同。因而,编译器不仅和编程语言的种类不同,和CPU的类型也是相关的。因为编译器本身也是程序的一种,所以也需要运行环境。例如,有Windows用的·C编译器、Linux用的C编译器等。还有一种交叉编译器,它生成的是和运行环境中的CPU所使用的本地代码。
编译器转换源代码后,就会生成本地文件。不过,本地文件是无法直接运行的。为了得到可以运行的EXE文件,编译之后还需要进行“链接”处理。使用Borland C++ Compiler5.5来看编译和链接是如何进行。Borland C++的编译器是bcc32.exe这个命令工具。在Windows的命令提示符中,运行下列命令后,由C语言编写的源文件Smaplel.c就会被编译。“-W-c”是用来指定编译Windows用的程序的选项。选项是对编译器的提示,有时也称为“开关”。编译后生成的不是EXE文件,而是扩展名为“。obj”的目标文件。Samplel.c编译后,就生成了Samplel.obj目标文件,此时,还处于未完成状态。把多个目标文件结合,生成1个EXE文件的处理就是链接,运行连接的程序就称为连接器。Borland C++的连接器就是ilink.exe的命令行工具。
链接选项“-Tpe-c-x-aa”是指定生成Windows用的EXE文件的选项。这些选项之后,会指定结合的目标文件。在了解了通过程序的编译及链接来生成EXE文件的机制后,接下来看一下EXE文件的运行机制。EXE文件是作为单独的文件储存在硬盘中的。通过资源管理器找到并双击EXE文件,就会把EXE文件的内容加载到内存中运行。程序加载时会生成栈和堆。栈是用来存储函数内部临时使用的变量,以及函数调用时所使用的参数的内存区域。堆是用来存储程序运行时的任意数据及对象的内存领域。EXE文件中并不存在栈及堆的组。栈和堆需要的内存空间是在EXE文件加载到内存后开始运行时得到分配的。银耳,内存中的程序,就是有用于变量的内存空间、用于函数的内存空间、用于栈的内存空间、用于堆的内存空间这4部分构成的。

标签:八章,有感,Windows,代码,程序,编译器,本地,源代码,CPU
From: https://www.cnblogs.com/chaipanpan/p/18033231

相关文章

  • C# vs2015 .dll模块联合开发好的应用程序进行调试
    C#vs2015.dll模块联合开发好的应用程序进行调试右键项目->属性,1.点击“调试”侧边菜单,在“启动操作”选项中选择“启动外部程序”,然后选择应用程序的exe文件的路径2.点击“生成”侧边菜单,在“输出”选项中“输出路径”中选择将当前调试项目的最新dll文件(最新的代码)输出到应用......
  • 程序是怎样跑起来的第十一章读后感
    第11章的标题是硬件控制方法,其实计算机离开了软件就是一个空壳子,在汇编语言中,是用指令同外围设备进行输入输出操作的,而这个指令就是IN和OUT。硬件的控制是由Windows全权负责的,所以很少能接触到直接控制硬件的指令。只有Windows提供了通过应用来间接控制硬件的方法在Windows中,系统......
  • 《程序是怎样跑起来的》第十一章读书笔记
    Window控制硬件时借助的是输入输出指令。其中具有代表性的两个输入输出指令就是IN和OUT。这些指令也是汇编语言的助记符。I/O是loput/Output的缩写。显示器、键盘等外围设备都有各自专用的I/O控制器。I/0控制器中有用于临时保存输人输出数据的内存。这个内存就是端口。端口(port)......
  • 读《系统科学方法概论》第三章有感
    第三章——信息方法1.信息科学的简史:信息科学的起源:信息科学作为一个跨学科领域,起源于20世纪中叶,随着信息技术的发展和应用而逐渐形成。信息科学集成了数学、计算机科学、工程技术等多个学科的理论和方法,用于研究信息的表示、传输、处理和应用。信息科学的应用领域:信息科学在各......
  • 《程序是怎样跑起来的》第十二章读书笔记
    C语言的rund(函数中,也肯定通过某些公式生成了伪随机数。假如使用的是线性同余法的话,就需要提前设定Ri、a、b、c的数值,为此就要用到代码清单12-1及代码清单12-2中的srand(time(NULL));。srand(函数中的参数time(NULL),是用来获取当前时间的参数。以time(NULL)的值为基础,来设定Ri、a......
  • 《程序是怎样跑起来》第十章读书笔记
    通过调查本地代码的内容,可以了解程序最终是以何种形式来运行的。但是,如果直接打开本地代码来看的话,只能看到数值的罗列。如果直接使用这些数值来编写程序的话,还真是不太容易理解。因而就产生了这样-一种想法,那就是在各本地代码中,附带上表示其功能不过,即使是用汇编语言编写的源代......
  • 《程序是怎样跑起来的》第六章“亲自尝试压缩数据”
    在亲自尝试压缩数据这一章中,用直观、易懂的方式介绍了数据压缩的基本概念、算法和应用。读完本章,我对数据压缩有了更深入的理解,也认识到了它在计算机科学中的重要性和广泛应用。在书中,我了解到了RLE算法和哈夫曼算法这两种数据压缩算法。RLE算法是一种非常直观的数据压缩算法......
  • 程序是怎么跑起来的第九章
    仅具有加载和运行功能的监控程序,这就是操作系统的原型。通过事先启动监控程序,程序员就可以根据需要将各种程序加载到内存中运行在操作系统这个运行环境下,应用并不是直接控制硬件,而是通过操作系统来间接控制硬件的。变量定义中涉及的内存的申请分配,以及time()和printf()这些函数的......
  • 《程序是怎样跑起来的》第九章读书笔记
    监控程序就是具有加载和运行工能,就是操作系统的原型。通过实现启动监控程序,程序员就可以根据需要将各种程序加载到内存中运行。应用对的可执行文件指的是计算机的CPU可以直接解释并运行的本地代码。在操作系统个环境中,应用并不是直接控制硬件,而是通过操作系统来控制硬件的。变量定......
  • 《程序是怎样跑起来的》第八章读书笔记
    用某种语言编写的程序就称为源代码,保存源代码的文件称为源文件。能把C语言等高级编程语言编写的源代码转换成本地代码的程序称为编译器。每个编写源代码的编程语言都需要其专用的编译器,将C语言编写的源代码转换成本地代码的编译器称为C编译器。编译器首先读入代码的内容,然后再把源......