深入认识Turbo C编译器

时间:2010-04-23 17:29:00  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:样傻瓜化的工具只能让你看不到事物的本质。接下来我们就来深入的认识Turbo C编译器。 广义的编译器,包括了代码编译器(compiler),目标文件链接器(linker),库文件管理工具(如tc的tlib,gcc的ar),编译驱动工具(如VC的NMake,gcc的make),ANSI c/c++标准的头文件和库文件,扩展的头文件和库文件,集成开发环境(IDE),等等与编译相关的工具,所有这些工具的集合,就组成了广义上的...
  正文:

 有谁真正的理解过一个编译器呢?许多人认为TC很简单很落后,但是即便是这样简单的工具,到底有几个人真正的深入理解了呢?一个简单的编译器都不能理解,如何能成为高手,如何能深入的使用更加高级的工具呢?不要以为自己使用的是VC就很了不起,因为使用这样傻瓜化的工具只能让你看不到事物的本质。接下来我们就来深入的认识Turbo C编译器。

 广义的编译器,包括了代码编译器(compiler),目标文件链接器(linker),库文件管理工具(如tc的tlib,gcc的ar),编译驱动工具(如VC的NMake,gcc的make),ANSI c/c++标准的头文件和库文件,扩展的头文件和库文件,集成开发环境(IDE),等等与编译相关的工具,所有这些工具的集合,就组成了广义上的编译器。

 狭义的编译器,则仅指compiler。compiler只负责将源代码,即.c/.cxx/.cpp文件编译成为目标文件.o/.obj。编译过程的输入是源文件,包括自己书写的.c和.h以及系统提供的.h文件,编译的输出是目标文件。需要强调的一点时,在compile阶段,只处理源文件,所以不需要库文件和额外的目标文件的参与,因此,只要代码在语法上没有错误,compile就一定能产生目标文件。

 对于一个广义的编译器来说以下几个部分是必备的:1.compiler,2.linker,3.系统提供的头文件和库文件。前面已经介绍了compiler,接下来看linker。

 linker的功能是将目标文件进行装配,将浮动的地址变为确定的地址,这个工作是通过修改目标文件的重定位项来实现的,其具体的过程可以参考"Linker & loader"这本书,这是一本详细介绍linker和loader的好书,在此做个推荐。总之,link这一阶段处理的输入是目标文件,其输出是可执行文件,或动态库。

 任何一个编译器都会提供库文件和与之对应的头文件,C/C++编译器一般都提供ANSI C/C++的库和相应的头文件。

 从现在起我们就需要建立起一个概念,就是广义的编译过程,实际上是由编译和链接两个基础步骤组成的,如果能深刻的理解这两个步骤,就是一大进步了。

 在编译器里,有一些默认的规定,我们需要了解。在编译器中,bin目录用于存放compiler、linker等工具,include目录用于存放头文件,lib目录用存放库文件,大多数的编译器的目录就是按这个来组织的。

接下来看Turbo C为我们提供了些什么(请到我的网站下载我动手制作的改良版TC编译器)。
bin目录中:
  CPP.EXE  是一个C语言预处理工具,就是负责对源代码进行预编译处理,不要理解为c++编译器
  TCC.EXE  是一个C语言的编译器,可以将代码编译为目标文件,并且能自动调用tlink链接生成可执行文件
  TASM.exe  是一个汇编工具,可以将x86的汇编代码编译成为目标文件
  TLink.exe 是一个链接器,负责对目标文件、库文件等进行链接
  TLib.exe  是一个库文件管理工具,可以将多个目标文件打包到一个库文件里
  BGIOBJ.exe 可以将BGI文件转换为.obj文件
  make.exe  符合GNU标准的make工具,可用于代码编译的管理(只有在我制作的TC中提供)
  TURBOC.CFG tcc默认的编译参数配置文件
以上所有的工具的使用方法都可以直接键入相应的命令进行查看,如键入tcc即可看到tcc的使用方法,因此这里不再讲解。

BGI目录中:
  EGAVGA.BGI 是EGAVGA的bgi驱动

FONT目录中:存放了BGI所使用到的各种字体文件

INCLUDE目录中:是Turbo C的库函数的所有的头文件,当要使用某个库函数时可以在这个目录下搜索,找到其所在文件和原型,这里不在详细叙述。

重点讲一下Lib目录:
  init.obj文件是C语言的启动代码,它负责建立C程序运行的堆栈、初始化内存、调用C入口函数等。这部分代码是使用汇编书写的,其源代码可以在TC(官方版)里找到,名称为Init.ASM。
  c0t.obj、c0s.obj、c0m.obj、c0c.obj、c0l.obj和c0h.obj文件,都是c code的入口函数实现,入口函数将会读取环境变量,并调用c语言中的main函数,将命令行参数传入main函数中,之后的控制权就交给了main函数,也就是我们常说的C的主函数main。由于Turbo C中有不同的内存模式,因此以上6个文件分别对应TC中6种不同的内存模式。
  cc.lib、ch.lib、cl.lib、cm.lib、cs.lib五个文件都是TC提供的ANSI C标准库的库文件,分别对用不同的内存模式:
  cc compact模式
  ch huge模式
  cl large模式
  cm medium模式
  cs small模式

由于不同模式参数的入栈方式、函数的调用方式等等都各不一样,所以代码也不一样,因此需要分别提供各个模式的库文件。

 再讲一下Turbo C中的内存模式。内存模式的出现不是由编译器决定的,而是由处理器的寻址方式决定的,在8086处理器中为了在16位寄存器的基础上寻址20位的地址,引入了段寄存器和分段寻址的方式。在编译器这一级,利用这种段式的寻址方式,可以实现多种不同的存储分配方法,因此就产生了所谓的不同的内存模式。

深入认识Turbo C编译器》由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Language/VC/2010-04-23/13766.html


关键字:

关于《深入认识Turbo C编译器》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td