宝安做网站哪家好,揭阳市seo上词外包,淮南网格员招聘,网站建设的一般流程是目录
编辑
1. C语言发展史
2. C语言特点
3. C语言标准
4. C语言编程机制
4.1 预处理(Preprocessing)
4.2 编译(Compilation)
4.3 汇编(Assemble)
4.4 链接(Linking)
结语 1. C语言发展史 C语言是由美国贝尔实验室的Dennis Ritchie于1972年设计开发的一种编…
目录
编辑
1. C语言发展史
2. C语言特点
3. C语言标准
4. C语言编程机制
4.1 预处理(Preprocessing)
4.2 编译(Compilation)
4.3 汇编(Assemble)
4.4 链接(Linking)
结语 1. C语言发展史 C语言是由美国贝尔实验室的Dennis Ritchie于1972年设计开发的一种编程语言它的设计目标是用于Unix操作系统的程序开发。 在20世纪70年代末和80年代初C语言逐渐成为主流的编程语言之一。它的广泛应用在于其简单易学、功能强大、可移植性强的特点使得许多计算机公司和软件开发者将其作为首选语言。 1990年代中期C语言的出现逐渐压过了C语言的优势。尽管如此C语言仍然是许多高性能应用程序的编程语言包括操作系统、嵌入式系统和设备驱动程序等。 近年来由于其广泛应用和高度成熟的编译器、文档和支持工具C语言仍然是许多计算机科学教育课程的核心部分。此外许多新的C语言标准和框架也在不断推出以满足不断变化的编程需求。 2. C语言特点 结构化编程C语言采用结构化编程的思想代码结构清晰简洁易于理解和维护。 代码可移植性C语言的编译器可以在多种平台上运行代码可以在不同的操作系统和硬件上运行具有很好的可移植性。 高效性C语言的编译器生成的代码执行效率高能够直接操作计算机硬件利用底层资源具有高效性。 指针C语言具有指针的概念可以直接访问内存地址实现高效的数据操作。 库函数丰富C语言提供了丰富的标准库函数能够方便地实现各种功能如字符串操作、文件操作等。 可扩展性C语言可以使用其他语言编写的库文件扩展其功能。 低级别控制C语言具有低级别的控制能力用户可以直接控制内存、硬件等底层资源实现灵活的编程。 面向过程C语言是一种面向过程的编程语言适合于开发底层的系统软件和高效的算法。 通过上述的介绍已经了解了C语言的若干特点。C语言虽然是一种优秀的计算机程序设计语言但也存在以下的一些缺点了解这些缺点才能够在实际使用中扬长避短。 1. C程序的错误更隐蔽。C语言的灵活性使得用它编写程序时更容易出错而且C语言的编译器不检查这样的错误。与汇编语言类似需要程序运行是才能发现这些逻辑错误。C语言还会有一些隐患需要程序员重视比如将比较的写成赋值语法上没有错误这样的逻辑错误不易发现要找出来往往十分费时。 2. C程序有时会难以理解。C语言语法成分相对简单是一种小型语言。但是其数据类型多运算符丰富且结合性多样使得对其理解有一定的难度。有关运算符和结合性人们最常说的一句话是“先乘除后加减同级运算从左到右”但是C语言远比这要复杂。发明C语言时为了减少字符输入C语言比较简明同时也使得C语言可以写出常人几乎无法理解的程序。 3. C程序有时会难以修改。考虑到程序规模的大型化或者说巨型化现代编程语言通常会提供“类”和“包”之类的语言特性这样的特性可以将程序分解成更加易于管理的模块。然而C语言缺少这样的特性维护大型程序显得比较困难。
3. C语言标准 C语言标准通常指ISO/IEC 9899C99或ISO/IEC 9899C11。这些标准定义了C程序语言的语法、语义、库等的规范。C99是C语言的第二个国际标准于1999年发布引入了许多新功能如可变长度数组、复合文字和行注释等C11于2011年发布进一步扩展了C99并添加了一些新功能如泛型选择和多线程库等。
4. C语言编程机制 编程机制是指在计算机程序中使用的各种规则和技术包括程序设计、算法、数据结构、编程语言、编码标准、调试和测试等方面。其中程序设计是编程机制的核心它涉及到如何组织和设计程序的核心逻辑和数据结构以及如何在其中使用编程语言和库。算法则是指在程序中描述问题的解决方案的过程或序列数据结构则是指程序中用于存储和操作数据的方式。编程语言则提供了一种语法和语义规则来实现特定的编程机制编码标准则规定了程序如何编写、格式化和文档化。调试和测试等技术则用于发现和修复程序中的错误和缺陷。综合使用这些机制可以编写高效、可靠、可维护和易于使用的程序。
C语言是一种基于过程的编程语言具有以下几个基本机制 结构化编程C语言通过控制结构如if-else、while、for等来组织代码实现结构化编程使代码清晰、易于理解和修改。 函数C语言中的函数是一个独立的代码块接受一些输入参数并返回一个输出值。通过函数可以将代码分解成小的模块提高了代码的可读性和可维护性。 指针指针是C语言中的一种重要数据类型可以指向内存中的地址允许对内存中的数据进行直接访问和操作。指针在C语言中被广泛使用可以用来实现高效的数据结构和算法。 数据类型C语言中定义了基本的数据类型如整数、字符、浮点数等也可以通过结构体和联合体来自定义复杂的数据类型以满足不同的需求。 预处理器C语言中的预处理器可以在编译代码之前对代码进行一些预处理如包含头文件、定义常量、条件编译等可以使代码更加灵活和可配置。
以上这些机制共同构成了C语言的编程范式使其成为一种高效、灵活、可扩展的编程语言。
4.1 预处理(Preprocessing) 预处理用于将所有的#include头文件以及宏定义替换成其真正的内容预处理之后得到的仍然是文本文件但文件体积会大很多。gcc的预处理是预处理器cpp来完成的你可以通过如下命令对test.c进行预处理
gcc -E -I./inc test.c -o test.i 或者直接调用cpp命令
$ cpp test.c -I./inc -o test.i 上述命令中-E是让编译器在预处理之后就退出不进行后续编译过程-I指定头文件目录这里指定的是我们自定义的头文件目录-o指定输出文件名。
经过预处理之后代码体积会大很多
X文件名文件大小代码行数预处理前test.c146B9预处理后test.i17691B857
预处理之后的程序还是文本可以用文本编辑器打开。
4.2 编译(Compilation) 这里的编译不是指程序从源文件到二进制程序的全部过程而是指将经过预处理之后的程序转换成特定汇编代码(assembly code)的过程。编译的指定如下
$ gcc -S -I./inc test.c -o test.s 上述命令中-S让编译器在编译之后停止不进行后续过程。编译过程完成后将生成程序的汇编代码test.s这也是文本文件内容如下
// test.c汇编之后的结果test.s.file test.c.section .rodata
.LC0:.string a%d, b%d, ab%d\n.text.globl main.type main, function
main:
.LFB0:.cfi_startprocpushl %ebp.cfi_def_cfa_offset 8.cfi_offset 5, -8movl %esp, %ebp.cfi_def_cfa_register 5andl $-16, %espsubl $32, %espmovl $2, 20(%esp)movl $3, 24(%esp)movl 24(%esp), %eaxmovl %eax, 4(%esp)movl 20(%esp), %eaxmovl %eax, (%esp)call add movl %eax, 28(%esp)movl 28(%esp), %eaxmovl %eax, 12(%esp)movl 24(%esp), %eaxmovl %eax, 8(%esp)movl 20(%esp), %eaxmovl %eax, 4(%esp)movl $.LC0, (%esp)call printfleave.cfi_restore 5.cfi_def_cfa 4, 4ret .cfi_endproc
.LFE0:.size main, .-main.ident GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2.section .note.GNU-stack,,progbits
请不要问我上述代码是什么意思!-_-
4.3 汇编(Assemble) 汇编过程将上一步的汇编代码转换成机器码(machine code)这一步产生的文件叫做目标文件是二进制格式。gcc汇编过程通过as命令完成
$ as test.s -o test.o
等价于
gcc -c test.s -o test.o
这一步会为每一个源文件产生一个目标文件。因此mymath.c也需要产生一个mymath.o文件
4.4 链接(Linking)
链接过程将多个目标文以及所需的库文件(.so等)链接成最终的可执行文件(executable file)。
命令大致如下
$ ld -o test.out test.o inc/mymath.o ...libraries...
结语 经过以上分析我们发现编译过程并不像想象的那么简单而是要经过预处理、编译、汇编、链接。尽管我们平时使用gcc命令的时候没有关心中间结果但每次程序的编译都少不了这几个步骤。也不用为上述繁琐过程而烦恼因为你仍然可以