趣谈编程史第2期-这个世界缺少对C语言的敬畏,你不了解的C语言科普

这是我制作的编程语言科普系列视频的第二期,博客根据视频文案整理而成,提供给有需要的朋友阅读或使用.
视频地址:https://www.bilibili.com/video/av83627932/   如果感兴趣可以观看视频,感谢博友.
在华夏文明的历史长卷中,
曾经有一段狼烟四起,群雄逐鹿的特殊历史时期
史称春秋战国
这段时期,诸侯分裂,各自为战,哀鸿遍野,战火连天
贫苦人民生活在水深火热之中
最终秦国招贤纳士,积极变法 
奋六世之余烈 席卷八荒 一统天下
最终结束了这段混乱的时期,
并且统一了文字,货币,语言等等
开创了华夏文明一个崭新的篇章
在编程语言的发展历史中
也有这样一段混乱不堪的时期
这段时期,
在各大公司生产的不同机器上,都搭载着自家独有的汇编语言
而汇编语言和机器绑的死死的,不能通用
这使得不同机器,不同系统之间的交流变得异常困难
此时还没有出现能够兼容不同机器的编程语言
这极大地阻碍了计算机的发展
后来经过多方努力,终于出现了一个通用且于计算机无关的程序设计语言标准
在这个标准下孕育出的最耀眼的一颗明星 
也是目前应用最广泛,影响最深远的编程语言
他就是今天的主人公,C语言 
 
鲁迅先生曾经说过
编程不会C语言,便称英雄也枉然
这期视频我将带你追溯C语言的诞生和发展历史
了解C语言和以java为代表的编程语言之间的优劣
盘点C语言让人又爱又恨的特性
以及分析C语言为何能穿越时空,长盛不衰
这些都是过程,
我的最终目的是希望
那些曾和C语言淡淡交汇,又天各一方的朋友
能够对C语言的有一些重新的认识和一点点敬畏
给你和C语言的关系画上一个圆满的感叹号
因为据我观察周围的朋友对C语言的态度
满满的都是恐惧和误解
我觉得这个世界缺少对C语言的敬畏
 
这是编程语言专题科普系列的第二期
建议你先看第一期,不看的话也没关系,
这是个单元剧,不是连续剧
下面的免责宣言我会连说三期
视频的定位是轻科普,我默认这个视频的观众都是编外人员
我希望用一种有趣下饭的方式能让你在吃着火锅唱着歌的间隙
快速了解一些互联网相关的专业术语和行业趣闻
有劝退门槛的编程知识 我会小心绕过
实在绕不过去我就降维解释
同时我单方面宣布你们也默认这个视频的制作者是一个娱乐up主
编程专题的科普在专业和趣味性上很难把握平衡
在内容不出现滑铁卢的前提下
我还是会尽量追求趣味性
而且 我也不是一个资深C程序员
如果你刚好是一个C语言大神
希望你能抱着微服私访的心态来观看本期视频
就当是到基层来与民同乐吧
 
能点进来看的朋友肯定或多或少的知道C语言这么个东西
因为现在很多大学的非计算机专业,也会开一门课,叫C语言.
凡是学过的都知道 C语言 那真不是个东西
谭浩强这个名字是不是我一提就让在座的诸位虎躯一震
不由的想起当年被C语言支配的恐惧
多少品学兼优,德智体美劳全面发展的好学生
在面对C语言时都突然感觉被制裁了
据我观察 学过C的编外同学大学毕业后很多并不知道自己能干什么
但基本都表示 编程 我不行
其实真实情况是,别说编外人员,
小弟我作为正规军
当年在霍格沃兹学C语言的时候也差点当了逃兵
记得那还是2012年大一的第一堂C语言课
#include <stdio.h>”
这一坨东西的出现让我的人生提前进入了世界末日
那时候真是
感到万飞沮丧,甚至开始怀疑人生
我就亲眼见过上了两次C语言的课就神秘失踪的同学,
真是编程一入深似海,从此君王不早朝
但是 我没有放弃
每一次 我都在徘徊孤单中坚强
后来 经过软磨硬泡的攻坚战 
我终于灵光乍现 豁然开朗
在完成一个变态的编程题目后 我觉得
这个门 我算是入了
我想对所有被渣C伤害过的朋友说
大学没学好C语言
不是我们的问题
是大学老师的问题
谭浩强的问题
 
在介绍C语言的历史前,我们需要先简单回顾一下编程语言的进化之路
编程语言总体上经历了
从机器语言到汇编语言,再到高级语言的进化.
高级语言又可以细分为面向过程和面向对象两种
面向对象的代言人暂时颁发给上期的java
而面向过程的门面当仁不让的要留给本期的主人公C语言
 
在人和计算机两者之间,最靠近计算机的就是机器语言,
因为计算机的电路元件 输入输出只有高低电平,只能表示0和1两个数,也就是二进制
机器语言就是0101二进制的一个指令集合,
它是计算机能识别的语言,机器语言是所有编程语言的归宿
不管你是多么花里胡哨最终都将被转化为机器语言执行
 
在远古洪荒时期,用纸带打孔通过纸带机输入计算机
交给计算机执行,那可是程序员必备技能
但是0101这东西门槛实在太高了,因为看不懂啊,不光别人看不懂,自己也看不懂
当程序员写完的一段机器语言,执行没问题的时候,
此时世界上就只有程序员和计算机能懂,
等程序员吃个午饭回来,就只剩计算机能懂了.
 
后来聪明的程序员定义了一个规则,比如加法指令是00000011,直接映射为ADD,
这下大家都能看懂了.这个就叫汇编语言,
汇编语言的出现大大的降低了编程的门槛,这是第二代编程语言
后来懒惰的程序员又再一次对汇编语言进行改造,
比如把加法指令ADD,直接映射为+号,
把多个复杂的汇编指令,直接用一个语法关键字来定义.
这样门槛就更低了,这就是高级语言.
这就要讲到C语言了.
严格来说,高级语言的鼻祖并不是C语言,
但如果所有的编程语言汇聚一堂拍一个大合照,
你要问前排最中间的位置让谁坐
我想在场的诸位选择应该出奇的一致
都选C
 
根据本视频刚刚发布的编程语言榜中榜的排名来看
C语言目前是世界排名第三的语言
好奇的朋友可能要问了,那前两名是谁呢
聪明的朋友一眼就看出来了,那一定是A语言和B语言
这位朋友不简单,还真让你蒙对了,我们就要从A语言开始说起
 
让我们把时钟拨回到上世纪
50年代末期,汇编语言开始出现
由于汇编是一种面向机器的编程语言
它能直接访问和控制硬件,比如存储器,CPU
执行效率很高 接近于机器语言的水平
同时又比较容易被人理解
因此在当时的市场上大放异彩
但是有个很头疼的问题
不同厂家的CPU都有自己的一套专属的指令集,
这就使得汇编语言没法在不同类型的设备上进行移植
不同机器之间的交流也更是遥不可及
 
1958年,德国的GAMM组织和ACM组织联合发布了一个
通用并且和计算机解耦的程序语言设计规范,
名叫 ALGOL,
这就是我们笑称的A语言,其实没有这样一个官方的叫法
 
1963年,英国的剑桥大学基于ALGOL60的规范推出了CPL语言
后来又对CPL语言做了一些简化和重新设计,推出了BCPL
关于汇编语言介绍两种 
目前还活跃在我们视野中的汇编语言,大概有以下几种
比如8086汇编,win32汇编,win64汇编,AT&T汇编,ARM汇编等等
我们简单介绍两个
你可能听过一个词 X86
8086汇编最早是英特尔公司推出的搭载在8086处理器上的操作指令集
后来英特尔推出了好几款86结尾的处理器, 统称为x86架构
内行的朋友已经知道我第二个要说的是谁了
AT&T汇编,之所以说它,就是要引出AT&T公司
AT&T全称是
美国电视电话公司,创始人贝尔,就是电话的发明者
公司旗下有一个声名远扬的研究部门,也就是贝尔实验室
像晶体管,二极管,太阳能电池,交换机,通信卫星等等等等很多重大发明都出自
贝尔实验室之手,包括后面要说的C语言和Unix操作系统
总之,贝尔实验室是人类智慧精华的杰出代表
在1964年,贝尔实验室和通用电气以及麻省理工合作了一个项目,
给当时的大型主机开发一套多用户,多任务,能7*24小时运行的分时操作系统,
简称 multics,
我们的第一个主人公, 在贝尔实验室任职的KenThompson就加入了该项目
这个项目耗资巨大,但是进度缓慢,
后来几经波折,最终因为资金短缺,以及系统性能不尽人意等种种原因
于1969年宣布破产,贝尔实验室黯然退出
Thompson不仅是汇编大牛也是个游戏狂人,
在开发Multics系统期间,
他用摸鱼的时间在Multics系统上开发了一款叫"space travel"游戏
贝尔实验室退出以后,连同机器也被部门装箱运走了
项目可以流产,游戏不能打烊
汤普森最后在贝尔实验室的库房里找到一台老式PDP-7的机器,
不是GDP 也不是PDD 是一个连操作系统都没有的古董裸机
没有操作系统就没法运行游戏 那咋办 写一个吧
KenThompson是个狠人啊,
他只用一个月就用PDP的汇编语言完成了新操作系统的开发
平均起来差不多
一周一个内核,一周一个文件系统,
一周一个编辑器,一周一个编译器,
使用汇编语言编写的操作系统因为和硬件耦合严重移植困难
后来他改进BCPL,移除了一些自己认为不需要的组件,
又加上了自己的一些编程习惯,开发出了B语言,以BCPL的首字母命名
并且使用B语言重写了这个新的操作系统,取名为UNIX
 
听到这你是不是很想跟我们的主人公汤普森喊一声汤神,或者是佛祖
为了加深你的记忆 我后面就叫他汤神
Unix面世初期 并没有掀起太大波澜
但是引起了汤神的同事,DennisRitchie的兴趣
我们第二个主人公, 也欣然加入到改造Unix系统的队伍中
至此,双剑合璧,一场轰轰烈烈的Unix革命拉开了序幕
 
1972年 他们把Unix系统移植到当时的最先进的大型机PDP-2上
由于Unix系统的简洁稳定和高效
Unix喧宾夺主,代替了当时PDP2上自带的DEC操作系统
 
1973年十月,在IBM举办的操作系统专题研讨会上 
KD两兄弟做了Unix的宣讲并且展示了Unix系统,
引发了整个会场的轰动,大家纷纷涌上来索取Unix系统程序
Unix得到了广泛的应用
 
B语言是一种无数据类型的语言,这使得程序无法方便的访问字符类型,
里奇对B语言就进行了大刀阔斧的改良
比如引入数据类型的概念,最终演化为一个新的编程语言
起初准备把这个新语言命名为NB,意思是new B
可能里奇也觉得新语言太过牛掰,超前,比new B 还是new 
于是以BCPL的第二个字母命名了这个新语言
也是在1973年,C语言终于登上历史舞台了
他来了 他来了 他脚踏祥云走来了
C语言和旧版的Unix发生了完美的化学反应
随着Unix系统摧枯拉朽般席卷市场
至此一个简洁高效优雅可移植的Unix终于在千呼万唤中黄袍加身
C语言一跃成为当时编程语言届最闪耀的一颗明星
 
1978年,那是一个春天,在希望的田野上,里奇正式出版了
旷世名著<C程序语言>,被称作C语言的圣经
 
1982年 ,美国国家标准协会联合一众有志之士,成立了C标准委员会,
从1989年至今,委员会发布了多个C语言标准,为C语言的进化和健康发展做出了很大贡献.
 
1983年,汤普森和里奇携手获得美国计算机协会颁发的图灵奖
,图灵奖被称作是计算机界的诺贝尔奖,象征着计算机领域最崇高的荣耀
 
2011年,C语言之父,Unix之父,达尼斯*里奇去世,享年70岁,
让人感慨的是,里奇并不被世人所熟知
当时并没有引起这个世界的太大的波澜
我们都知道,同一年,乔布斯也因为癌症去世,和里奇仅仅相隔几天而已
全世界在那一天都陷入悲伤的氛围
里奇去世后,计算机历史学家Paul E. Ceruzzi说
 
里奇不被人们知道。他的名字一点也不家喻户晓,但是……
如果你有一台显微镜,能在电脑里看到他的作品,你会发现里面到处都是他的作品
麻省理工大学计算机系的马丁教授说:
如果说,乔布斯是可视化产品中的国王
那么里奇就是不可见王国中的君主
乔布斯的贡献在于,他如此了解用户的需求和渴求
以至于创造出了让当代人乐不思蜀的科技产品
然而,却是里奇先生为这些产品提供了最核心的部件
人们看不到这些部件,却每天都在使用着
 
接下来 我们聊一点干货
C语言有两个地方让人又爱又恨,那就是指针和内存管理
指针是一个很特殊的变量,并不用来存数据,
而是专门用来存放地址,
这个地址需要在内存中申请空间才能装东西
是不是完全听不懂这人在逼逼什么
对很多C语言小白来说,这个指针指着指着就指向了沮丧,奔溃,甚至放弃,
很多人觉得指针的设计很反人类,甚至弊大于利
我冥思苦想了很久想到一个不太恰当但有助于外行理解的比喻 
同学 你玩游戏吗 
如果玩 你玩过英雄联盟吗 
如果玩过 你知道大魔王Faker吗 
如果知道 你见过Faker切屏吗 
如果把游戏地图当做你的整块物理内存
显示器上展示的游戏画面相当于指针指向了其中的一小块内存空间
当你切屏时就是移动了指针,指向了另一块内存空间
faker的光速切屏能让他在对线的同时洞悉整个游戏的战况
这放在C语言中就是能把指针整出花活的编程高手
指针的存在让程序员可以直接操作物理内存,
如果玩的溜,可以写出紧致高效的代码,
同时也给程序员提供了很大的空间来发挥你天马行空的想象力,
如果你掌握了指针,对C语言那就是四个字,爱了爱了
如果卡死在指针这里,多半你就只能感叹,来不了来不了
 
第二个让人诟病的就是内存清理
C语言没有垃圾回收的机制
则意味着你需要手动且及时的清理调不需要的数据,
否则会造成内存溢出,就是内存不够用了,
目前江湖上流传比较广的一个段子是这么说的
去食堂吃饭,吃完饭就走的是java程序员,
吃完饭还要自己收拾的就是C程序员
这个其实说的就是垃圾回收的问题
我也想到一个比喻你可以同时理解指针和垃圾回收机制
 
试想你是一个富婆,你拥有一个100平的衣帽间,
你可以随心所欲的放置你的衣服,鞋和化妆品,
你能准确的找到每一个物品的摆放位置
你想要带走什么东西也可以直接推门进去,拿完就走,简单粗暴
你想扔掉不需要的东西也是顺手的事情.
这就是C语言
 
试想你是一个富婆中的富婆,不仅拥有100平的衣帽间,还专门雇了一个保姆守在守在门口听你差遣
你买的东西直接扔给保姆,她会帮你寄存,
东西放满了保姆需要小心翼翼的挨个判断哪些物品是你从来没用过的帮你扔掉,
你想要什么东西就站在门口吩咐她去拿
这就是java 
这样你其实是省事了,但会带来两个问题
第一你要额外花钱雇佣这个保姆,还要腾出一块地分配给他
第二你在放和取这件事上会消耗额外的时间,本来一个人就能干的人现在需要两个人,效率就变低了
所以C程序员,面对java程序员会有一种优越感,
觉得后者写的代码是没有灵魂的.
 
如果你不是程序员,我猜你可能会说,道理我都懂,
但我还是想吃完饭就走,而且是而且开着我的手动挡
其实这个想法很对
如果内存足够大,运算能力足够强,能够接受这个额外的开销
后者也不失为一个更好的方式
这也是java等语言广受欢迎的一个很重要的原因
将复杂的指针封装成引用的概念,同时提供自动垃圾回收的机制
正是当前新兴编程语言都在做的事情
C语言和java都属于高级语言
C语言离计算机底层更近属于高级语言中的低级语言
以java为代表一众语言都是参考了C的设计,将很多东西封装起来
以更接近于人类的思维来提供语法和功能,他离计算机底层更远
也不用纠结这样编码是不是没有灵魂
当你给你喜欢的姑娘发微信时,
你知道在应用层发生了什么,
网络层发生了什么
数据链路层发生了什么
数据包经过了多少个节点
多少次路由
才最终跨过山河大海达到对方的手机,
你们关心过吗,不,你们没有,
你们关心的只有对方有没有回复
程序员也是如此
编程语言的发展之路也是程序员离计算机底层越来越远的道路
关于垃圾回收,我们听听汤神本人是怎么说的
在编程人生一书中,Seibel就向汤神提了一个这样的问题
你怎么看待垃圾收集 java已最终将垃圾收集技术融入主流语言
这究竟是好是坏,这种技术是否应该成为主流
汤神回答说,
对这个话题,我有完全相反的两个答案,如果你正在编写操作系统
或者C语言的编译期,或者是会被很多很多人使用的东西
我认为垃圾收集多半是一个错误的选择
用它是自欺欺人,因为你完全可以手动去做,而且效果要好的多
用它无异于毁了你的任务,你的工作,让你的用户用起来更慢
那根本不适合操作系统
但如果你在编写一个简单程序,完成一个小任务,有了答案编将程序扔掉
那是很棒的,他剔除了一层你并不想深究的东西,这个代价你可以接收
计算机是如此之快,使用它可以达成一个多方共赢的局面
 
现在已经是个性能过剩的时代,因此让java这样的语言大行其道
但是在上世纪可没有这么好的硬件资源给你造,
对性能的追求是一种"极客"精神的体现
这也是属于C语言骄傲的倔强
 
海阔凭鱼跃,天高任鸟飞
C语言可以说是目前应用最广泛,影响最深远的编程语言.
在各个领域都大放异彩.
市面上几乎所有的编译器,底层都是由C语言实现,
包括java,Python,ruby等等
市面上几乎所有的操作系统内核,
底层都是由C语言实现,包括你的手机平板笔记本.
还有各种驱动,嵌入式设备,单片机
在这方面上,其他编程语言,有一个算一个
都得认怂
编程语言一条街 打听打听谁是爹
不仅如此,由于C语言很多特性尤其是集大成者的指针
极端一点,我甚至可以这么说
上至九天揽月,下到五洋捉鳖
只有你想不到,没有C语言做不到
 
虽然我对C语言有崇高的敬意
但如果你是一个编程的小白,
没有经过计算机基础学科的滋养
并且正在考虑学习一门编程语言
作为过来人,我个人并不建议你上来就学C语言
我甚至觉得 大学专业都不应该在大一安排C语言的课程
我怀疑开这个课就是为了让你们不要误入歧途
学C语言有个现象 学会了的人太健忘
没有学会的人又太懵懂
这就导致了
不会的人去问大神C语言为什么这么难
会有无数的声音告诉你
我觉得C语言很好学啊,语法简单,比Java容易多了
言外之意就是 哦 你不会啊 那你怕不是个智障吧
C语言的指针,回调,递归等等都需要耗费很大的心力去攻克
花花世界,有很多简单易学的编程语言楚楚待撩
捏软柿子并不丢人
人生苦难
你懂我意思吧
当然以上只是我个人的观点
跟我本人无关
 
既然C语言这么重要 你可能要问
如果没有C语言,整个互联网体系岂不是尽失半壁江山,
这么同学,你这种危言耸听的想法确实是有点保守了
小弟认为,如果没有C语言,整个互联网体系会瞬间崩塌
 
C语言就像是河流发源地的一眼清泉 
出生于极寒之地,成长在崎岖山间
奔跑在时间的长河里,不断汇聚能量,开枝散叶
不仅孕育出了众多的编程语言
也驱动着互联网这座巨轮劈波斩浪,无畏前行
说C语言供养着现代商业文明体系也不为过
如今在各个领域已经有很多年轻有为的编程语言脱颖而出,
声势浩大,雄踞一方
面对着飞速发展的时代和一众跃跃欲试的小鲜肉语言
C语言这个钢铁直男已经开始退居幕后
但是这并不意味着底层离社会发展会越来越远
恰恰相关 这会让C语言的作用更加重要
底层的世界依然是广阔天地,大有作为
当我们面对只有简陋硬件,需要极致性能,
或者一些其他语言都束手无策的场景时
它总是能及时站出来,轻描淡写的说
稳住别送 这把我C
当大家打开由C语言实现了内核的Windows或Mac操作系统
操作着由C语言实现了驱动的键盘和鼠标
使用着由C语言实现了底层的网络通信协议
和网友讨论谁是世界上最好的编程语言时
C语言只是微微一笑,便默不作声
继续向前奔流
 
当我们追溯编程语言的历史时,C语言是一座无法绕过的丰碑
牛顿站在了巨人的肩膀上,
如今,我们都站在C语言的肩膀上
作为编程语言界的元老成员,
C语言生于旧社会,长在红旗下
走在春风里,准备跨世纪
当然,是下一个世纪,
我们都知道C语言不会死,他的热血依然滚烫
而它的归宿就在前方
那就是星辰大海
 
posted @ 2020-01-16 11:55  冬至饮雪  阅读(1250)  评论(4编辑  收藏  举报