第 1 章 编译与调试

1.1 编译的概念和理解

在进行 C 程序开发时,编译就是将编写的 C 语言代码变成可执行程序的过程,这一过程

是由编译器来完成的。编译器就是完成程序编译工作的软件,在进行程序编译时完成了一系

列复杂的过程。

1.1.1 程序编译的过程

在执行这一操作时,程序完成了复杂的过程。一个程序的编译,需要完成词法分析、语

法分析、中间代码生成、代码优化、目标代码生成。本章将讲解这些步骤的作用与原理。

(1)词法分析。指的是对由字符组成的单词进行处理,从左至右逐个字符地对源程序进

行扫描,产生一个个的单词符号。然后把字符串的源程序改造成为单词符号串的中间程序。

在编译程序时,这一过程是自动完成的。编译程序会对代码的每一个单词进行检查。如果单

词发生错误,编译过程就会停止并显示错误。这时需要对程序中的错误进行修改。

(2 )语法分析。语法分析器以单词符号作为输入,分析单词符号串是否形成符合语法规

则的语句。例如,需要检查表达式、赋值、循环等结构是否完整和符合使用规则。在语法分

析时,会分析出程序中错误的语句,并显示出结果。如果语法发生错误,编译任务是不能完

成的。

(3 )中间代码生成。中间代码是源程序的一种内部表示,或称中间语言。程序进行词法

分析和语法分析以后,将程序转换成中间代码。这一转换的作用是使程序的结构更加简单和

规范。中间代码生成操作是一个中间过程,与用户是无关的。

(4 )代码优化。代码优化是指对程序进行多种等价变换,使得从变换后的程序能生成更

有效的目标代码。用户可以在编译程序时设置代码优化的参数,可以针对不同的环境和设置

进行优化。

(5 )目标代码生成。目标代码生成指的是产生可以执行的应用程序,这是编译的最后一

个步骤。生成的程序是二进制的机器语言,用户只能运行这个程序,而不能打开这个文件查

看程序的代码。

1.1.2 编译器

所谓编译器,是将编写出的程序代码转换成计算机可以运行的程序的软件。在进行 C 程

序开发时,编写出的代码是源程序的代码,是不能直接运行的。需要用编译器编译成可以运

行的二进制程序。

第5 章 编译与调试

在不同的操作系统下面有不同的编译器。C 程序是可以跨平台运行的。但并不是说

Windows 系统下 C 语言编写的程序可以直接在 Linux 下面运行。Windows 下面 C 语言编写的

程序,被编译成 exe 文件。这样的程序只能在 Windows 系统下运行。如果需要在 Linux 系统

下运行,需要将这个程序的源代码在 Linux 系统重新编译。不同的操作系统下面有不同的编

译器。Linux 系统下面编译生成的程序是不能在 Windows 系统上运行的。

1.2 gcc 编译器

gcc 是 Linux 下的 C 程序编译器,具有非常强大的程序编译功能。在 Linux 系统下,C 语

言编写的程序代码一般需要通过 gcc 来编译成可执行程序。

1.2.1 gcc 编译器简介

Linux 系统下的 gcc 编译器(GNU C Compiler )是一个功能强大、性能优越的编译器。gcc

支持多种平台的编译,是 Linux 系统自由软件的代表作品。gcc 本来只是 C 编译器的,但是后

来发展为可在多种硬体平台上编译出可执行程序的超级编译器。各种硬件平台对 gcc 的支持

使得其执行效率与一般的编译器相比平均效率要高 20%~30% 。gcc 编译器能将 C、C++源程

序、汇程语言和目标程序进行编译链接成可执行文件。通过支持 make 工具,gcc 可以实施项

目管理和批量编译。

经过多年的发展,gcc 已经发生了很大的变化。gcc 已经不仅仅能支持C 语言,还支持 Ada

语言、C++语言、Java 语言、Objective C 语言、Pascal 语言、COBOL 语言等更多的语言集的编

译。gcc 几乎支持所有的硬件平台,使得 gcc 对于特定的平台可以编译出更高效的机器码。

gcc 在编译一个程序时,一般需要完成预处理(preprocessing )、编译(compilation )、汇

编(assembly )和链接(linking )过程。使用gcc

在Linux系统终端利用ggc,大学计算机:Linux下C编程.pdf相关推荐

  1. Linux打过cat没有编码,linux系统 终端下 cat中文乱码/vim不乱码 或者 cat不乱码/vim中文乱码...

    场景:在linux系统终端内,用cat查看中文文档乱码,同一文件利用vim查看不乱码.(secureCRT窗口编码为utf-8) 用cat查看中文文档不乱码,同一文件利用vim查看乱码.(secure ...

  2. Linux系统上利用nmcli命令创建网络组

    网络组:是将多个网卡聚合在一起方法,从而实现冗错和提高吞吐量 网络组不同于旧版中bonding技术,提供更好的性能和扩展性 网络组由内核驱动和teamd守护进程实现. 下面我们以CentOS7系统为环 ...

  3. Linux 系统中利用 apt-get 管理软件的安装目录和安装路径

    Linux 系统中利用 apt-get 管理软件的安装目录和安装路径 apt-get 下载软件存放路径: /var/cache/apt/archives lib 文件路径: /usr/lib 可执行文 ...

  4. linux操作系统安装man,在deepin linux系统终端中安装man的中文手册

    本文教你在深度deepin linux操作系统终端中安装man的中文手册的方法,当前manjaro系统的man的中文手册相当的好,在deepin的lion源中也可以安装man的中文手册,可参考解决de ...

  5. 路由器 刷 linux系统版本,一个小型的无线路由器 Linux 系统OpenWRT[转]

    一个小型的无线路由器 Linux 系统OpenWRT分类:电脑技术 » linux应用    出处:网络   OpenWRT - (http://www.openwrt.org) 开发板: 十几种市面 ...

  6. 太原理工大学计算机软件基础考试,太原理工大学考试《大学计算机基础》A考题.pdf...

    太原理工大学考试<大学计算机基础>A考题.pdf (8页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 11.90 积分 A卷第1页共8页___ ...

  7. 查看Linux系统架构的命令,查看linux系统是哪种架构:AMD、ARM、x86、x86_64、pcc 或 查看Ubuntu的版本号

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 原创文章,转载告知,盗版必究 查看Linux系统架构的命令,查看linux系统是哪种架构:AMD.ARM.x86.x86_64.pcc 文章目录: 1 ...

  8. Mac/Linux/Centos终端中上传文件到Linux云服务器

    Mac/Linux/Centos终端中上传文件到Linux云服务器 1.mac上传文件到Linux服务器 scp 文件名 用户名@服务器ip:目标路径如:scp /Users/test/testFil ...

  9. linux系统6.5详解,linux6.5下 简单配置 MINI 系统实现详解(1)

    一.linux系统启动流程介绍 我们来了解下linux系统的启动流程: 首先linux要通过POST自检过程(BIOS)-->如果想要做多块启动盘的话,还需要在bios中选择启动磁盘--> ...

最新文章

  1. Layui 弹出text输入框, 多行,
  2. JAVA面试整理之——JAVA基础
  3. Cocoa的MVC架构分析 cocoa的mvc实现
  4. 交际过程的两个基本环节_男女相处,若不介意这些“小动作”,基本可以确定“关系暧昧”...
  5. 关于 VM Linux操作系统使用 360随身wifi的驱动安装问题
  6. nginx 强制跳转https_Nginx服务器环境手动安装Discuz! Q非详细教程
  7. 生命太短暂,我没时间讨厌你
  8. capture 部分元器件编号_Capture新建元件符号文件
  9. idea打包java项目
  10. 如何用chrome浏览器打开swf文件
  11. ImageAI训练自定义数据总结
  12. win7系统如何卸载漏洞补丁--win10专业版
  13. kubernetes 创建pod /merged/dev/shm: invalid argument
  14. PS—制作 抖音 图标
  15. 计算机组成知识教案,计算机系统的基本组成 教案_
  16. 搭建Hadoop高可用集群
  17. 关于大淘客CMS免费二次开发分享的曝光
  18. 自动驾驶路侧感知定位技术条件
  19. android jdk和ndk下载地址,cocos2d-x Android(SDK,NDK,JDK,ANT)下载地址
  20. 厦门信息计算机专业录取分数,厦门大学计算机类专业2016年在福建理科高考录取最低分数线...

热门文章

  1. 有一个1,2,3....49 的数组,通过控制台显示为7行7列的,并且里面的数据时随机的代码...
  2. Winform 自定义窗体皮肤组件
  3. webpack----常规配置
  4. Web前端入门学习(5)——浮动原理及清除浮动
  5. 08.self关键字
  6. mysqlsla日志分析工具
  7. Codeforces Round #215 (Div. 2) D. Sereja ans Anagrams
  8. 教你50招提升ASP.NET性能(十五):解决性能问题时不要低估UI的价值
  9. JS 对select动态添加options操作[IEFireFox兼容]
  10. 总结一下ASP.NET MVC 网站的部署问题