1 概览
本章介绍以下内容:
- 计算机系统架构:硬件和软件
- 编程语言的发展历程及其特性和使用场景
- 主流桌面系统(Windows,Linux,Mac)的C语言开发环境的搭建
- C程序运行在各大操作系统
- C语言运行原理
- C语言的实用小程序
- 软件开发流程
- C语言模块化编程的思想
2 计算机系统架构
计算机系统架构通常是由硬件系统和软件系统两大部分组成。
通常是应用软件(微信,迅雷)运行在系统软件-操作系统(Windows,Linux,MacOS)之上,而操作系统负责和底层硬件系统(CPU,内存,硬盘)交互。软件开发就是指的运用某种程序设计语言(例如C/C++/Java/Pyhton/Go…)编写系统软件或者是应用软件,目前主流的技术趋势是移动互联网(Android,IOS,手游),云计算和大数据,物联网,以及即将火爆的人工智能和机器学习。
2.1 计算机核心硬件
通常计算机核心硬件包含CPU,内存,硬盘以及IO设备组成。
下面来认识下各大组件的作用:
CPU:也被称为中央处理器,由运算器和控制器组成,其主要作用是用来计算数据(从内存中获取指令并执行后将结果返回给内存或者写入到磁盘)和控制其他设备协同工作。
内存:其主要作用是用来作为程序的工作区,程序运行时会被加载到内存,断电后数据会丢失。
硬盘:其主要作用是永久性存储海量(PB)的数据,分为机械式硬盘(HDD)(7500rpm,15000rpm)和固态硬盘(SSD)两大类。
IO设备:其主要作用是用来数据的输入输出,常见的输入设备包括鼠标键盘,常见的输出设备包含声卡,显卡,打印机等等。还有个典型输入输出设备:网卡主要是负责数据在网络上的传输。
在程序故障诊断或者做程序性能优化是时除了考虑程序自身之外还需要考虑CPU,内存,磁盘和网卡的状况。
2.2 计算机硬件的IO各层次性能汇总
组件名称 | 延时、带宽 |
---|---|
CPU | |
Cache L1,L2,L3 | 0.5-15ns、20-60GB/S |
内存 | 30-100ns、2-12GB/S |
SSD硬盘 | 10us-1ms、50MB-2GB/S |
普通硬盘 | 5-20ms、50-200MB/S |
网卡-网卡 | 100us-1ms、10MB-10GB/S |
从该表格中可以看出CPU延时(最低)和带宽(最高),而普通硬盘是性能最差的,根据木桶效应,在性能优化时应该优先优化磁盘。
2.3 计算机软件
软件的出现实现了人和计算机之间更好的交互
计算机软件分为系统软件和应用软件两大类,如下列表中包含常见的软件及其运行平台。
- 系统软件
人机交互方式 | 系统名称 | 平台 |
---|---|---|
命令行界面 | Unix(Solaris,HP Unix,AIX),Linux(CentOS) | 服务器 |
图形界面 | Windows10,MacOS10.13,Linux(Ubuntu16.04) | 桌面 |
自然交互界面 | Android8.0,IOS11 | 嵌入式(手机、汽车、电视) |
- 应用软件
类型 | 名称 | 平台 |
---|---|---|
通讯 | 微信 | Windows,MacOS,Android,IOS |
购物 | 京东、天猫 | Windows,Android,IOS |
办公 | WPS,Office | Windows,Mac |
目前在典型的中小型互联网公司的应用软件的后台业务逻辑通常都是采用Java或者Python,C/C++/Go实现。前台展示通常包含PC,H5,android,ios和微信小程序。
系统软件主要实现和底层硬件交互,给应用软件提供运行平台。操作系统、编译器等都是属于系统软件,目前主流的桌面操作系统是Windows,Linux(Ubuntu),MacOS,主流的移动端操作系统是Android,IOS,主流的服务端操作系统是Linux(CentOS,Ubuntu)。
应用软件主要是运行在PC或者是移动终端的操作系统之上,用于解决工作和生活的各种需求,例如购物(淘宝、天猫、京东),聊天(微信、QQ),听音乐(QQ音乐、网易云音乐),看电影(爱奇艺、暴风影音),收发邮件(Foxmail)等等。
2.4 推荐给开发者的硬件和软件
2.4.1 硬件
Windows/Linux(Ubuntu):Razer雷蛇 灵刃专业版
硬件配置一览
MacOS:MacBookPro 15
配置和价格一览
开发者推荐最低硬件配置:i7 CPU+ 512G固态硬盘+16G内存+GTX1070
2.4.2 必备软件
Windows | MacOS | 功能描述 |
---|---|---|
VMWareWorkStataion12 Pro | Parallels Desktop 12 Pro | 虚拟机 |
微信 | 微信 | 及时通讯 |
钉钉 | 钉钉 | 企业办公 |
WPS/Office | Office | 办公软件 |
Ultraedit | Ultraedit | 文本编辑 |
福昕PDF阅读器 | PDF Expert | PDF阅读器 |
百度网盘 | 百度网盘 | 文件存储 |
QQ音乐 | QQ音乐 | 音乐播放 |
Teamviewer | Teamviewer | 远程控制 |
XMind | XMind | 思维导图 |
KMPlayer | KMPlayer | 视频播放 |
迅雷 | 迅雷 | 下载 |
Chrome | Chrome | 浏览器 |
IntelliJ IDEA | IntelliJ IDEA | Java开发 |
VisualStudio2017 | VisualStudio2017 | C/C++开发 |
Git | Git | 源码版本控制 |
MySQL | MySQL | 数据库 |
SecureCRT | SecureCRT | Linux SSH客户端 |
Axure RP 8 | Axure RP 8 | 原型图 |
如果是想开发Windows和Linux程序
推荐在Windows开发机上先安装Windows10 x64企业版,然后通过安装的VMWareWorkStation12虚拟机上安装Linux/CentOS7.3、Linux/OpenSUSE42.2和Linux/Ubuntu16.04三个常见的Linux发行版。
如果是想开发MacOS程序
MacBookPro则是安装了最新的MacOS10.13,由于极少数必备软件(例如RedisDesktopManager,WPS),同时通过Mac平台上的虚拟机Parallels Desktop 12 安装了Windows10以及一些Mac平台上缺失的软件。
这样基本就可以覆盖所有主流的PC/服务端操作系统。
如果想测试Android或者是IOS,再买个三星Note8和iPhone 8,安装最新版的操作系统即可。
再推荐一些MacOS平台上非常好用的软件
- XCode(开发IOS,Mac,Apple Watch应用的利器)
- iTem2(shell client)
- Atom(文本编辑器)
- CleanMyMac(系统清理优化)
- GitBook(开源的写书软件)
- MWeb(MarkDown写作)
- 2Do(任务计划)
- Dash(帮助文档)
- Charles(HTTP网络监视、代理)
- Tower(Git客户端)
- ScreenFlow(录屏)
- Adobe PhotoShop 2017
- StartUML(UML)
3 编程语言发展史
编程语言经历了机器语言-汇编-高级程序设计语言三个阶段,其显著的变化特点就是程序的开发、测试、运维越来越变得更加简单。
先了解下2017年 7月 TIOBE 编程语言排行榜
目前主流的语言是C/C++/Java/Python/C#/PHP/Go/Swift/Objective-C
机器语言
想让计算机做事情就必须采用某种指令系统(它是由计算机系统的基本运算构成)来指挥计算机进行计算,存储和传输数据等任务,而大型服务器(非X86精简指令系统),PC,笔记本(X86复杂指令系统)以及手机(ARM精简指令系统)所采用的指令系统是不尽相同的,这也就意味着PC上的程序不加修改就不能到手机上运行,手机上的程序不加修改也不能到PC上运行。
程序就是指令系统加上数据集组成,而每个CPU都有自己的指令系统(由二进制的机器码010101序列组成),这也就是最早的编程语言-机器语言的由来,它的特点是特别高效,不能移植,不易开发和后期维护等等。汇编语言
随着时代和计算机技术的发展,汇编语言和编译器的出现解决了需要记住非常多的二进制机器指令的难题,但是还是没有从根本上解决移植性的问题,只是将机器指令转换为易懂的英文单词,然后由编译器编译成机器指令,因为计算机终归揭底只能识别0001110100110机器指令,而且汇编语言是面向机器的,不同机器(Intel,ARM平台)的汇编指令是不相同的。 而汇编的使用场景只有在追求绝对性能的场合中使用。
C语言嵌套汇编语言的案例
#include <stdio.h>
#include <stdio.h>
/*****************************
作者:刘光磊
联系方式:18601767221@163.com
创作日期:2017/8/14/15/11
程序说明:C语言嵌套汇编的案例
*****************************/
void use_asm() {
int a, b, c = 0; //初始化声明三个整数变量并赋值为0
a = 4;
b = 6;
printf("before a=%d\tb=%d\tc=%d\n", a, b, c);
_asm {
//将变量a的值赋值给eax寄存器
mov eax, a;
//将变量b的值和寄存器eax相加
add eax, b;
//将相加的结果赋值给c
mov c, eax;
}
printf("after a=%d\tb=%d\tc=%d\n", a, b, c);
}
/*****************************
作者:刘光磊
联系方式:18601767221@163.com
创作日期:2017/8/14/15/10
程序说明:入口方法
*****************************/
void main() {
use_asm();
getchar();
}
- 高级程序设计语言
高级程序设计语言的高级之处体现在开发人员在编写程序时无需关心硬件差异只需要专注于业务模块实现即可。甚至是可以实现一次编译,到处运行(Java通过实现不同平台的JVM,编译生成的字节码文件可以在任意的JVM上运行)。
高级语言通常都需要编译器或者是解释器将源码编译或者解释执行。
目前主流的高级程序设计语言有C/C++/Java/Python/Go/PHP/Swift,
其中C语言擅长做系统级开发,例如各大操作系统底层实现、各种编程语言的编译器等等。
而Java,PHP,Python适合做Web应用开发,
Swift用于iPhone的app开发,
Go语言适用于高并发的场景。
4 C语言的概述
C语言经历了45年的发展,已经广泛用于操作系统(Windows,Linux,MacOS)、计算机编程语言(Java,Python…)、游戏、PC应用等领域开发,后期出现的C++,Python,Go等程序设计语言在许多方法都借鉴了它的优势。
4.1 C语言的起源
C语言在1972年诞生于美国的贝尔实验室,由Dennis Ritch和Ken Thompson在开发Unix操作系统时设计的,该操作系统的90%以上的代码都是由C语言实现。
4.2 C语言的特性
优点
- 设计特性:自顶向下,结构化编程和模块化设计
- 高效:C语言具有接近汇编的性能,同时可以嵌套汇编代码
- 可移植:在开发程序时,如果使用跨平台的开发库则编写的可以运行在各大平台。
- 强大而灵活:可以编写系统、驱动、网站后台程序等各种应用程序
缺点
- 过于自由,经验不足容易出错
- 对平台库依赖比较多
- 编写代码周期长
4.3 C语言的适用范围
操作系统
驱动程序
游戏引擎
网站后台
程序设计语言
物联网
云计算、大数据
C语言的产品:操作系统(Unix,Linux,Windows,MacOS,Android),Web服务器(Nginx),NoSQL数据库(Redis),分布式版本控制系统(Git)。
5 C语言编程环境搭建
目前主流操作系统(Windows,Linux,MacOS)都有完善的C语言集成开发环境,用于编辑、编译、调试、打包部署C程序。
操作系统 | 开发工具 |
---|---|
Windows | VisualStudio2017 |
Linux(Ubuntu) | QT5.9 |
MacOS | XCode8.3 |