(一)C语言概述

本篇介绍C语言起源、编译、存储层次。

诞生

  • 简单介绍
    C语言诞生于美国的贝尔实验室,由D.M.Ritchie以B语言为基础发展而来,在它的主体设计完成后,Thompson和Ritchie用它完全重写了UNIX,且随着UNIX的发展,c语言也得到了不断的完善。为了利于C语言的全面推广,许多专家学者和硬件厂商联合组成了C语言标准委员会,并在之后的1989年,诞生了第一个完备的C标准,简称“C89”,也就是“ANSI c”,截至2020年,最新的C语言标准为2017年发布的 “C17”。
    C语言之所以命名为C,是因为C语言源自Ken Thompson发明的B语言,而B语言则源自BCPL语言。

  • 发展历程

在这里插入图片描述

特点

  • 简洁的语言
    C语言包含的各种控制语句仅有9种,关键字也只有32 个。

  • 具有结构化的控制语句
    C语言是一种结构化的语言,提供的控制语句具有结构化特征,如for语句、if⋯else语句和switch语句等。可以用于实现函数的逻辑控制,方便面向过程的程序设计。

  • 丰富的数据类型
    C语言包含的数据类型广泛,不仅包含有传统的字符型、整型、浮点型、数组类型等数据类型,还具有其他编程语言所不具备的数据类型,其中以指针类型数据使用最为灵活,可以通过编程对各种数据结构进行计算。

  • 丰富的运算符
    C语言包含34个运算符,它将赋值、括号等均是作运算符来操作,使C程序的表达式类型和运算符类型均非常丰富。

  • 可对物理地址进行直接操作
    C语言允许对硬件内存地址进行直接读写,以此可以实现汇编语言的主要功能,并可直接操作硬件。C语言不但具备高级语言所具有的良好特性,又包含了许多低级语言的优势,故在系统软件编程领域有着广泛的应用。

  • 代码具有较好的可移植性
    C语言是面向过程的编程语言,用户只需要关注所被解决问题的本身,而不需要花费过多的精力去了解相关硬件,且针对不同的硬件环境,在用C语言实现相同功能时的代码基本一致,不需或仅需进行少量改动便可完成移植,这就意味着,对于一台计算机编写的C程序可以在另一台计算机上轻松地运行,从而极大的减少了程序移植的工作强度。

  • 可生成高质量、目标代码执行效率高的程序
    与其他高级语言相比,C语言可以生成高质量和高效率的目标代码,故通常应用于对代码质量和执行效率要求较高的嵌入式系统程序的编写。

编译

  • 目的
    编译是利用编译程序从源语言编写的源程序产生目标程序的过程,就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2进制的。

  • 过程
    在这里插入图片描述

    • 词法分析
      词法分析的任务是对由字符组成的单词进行处理,从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。执行词法分析的程序称为词法分析程序或扫描器。
      源程序中的单词符号经扫描器分析,一般产生二元式:单词种别;单词自身的值。单词种别通常用整数编码,如果一个种别只含一个单词符号,那么对这个单词符号,种别编码就完全代表它自身的值了。若一个种别含有许多个单词符号,那么,对于它的每个单词符号,除了给出种别编码以外,还应给出自身的值。
      词法分析器一般来说有两种方法构造:手工构造和自动生成。手工构造可使用状态图进行工作,自动生成使用确定的有限自动机来实现。

    • 语法分析
      编译程序的语法分析器以单词符号作为输入,分析单词符号串是否形成符合语法规则的语法单位,如表达式、赋值、循环等,最后看是否构成一个符合要求的程序,按该语言使用的语法规则分析检查每条语句是否有正确的逻辑结构,程序是最终的一个语法单位。编译程序的语法规则可用上下文无关文法来刻画。
      语法分析的方法分为两种:自上而下分析法和自下而上分析法。自上而下就是从文法的开始符号出发,向下推导,推出句子。而自下而上分析法采用的是移进归约法,基本思想是:用一个寄存符号的先进后出栈,把输入符号一个一个地移进栈里,当栈顶形成某个产生式的一个候选式时,即把栈顶的这一部分归约成该产生式的左邻符号。

    • 中间代码
      中间代码是源程序的一种内部表示,或称中间语言。中间代码的作用是可使编译程序的结构在逻辑上更为简单明确,特别是可使目标代码的优化比较容易实现中间代码,即为中间语言程序,中间语言的复杂性介于源程序语言和机器语言之间。中间语言有多种形式,常见的有逆波兰记号、四元式、三元式和树。

    • 代码优化
      代码优化是指对程序进行多种等价变换,使得从变换后的程序出发,能生成更有效的目标代码。所谓等价,是指不改变程序的运行结果。所谓有效,主要指目标代码运行时间较短,以及占用的存储空间较小。这种变换称为优化。
      有两类优化:一类是对语法分析后的中间代码进行优化,它不依赖于具体的计算机;另一类是在生成目标代码时进行的,它在很大程度上依赖于具体的计算机。对于前一类优化,根据它所涉及的程序范围可分为局部优化、循环优化和全局优化三个不同的级别。

    • 目标代码
      目标代码生成是编译的最后一个阶段。目标代码生成器把语法分析后或优化后的中间代码变换成目标代码。目标代码有三种形式:
      ① 可以立即执行的机器语言代码,所有地址都重定位;
      ② 待装配的机器语言模块,当需要执行时,由连接装入程序把它们和某些运行程序连接起来,转换成能执行的机器语言代码;
      ③ 汇编语言代码,须经过汇编程序汇编后,成为可执行的机器语言代码。
      目标代码生成阶段应考虑直接影响到目标代码速度的三个问题:一是如何生成较短的目标代码;二是如何充分利用计算机中的寄存器,减少目标代码访问存储单元的次数;三是如何充分利用计算机指令系统的特点,以提高目标代码的质量。

    • 表格管理
      编译过程中源程序的各种信息被保留在种种不同的表格,编译各阶段的工作都涉及到构造、查找、或更新有关的表格。
      编译程序的公共辅助部分。对源程序中的各种量进行管理,登记在相应的表格。编译程序处理时通过查表得到所需的信息。

    • 出错处理
      如果编译过程中发现源程序有错误,编译程序应报告错误的性质和错误的发生的地点,并且将错误所造成的影响限制在尽可能小的范围内,使得源程序的其余部分能继续被编译下去,有些编译程序还能自动纠正错误,这些工作由错误处理程序完成。
      需要注意的是,一般上编译器只做语法检查和最简单的语义检查,而不检查程序的逻辑。

存储层次

  • 定义
    存储层次是在计算机体系结构下存储系统层次结构的排列顺序。每一层于下一层相比都拥有较高的速度和较低延迟性,以及较小的容量。大部分现今的中央处理器的速度都非常的快。大部分程序工作量需要存储器访问。由于高速缓存的效率和存储器传输位于层次结构中的不同档次,所以实际上会限制处理的速度,导致中央处理器花费大量的时间等待存储器I/O完成工作。

  • 简介

    • 存储系统是指计算机中由存放程序和数据的各种存储设备、控制部件及管理信息调度的设备(硬件)和算法(软件)所组成的系统。计算机的主存储器不能同时满足存取速度快、存储容量大和成本低的要求,在计算机中必须有速度由慢到快、容量由大到小的多级层次存储器,以最优的控制调度算法和合理的成本,构成具有性能可接受的存储系统。存储系统的性能在计算机中的地位日趋重要,主要原因是:①冯诺伊曼体系结构是建筑在存储程序概念的基础上,访存操作约占中央处理器(CPU)时间的70%左右。②存储管理与组织的好坏影响到整机效率。③现代的信息处理,如图像处理、数据库、知识库、语音识别、多媒体等对存储系统的要求很高 。

    • 对于通用计算机而言,存储层次分为四层:CPU寄存器。高速缓存、主存和辅存。对于CPU 寄存器,CPU 可以再一个时钟周期内访问它们。接下来是一个或者多个小型到中型的基于 SRAM 的高速缓存存储器,可以再几个 CPU 时钟周期内访问它们。然后是一个大的基于 DRAM 的主存,可以在几十或者几百个时钟周期内访问它们。接下来是慢速但是容量很大的本地磁盘。存储器层次结构的核心是,对于每个 k,位于 k 层的更快更小的存储设备作为位于 k+1 层的更大更慢的存储设备的缓存。也就是说,层次结构中的每一层都缓存来自较低一层的数据对象。例如,本地磁盘作为通过网络从远程磁盘取出文件的缓存,以此类推知道 CPU 寄存器。

    • 对于计算机系统中配置的存储器,归结起来有三个主要的参数要求:容量大,速度快,价格低。存储器的易失性也是计算机存储器的一个重要指标,一般来讲,速度高的存储器,每位价格也高,因此容量不能太大。所以对单一的存储器部件来说,大容量、高速度、低价格三者是不能同时满足的。为了解决这个难题,在现代计算机系统中采用了存储器分层结构,这样就不会仅仅依赖于某一个存储部件或技术了。任意高速存储设备都可以作为低速存储设备的缓存,也是出现存储层次主要原因之一。

  • 特点
    在这里插入图片描述

    • 在存储层次中,存储系统的基本要求是存储容量大、存取速度快和成本低。为同时满足上述三个要求,计算机需有速度由慢到快,容量由大到小的多层次存储器,以最优的控制调度算法和合理的成本,构成存储系统。

    • 在图4-1中,存储层次由上到下呈现出以下特点:每位的价格越来越低,速度越来越慢,容量越来越大,CPU 访问的频度也越来越少。最上层的寄存器通常都制作在 CPU 芯片内,寄存器中的数直接在 CPU 内部参与运算。现代 CPU 内可以有十几个、几十个寄存器,它们的速度最快、位价(平均每位的价格)最高、容量最小。主存用来存放将要参与运行的程序和数据,但其速度与 CPU 速度差距较大,为了使它们之间的速度更匹配,在主存与 CPU 之间插入了一种比主存速度更快、容量更小的高速缓冲存储器 (cache)。主存与缓存之间的数据调动是由硬件自动完成的,对程序员来说是透明的。这三层都在主机内,多由各种半导体存储材料制成。辅助存储器存储容量比主存储器大得多,主要用来存放暂时未用到的程序和数据文件。CPU 不能直接访问辅存,辅存只能与主存交换信息,但它的位价是最便宜的。

    • 存储器的层次结构实质上还是体现为缓存—主存和主存—辅存这两个存储层次上。从CPU 的角度看,缓存—主存层次的速度接近于缓存,容量与每位价格则接近于主存。因此,解决了速度与成本之间的矛盾。而主存—辅存这一层次,从整体分析,其速度接近于主存,容量接近于辅存,平均位价也接近于低速、廉价的辅存位价,这又解决了速度、容量、成本这三者间的矛盾。这种多层次结构已成为现代计算机的典型存储结构。在主存—辅存这一层次的发展中,形成了虚拟存储系统。在这个系统中,程序员编程的地址范围与虚拟存储器的地址空间相对应。例如,机器指令地址码为 32 位,则虚拟存储器的存储单元可达 4GB。可是这个数与主存的实际存储单元个数相比,要大得多。通常称这类指令地址码为虚地址或叫逻辑地址,而把主存的实际地址称作实地址或物理地址。

    • 物理地址是程序在执行过程中能够真正访问的地址,也是真实存在于主存的存储地址。对具有虚拟存储器的计算机系统而言,编程时可用的地址空间远远大于主存空间,使程序员以为自己占有一个容量极大的主存,其实这个主存并不存在,这就是将其称为虚拟存储器的原因。对虚拟存储器而言,其逻辑地址变换为物理地址的工作,是由计算机系统的硬件设备和操作系统自动完成的,对应用程序员是透明的。当虚地址的内容在主存储器中时,机器便可立即使用;若虚地址的内容不在主存,则必须先将此虚地址的内容在辅存中找到,传递到主存储器的合适单元后再被机器所用。主存储器是可以和 CPU 直接交换信息的存储器,它通常由存放程序和数据的随机读写存储器 RAM 和存放某些固定内容的只读存储器 ROM组成。

  
  


总结一下,本篇介绍了C语言的起源、编译原理、存储层次,对后续的学习是有很大帮助的

小僧初来乍到,希望大家多多支持!如有纰漏,欢迎大家在评论区留言,小僧会及时更正,同时,大家如果有疑惑的地方可以把问题写在评论区,小僧看到会回复哟😄!
另外,小僧的公众号上线啦,里面有“实用工具”、“学习资源”以及许多资料,欢迎大家关注一波小僧的公众号👇

在这里插入图片描述
  
  
  
参考:
百度百科
《C语言开发从入门到精通》------王长青、韩海玲

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值