C语言起源、特性和发展历程

news2024/11/23 0:42:29

本文从ALGOL 60语言谈起,简述C语言的起源和发展历程,然后对C语言的一些特性做了探讨,最后说说C语言为什么在众多编程语言中,起到了承上启下的作用。

本文介绍以下内容:

  • C语言的起源
  • C语言的发展
  • C语言的特性
  • C语言的重要性

C语言的起源

C语言的前身是B语言,B语言的英文全称是Basic Combined Programming Language,简称BCPL,它是一种早期的高级语言,1967年由剑桥大学的计算机科学家马丁·理察德在CPL语言上改进而来,下面我们聊一聊C语言的进化过程。图1-1描述了C语言的起源。

 

图 1-1 C语言的起源

CPL是1963年由英国剑桥大学研发的一种编程语言,实际上CPL语言也不是横空出世,它是在ALGOL 60语言基础上发展而来,ALGOL 60采用了结构化程序设计和模块,并提出了函数、递归、巴克斯范式、结构体等现代程序设计思想,可以说ALGOL 60是程序设计语言发展史上的一个里程碑。

ALGOL 60最大的缺点就是缺乏标准的输入输出能力,使用ALGOL 60编写的程序无法兼容不同的计算机外部设备,导致ALGOL 60最终失败。

ALGOL 60并没有随着它的命运一起终结,英国剑桥大学在ALGOL 60的基础上研发了CPL语言,CPL催生了BCPL语言,而 BCPL 语言又进一步发展成为 C 语言。

C语言的发展

美国贝尔实验室在1970年对BCPL语言进行了修改和扩充,将修改和扩充的语言命名为B语言,并使用B语言写了第一个UNIX操作系统。1973年美国贝尔实验室对B语言又进行了改进,改进后的语言被命名为C语言,并使用 C 语言成功重新编写了UNIX内核。使用 C 语言编写内核的 UNIX 版本非常稳定,并且具有良好的可移植性,展现了 C 语言与 UNIX 的完美结合及 C 语言在编写系统软件时得天独厚的优势。

重写后的UNIX系统在一些研究机构、大学、政府机关开始慢慢流行起来,并带动了C语言的发展,1978年《The C Programming Language》出版,又进一步推动了C语言的普及。

从70年代开始,C语言被广泛应用,也衍生了C语言很多不同的版本,为了统一C语言版本,1983年美国国家标准局(英文简称ANSI)开始制定C语言标准,标准于1989底完成,在1990年春季发布,这个标准称为“ANSIC”标准,因为该标准在1989完成,因此也称为“C89”标准。

“ANSIC”标准在1990年被ISO采纳为国际标准,称为“ISOC”标准,同时也被称为“C90”标准,ANSIC(C89)和ISOC(C90)内容基本相同,主要区别在于制定C标准的组织不同而已。

1999年ISO对“C90”标准进行了扩充,增加了语言和标准库功能,增强了数值处理能力,该标准被称为“C99”标准,同时该标准在2000年被ANSI采纳。

当前最新的C语言标准是“C11”标准,由ISO制定并发布。图1-2描述了C语言标准发展历程。

 

图 1-2 C语言标准发展历程

C语言的特性

C 语言是一门工程实用性极强的语言,提供了对操作系统和内存的精准控制,编译后的程序运行效率相比Java、Python等语言要高效的多,对理工科学生来说它也是一门必修课。C语言的特点概况如下;

  1. C语言是一种结构化语言,层次清晰,便于模块化方式组织程序,易于调试和维护。
  2. C语言功能强大,程序运行效率高,计算机操作系统一般都由C语言编写而成,如Windows操作系统、Linux操作系统。
  3. C语言数据结构丰富,能实现各种复杂的数据类型的运算,引入指针可以直接操作硬件,把高级语言的基本结构和语句与低级语言的实用性结合起来。
  4. C语言可移植性强。它适合于多种操作系统编程,如Windows、DOS、UNIX、Linux等等,在一种系统中编写的C程序稍作修改或不修改就能在其它系统运行。
  5. C语言允许直接访问物理地址,能进行位(bit)操作,可以实现汇编语言的大部分功能,直接对硬件进行操作,特别适合于编写嵌入式程序和控制硬件的程序。

C语言的重要性

C语言在编程语言中属于系统级语言,几乎所有的操作系统内核都用到了C语言,例如: Windows、Linux、macOS 等等。只有学会了C语言,才能更好掌握数据结构、计算机组成原理、操作系统等计算机专业课程。另外,Java、C++、C#、Python、Go等语言都受到了C语言的影响,掌握了C语言,再学习其它高级语言就会容易得多,C语言在众多编程语言中,起到了承上启下的作用。

在人工智能、大数据、物联网持续发展的今天,嵌入式开发愈来愈重要,由于嵌入式开发技术门槛高,嵌入式开发人才缺乏,企业对嵌入式开发工程师需求旺盛。要学习嵌入式开发,必须要掌握C语言,C语言是开发嵌入式程序的基础。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

外卖项目优化-01-redis缓存短信验证码、菜品数据

文章目录 外卖项目优化-01课程内容前言1. 环境搭建1.1 版本控制解决branch和tag命名冲突 1.2 环境准备 2. 缓存短信验证码2.1 思路分析2.2 代码改造2.3 功能测试 3. 缓存菜品信息3.1 实现思路3.2 代码改造3.2.1 查询菜品缓存3.2.2 清理菜品缓存 3.3 功能测试3.4 提交并推送代码…

AutoGPT安装教程

最近安装AutoGPT时遇到了一些问题,写下这篇文章记录一下 1 下载AutoGPT AutoGPT链接:https://github.com/Significant-Gravitas/Auto-GPT/tree/v0.2.2 下载AutoGPT 推荐下载stable 版本 2 申请openai 的api key 获取api的key,这里就不介…

【超算/先进计算学习】日报8

目录 今日已完成任务列表遇到的问题及解决方案任务完成详细笔记阶段一阶段二阶段三阶段四 对自己的表现是否满意简述下次计划其他反馈 今日已完成任务列表 超算/高性能计算总结 遇到的问题及解决方案 无 任务完成详细笔记 阶段一 在学习的第一阶段,我们首先对需要…

ChatGPT+智能家居在AWE引热议 OpenCPU成家电产业智能化降本提速引擎

作为家电行业的风向标和全球三大消费电子展之一,4月27日-30日,以“智科技、创未来”为主题的AWE 2023在上海新国际博览中心举行,本届展会展现了科技、场景等创新成果,为我们揭示家电与消费电子的发展方向。今年展馆规模扩大至14个…

【pytest里的参数化:看几个例子就够了!】

参数化多个参数:可以使用多个参数来参数化测试。例如: import pytestpytest.mark.parametrize("x, y, expected", [(1, 2, 3),(3, 4, 7),(5, 6, 11), ]) def test_addition(x, y, expected):assert x y expected参数化列表:可以…

轻叶H5营销单页,让你的营销更加清爽高效

网络营销就是营销企业品牌形象、产品信息发布、优惠促销活动,最终目的就是争抢流量和客户。现在为了吸引流量,各种营销方式、广告玩法层出不穷,成本投入大,带来的转化不一定好。今天,我们要来讲一讲H5营销单页。 H5营销…

项目管理软件project下载安装配置图文教程

目录 前言 配置安装过程 总结 前言 Project是一种计划、组织和管理任务的工具,通常用于团队协作和项目管理。它可以帮助用户创建任务列表、分配任务、设置截止日期、跟踪进度、分析数据等。Project还可以生成各种报告,如甘特图、资源使用情况、任务分…

稀疏矩阵存储格式总结

稀疏矩阵是指矩阵中的元素大部分是0的矩阵,实际问题中大规模矩阵基本上都是稀疏矩阵,很多稀疏度在90%甚至99%以上,大规模的稀疏造成了大量无效数据的计算和存储资源占用,也无法有效的载入有限内存计算。因此我们需要有高效的稀疏矩阵存储格式…

SpringCloud:ElasticSearch之数据同步

elasticsearch中的酒店数据来自于mysql数据库,因此mysql数据发生改变时,elasticsearch也必须跟着改变,这个就是elasticsearch与mysql之间的数据同步。 1.思路分析 常见的数据同步方案有三种: 同步调用异步通知监听binlog 1.1.同…

Nacos配置中心的详解与搭建

Namespace 简介 用于进行租户粒度的配置隔离,不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置 配置Namespace 点击nacos的命名空间——点击新建命名空间 开发环境【dev】测试环境【test】正式环境【prod】 DataID 简介 Data ID 通常用于…

Node.js 下载与安装教程

文章目录 Node.js 下载Node.js 安装npm 配置配置node_path修改用户变量更换npm源为淘宝镜像全局安装基于淘宝源的cnpm Node.js 下载 1.进入nodejs官网:https://nodejs.org/en 2.单击downloads 3.此时滑动滚动条,找到并单击 previous release 4.在此页…

<C++>lesson1.C++入门上

文章目录 1. C关键字(C98)💚2. 命名空间🤎2.1 命名空间定义2.2命名空间的使用 3. C输入/输出🖤4.缺省参数💙4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载❤️5.1 函数重载的概念5.2 C支持函数重载的原理 6. 引用💜6.…

Day4_Springboot集成Mybatis

上一节使用springboot框架搭建了项目,并创建了数据库user表,接下来集成mybatis对用户表实现增删改查操作~~~~ 目录 SpringBootApplication.java 创建model/entity文件夹,存放实体类 UserDao.java UserController.java 浏览器Json插件&am…

Leetcode刷题日志3.0

目录 前言: 1.相对名次​​​​​​ 2.学生出勤记录 I 3.重塑矩阵 4.分糖果 5.最长和谐子序列 6.种花问题 前言: 今天我就分享一下最近在leetcode刷到的题,希望对大家有所帮助。编程语言:Python3。好了废话不多讲了&…

消息队列使用场景介绍

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题 实现高性能,高可用,可伸缩和最终一致性架构 使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Ka…

【华中农业大学2023年十二届程序设计竞赛(同步赛)】B. 写信

文章目录 题目描述思路代码 题目描述 思路 错位排序,可搜索引擎。复杂度太高 递推式: f [ n ] ( n − 1 ) ∗ ( f [ n − 1 ] f [ n − 2 ] ) f[n](n-1)*(f[n-1]f[n-2]) f[n](n−1)∗(f[n−1]f[n−2]) 正解:打表!YYDS 1e9的数…

12.Hadoop练习题

1.网络问题 (1)机器联网出现问题 情况:ping一下百度,发现百度ping不通 sudo vim /etc/sysconfig/network-scripts/ifcfg-ens33检查GATEWAY是否正确,修改过来之后保存退出,重启虚拟机 sudo systemctl re…

图论 (Java) 从入门到入土 /第一部分 图的基础-图的定义/

零.前言 图,是一种比较复杂的数据结构。和树的一个节点只和上层一个节点相连不同,在图中,任意两个节点都可能相连,且可能具有方向性,并且节点的边具有权重,因此,图被用于描述各种复杂的数据对象…

python:tkinter 生成 buttonBar 示例

tk_test1.py # -*- coding: utf-8 -*- import os import tkinter as tk from tkinter import filedialogroot tk.Tk() root.title("生成 buttonBar 示例 ") var tk.StringVar() # 动态字符串 label tk.Label(root, textvariablevar) listbox tk.Listbox(root, s…

题集-快慢指针的应用(链表)

1.中心结点 代码: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* middleNode(struct ListNode* head) {if(head->nextNULL) return head;struct ListNode* fast head,*slow …