这一个系列学习笔记是根据《C Primer Plus》这本书进行总结的。
加油!!欢迎大家一起交流
概览:
C的历史和特性
编写程序的步骤
编译器和链接器的一些知识
C标准
总结:
C是编译型语言,C编译器和链接器是把C语言源代码转换成可执行代码的的程序。
目录
1.1 C语言的起源
1.2 选择C语言的理由
1.2.1 设计特性
1.2.2 高效性
1.2.3 可移植性
1.2.4 强大而灵活
1.2.5 面向程序员
1.2.6 缺点
涉及指针的编程需要额外注意(后面再论述)
1.3 C语言的应用范围
1.4 计算机能做什么
明白计算机的工作原理,能更好的的清晰用C语言编写程序和运行C程序时两者发生的事情的联系。这本书这里讲的太浅显,具体由另外一门课再总结,总的来说:
CPU能理解的语言是指令(指令集),这些指令很具体,用于请求计算机把一个数字从一个位置移动到另一个位置。这些指令存在CPU自己的工作区--寄存器中。另外,计算机以数字形式存储数字和字符,每个字符都有一个数字码,计算机载入寄存器的指令也以数字形式存储,指令集中的每条指令都有一个数字码;计算机程序必须以数字指令码(机器语言)来表示。
计算机的工作原理:希望计算机做某些事,必须提供特殊的指令列表(程序),确切告诉计算机要做的事情以及如何做。你必须用计算机能直接明白的语言(机器语言)创建程序。
1.5 高级计算机语言和编译器
高级编程语言(C)在更抽象的层面表达你的想法,不用考虑CPU在完成任务时具体需要哪些步骤。但在计算机而言,高级编程语言就是一堆无法理解的无用数据,编译器的作用就是把高级语言翻译成计算机能理解的机器语言指令集的程序。
即:程序员进行高级思维活动,不受限于特定CPU或指令集,而编译器负责处理冗长乏味的细节工作。
另外,不同CPU制造商使用的指令系统和编码格式(机器语言)不同,例如Inter Core i7 CPU编写的机器语言程序对于ARM Cortex-A57 CPU而言什么都不是,但是可以找到与特定类型CPU匹配的编译器,因此合适的编译器,便可把一种高级语言程序转换成工各种不同类型的CPU使用的机器语言程序
1.6 语言标准
本书的作者在这里提到了《The C Programming Language》这本书,恰好cmu 15-213的教授《深入理解计算机系统》的原作者,在他的课程中也提到了这本书,后面有机会拜读一下。
为什么要有C语言标准:在编写C程序时,假设该程序中未使用机器特定的编程技术,那么它的运行情况在任何实现中都应该相同,但是要做到这一点,不同的实现要遵循同一个标准。
1.6.1 第一个ANSI/ISO C标准
1989年美国国家标准协会(ANSI)定义了C语言和C标准库(ANSI C),1990年后来国际标准化组织(ISO)采用了这套标准(ISO C),ANSI/ISO的最终版本叫C89(1989)或C90(ISO)
1.6.2 C99标准
1994年,为了国际化、弥补缺陷和提高计算的实用性,ANSI/ISO联合委员会修订C标准,最终发布C99标准。
1.6.3 C11标准
2011年,为了编程安全,发布了C11标准
1.7 使用C语言的7个步骤
1.7.1 第一步:定义程序的目标
1.7.2 第二步:设计程序
1.7.3 第三步:编写代码
1.7.4 第四步:编译
编译的细节取决于编译环境。
编译器把源代码转换成可执行代码的程序,可执行代码是计算机的机器语言表示的代码,这种语言有数字码表示的指令组成,不同的计算机使用不同的机器语言方案。
具体编译、链接是如何进行的,后面再论述。
1.7.5 第五步:运行程序
1.7.6 第六步:测试和调试程序
1.7.7 第七步:维护和修改代码
1.7.8 说明
1.8 编程机制
1.8.1 目标代码文件、可执行文件和库
源代码文件(source code file) 文件名要求(xxxx.c)其中xxxx是基本名(basename),.c是扩展名(extension).
编译器把源代码转换成中间代码,中间代码普遍又称目标代码文件(目标文件),虽然目标文件中存储的是编译器翻译的源代码,即机器语言代码,但不能直接运行该程序,两个原因
一:缺失启动代码(startup code),启动代码充当程序和操作系统之间的接口。例如,可在windows或Linux系统中运行IBM PC兼容机,两种情况使用的硬件相同,所以目标代码相同,但是所需的启动代码不同。
二:缺失库函数(library),目标代码文件并不包含该函数的代码,只包含了使用printf()函数的指令,此函数的真正代码存储在另一个被称为库的文件中,库文件有很多目标代码。链接器只会把程序中用到的库函数代码提取出来。
链接器的作用,把目标代码、系统的标准启动代码和库代码这三部分合并成可执行文件。
总之,目标代码和可执行文件都由机器语言指令组成的。目标代码中包含编译器为你编写的代码翻译的的机器语言代码,可执行文件中包含你编写的程序中使用的库函数和启动代码的机器代码。
1.8.2 UNIX系统
name.c为源代码
编译器为UNIX C编译器,cc命令为编译器的别名
a,out为可执行代码
wlsh@wlsh-ThinkStation:~$ cc --version
cc (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
wlsh@wlsh-ThinkStation:~$ type cc
cc is hashed (/usr/bin/cc)
wlsh@wlsh-ThinkStation:~$ type -a cc
cc is /usr/bin/cc
1.8.3 GNU编译器集合和LLVM项目
1987年GNU项目,是一个开发大量免费UNIX软件的集合(GNU's Not UNIX)。
GNU编辑器集合(也称GCC,包括GCC C编译器)是该项目的产品之一,它的C编译器紧跟C标准的改动。
wlsh@wlsh-ThinkStation:~$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
wlsh@wlsh-ThinkStation:~$ type cc
cc is hashed (/usr/bin/cc)
wlsh@wlsh-ThinkStation:~$ type -a cc
cc is /usr/bin/cc
LLVM项目是cc的另一个替代品,该项目是与编译器相关的开源软件集合,它的Clang编译器处理C代码,通过clang调用。
1.8.4 Linux系统
Linux是开源的、类UNIX操作系统,使用GNU提供的GCC公共C编译器,会将cc变为gcc的别名。
1.8.5 PC的命令行编译器
windows可以通过Cygwin和MinGW,可以在PC上通过命令行调用GCC编译器
1.8.6 集成开发环境(Windows)
许多供应商提供widows下的集成开发环境,或称为IDE,这些IDE都内置编写C程序的编辑器。
1.8.7 Windows/Linux
1.8.8 Macintosh中的C
Xcode的使用具体后面再演示