二进制文件和文本文件的详细以及如何生成二进制文件

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二进制文件和文本文件的详细以及如何生成二进制文件?

技术随笔2010-05-01 19:13:56 阅读226 评论0 字号:大中小订阅

这个问题一直困扰了很多年,可能是我没有认真的去思考。我相信很多人可能和我一样很纠葛,到底编译器也好,汇编器也好是如何工作的呢?到底怎么回事?为什么会运行呢?这是让我们这些看着windows 学习电脑的人真的很难去理解计算机的内部结构。其实,这一切都只是障眼法,下面我就来给大家细细说说我对计算机的理解。

解答1:编译器是怎么回事?

所谓编译器,顾名思义就是将一种文本格式转换成另一种文本格式。比如将字符串echo "hello"; 转换成printf("hello"); 这其实是php语言转成c语言的一种表示。这只是一种简单的描述,其实很大一部分的编译器是将源语言转换成了汇编语言。下面我们来看看 C 语言中的经典hello word,通过gcc编译后生成的汇编是怎么回事。

c语言源码:

#include

int main() {

printf("hello world\n");

}

通过编译器后,编译器把这个翻译成了另一套字符串,其实就是汇编语言:

.file "hello.c"

.section .rodata

.LC0:

.string "hello world"

.text

.globl main

.type main, @function

main:

leal 4(%esp), %ecx

andl $-16,%esp

pushl -4(%ecx)

pushl %ebp

movl %esp, %ebp

pushl %ecx

subl $4, %esp

movl $.LC0, (%esp)

call puts

addl $4, %esp

popl %ecx

popl %ebp

leal -4(%ecx), %esp

ret

.size main, .-main

.ident "GCC: (GNU) 4.1.2"

.section .note.GNU-stack,"", @progbits

这就是编译器做的工作了,其实这应该可以理解是吗,其实就是从一种字符串模式到了另一种字符串模式。但是很多人一定和我一样在思考,字符串模式的转变我会,但是从字符串转到二进制如何转其实我们的大脑真的被这些东西所迷惑了,都错了,字符串是什么?字符串其实也是二进制啊,只不过字符串它不能执行而已。当我们查看字符串的16进制的时候,其实和二进制的16进制一样,只是我们人为的给字符串赋予了一个abcde...这样的一层显示方式。而二进制码之所以没有这层皮,是因为他有了另一层含义。汇编器其实和编译器做的动作是一样的。只是抽象的层次不同。这里有点绕是吗?其实不绕。当我们编译的时候,我们发现了文本文件要比可执行文件小很多,文本文件比汇编文件小6.5倍。而比二进制要小70倍左右,也就是说一个60字节的文本文件编译成汇编是400个字节左右,再生成二进制大概是4k左右了。

那这到底说明了什么呢?

其实是这样的,所谓的二进制其实和我们一般说的ASCII 中的FF,0F是一样的,只不过二进制符合的不是ASCII的这套显示或者作用标准,它采用的是计算机cpu的处理标准。比如\x41 在ASCII中表示的是A,而到了计算机cpu那里他可能是另一个意思,

那么你又会觉得奇怪,那么为什么文本可以显示,而二进制却不能呢?因为文本文件是通过文本文件查看器去重新给文本文件进行处理然后显示的,并不是我们想当然的"直接打开"就能看见,至少也要通过notepad吧?!而二进制进行运行,则是不通过其他软件的,直接丢给cpu的(当然,你也可以用notepad 打开二进制文件,只不过显示的是杂乱的ASCII字符和控制符)。有些人又会问了,错了吧,windows的二进制丢到linux下能用吗?其实这不是错,windows的二进制丢到linux下之所以不能运行,并不是二进制本身的问题,而是因为linux里没有windows的库,二进制文件运行的时候缺少必要的库才无法运行。所谓的库,其实就是调用系统资源或者本身就是系统资源的一种程序包(比如显示,接受键盘,窗口啊,等等等等)。和二进制代码有关的唯一的一方面其实就是cpu。因为不同的cpu处理的二进制的指令是有区别的。

其实,说穿了,所谓的计算机软件,就是对计算机硬件的一次次的抽象,让它更接近于人类的思考方式和使用习惯。这其实和我们生活中的很像,比如,我们把硬件比作是树木(当然硬件的材料属性并非木头的属性,它的属性比木头要更全面,可以很坚硬可以很柔软),那么二进制就是木头,可是木头毕竟只是木头,虽然是很好的材料但是单单一颗木头有什么用呢?于是,就有一些最早的程序员用手去处理这个木头,做出了一些简单的凳子椅子。于是程序员们就像,不如用做出一个木头匕首来切木头,这样不是比手抓更好吗(我前面说了硬件的属性比木头更全面,可以很硬也可以很软)?汇编就好比是这么一个匕首。用着用着,人们觉得匕首砍木头,虽然可以做出很精细的东西,但是砍大件不行,于是就用匕首加上手工制作出了一把短刀,这就是C语言吧,然后他们在短刀里增加了一些齿牙,让比短刀更有杀伤力,这就是C++。可以他们发现,这个短刀虽然好,但是它只能砍一种树(因为这种树的木头做的短剑只能砍这种树),于是他们用两种木头各做了一面做了一把短剑,短剑虽然有两面,但是剑的杀伤力明显比刀要小。这就是我们说的Java。

那么操作系统是什么呢?操作系统我们可以理解为一个工具包,这个说明书里面写了各种用木头制作工具的说明并且提供了很多基础工具和小配件(我们看起来是不是很像木匠了,桌面上放了许多用木头做的小工具)。

然后我们要做的就是用这些配件和工具来做出我们的板凳啊,家具啊,各种各样的东西。

相关文档
最新文档