背景知识
计算机语言有机器语言,汇编语言,高级语言三个阶段
机器语言是直接使用二进制数来编写的语言,直接与底层硬件打交道,速度快但是移植性差
汇编语言是用助记符表示二进制代码,方便人们的理解与记忆,
高级语言有更接近自然语言的形式,同时可以移植到不同的平台
高级语言是不能被计算机直接执行的,需要编译或解释为汇编,最后变为机器语言才能被计算机执行
编译型语言:将源代码一次性编译成可被该平台硬件执行的机器码
- 速度比解释性快,消耗更少的内存
- 与特定平台相关,编译后的执行程序无法移植到其他平台
- 有C、C++、Objective-C、Pasca
解释型语言:解释型语言不需要事先编译,其直接将源代码解释成机器码并立即执行
- 需要一行行解释后运行,效率较慢,比较占用内存
- 一个代码可在多个平台运行
- python,java
目前主流的编程语言有:c,c++,java,python,php等等
分享一个有趣的网址编程语言排行榜:https://www.tiobe.com/tiobe-index/
起源
c语言标准
美国国家标准协会(ANSI),给c语言制定了一套标准,被称为ANSI C 或 C89,后来被做了一点小改动,被ISO采用,被称为ISO C 或 C90 ,实际上是差不多的
2000年C99被采纳,增加了一些特性(如下),但是
- 支持不定长数组
- 变量声明不必在语句块开头
- for依据提倡写为for(int i=0;i<10;i++)的形式,即 i 只在内部有效
2011年发布了C11标准,增加了复数的支持等等
需要注意的是,虽然C99,C11已经发布一段时间,但是也不是所有的编译器都实现了新的特性,所以采用新标准编写代码可能会有编译不通过的风险
无特殊要求,尽量还是使用C89的标准
c程序开发
c程序结构
预处理指令
所有以#开头的行代表预处理指令,在编译阶段由预处理器处理
一般都位于程序的前部
代码注释
单行注释以 // 开头,代码块注释以 /* 开头以 */ 结尾
也可以通过预处理条件编译 #if 0 … #endif来实现代码块注释
代码应写好必要的注释,方便他人和自己日后查看,没有注释的代码是丑陋的
函数
函数是一组实现某个特定功能的一段语句
每个c程序都会有一个主函数 main()是程序的入口
在编写代码时,应当将每个基本功能封装成一个个函数
语句和表达式
是c程序的基本单位,每个语句以 ;结尾
软件开发流程
在很多人的观念里面,写代码是软件开发的主要工作,其实不是在整个开发过程中,写代码只是一小部分
代码编写和编译运行,一般是由低级程序员负责,内卷严重的也是这一阶段,
而深入理解开发过程的高级程序员一般在概要设计和详细设计部分工作
编译程序
在Windows下编译一个程序,只需要点击编译器的对应按键即可
在Linux使用命令编译程序,如下编译hello.c程序
gcc -o hello hello.c
//gcc -o 生成文件的文件名 程序名
执行程序前需要确定是否有执行权限,可以使用chmod修改权限
sudo chmod 777 hello
执行程序
./hello
生成可执行文件 的过程包括编译和链接两个过程
编译器把源代码转化成中间代码
链接器把中间代码和其他代码合并,生成可执行文件
编译器生成的中间文件,只是将源代码“翻译”成了目标文件(机器语言代码),但是还不是完整的程序还缺少启动代码和库函数
启动代码是程序和操作系统之间的接口,不同系统的启动代码不一样
交叉编译
在x86架构Linux下使用gcc编译生成直接在x86架构系统下运行的编译叫本地编译
在x86架构Linux下使用支持ARM的编译器编译生成在ARM架构下运行的编译叫交叉编译
就是在电脑的Linux开发想放去开发板的Linux上运行的话,大概率就需要交叉编译
安装ARM-Linux交叉编译器
sudo apt install -y gcc-arm-linux-gnueabihf
交叉编译
arm-linux-gnueabihf-gcc -o helloarm hello.c
编译成功后,在本机是无法运行的,需要放到arm架构的Linux系统上运行
使用file命令可查看可执行文件的架构
file helloarm