范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

C语言名称怎么来的?有A和B语言吗?没A语言有B语言,正是C的源头

  C语言是在B语言的基础上发展起来的。
  C的根源是ALGOL 60,1960年ALGOL 60是一种面向问题的高级语言,离硬件比较远,1963年的时候推出了CPL语言,CPL在ALGOL 60的基础上更接近硬件一些,但很难实现,1967年,对CPL语言做出了简化,推出了BCPL语言,1970年又对BCPL语言为基础,又做出了进一步的简化,设计出了很简单的的而且接近硬件的BCPL语言简称B语言(BCPL的第1个字母),并且用了B语言编写的第1个UNIX操作系统,在PDP 7上实现,此时的B语言过于简单,功能有限,在1972-1973年间,D.M.Ritchie在B语言的基础上设计出了C语言(BCPL的第2个字母),C语言保持了B语言的优点(精炼,接近硬件)又克服了缺点(过于简单,数据无类型等)。它就经受住了时间的考验,在许多情况下仍然是最流行的编程语言之一。
  Basic Combined Programming Language(BCPL),1967年由剑桥大学的Matin Richards在同样由剑桥大学开发的CPL语言上改进而来。BCPL最早被用做牛津大学的OS6操作系统上面的开发工具。后来通过美国贝尔实验室的改进和推广成为了UNIX上的常用开发语言。
  BCPL有些类似于Fortran,也是典型的面向过程的高级语言。BCPL的语法更加靠近机器本身,适合于开发精巧,高要求的应用程序,同时对编译器的要求也不高。BCPL也是最早使用库函数封装基本输入输出的语言之一,这使得他跨平台的移植性很好。BCPL的代码用小写字母书写,有别于同时代的BASIC和PASCAL。BCPL对于字符串的支持很差,内存管理也很糟糕。
  BCPL本身并没有被使用太长时间。1970年,贝尔实验室的Ken Thompson在BCPL的基础上改进出了B语言,用于书写UNIX。这个名字取自BCPL中的第一个字母。B语言使用的时间更短,三年后的1973年同样是贝尔实验室的D.M.RITCHIE将B语言进一步改进,并且取了BCPL中的第二个字母将其命名为C语言。而C语言和C++则在日后成为了最流行的高级语言。
  B语言之父和C语言之父是同事,UNIX的作者
  1964年,美国麻省理工、贝尔实验室、通用电气准备为GE-645大型机开发一套多人多任务操作系统MULTICS。
  参与研发的一位贝尔实验室研究员肯·汤普森搞了一台废弃的DEC PDP-7计算机,PDP-7字长为18位,其标准主内存为4K字(相当于9千字节),可以升级到64K字(144 KB)。
  DEC PDP-7
  肯·汤普森伙同好友丹尼斯·里奇在上面研发了一个操作系统
  丹尼斯·里奇
  虽然这个操作系统比较简陋,但公认是UNIX操作系统的雏形。已经显示出Unix的一些基本特征——简洁、高效、比当时所有的操作系统都更注重交互性、对程序员友好。具备一个简陋的文件系统,有特殊的文件类型及支持目录和设备,甚至可以支持多任务。它的核心是用汇编写的(汇编器也是肯·汤普森自己写的),不具备可移植性。只支持两个用户。
  这个系统除了使用汇编语言之外,还是用了一种在BCPL语言基础上由肯·汤普森发明的B语言。叫B语言,就是把BCPL精简提炼的意思。
  B语言不支持数据类型和结构,接近底层。后来丹尼斯·里奇在B语言的基础上增加了数据类型和结构的支持,推出了C语言(意思是"BCPL"中排在B之后)。
  肯·汤普森1970年借为贝尔实验室专利部开发一套文字处理系统的机会,搞到了一台PDP-11/20。他们把UNIX从PDP-7上移植了过来,汇编写的代码没什么可移植性,所以基本上就是在PDP-11上重写了一次,让C语言有了大显身手的用武之地,也是第一次使用高级语言开发操作系统。
  贝尔实验室成了Unix的第一个商业用户,这是在1971年11月,在与系统配套的手册中,该版本被称做"First Edition"。
  这么好用的东西在业界引起了极大反响,无论是UNIX还是C语言,成了当时计算机科学界研究的热门。两位大神也从来不敝帚自珍,不但利用贝尔实验室无法限制UNIX版权大量邮寄这款操作系统给当时的同仁,还经常帮助他们解决安装使用UNIX中遇到的问题。
  同时,计算机科学家和工程师们也不断对UNIX添砖加瓦,各路大神编写了各种Unix版本和各种Unix-like操作系统,其中有 Linus Torvalds 用C语言写的Linux。
  B语言之父还是Go语言之父
  后来肯·汤普森又在谷歌写出了go语言代替c语言与python,谷歌的文化是提倡每周五天干工作事4天,剩余一天自己安排,go语言就是在这种情况下开发出来的。
  Go的三个作者分别是:Robert Griesemer(罗伯特.格利茨默),Rob Pike(罗伯.派克)和 ken Thompson(肯.汤普森)。
  .Robert在开发Go之前是Goole V8 、Chubby和HotSpot JVM的主要奉献者;
  .Rob主要是Unix 、UTF-8、 plan9的作者;
  .ken主要是B语言、C语言的作者、Unix之父。
  Go语言设计初衷
  1、设计Go语言是为了解决当时Google开发遇到的问题: .大量的C++代码,同时又引入了Java和Python .数以万行的代码 .分布式的编译系统 .数百万的服务器
  2、Google开发中的痛点 : .编译慢 .失控 的依赖 .每个工程师只是用了一个语言里面的一部分 .程序难以维护 .更新的花费越来越长 .交叉编译困难
  3、如何解决当前的问题和痛点?
  Go希望成为互联网时代的C语言。多数系统级语言(包括Java和C#)的根本编程哲学来源于C++,将C++的面向对象进一步发扬光大。但是Go语言的设计者却有不同的看法,他们认为值得学习的是C语言。C语言经久不衰的根源是它足够简单。因此,Go语言也是足够简单。
  他们当时设计Go语言的目标是为了消除各种缓慢和笨重、改进各种低效和扩展性。Go是有那些开发大型系统的人设计的,同时也是为了这些人服务的,它是为了解决工程上的问题,不是为了研究语言设计;它还是为了让我们的编程变得更舒适和方便。
  C语言为什么仍被广泛使用?
  在今天,有许多编程语言可以让开发者研发出比C更高效的应用,这些语言拥有丰富的内置库,可以简化与JSON、XML、UI、网页、客户端请求、数据库链接、媒体操作等工作。尽管如此,C依然仍将长期活跃在编程一线,为什么呢?
  那让我们一起来看看C语言都有哪些无与伦比的优势。 可移植性和高效
  汇编语言的可移植性差,可C语言却是一门可移植性非常好的语言。它尽可能地接近机器,同时它几乎普遍适用于现有的处理器架构。几乎现有的每个架构至少有一个C语言编译器。如今,由于现代编译器产生高度优化的二进制文件,用手写的汇编来改进它们的输出并不是一件容易的事。
  由于它的可移植性和效率高效,"其他编程语言的编译器、库和解释器经常用C语言实现"。像Python、Ruby和PHP这些解释性语言的主要实现都是基于C语言,它甚至被其他语言的编译器用来与机器通信。例如,C是Eiffel和Forth的中间语言。意味着这些语言的编译器不需要为每个要支持的架构生成机器代码,而只是生成中间的C代码,由C编译器处理机器代码的生成。
  C语言也已成为开发人员之间交流的一种语言。正如Dropbox工程经理、Cprogramming.com创建者Alex Allain所说:
  C语言作为一门伟大的语言,可以让大多数人以能接受的方式来表达编程中的常见想法。此外,C语言在使用中也有语法结构也会出现在其他语言中,例如,用于命令行参数的argc和argv,以及循环结构和变量类型,因此,即使对方不懂C语言,你也能找到一些共同点来与他们交谈。  内存操作
  内存管理和指针运算是C语言的重要特征,使C语言成为系统级编程(操作系统与嵌入式系统)的最佳搭档。
  在硬件/软件边界,计算机系统和微控制器将其外设和I/O引脚映射到内存地址。系统应用程序必须读取和写入这些自定义的内存位置,以便与外界进行通信。因此,C语言操作任意内存地址的能力对于系统编程是必不可少的。
  例如,一个微控制器可以这样设计:每当地址0x40008001的第4位被设置为1时,内存地址0x40008000中的字节就会被通用异步接收/发送器(或UART,一种与外设通信的常见硬件组件)发送,并且在设置后,它将被外设自动取消。下来演示一个C函数代码,它通过该UART发送一个字节:
  #define UART_BYTE *(char *)0x40008000  #define UART_SEND *(volatile char *)0x40008001 |= 0x08    void send_uart(char byte)  {     UART_BYTE = byte;    // write byte to 0x40008000 address     UART_SEND;           // set bit number 4 of address 0x40008001  }
  send_uart函数的第一行代码可扩展为:
  *(char *)0x40008000 = byte;
  这一行代码是告诉编译器将值是0x40008000解释为一个指向char的指针,然后解除对该指针的定义(给出该指针所指向的值)(用最左边的*操作符),最后将字节值分配给该解除定义的指针。换句话说:把变量byte的值写到内存地址0x40008000。
  将该函数的下一行代码扩展一下:
  *(volatile char *)0x40008001 |= 0x08;
  在这行代码中,我们对地址0x40008001和数值0x08(二进制的00001000,即第4位的1)进行了or位运算操作,并将结果存回地址0x40008001。换句话说:我们设置地址为0x40008001的字节的第4位。我们还声明地址为0x40008001的值是易失性的。这就告诉编译器,该值可能会被我们代码外部的进程所修改,所以编译器在写入该地址后不会对该地址的值做出任何假设。(在这种情况下,该字节在我们用软件设置后就被UART硬件取消了)。这些信息对于编译器的优化器来说是很重要的。例如,如果我们在for循环中这样做,而没有指定该值是易失性的,编译器可能会认为该值在被设置后永远不会改变,并在第一个循环后跳过执行该命令。 确定资源使用
  开发人员进行系统编程不能依赖的一个常见语言特性就是垃圾收集,甚至对一些嵌入式系统来说,只能进行动态分配。嵌入式应用程序在时间和内存资源方面非常有限。对于一些实时的嵌入系统,它们无法承受垃圾收集器的非确定性调用。如果因为内存不足而不能使用动态分配,那么拥有其他内存管理机制就显得尤为重要,比如将数据放在自定义地址中,就像C语言的指针所允许的那样。那些严重依赖动态分配和垃圾回收的语言不适用于资源紧张的系统。 Code Size
  C语言有一个非常小的运行时,其代码的内存占用要小于其它语言。例如与C++相比,一个由C语言生成的二进制文件,其体积大约是由类似的C++代码生成的二进制文件的一半。造成这种情况的主要原因之一是异常支持。
  异常(Exceptions )机制是C++比C语言多出来的一个不错功能,如果异常不被触发和巧妙的实现,他们实际上是没有执行时间的开销,但代价便是增加代码体积。
  下面让我们以C++代码为例:
  // Class A declaration. Methods defined somewhere else;  class A { public:    A();                    // Constructor    ~A();                   // Destructor (called when the object goes out of scope or is deleted)    void myMethod();        // Just a method };   // Class B declaration. Methods defined somewhere else; class B { public:    B();                    // Constructor    ~B();                   // Destructor    void myMethod();        // Just a method };   // Class C declaration. Methods defined somewhere else; class C { public:    C();                    // Constructor    ~C();                   // Destructor    void myMethod();        // Just a method };   void myFunction() {    A a;                    // Constructor a.A() called. (Checkpoint 1)    {                              B b;                 // Constructor b.B() called. (Checkpoint 2)       b.myMethod();        //                           (Checkpoint 3)    }                       // b.~B() destructor called. (Checkpoint 4)    {                              C c;                 // Constructor c.C() called. (Checkpoint 5)       c.myMethod();        //                           (Checkpoint 6)    }                       // c.~C() destructor called. (Checkpoint 7)    a.myMethod();           //                           (Checkpoint 8) }                          // a.~A() destructor called. (Checkpoint 9)
  该段代码中的A类、B类和C类中的方法都被定义在了外部(例如在其它文件中)。因此,编译器无法对它们进行解析,也不知道是否会抛出异常。所以程序必须准备处理从它们的任何构造函数、析构函数或其他方法调用中抛出的异常。解构器不应该抛出(做法非常糟糕),但用户还是可以抛出,或者他们可以通过调用一些抛出异常的函数或方法(显式或隐式)间接地抛出。
  如果myFunction中的任何调用抛出了异常,堆栈解开机制必须能够调用所有已经构建的对象的析构器。堆栈解开机制的一个实现将使用这个函数的最后一次调用的返回地址来验证触发异常的调用的 "检查点编号"(这是简单的解释)。它是通过利用一个辅助的自动生成的函数(一种查找表)来实现的,当该函数的主体抛出异常时,该函数将被用于堆栈解绕,这将与此类似。
  如果myFunction函数的任何一个调用抛出异常,C++的栈展开(stack unwinding)机制必须能够调用所有已构建对象的析构器。栈展开机制的一个实现是将使用这个函数的最后一次调用的返回地址来验证触发异常调用的 "检查点编号"(这是简单的解释)。它是通过利用一个辅助的自动生成函数(一种查找表)来实现,在该函数的主体抛出异常时,该函数将被用于堆栈解绕,与下面这段代码类似:
  // Possible autogenerated function void autogeneratedStackUnwindingFor_myFunction(int checkpoint) {    switch (checkpoint)    {       // case 1 and 9: do nothing;       case 3: b.~B(); goto destroyA;                     // jumps to location of destroyA label       case 6: c.~C();                                    // also goes to destroyA as that is the next line       destroyA:                                          // label       case 2: case 4: case 5: case 7: case 8: a.~A();    } }
  如果从case 1和9抛出异常,则没有对象需要销毁。对于case 3,则b和a必须被销毁。对于case 6,c和a必须被销毁。在所有情况下,销毁顺序必须得到尊重。对于检查点2、4、5、7和8,只有对象a需要被销毁。
  这个辅助函数增加了代码的体积。这是C++添加到C语言中的空间开销的一部分。许多嵌入式应用无法负担这种额外的空间。因此,用于嵌入式系统的C++编译器通常有一个禁用异常的标志。在C++中禁用异常是不自由的,因为标准模板库严重依赖异常来告知错误。使用这种修改过的方案,没有异常,需要对C++开发人员进行更多的培训,以检测可能的问题或发现错误。
  C++的一个原则就是"开发者无需为不使用的东西付费"。对于其他语言来说,二进制体积的增加会变得非常糟糕,通过其它功能来增加额外开销,虽然这些功能有用,但嵌入式系统却负担不起。虽然C语言不会给你提供这些额外功能,但他可以比其它语言拥有更紧凑的代码足迹(code footprint ),占用更小的磁盘空间。
  为什么要学习C语言
  C语言并不难学,作为一门老牌编程语言,有关它的教程跟学习资料非常多,那么学习C语言有哪些好处呢?
  C语言是开发人员的通用语言,网上或者图书里面的不少算法都是基于C语言实现,这也为实现提供了最大的可移植性,开发者也会从中受益。 Understand the Machine(用C语言思考)
  当我们与同事讨论代码的某些部分或其他语言的某些特征时,我们最终会 "用C语言说话":"这部分是向对象传递一个 "指针 "还是复制整个对象?这里会不会发生任何 "转换"?等等。
  在分析高级语言的一部分代码的行为时,我们很少讨论(或思考)一部分代码正在执行的汇编指令。相反,在讨论机器在做什么时,我们可以用C语言描述(或想)得很清楚。
  在许多有趣的C语言项目上工作
  从大型数据库服务器或操作系统内核甚至是为了满足个人乐趣而制作的小型家用嵌入式应用,你都可以用C语言实现,并且还可以在网上找到相关Demo。Daniel呼吁大家,不要停止自己喜欢做的事情,比如学习C语言,它古老但小巧,并且是一门经过时间验证的编程语言。
  当下许多编程语言在其预设的用途上都要优于C语言,但这并不意味着就能击败C,当考虑性能优先的时候,C依然是王者。世界正运行在C语言驱动的设备上,无论你是否意识到,你使用的诸多设备的的确确都用到了C语言。

中国将举办更大规模双品网购节促消费中新社北京4月22日电(记者李晓喻)第四届双品网购节将于4月28日至5月12日举办。这是中国促进消费的最新举措。中国商务部电子商务和信息化司司长骞芳莉在22日举行的新闻发布会上介绍最稳定的Windows10来了!不更新全面开放,你升级了吗?对于微软来说,Windows1021H2这个系统是比较稳定的版本了,且微软通过对Windows10HealthDashboard的更新对外提示的意思,就是如果Windows10用户取消所有网贷,鼓励银行正规贷款,挽救千千万万人你同意吗?你都不明白网贷背后是谁在玩。大多数网贷平台,都是有自己的小贷和银行一起放的。很多网贷平台,本身只是做流量管道和数据收集,真正放款还是银行,这里面利益链复杂得很。好像银行就正规一样你国内工厂待遇领头人?我觉得特斯拉就是国家特意引进的搅屎棍,要不然国家一些企业更黑暗,福利待遇更差,资本主义恨不得52白加黑让工人做工,电动汽车行业更是遥遥无期。我们不得不承认国外的企业比本土企业在对待低调的国内四大财团,个个资产过万亿,腾讯阿里远不是一个级别说到中国最有钱的企业,我们第一时间想到的是腾讯阿里巴巴京东这些互联网大佬,或者民营企业的佼佼者,比如华为集团。他们的实力确实都很强,以腾讯为例,在今年1季度中国500强企业排名中,这五款小众手机APP,知乎10W人精选,究竟好在哪里哈喽大家好,我是分享科技小达人不知道大家手机上都有哪些小众但是出奇的好用的APP,今天给大家整理了一些知乎精选的APP,究竟好在哪里呢?大家一起来看看吧。01VideoLabVed石油枯竭是个伪命题吗?沙特阿拉伯的石油资源,为何源源不断?文科普探所石油作为一种由碳氢化合物及其衍生物构成的化石能源,在概念上一直都是不可再生资源,最典型的特征是珍贵产量有限,也因此价格起起伏伏。日常生活中石油的用处很广泛,却只在特定的地阿里达摩院裁员30!贾扬清咋看?4月20日消息,据媒体报道,阿里旗下达摩院计划裁员,预计将有三分之一的员工输送到社会。今年1月份,阿里巴巴副总裁阿里达摩院自动驾驶实验室负责人王刚离职。阿里对此表示,感谢王刚为达摩开发者必看,聚合数据API精选清单来了想要快速实现一个功能,却不知道哪里有现成的API可以调用?参加大赛想要进行应用创新,却不知道有哪些现成的API可以使用?公司面临转型,如何快速获得他人的技术能力(API),来完成商博鳌凝共识数字科技助力世界经济企稳复苏本报记者刘艳4月21日上午,博鳌亚洲论坛2022年年会开幕式在海南博鳌举行,国家主席习近平以视频方式发表主旨演讲。众多科技企业表示,在当前复杂严峻的国际形势背景下,习近平主席的重要中关村智酷与猎豹移动AI教育签约全面合作4月15日,中关村智酷与猎豹移动AI教育共同举办了中关村智酷猎豹移动AI教育全面合作签约仪式,旨在通过全面合作进一步推动人工智能技术在教育领域的深入应用。中关村智酷是由中关村软件园
俄乌冲突之后,中国云计算如何实现国产自主化?作者Challey2010年3月,中国深圳,深圳市政府举办的2010年度IT领袖峰会上,阿里巴巴马云坚持对云计算充满了信心,而腾讯马化腾认为可能你过几百年一千年后,到阿凡达时代,那微信收到的语音怎么转发给好友?教你2种方法,操作简单一学就会分享最实在的玩机技巧,洞察最前沿的科技资讯!大家好,这里是手机科技园!我们平时使用微信聊天的时候,都转发过文字表情图片和视频,但是微信收到的语音怎么转发给好友呢?今天就来教大家2种地狱之门的入口探秘前苏联科拉超深钻孔地狱,被一些人认为是人去世之后受苦的地方。地狱的观念广泛分布于世界各地的宗教信仰观念中,如佛教印度教基督教的一些派别,中国古代也流传着阴间的说法,就连21世纪最伟大的科学家之一霍金越南许家印,要给拜登造车出品虎嗅汽车组作者王笑渔编辑周到头图视觉中国不想造车的老板,干不好房地产?4月21日,三台恒驰5现身广州恒大中心,恒大董事局主席许家印携管理团队全方位体验恒驰5,还连连点赞漂亮!真北航硕士怒怼小米毁约!网友裁应届生,脸都不要了虽然互联网大厂裁员不断,但小米这次,却引发了众怒。北航应届硕被裁4月23日,脉脉一则职言,让小米直接冲上了热搜。一位曾经打网球的辣椒发帖称,自己是北航2022届应届研究生,校招签约人类有办法赋予人工智能科技伦理?探索才刚刚开始张礼立文假设说,人类从来就不是单一的理性的实体,不知您是否会认同这个观点。人类对自己大脑和自我的探索才刚刚开始我们经常听到一句老话叫,人无完人。我们认知的人类是由数不胜数的,令人讨苹果上架智能水壶售价568元,可记录摄水量并同步健康应用中Tech星球4月26日消息,日前,苹果中国官网上架了一款HidrateSparkSTEEL水壶,容量为620毫升(21盎司),售价人民币568元。该水壶底部的LED小球可以记录摄水小米Civi1S发布会来袭!现场PPT颜值超炫?同事不愧是大厂出品最近的手机发布会真是一个接着一个!这不,有朋友在评论区说来解析一下,最新小米Civi1S手机的发布会PPT,据说颜值很高作为PPT设计师呢,赶紧补补课,一口气看完了小米这次发布会的在10平米的房间,用1P和1。5P一级能效变频空调,耗电上和舒适上有何区别?空调耗电多少,主要有2个因素。一是房间的密封和隔热做得好不好,二是空调的能效比高不高。国家规定,能效比达到36,即可标示为一级能效空调。但是有的厂家生产的空调,远高于这个数字。比如特斯拉Q1财报不可阻挡的印钞机,下一个苹果?4月21日美股收盘后,特斯拉公布了公司的2022财年第一季度财报。报告显示特斯拉汽车第一季度总营收为187。56亿美元,预期178亿美元,与去年同期的103。89亿美元相比增长81又双叒叕出事了,抛开车主误操作,特斯拉你就没责任吗?近日,有一条视频,先是在朋友圈之间互相转发,随后便在网络中爆发。各位看官没猜错,就是特斯拉在北京机场第二高速发生事故的视频。可能换做是其他品牌的车辆,这事说破大天,顶多是您手机上的