1-01初识C语言

一、概述

C语言是贝尔实验室的Ken Thompson(肯·汤普逊)、Dennis Ritchie(丹尼斯·里奇)等人开发的UNIX 操作系统的“副产品”,诞生于1970年代初。

Thompson和Ritchie共同创作完成了Unix操作系统,他们都被称为**“Unix之父”**。

如果你非要较真谁才是“C语言之父”,那么普遍而言,Dennis Ritchie被认为是**“C语言之父”**。

为了表彰他们在**“Unix操作系统的设计和实现,以及与之相关的C语言的开发”上的贡献,Dennis Ritchie 和 Ken Thompson 在1983年共同获得了图灵奖**。

Thompson(左)和Ritchie(右)

除此之外,Thompson还是“UFT-8编码”和“Go语言”的主要发明设计者。

二、C语言历史

2.1 诞生

上世纪60年代末,Thompson独自编写出了最初版本的Unix操作系统。Unix系统最初是用汇编语言编写的,用汇编语言编写的程序往往难以调试,也不易于进行扩展和移植。

Thompson意识到需要用一种更加高级的编程语言来完成Unix系统未来的开发,于是他设计了一种小型语言——B语言。B语言是在BCPL语言(20世纪60年代中期产生的一种系统编程语言)的基础上,简化开发而来的。

不久,Ritchie也加入到Unix项目中,并且开始着手用B语言编写程序。1970年,贝尔实验室为Unix项目争取到一台PDP-11计算机(一款在70年代非常成功的小型计算机)。当B语言经过改进并能够在PDP-11计算机上运行后,Thompson用B语言重新编写了部分UNIX代码。

到了1971年,B语言由于效率和功能上的局限性,已经明显不适合PDP-11计算机了,于是Ritchie着手开发B语言的升级版。最初,他将新开发的语言命名为NB语言(意为“New B”),但是后来新语言越来越偏离B语言,于是他将其改名为C语言。

这样C语言就诞生了,C语言的前身是B语言,而C语言的发明者是Dennis Ritchie。

到了1973年,C语言已经基本完善和稳定,Ritchie和Thompson把Unix系统的大部分组件都使用C语言进行了重写。这既证明了C语言在系统编程上的强大功能,也奠定了Unix系统的地位。

使用C语言重写Unix是一个关键决策,它为Unix的成功和普及打下了坚实的基础,使得Unix成为了一个扩展性强、可移植性强、易于开发维护的操作系统。

2.2 发展

1978年,Dennis Ritchie和Brian Kernighan(布莱恩·克尼汉)共同出版了书籍《C编程语言(The C Programming Language)》。这本书中描述的C语言版本经常被称为**“K&R C”**,可以认为这是最早的统一C语言版本。

图 3. Kernighan(左)和Ritchie(右)Kernighan(左)和Ritchie(右)

到了80年代,C语言走出贝尔实验室,被广泛使用。不同的机构间,往往会在原有基础上自己扩展一些C语法,这就是“C方言”。

为了确保C语言的一致性和可靠性,美国国家标准协会(ANSI)于1983年设立了一个委员会来标准化C语言。最终,该组织在1989年推出了ANSI C标准,也称为C89或ANSI C

不久之后,到了1990年,国际标准化组织(ISO)采纳了这一标准,并在1990年发布了这个C语言版本,被称为C90。**事实上,C89和C90就是两个相同的C语言标准,只是由不同的组织在不同的时间发布罢了。**C89/C90是第一个官方统一标准认证的C语言版本。

在这之后,C语言的官方标准版本的发布,都由ISO机构下的C语言相关工作组WG14完成。

1999年,C99发布。引入了如内联函数、新的数据类型、变长数组等新特性。

2011年,C11发布。增加了并发支持、类型通用宏、静态断言等新特性。

2018年,C18发布。主要是对C11进行小维护和小修正,没有引入新特性。可以认为C18就是C11的小更新版本。

在实际的应用中,C99虽然年代久远,但稳定可靠且足够好用,是比较常用的C语言版本。

除此之外,C11增加了对现代计算机操作系统的支持,特别是关于线程、并发部分的支持,所以在需要这些特性的C语言程序中,会优先选择C11。

总得来说,到目前为止,C99和C11在商业环境中是最常用的版本。

在我们的课程设计中,第一周的C语言部分我们只学习最基础的C语言语法,并不会涉及到C11的新特性。所以第一周学习C语言的课程将采用C99作为学习的C语言版本。

三、C语言的优点/优势

当今互联网世界是建立在C语言的基础上的

例如:

  1. 操作系统。C语言设计的初衷就是用来编写操作系统,目前所有的主流操作系统内核,所采用的编程语言都是C语言。
  2. 网络协议栈。一般和内核采用相同的语言实现,也就是C语言。
  3. Web服务器/HTTP服务器。Apache、Nginx主要由C语言编写。Tomcat(Java编写,仅运行Java应用)
  4. 关系型数据库。PostgreSQL、SQLite主要由C语言编写。MySQL(C/C++)
  5. 非关系型数据库。Redis主要由C语言编写。MongoDB(C++)、Elasticsearch(Java)

C语言是一门接近"低级语言"的"中级语言"

所谓"中级"编程语言,是要比较的,参看下图:

图 4. C语言是"中级语言"C语言是"中级语言"

这意味着C语言有以下优点:

  1. **C语言是一门接近硬件层面的编程语言,提供了接近硬件的操作能力。**C语言通过提供直接内存访问、指针操作和系统调用等功能,允许程序员以接近硬件的方式编写代码。这种能力使得C语言特别适用于嵌入式系统开发以及系统级编程。
  2. C语言拥有在所有编程语言中几乎独一档的高运行效率。
    1. C语言提供了接近硬件的操作能力,这意味着C程序可以更好的利用硬件资源。
    2. C语言编译器将源代码直接编译成机器代码(或非常接近的汇编语言),而非解释执行或编译为中间代码。
    3. **C语言还提供了各种特性使得程序员可以控制优化C程序的几乎每一个细节。**比如C语言的手动内存分配控制,这意味着可以精确地管理资源使用,从而提高效率。
    4. 在平均一般情况下,如果一个C程序的执行速度是100%,那么:
      • C++可能由于复杂性的影响,性能会轻微下降,一般是95%左右。
      • Java由于JVM等特性的影响,运行效率一般低于C/C++,大概在50%-80%范围内。
      • Python是一种脚本语言,需要解释执行,效率很差。可能在5%-30%之间。
  3. **C语言的语法非常简洁,没有太多复杂的特性。**作为一门接近硬件的编程语言,C语言的抽象层次很低,没有很多高级的抽象特性。这使得C语言简单易学,同时对于想要深入理解计算机原理的人来说,C语言的低抽象性也可以使得学习者可以更好的忽略语言特性,关注具体原理。
  4. C语言作为一门"中级语言",市面上流行的编程语言基本都可以找到它的影子(C-like语言),所以学习C语言对于学习其他编程语言也有很大的帮助。

C语言是一门从诞生到现在,一直都非常流行的编程语言

C语言的生命力旺盛,从诞生到如今始终都是最流行的开发语言之一。

可以参考:TIOBE世界编程语言排行榜

四、C语言的缺点

很多时候,一个优点往往同步带来一些缺点,C语言实际上是一门缺点很明显的编程语言。正如丹尼斯·里奇(Dennis M. Ritchie),C语言的主要发明者,曾经评价C语言说:

C is quirky, flawed, and an enormous success.

这句话直译为:“C语言是古怪的、有缺陷的,但同时取得了一个巨大的成功。”

C语言有以下突出的缺点:

  1. **C语言是一门非常容易出错,却非常不容易发现错误的编程语言。**这主要是因为:
    1. C语言的语法相对非常宽松和灵活,给予了程序员很大的自由度,但出错的概率也大大增加了。
    2. C语言给程序员很大的自主性和控制权限,但即便是熟练的C程序员也无法保证能够完美的控制程序。比如内存管理,手动的内存管理不仅增加了编程的复杂性,而且非常容易出错,如内存泄漏和使用未初始化的内存导致未定义行为。
    3. C语言追求效率,所以没有专门的异常机制来指示程序出现的问题。C程序甚至不会去检查数组下标越界的问题。
  2. C语言缺少一些必要的高级特性,使得C程序的可维护性很差。一个复杂的C程序,如果在设计之初没有考虑到维护问题,那么将很难对它做出修改或扩展。(这也是C++出现的目的)
  3. 相比较现代的高级语言,C语言经常可以写出可读性十分差的代码。
    1. 这一方面是由于C语言作为一门小型语言,它缺乏一些现代高级语言中的特性,并且其标准库相对较小。因此,程序员往往需要自行编写复杂的代码实现,这些代码对于其他人可能难以理解。
    2. 另一方面,C语言诞生于编程发展的初期,那时的编程哲学倾向于代码的极致简洁性。这种风格有时会导致代码过于晦涩难懂,尤其是当程序员过分追求聪明的技巧时,可能会编写出只有自己能理解的代码。
    3. 在现代编程中,尤其是团队协作环境下,高度重视代码的可读性和维护性。因此,在我们的课堂上,我们会强调编写清晰易读的C代码,而不是单纯追求代码的简洁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/299150.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解析数据链路层——组帧

组帧是数据链路层的重要功能之一,它将较长的数据分割成较小的帧以便在网络中传输。在本文中,我们将深入探讨组帧的概念、目的以及常见的组帧技术。 组帧是将数据封装成具有一定格式的帧的过程。帧是数据链路层传输的基本单位,它包含了有效数…

模糊综合评价

第一步:确定评价指标集 确定评语集:如好,很好 第二步:求出模糊评价矩阵P 其中Pij表示方案X在第i个指标处于第j级评语等等隶属度 并且在此阶段需要确认各指标的权系数向量A 第三步:利用矩阵的模糊乘法得到综合评价…

InternLM第2节课作业

基础作业 使用 InternLM-Chat-7B 模型生成 300 字的小故事 熟悉 hugging face 下载功能,使用 huggingface_hub python 包,下载 InternLM-20B 的 config.json 文件到本地

【算法专题】FloodFill 算法

FloodFill 算法 1. 图像渲染 题目链接 -> Leetcode -773.图像渲染 Leetcode -773.图像渲染 题目:有一幅以 m x n 的二维整数数组表示的图画 image ,其中 image[i][j] 表示该图画的像素值大小。 你也被给予三个整数 sr, sc 和 newColor 。你应该从…

腾讯云轻量应用服务器可以一次性买三年,2核2G4M和2核4G5M

腾讯云优惠之轻量应用服务器3年优惠价格表,目前可以买三年的轻量配置为2核2G4M和2核4G5M,2核2G4M价格三年价格540元,2核4G5M带宽三年756元,当然也可以选择购买一年,第二年续费会比较贵,腾讯云轻量2核2G4M服…

Unity中Shader面片一直面向摄像机(实现思路)

文章目录 前言一、实现思路1、 我们要实现模型面片一直跟着摄像机旋转,那么就需要用到旋转矩阵2、确定 原坐标系 和 目标坐标系3、确定旋转后坐标系基向量 二、确定旋转后 坐标系基向量 在 原坐标系 下的值1、Z轴基向量2、假设Y轴基向量 和 世界空间下 的Y轴方向一致…

SpringCloud-高级篇(十二)

在主从集群中slave节点发生了宕机,不用担心,只要它重启就能从master节点上完成数据的同步,恢复数据,如果宕机的不是slave而是master,是不是master重启就可以呢?如果你做了master节点的数据持久化&#xff0…

如何在GitHub正确提PR(Pull Requests),给喜欢的开源项目贡献代码

最好的中文TTS项目Bert-vits2更新了中文特化分支,但可能由于时间仓促,代码中存在不少的bug,作为普通用户,有的时候也想为自己喜欢的开源项目做一点点贡献,帮助作者修改一些简单的bug,那么该如何开始&#x…

阿里云服务器Centos安装宝塔面板

阿里云服务器Centos安装宝塔面板 1 背景1.1 aliyun1.2 Linux 2 安装步骤2.0 环境配置2.1 安装前准备2.2 宝塔安装2.3 建站 3 centos常用命令3.1 防火墙相关 1 背景 1.1 aliyun 阿里云服务器是阿里云提供的一项云计算服务,它能够帮助用户快速搭建网站、应用和服务&…

大模型机器人原理解析:如何从RT/RT2、Berkeley Gello到发展到斯坦福Mobile ALOHA、Google家务机器人

前言 23年7月,我在朋友圈评估Google的RT2说道: “大模型正在革新一切领域啊,超帅,通过大模型不仅能理解“人话”,还能对“人话”进行推理,并转变为机器人能理解的指令,从而分阶段完成任务。回…

Spring Boot 整合 MinIO自建对象存储服务

GitHub 地址:GitHub - minio/minio: The Object Store for AI Data Infrastructure 另外,MinIO 可以用来作为云原生应用的主要存储服务,因为云原生应用往往需要更高的吞吐量和更低的延迟,而这些都是 MinIO 的优势。安装过程跳过。…

3C电子制造:智慧物流引领产业升级

在当今科技飞速发展的时代,3C电子制造行业正面临着一系列挑战和机遇。市场需求的多变和技术革新的加速,使得企业必须不断创新和升级。在这个过程中,智慧物流成为了一个关键的环节,它能够有效地提高生产效率、降低成本并增强企业的…

Maven之多环境配置与应用

多环境配置与应用 1. 多环境配置作用 maven提供配置多种环境的设定&#xff0c;帮助开发者使用过程中快速切换环境 2. 多环境配置步骤 2.1 定义多环境 <!--定义多环境--> <profiles><!--定义具体的环境&#xff1a;生产环境--><profile><!--定义…

使用Docker-Compose部署MySQL一主二从同步高可用MHA集群

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容准备mysql一主二从同步集群一主二从同步集群规划需要安装docker和docker-compose命令形式安装安装docker安装docker-compose 宝塔面板形式安装 部署Master节点的docker-compose.yaml文件部署MySQL从节点1的docker-compose.…

学习JavaEE的日子 day10 一维数组的深入,二维数组

day10 1.eclipse的使用 Eclipse是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于开发Java应用程序。 1.项目&#xff08;Project&#xff09;&#xff1a;项目是为满足特定需求而创建的代码文件集合。一个工作区可以包含多个项目&#xff0c;而您…

7+非肿瘤+WGCNA+机器学习+诊断模型,构思巧妙且操作简单

今天给同学们分享一篇生信文章“Platelets-related signature based diagnostic model in rheumatoid arthritis using WGCNA and machine learning”&#xff0c;这篇文章发表在Front Immunol期刊上&#xff0c;影响因子为7.3。 结果解读&#xff1a; DEGs和血小板相关基因的…

Jupyter Lab 入门指南:基础篇

&#x1f31f;&#x1f30c; 欢迎来到知识与创意的殿堂 — 远见阁小民的世界&#xff01;&#x1f680; &#x1f31f;&#x1f9ed; 在这里&#xff0c;我们一起探索技术的奥秘&#xff0c;一起在知识的海洋中遨游。 &#x1f31f;&#x1f9ed; 在这里&#xff0c;每个错误都…

深入理解计算机硬件存储体系结构

文章目录 深入理解计算机硬件存储体系结构前言&#xff1a;一、寄存器&#xff1a;计算机的最快存储器二、高速缓存&#xff1a;缓解主存储器和CPU速度不匹配的瓶颈三、主存储器&#xff08;RAM&#xff09;&#xff1a;临时存储程序和数据四、辅助存储器&#xff1a;永久存储数…

2024PMP考试新考纲-【人员领域】近期典型真题和超详细解析(5)

今天华研荟继续为您分享PMP新考纲下的【人员People领域】近年真题&#xff0c;帮助大家举一反三&#xff0c;一次性通过2024年的PMP考试。 2024年PMP考试新考纲-【人员领域】真题解析21 题&#xff1a;项目经理正在为一个项目工作。该项目由于人员流动&#xff0c;相关方登记册…

linux 01

01.使用的版本 国内主要使用的版本是centos 02.centos官网 www.centos.org