精华内容
下载资源
问答
  • 既然如此庞大复杂的0S都可以用c语言编写,从狭义而言,还有什么系统软件和应用软件不能用c语言编写呢?由此可以肯定的说,c语言是一门十分优秀而又重要的语言c语言程序设计是过程性程序设计语言,它的发展贯穿了...

    C语言:

    **目前最著名、最有影响、应用最广泛的windows、linux和UNIX三个操作系统都是用C语言编写的。**0S是计算机系统(由软硬件两个子系统构成)的核心和灵魂,它是软件中最庞大最复杂的系统软件。既然如此庞大复杂的0S都可以用c语言编写,从狭义而言,还有什么系统软件和应用软件不能用c语言编写呢?由此可以肯定的说,c语言是一门十分优秀而又重要的语言。

    c语言程序设计是过程性程序设计语言,它的发展贯穿了计算机发展的历程,它蕴含了程序设计的基本思想,囊括了程序设计的基本概念,所以它是理工科高等院校的一门基础课程。

    从市面上有关c语言的书籍和高等院校采用的教材来看,它们有一个共性,那就是:脱离了实际应用(全是小打小闹的小例子),纯粹的过程性程序设计,没有软件工程思想的体现,没有一定程序设计风格,仅仅是为了让大家明白什么是c语言而已。

    高等院校开设c语言程序设计的目的是让学生对程序设计有个入门,有个直观的理解,同时为其他后续课程作铺垫。

    C++:

    C++语言是在C语言的基础是扩展而成的.所以两种语言的基本语法和语义是相同。C++中加入了面向对程序设计(OOP)的特征。

    下面的三个主要性质刻划OOP语言的特点:

    封装性:把一个数据结构同操作的函数(行为或方法)组合在一起。封装性是借助于一种新的结构和数据类型机制——类实现的。

    继承性:建立一个新的派生类,它从一个或多个先前定义的基类中继承函数和数据,而且可能重新定义或加进新的数据行为,这样就建立了类的层次。

    多态性:给行为取一个名字或符号,它共享一个类的层次,在这个层次中的每个类都以适合自己的方式实现这个行为。

    C#:

    C#(读做 “C sharp”,中文译音“夏普”)是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言,并定于在微软职业开发者论坛(PDC)上登台亮相.C#是微软公司研究员Anders Hejlsberg的最新成果.C#看起来与Java有着惊人的相似;它包括了诸如单一继承,界面,与Java几乎同样的语法,和编译成中间代码再运行的过程.但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司.NET windows网络框架的主角.

    Java:

    Java是一种可以编写跨平台应用软件的面向对象的程序设计语言,由升阳(太阳微电子,Sun Microsystems)公司的James Gosling等人于1990年代初开发的.具有以下特征的高级程序语言:

    简单 面向对象 可分布 可解释 强壮 安全性 结构化 轻便 功能强大 多线程 动态…

    Java既可以被编译,也可以被解释。通过编译器,可以把Java 程序翻译成一种中间代码 - 称为字节码 - 可以被Java解释器 解释的独立于平台的代码。通过解释器,每条Java字节指令被 分析,然后在计算机上运行。只需编译一次,程序运行时解释 执行。

    Javascript诞生记:C语言和Self语言一夜情的产物

    http://blog.jobbole.com/963/

    二周前,我谈了一点Javascript的历史。

    今天把这部分补全,从历史的角度,说明Javascript到底是如何设计出来的。

    只有了解这段历史,才能明白Javascript为什么是现在的样子。我依据的资料,主要是Brendan Eich的自述。

    上一篇文章写道:

    “1994年,网景公司(Netscape)发布了Navigator浏览器0.9版。这是历史上第一个比较成熟的网络浏览器,轰动一时。但是,这个版本的浏览器只能用来浏览,不具备与访问者互动的能力。……网景公司急需一种网页脚本语言,使得浏览器可以与网页互动。”

    网页脚本语言到底是什么语言?网景公司当时有两个选择:一个是采用现有的语言,比如Perl、Python、Tcl、Scheme等等,允许它们直接嵌入网页;另一个是发明一种全新的语言。

    这两个选择各有利弊。第一个选择,有利于充分利用现有代码和程序员资源,推广起来比较容易;第二个选择,有利于开发出完全适用的语言,实现起来比较容易。

    到底采用哪一个选择,网景公司内部争执不下,管理层一时难以下定决心。

    就在这时,发生了另外一件大事:1995年Sun公司将Oak语言改名为Java,正式向市场推出。

    Sun公司大肆宣传,许诺这种语言可以”一次编写,到处运行”(Write Once, Run Anywhere),它看上去很可能成为未来的主宰。

    网景公司动了心,决定与Sun公司结成联盟。它不仅允许Java程序以applet(小程序)的形式,直接在浏览器中运行;甚至还考虑直接将Java作为脚本语言嵌入网页,只是因为这样会使HTML网页过于复杂,后来才不得不放弃。

    总之,当时的形势就是,网景公司的整个管理层,都是Java语言的信徒,Sun公司完全介入网页脚本语言的决策。因此,Javascript后来就是网景和Sun两家公司一起携手推向市场的,这种语言被命名为”Java+script”并不是偶然的。

    此时,34岁的系统程序员Brendan Eich登场了。1995年4月,网景公司录用了他。

    Brendan Eich的主要方向和兴趣是函数式编程,网景公司招聘他的目的,是研究将Scheme语言作为网页脚本语言的可能性。Brendan Eich本人也是这样想的,以为进入新公司后,会主要与Scheme语言打交道。

    仅仅一个月之后,1995年5月,网景公司做出决策,未来的网页脚本语言必须”看上去与Java足够相似”,但是比Java简单,使得非专业的网页作者也能很快上手。这个决策实际上将Perl、Python、Tcl、Scheme等非面向对象编程的语言都排除在外了。

    Brendan Eich被指定为这种”简化版Java语言”的设计师。

    但是,他对Java一点兴趣也没有。为了应付公司安排的任务,他只用10天时间就把Javascript设计出来了。

    由于设计时间太短,语言的一些细节考虑得不够严谨,导致后来很长一段时间,Javascript写出来的程序混乱不堪。如果Brendan Eich预见到,未来这种语言会成为互联网第一大语言,全世界有几百万学习者,他会不会多花一点时间呢?

    总的来说,他的设计思路是这样的:

    (1)借鉴C语言的基本语法;

    (2)借鉴Java语言的数据类型和内存管理;

    (3)借鉴Scheme语言,将函数提升到”第一等公民”(first class)的地位;

    (4)借鉴Self语言,使用基于原型(prototype)的继承机制。

    所以,Javascript语言实际上是两种语言风格的混合产物 —-(简化的)函数式编程+(简化的)面向对象编程。这是由Brendan Eich(函数式编程)与网景公司(面向对象编程)共同决定的。

    多年以后,Brendan Eich还是看不起Java。

    他说:

    “Java(对Javascript)的影响,主要是把数据分成基本类型(primitive)和对象类型(object)两种,比如字符串和字符串对象,以及引入了Y2K问题。这真是不幸啊。”

    把基本数据类型包装成对象,这样做是否可取,这里暂且不论。Y2K问题则是直接与Java有关。根据设想,Date.getYear()返回的应该是年份的最后两位:

    1

    2

    3

    4

    5

    var date1 = new Date(1999,0,1);

    var year1 = date1.getYear();

    alert(year1); // 99

    但是实际上,对于2000年,它返回的是100!

    1

    2

    3

    4

    5

    var date2 = new Date(2000,0,1);

    var year2 = date2.getYear();

    alert(year2); // 100

    如果用这个函数生成年份,某些网页可能出现”19100″这样的结果。这个问题完全来源于Java,因为Javascript的日期类直接采用了java.util.Date函数库。Brendan Eich显然很不满意这个结果,这导致后来不得不添加了一个返回四位数年份的Date.getFullYear()函数。

    如果不是公司的决策,Brendan Eich绝不可能把Java作为Javascript设计的原型。作为设计者,他一点也不喜欢自己的这个作品:

    “与其说我爱Javascript,不如说我恨它。它是C语言和Self语言一夜情的产物。十八世纪英国文学家约翰逊博士说得好:’它的优秀之处并非原创,它的原创之处并不优秀。’(the part that is good is not original, and the part that is original is not good.)”

    展开全文
  • C语言作为一种高级语言,有3个优点,除了代码效率高,还有什么别的优点
  • C语言是所有高级语言的前辈,C++,C#,Java ,都是由C语言演变过来的,包括现在很火的python,第一个Python编译器诞生,它是用C语言实现的。 所有大学理科专业的必修课程都是C语言,就算你将来不从事开发, 期末考试...

    C语言的重要性

    C语言是所有高级语言的前辈,C++,C#,Java ,都是由C语言演变过来的,包括现在很火的python,第一个Python编译器诞生,它是用C语言实现的。

    所有大学理科专业的必修课程都是C语言,就算你将来不从事开发, 期末考试总不能挂科吧,除了C语言,小林不知道还有哪一门课这么普及。

    我们常用的操作系统windows、linux、unix是C语言开发的,如果你想当黑客必须学C语言,你去黑别人电脑的是不是绕不操作系统。

    如果你想入职阿里、腾讯这样的大厂,必须学C语言,为什么呢?

    因为大厂都要考算法,比如我要你实现二叉树,你总不能用Java来实现吧,况且进大厂你的基础要扎实吧,操作系统,数据结构是不是要学一下,哎,又绕回C语言了。

    C语言应用领域

    操作系统:windows、linux、unix
    数据库:Oracle和sql server
    一些驱动程序
    wps、photoshop
    嵌入式开发

    C语言特点

    • C语言简洁,灵活,有37个关键字,9种控制语句。
    • C语言数据类型极其丰富。
    • C语言程序执行效率很高,可以直接操作内存。

    C语言学习目标

    1. 掌握C语言的语法规则,数组、循环、函数、指针等。
    2. 要学会一些算法,比如冒泡排序、快速排序、递归等。
    3. 在学习的过程中理解什么是面向过程,为将来学习C++、Java等面向对象语言做准备。

    以上,如果你看了觉得对你有所帮助,就给小林点个赞,分享给身边的人叭,这样小林也有更新下去的动力,跪谢各位父老乡亲啦~

    更多案例可以go公众号:C语言入门到精通

    展开全文
  • 请教大神,麻烦详细回答,请...还有学习C等计算机语言要特别重视概念的东西吗?比如什么是常量,什么是变量等 老师平时i老是提问同学概念问题。 我平时都没怎么重视概念。以为看懂了程序就OK了。 来个大神分享心得。。
  • C语言什么不会过时

    2020-05-22 08:09:17
    什么C语言不会过时评价任何一门编程语言,都是招人骂的。永远是这样。就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字:“傻逼!”这个在心理学上有个专业的名字:叫做...

    01
    为什么C语言不会过时评价任何一门编程语言,都是招人骂的。永远是这样。就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字:“傻逼!”这个在心理学上有个专业的名字:叫做“二逼”现象!那我为啥还要做这个挨骂的事呢?作为《C语言点滴》《drop of knowledge of C++》书籍的作者,《C语言新思维,第二版》的译者。我觉得我有责任系统的介绍一下这本语言,他的特点,还有他的未来。这个问题对很多刚刚踏入程序猿这个行业的新手至关重要。因为他们有深深的担忧,万一C语言就像Fortran,perl语言那样过时了怎么办?先上一个表,这个就是著名的TIOBE语言排行榜。目前它是一个最权威的一个语言流行度的排行榜,从这个排行榜上看,你会得到一个最直观的结论。Java和C都在下降,而下降的部分被第三名以后的语言所瓜分。而就在5月,时隔5年,C语言再次领先Java,荣登TIOBE编程语言排行榜第一!排名前十的分别是:C,Java,Python,C++,C#,Visual Basic.NET,JavaScript,PHP,SQL和R。有没有发现亮点?没错, 第一易主了,C 语言反超了 Java 。要知道,C 语言上次第一还是在 5 年前,是什么原因让其“东山再起”了呢?时隔五年,C语言重回榜首。受冠状病毒的影响。据TIOBE CEO Paul Jansen 的猜测,“这听起来可能很不可思议,但是某些编程语言确实可以从这种情况中受益。"嵌入式语言(C 和 C++ 等)越来越流行,因为它们被用于医疗设备软件中。对所有的编程语言,他们的最后的目的其实就是两种:提高硬件的运行效率和提高程序员的开发效率。遗憾的是,这两点是不可能并存的!你只能选一样。在提高硬件的运行效率这一方面,C语言没有竞争者!举个简单的例子,实现一个列表,C语言用数组int a[3],经过编译以后变成了(基地址+偏移量)的方式。对于计算机来说,没有运算比加法更快,没有任何一种方法比(基地址+偏移量)的存取方法更快。C语言已经把硬件的运行效率压缩到了极致。这种设计思想带来的问题就是易用性和安全性的缺失。例如,你不能在数组中混合保存不同的类型,否则编译器没有办法计算正确的偏移量。同时C语言对于错误的偏移量也不闻不问,这就是C语言中臭名昭著的越界问题。C语言自诩的“相信程序员”都是漂亮的说辞,它的唯一目的就是快,要么飞速的运行,要么飞速的崩溃。C语言只关心程序飞的高不高,不关心程序猿飞的累不累。就是这样!现在来看看那些非C的语言,他们的长处都在于提高程序员的开发效率上。或者支持动态的列表,或者支持安全的列表。但是加入任何的中间层,加入任何的安全检验,它不可能比(基地址+偏移量+无检验)的方式更快。这个世界上不存在“开发容易,运行快”的语言,开发容易毕竟来源于对底层的一层一层又一层的包装。 现在回答两个最普遍的问题:硬件这么便宜了,有必要让软件更快吗?有这种疑问的人大部分都是网吧的固定客户,他们理解的计算机只在电脑城,他们理解的计算只是游戏和播放硬盘中的小电影。不要玩个游戏开个挂就乐得不行不行的,别忘了还有全实景仿真,还有3D渲染,还有自动驾驶。人在开车的时候,每秒要收集60个不同的物体,然后根据这60个物体的不同组合和反映来做20个最重要的决定。然后从这20多个决定中选一个执行。所以就算用上最快的硬件,自动驾驶现在还不敢说能像人那样开车。就算是自动驾驶成功了,下一步还要自动飞行呢?因为我们老早就预言了:你咋不上天呢!所以说:计算速度永远是不够的!因为新的应用会越来越复杂,越来也实时。对了!我还忘了一个更重要的限制:计算的能耗!NASA飞行器上的CPU最多就是32位的,说出来你可能不信,国际空间站上没有一个CPU是64位的,我猜一个最主要的原因是航天员不爱看硬盘小电影吧。另外一个流行的疑问是:我可以发明一种同样快的语言,但是没有C语言那么多的坑。想法是可以的,而且还真巧有这个语言,真巧它的名字叫D语言,真巧没有太多的人用!这是因为一个基本的事实。现在有太多,太多太多的C代码,他们大部分都在正常工作,就像Linux, Window, MacOS,Unix,Vxworks。你没有看错,这些操作系统的内核都是C,我虽然不确定C在Window中所占的比例,但是我相信微软的人不会傻到用C#去全部改写一个操作系统的内核。你想让这些人去用你的全新的语言,这就不是“有点”很傻,很天真了!而且有些代码,我们根本就不能改!NASA一个简单的5个CPU飞控软件编写完毕后,要进行一种“全覆盖”测试。如果CPU A坏了会发生什么?如果CPU A,B坏了呢?如果CPU A,C坏了呢。。。。?如果你愿意,你可以做个简单的数学组合。测试完毕后,别说重写,就算加个注释都不行。因为主管payload的大妈会非常严肃的质问你,为什么你上报的东西数量增加了,但是质量没有增加?你需要和她详细的解释:硬件和软件是不同的,硬件是那种摸起来硬硬的东西,但是软件不是那种摸起来软软的东西。看着大妈鄙夷的眼神,这个时候你会非常后悔自己手欠加入的哪一行注释。你还别不当真,这个是NASA的真实故事。哪为什么C语言还下降这么多呢?很简单,有些任务本身就不是C语言的。我上学的时候还用C语言编过窗口界面呢?然后很快微软的人就推出了MFC,就是一大堆宏把底层的C windowAPI包装了起来。再后来这个技术也过时了。因为微软的人认识到,带有窗口的应用程序说到底不是C语言的本职工作,再这么一层一层包下去就有露馅的危险,于是他们发明了一个全新的语言C#来负责这个任务。Java也是这样,突出网络,易用,安全,跨平台。无论是Java, c#还是python, 他们都有意避开提高硬件的运行效率这个问题,因为这个问题上没办法和C竞争,也无法撼动Linux, Unix,GNU tool这些已有C代码的位置。剩下的就只是提高程序员的开发效率上大作文章。这对C语言是好事,把自己不善长的东西去掉,让自己跑的更快!伴随着嵌入和实时系统的兴起,AI,机器人,自动驾驶等。这些都是C语言的核心应用,而且在这种应用上面,C语言没有竞争者。所以我感觉C语言会稳定在自己核心的应用中,并开始逐步回升。(码农翻身注:赵老师预料对了,果然回升了。)但是Java语言我个人不乐观。小型和灵活性上,Python更胜一筹。一行python代码后,你根本不知道自己还是不是duck类型?平台领域,每个平台都推出自己专属的语言。Windows会继续支持C#,苹果偏爱Swift, Android推出Kotlin,Google用go。Java宣称自己可以自由到每家做客,但是无论是到谁家,都会发现客厅里面坐着一个亲儿子,这个时候自己这个干儿子多多少少有点尴尬。所以我猜测,最后Java会稳定在对跨平台有严格要求的,大型非实时应用上。 最后说点闲话,C++不会淘汰C语言。有了对象后你会发现再简朴的对象也耗费资源,而且有了对象以后,总是不由自主的去想继承这个事,一但继承实现了,你会发现继承带来的麻烦远超过你的想象。Java的发明人James被问到如果可以从新设计Java语言的话,第一个要做什么事?他说:“去掉对象”!作为一个已婚,有两个孩子的程序猿,我感同身受。如果大家感兴趣,我可以再写一个博客,聊聊C++和C的真实区别所在。如果你看到这里,还什么都没记住。那就只记住一点:没人能预测未来。全世界只需要五台电脑 -IBM创始人 640K内存足够了 -微软创始人 没必要在家里用电脑-DEC创始人 如果再有人对你说C语言已经过时了,最好自己思考一下,能求真最好,如果不能,至少要做到存疑。网友对于C语言这样评价1、航空、军工领域不是大众所能接触的;2、现在很多工业领域也很多使用64位处理器吧(人工智能技术的成熟和普及) 3、消费领域就更不用说了;4、作为普通程序猿,主要还是工业领域或者消费应用领域,c语言适合底层开发,c++的对象其实也没有多么耗资源,c++对象模型这本书有详细介绍,虽然有些过时,但是设计理念基本还是延续着。c、c++会继续有一席之地。但是这个范围是不是会继续缩小到一个极点也不好说。淘汰,我个人看法应该不会。5、范围缩小了,小众了,可能工资回报也不会大幅变化。6、会不会有更适合底层开发、比c更有优势的语言出现。这个敢说,但是前段时间使用了一下rust语言,还是让我眼前一亮。而且大厂也在关注这门语言,毕竟是后来设计的,会总结前人的经验,可能会更佳优秀。越往上层应用,开发平台和语言越是封装很好、使用很方便、更佳接近人类的思维方式(以前的开发语言很像是控制计算机的具体指令,慢慢的在发展)02为什么 C 语言仍然占据统治地位?于一种计算机行业的技术来说尤其如此。自1972年诞生以来,C语言一直保持生龙活虎的状态,时至今日它仍然是我们用来搭建软件世界的基础建筑材料之一。但有时一种技术能够长期存在,只是因为人们还没有来得及发明新的东西来取代它而已。在过去的几十年里,出现了许多其他语言——其中一些明确地被设计用于挑战C的主导地位,有些语言试图凭借自己的人气慢慢瓦解C语言的统治地位。为C需要被替换掉的观点争辩是简单的。编程语言研究和软件开发实践都暗示了如何比C更好地去做事。但历经数十年的研究和开发,C语言的地位却依旧稳固。很少有其他语言能够在性能、裸机兼容性或通用性等方面击败它。不过,2018年C是如何与那些明星编程语言竞争的呢,其中细节仍值得一看。C vs. C ++当然了,C最常被拿来与C ++进行比较,正如其名称本身所暗示的那样,C++作为对C语言的扩展而被创建出来。C ++和C之间的差异可以概括为C++更加广泛(褒)或更加宽泛(贬),具体取决于这个问题你是问的C还是C++程序员。(笑)虽然C ++的语法等方面仍然是类C的,但它提供了许多在原生的C中本不可用的非常实用的功能:命名空间(namespace),模板(template),异常(exception),自动内存管理(automatic memory management)等等。需要顶级性能的项目,例如涉及数据库,机器学习系统的项目通常是用C ++编写的,以便项目能尽可能地榨取以及利用到每一点性能。此外,与C相比,C ++在持续地更加积极地扩展。即将推出的C ++ 20会带来更多功能供开发者享用,包括模块,协同程序,同步库,以及概念,这些使模板更易于使用。C standard的最新版本只进行了少量更新,并侧重于保持向后兼容性。事实上,C ++中的所有附加功能同样也可能成为累赘。而且是很大的累赘。您使用的C ++专属功能越多,引入的复杂度就越高,对结果的修正就越困难。将自己局限于仅一个C ++子集的开发人员可以避免许多开发中严重的坑和额外负担。但是有些团队想要从根儿上防范C ++的过度复杂性。坚持使用C能迫使开发人员将自己局限于一个子集。例如,Linux内核开发团队就直接避开了C ++。选C而不选C++对您——以及任何将会维护你代码的开发人员——来说都是可行的,通过采用强制简约主义来避免与C ++的复杂性纠缠。当然,C ++拥有丰富的高级功能,这是有它自己的道理的。但如果极简主义更适合当前和未来的项目——以及负责项目的团队——那么还是选C更明智一些。C vs. Java几十年了,Java仍然是企业软件开发的主力军之一——并且也是宽泛而言的开发的主力军之一。许多最重要的企业软件项目都是用Java编写的——包括绝大多数Apache Software Foundation项目——而Java仍然是开发企业级需求项目的可行语言。Java的语法从C和C ++中借鉴了很多东西。但是,与C不同的是,Java默认情况下不会编译为本机代码。相反,Java运行时环境,JVM,JIT(实时)编译Java代码以在目标环境中运行。在适当的情况下,JIT编译后的Java代码可以接近甚至超过C的性能。Java背后的“一次编写,随处运行”的理念也允许Java程序在目标架构上进行相对较少的调整即可运行。相比之下,虽然C已被移植到许多架构中,但任何给定的C程序仍可能需要重新量身定做才能在,打个比方,Windows与Linux,两种不同的os之间正常运行。这种可移植性和强大性能的结合,以及庞大的软件库和框架组成的生态,使Java成为构建企业应用程序的首选语言。Java输给C的地方是一个Java从未打算竞争的领域:靠近底层结构运行,或直接与硬件打交道。C代码被编译成机器代码,由进程直接执行。Java被编译成字节码,这是一种随后会被JVM解释器转换为机器代码的中间代码。此外,尽管Java的自动内存管理在大多数情况下都是个优点,但C更适合于必须充分利用有限内存资源的情况。也就是说,在某些方面,Java在速度方面可以接近于C。JVM的JIT引擎在运行时根据程序行为优化例程,允许进行许多类型的优化,而这些优化是在未提前编译的C中无法实现的。虽然Java运行时自动执行内存管理,但一些较新的应用程序可以解决这个问题。例如,Apache Spark部分地通过使用绕过JVM的自定义内存管理代码来优化内存中处理。C vs. C#和.Net在推出近二十年后,C#和.Net 框架仍然是企业软件世界的主要组成部分。有人说C#和.Net是微软对Java的回应——一个托管代码编译器系统和通用运行库——C和Java之间的许多种对比也适用于C和C#或.Net之间。与Java(以及某种程度上来说Python也是如此)一样,.Net提供跨各种平台的可移植性和庞大的集成软件生态系统。考虑到.Net世界中有多少面向企业的开发,这些都是不小的优势。当您使用C#或任何其他.Net语言开发程序时,您可以使用为.Net运行时编写的大量工具和库。.NET另一个类似Java的优势是JIT优化。C#和.Net程序可以按照C语言提前编译,但它们主要由.Net运行时进行即时编译,并使用运行时信息进行优化。JIT编译允许对无法在C中执行的运行着的.Net程序进行各种就地优化。与C一样,C#和.Net提供各种直接访问内存的机制。堆,栈和非托管系统内存都可以通过.Net API和对象访问。开发人员可以使用.Net中的unsafe模式来实现更高的性能。但这些都不是没有代价的。托管对象和unsafe对象不能被任意交换,并且它们之间的编组会降低性能。因此,要最大化.Net应用程序的性能需要将托管和非托管对象之间的变动保持在最低限度。如果您无法承担托管与非托管内存之间变动造成的性能损失,或者.Net运行时对于目标环境(例如,内核空间)来说是一个糟糕的选择,或者可能根本不可用,那么C就是你所需要的。与C#和.Net不同,C被默认可以解锁对内存的访问权。C vs. GoGo的语法很大程度上借鉴了C——花括号作为定界符,语句以分号结束,等等。精通C的开发人员通常可以毫不费力地直接使用Go,甚至算上Go的独有功能,如命名空间和包管理,对开发人员来说也并不困难。代码可读性是Go的指导设计目标之一:让开发人员可以轻松掌握任何Go项目,并在短时间内熟练掌握代码库。C代码库可能很难理解,因为它们很容易聚集大量专属于某个项目或某个团队的宏和和#ifdef。Go的语法及其内置的代码格式以及项目管理工具旨在避免这种结构性问题。Go还提供了诸如goroutine和channel之类的附加功能,用于处理并发性和组件之间的消息传递的语言级别的工具。C需要开发者手动完成或由外部库提供,但Go提供了开箱即用的这些功能,使得构建需要这些功能的软件变得更加容易。Go与C最深层次的不同之处在于内存管理方面。默认情况下,Go的对象会被自动管理并自动进行回收。对于大多数编程工作来说,这非常方便。但这也意味着任何需要确定性处理内存的程序都会更难编写。Go确实包含了用于绕过Go的某些类型处理安全性的unsafe包,例如使用Pointer类型读取和写入任意内存。但unsafe会附带一个warning说用它编写的程序“可能是不可移植的,并且不受Go 1兼容性指南的保护。”Go非常适合构建命令行实用程序和网络服务等,因为这些很少用到太过细致的操作。但是,如果是低级设备驱动程序,内核空间操作系统组件以及其他需要严格控制内存布局和管理的任务,那么就最好用C来创建。C vs. Rust在某些方面,Rust是对C和C ++创建的内存管理难题的回应,也是对这两种语言的许多其他缺点的回应。Rust编译为本机机器代码,因此就性能而言,它被认为与C相当。但默认情况下,内存安全才是Rust的主要卖点。Rust的语法和编译规则可帮助开发人员避免常见的内存管理错误。如果程序有一个不符合Rust语法的内存管理问题,它就不会被编译。刚接触这种语言的新手,特别是以前用C语言的开发者,由于C语言为这类bug提供了充足的容错空间,所以他们接触Rust的第一步是学习如何安抚编译器。但Rust的支持者认为,这种短期的痛苦有一个长期的回报:更安全的,不会减缓速度的代码。Rust还通过其工具改进了C语言。默认情况下,项目和组件管理是Rust提供的工具链的一部分,与Go相同。有一种默认的,推荐的方法来管理包,组织项目文件夹,以及处理C需要单独处理的其他许多事情,每个项目和团队以不同的方式处理它们。然而,在Rust中被吹捧为优势的东西对于C开发者来说可能并没有太大吸引力。Rust的编译时安全功能无法禁用,因此即使是最小的Rust程序也必须符合Rust的内存安全限制。默认情况下,C可能不太安全,但在必要时它更灵活,更宽容。另一个可能的缺点是Rust语言的大小。即使考虑到标准库,C的功能也相对较少。Rust功能集非常庞大并且还在不断增长。与C ++一样,较大的Rust功能集意味着更强大的功能,但也意味着更高的复杂度。C是一种较小的语言,但更容易在头脑中进行建模,因此可能更适合那些对Rust来说太小,不值得大动干戈的项目。C vs. Python当今,每当谈论软件开发时,Python似乎总是能出现在对话中。毕竟,Python是“对所有项目的第二佳语言”,毫无疑问是最通用的语言之一,拥有数千个第三方库。Python强调的,以及它与C最不同的地方,是有利于开发速度而不是执行速度。一个可能需要一个小时才能用另一种语言写出来的程序——比如C——可能用Python几分钟内就能写好。另一方面,该程序在C中执行可能需要几秒钟,但需要一分钟才能在Python中运行完。(一个很好的经验法则:Python程序通常比它们对应的C语言程序运行速度慢一个数量级。)但是对于现代硬件上的许多工作,Python已经足够快了,这是它如今广泛应用的一个重要原因。另一个主要区别是内存管理。Python程序完全由Python运行时进行内存管理,因此开发人员不必担心分配和释放内存的细节。但同样,开发人员的轻松也是以运行时性能为代价的。编写C程序需要严格关注内存管理,但生成的程序通常是纯机器速度的黄金标准。但是,在二者的血脉中,Python和C共享一个深层的关系:Python运行时参考是用C语言编写的。这允许Python程序包装用C和C ++编写的库。第三方库的Python生态系统的很多重要模块,例如机器学习方面的库,其核心是C代码。如果开发速度比执行速度更重要,并且如果程序的大多数高性能部分可以被隔离到独立组件中(而不是遍布整个代码),那么纯Python或Python和C库的混合使得会是比单独使用C更好的选择。否则的话,C仍然是老大。03C语言为何值得去学1. 嵌入式领域,C语言依然是首选语言,嵌入式并没有因为其他上层语言的发展而没落,现在嵌入式依然还在其自身的领域展现强大的生命力。手机,电视机,机顶盒,空气净化器等等电子产品都是其领域范畴,从长远看短时间内不可能被消失。而且智能机器人的崛起,C语言的使用频率又开始加大了。2. 操作系统内核代码还是C语言为主打,就语言的灵活性以及执行的效率来看C语言还是最合适的语言,而且在系统层次的代码,C语言还是首选语言。而且现在很多流行语言的底层绝大部分的C语言构建完成。从这个层面讲C语言是永远不会过时的,顶多算是应用范围变窄,但其作用依然强大。3. C语言的职位比例相对应用级语言是低了点,但是整个软件行业在发展,绝对的C语言编程职位并没有减少。而且对于有志于成为架构师层次的程序员来说,C语言还是必修课,构建软件框架还是需要对底层有所了解。退一步来讲,即使觉得C语言方面的职位比例低一些,不好找工作,可以先从C语言入手,把自己的知识体系建立起来,编程语言属于工具范畴,熟悉一种工具的使用,很容易触类旁通,切换到别的语言也相对轻松些,而且给整个职业生涯起了个好头,打好了基础为更上一层楼做足准备。C语言之所以流行这么年,生命力这么旺盛和本身鲜明的高效,方便灵活挂钩。即使在上层语言使用概率变低,并不妨碍在系统级别继续发挥作用。任何一种语言都有其存在的社会价值所在。C语言还是值得作为入门语言深刻的学习。4.C/C++程序员的收入没有受到影响,依据100offer的后台数据显现,现在经过100offer入职的程序员年薪最高达47W,最低22.4W,C/C++程序员的收入与其它编程言语的岗位相比处于相等状况,没有呈现下风。跟着C++逐步变成某些特定公司和特定项目所需的言语后,高档C++程序员的收入也会更具有竞争性。5.在整个游戏产业和嵌入式上依然是主流。首先是游戏范畴,Milo Yip表示——程序员有必要运用C++结构/库,如大多数游戏引擎(如Unreal/Source)及中间件(如Havok/FMOD),尽管有些C/C++库供给别的言语的绑定,但通常原生的API性能最佳、最新。其次是东西范畴,无论是网络安全仍是杀毒软件,C/C++仍是干流言语。知乎红人vczh说:「我在上大学的时分简直就只学习C/C++,后来实习的时分去了微软,成果到了那里才知道,那个组是不必C/C++的,怎么办?凭借着C++带给我的富裕的功底,我准时完结了老板给我的"两个星期内学会C#和WCF基础知识"的作业,顺畅开端作业。」当然,这只是vczh的个人经历,不具有普遍性,但不行否认的是C/C++仍具有不行代替性。某家创业公司CTO在承受采访时表示:「即使有许多人唱衰C/C++,但在今世,仍有许多许多项目的目标渠道暂时只供给C/C++编译器的支撑,仅从这一点而言,C/C++是不行能完全逝世的。」从应用范畴来说,C/C++适用于高性能计算、嵌入式体系、开发服务器软件、游戏、实时体系等,所以,短期内能完全代替C++言语并不存在。C/C++在体系、图形、网络等许多范畴都是不行代替的,它的光芒年月让它的逝世速度得以减少。当某一种编程言语在市场需要显着比另一种言语更强时,强需要言语中的缺陷则简单被淡化,阑珊的言语则不断被人挑出致命硬伤。这种编程言语之间的比较并不公平,且没有意义。编程言语都是用来表达思想和完结需要的东西,跟着年代的开展,不一样言语在不一样范畴都做出了取舍,代替尽管存在,但不是必定景象。C/C++的需要跟着年代开展会不行避免地越来越少,但不行能完全不见,C/C++程序员也具有不行代替性,在市场上照旧有着竞争性。04除了C语言,需要掌握多种编程语言吗?简述我刚刚断送了自己的职业生涯,没错,很多人都这样对我说。同事得知我即将离开公司的消息,大多数对此表示理解。但让他们困惑的是,我目前就职的公司是一家Windows商店,用C#.net编写代码,而我要入职的岗位要求在Linux环境下进行开发,以Java为主要的编程语言。他们认为编程语言的改变会让我丢失多年经验,许多人都赞同他们的观点。编程语言很多,数以百计。有些很常见,例如:Java、C#、PHP、Ruby、Python、和JavaScript,而有些则比较边缘化或是新兴的,例如:Awk、Go、Julia、Rust。面对如此多的选择,我们又该关注那种语言呢?因此,我开始思考这个问题 - 你真的需要掌握不止一种编程语言吗?想要掌握多种编程语言的9个理由能用多种方式来解决同样的问题,掌握不同的编程语言意味着拥有更多的选择。毕竟,当你只有锤子时,一切看起来都像是钉子。更有竞争力,拥有更多的就业机会。学习第二门编程语言,有时能加倍工作机会的数量。然而,这取决于你学习的语言种类。但无论怎么说,你将会有更多的合适机会,从而增加求职能力。表明你具备学习新语言的能力。潜在的雇主会认为你并非是死板或者惯守成规的人。学习是很有趣的。学习新的事物会让你的头脑保持兴奋。这将有助于你在新领域的成长和提高。紧跟当前的技术发展趋势。了解哪个行业在独领风骚,就可以永远站在潮流的尖端,你的技能便不会过时。这将提醒你为什么应该热爱你的“主”语言,或者如何将事情做得更好。有时候,只有尝试过新语言,才会知道主语言是何等的优秀。你会更加欣赏自己最爱的语言。与此同时,新语言可能会有一些惊人的特性,让你深觉相见恨晚。有助于成为一个更加优秀的程序猿。学习新的语言,有助于提高在所有语言之间通用的技能,例如:设计和架构算法,或处理不同的数据结构。针对工作选择最佳的工具。尺有所短寸有所长 - 有的语言更善于处理某些特定方面的事情。掌握了多种语言,你可以在工作中选用最佳的工具表明你的学习能力强。没有任何事情比掌握第二语言更能证明你的学习能力。不想掌握多种编程语言的9个理由掌握一种语言更容易。通常,集中精力和全心投入才能精通某一事物。如果不断地在多种语言之间进行切换,那么真正精通一门语言的概率就会降低。掌握一种语言也有助于你集中精力。大多数人只需要一份工作,大部分公司只使用一种语言。在你被录用后,掌握多种语言不一定会有所帮助。有时候,只要掌握项目所用的语言就够了。总有一些东西值得学习;有时候,这意味着要更深入地学习一种语言。大多数情况下,专家能提更高的薪资要求,因为人们更愿意为专家支付更多的薪水。John Sonmez在其视频《 I’m Not Sure I Want To Be A Specialist》中谈到为什么多面手并不总是最好的。即便仅掌握一种语言,仍然可以被认为是一个伟大的开发者。是否是伟大的开发者与你掌握多少种语言无关。关键在于你创造的是什么。因为只涉及一种语言,所以你可以花更多的时间进行创造。你只需要学习有限的软件开发工具。大多数语言只有为数不多的一些工具。切换语言往往意味着要切换工具。只掌握一种语言,你就可以更快地掌握相关的工具。这将有助于提高工作效率。更易于定位自己的市场。因为只掌握一种语言,基本上你只会朝这个方向安顿下来(即使不是出于自己的选择)。你可以凭借任何一种语言解决大多数软件问题。不管有多少人告诉你,大多数语言可以用于解决任何问题。如果解决问题是你的主要目标(本应当是),掌握更多的语言并不一定有助于实现这个目标。深入理解一件事比表面了解十件事更好。这并非是一个非黑即白的问题。和其他问题一样,最好的解决办法是取中间值:总有一片灰色地带。如果你是一个初学者,那么学习一种语言,并将其应用到前十多个项目中会比较容易。但此之后,建议你成为一个「T形」软件开发者。什么是「T形」软件开发者?所谓「T形」软件开发者在某一个特定的区域拥有很深的造诣,而且是一种语言的专家,T字母中的垂直线代表了这一点;此外,他们会继续广泛学习另一种技能,T字母中的水平线代表了这一点。那么,这与软件开发,特别是编程语言的学习,有什么关系呢?我的建议是精通一种编程语言,这将成为你以后的生计,并用于解决大部分问题。你应该尽你所能掌握这门语言。在此基础上,可以学习最适合工作的第二种语言或技能。T形软件开发者是一个多面手,精通于某一领域。在成为T形开发者的历程中,你将灵活地掌握多种语言,同时具备某个领域专家的优点。应该掌握哪种编程语言?一个常见的问题是,应当学习哪种语言。或者说,假如你是初学者,应当首先学习哪种语言。通常,我会选择有一定历史的语言作为主要语言。这种语言应当用于多个行业,并且有广泛的使用群体和大量的开发工具。符合这些标准的语言有:Java、C#、.NET、Ruby、Python和Swift。TIOBE软件基于这些标准持续跟踪软件语言的流行性,并编入索引中。你可以点击TIOBE Index查看完整的编程语言列表。索引会每月更新,前20名中的大多数语言都是不错的选择。未来10年,这些语言还会流行吗?我不确定。不过至少在未来四年内还是很可能保持流行的,我想,这对任何准备着手的项目都是够用的。是否需要掌握多种语言取决于你的目标

    展开全文
  • C语言什么不会过时?

    万次阅读 2020-06-23 21:48:39
    整理自网络 作者:赵岩/...作为《C语言点滴》《drop of knowledge of C++》书籍的作者,《C语言新思维,第二版》的译者(赵岩老师),我觉得我有责任系统的介绍一下这本语言,他的特点,还有他的未来。这个问题对很...

    整理自网络  作者: 赵岩/Serdar等

    01、为什么C语言不会过时

    评价任何一门编程语言,都是招人骂的。永远是这样。就像是春寒料峭的季节,街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字:“傻逼!”这个在心理学上有个专业的名字:叫做“二逼”现象!

     

    那我为啥还要做这个挨骂的事呢?作为《C语言点滴》《drop of knowledge of C++》书籍的作者,《C语言新思维,第二版》的译者(赵岩老师),我觉得我有责任系统的介绍一下这本语言,他的特点,还有他的未来。这个问题对很多刚刚踏入程序猿这个行业的新手至关重要。因为他们有深深的担忧,万一C语言就像Fortran那样过时了怎么办?
     

    先上一个表,这个就是著名的TIOBE语言排行榜。目前它是一个最权威的一个语言流行度的排行榜。

    就在5月,时隔5年,C语言再次领先Java,荣登TIOBE编程语言排行榜第一!

     

     

    排名前十的分别是:

     

    C,Java,Python,C++,C#,Visual Basic.NET,JavaScript,PHP,SQL和R。
     

     

    有没有发现亮点?没错, 第一易主了,C 语言反超了 Java 。要知道,C 语言上次第一还是在 5 年前,是什么原因让其“东山再起”了呢?

     

    时隔五年,C语言重回榜首。

     

     

    据TIOBE CEO Paul Jansen 的猜测,“这听起来可能很不可思议,但是某些编程语言确实可以从这种情况中受益。"

    嵌入式语言(C 和 C++ 等)越来越流行,因为它们被用于医疗设备软件中。

     

     

    对所有的编程语言,他们的最后的目的其实就是两种:提高硬件的运行效率和提高程序员的开发效率。

    遗憾的是,这两点是不可能并存的!你只能选一样。在提高硬件的运行效率这一方面,C语言没有竞争者!举个简单的例子,实现一个列表,C语言用数组int a[3],经过编译以后变成了(基地址+偏移量)的方式。对于计算机来说,没有运算比加法更快,没有任何一种方法比(基地址+偏移量)的存取方法更快。

    C语言已经把硬件的运行效率压缩到了极致。这种设计思想带来的问题就是易用性和安全性的缺失。例如,你不能在数组中混合保存不同的类型,否则编译器没有办法计算正确的偏移量。同时C语言对于错误的偏移量也不闻不问,这就是C语言中臭名昭著的越界问题。


    C语言自诩的“相信程序员”都是漂亮的说辞,它的唯一目的就是快,要么飞速的运行,要么飞速的崩溃。C语言只关心程序飞的高不高,不关心程序猿飞的累不累。就是这样!
     

    现在来看看那些非C的语言,他们的长处都在于提高程序员的开发效率上。或者支持动态的列表,或者支持安全的列表。但是加入任何的中间层,加入任何的安全检验,它不可能比(基地址+偏移量+无检验)的方式更快。这个世界上不存在“开发容易,运行快”的语言,开发容易毕竟来源于对底层的一层一层又一层的包装。 


    现在回答两个最普遍的问题:硬件这么便宜了,有必要让软件更快吗?有这种疑问的人大部分都是网吧的固定客户,他们理解的计算机只在电脑城,他们理解的计算只是游戏和播放硬盘中的小电影。不要玩个游戏开个挂就乐得不行不行的,别忘了还有全实景仿真,还有3D渲染,还有自动驾驶。
     

    人在开车的时候,每秒要收集60个不同的物体,然后根据这60个物体的不同组合和反映来做20个最重要的决定。然后从这20多个决定中选一个执行。所以就算用上最快的硬件,自动驾驶现在还不敢说能像人那样开车。就算是自动驾驶成功了,下一步还要自动飞行呢?因为我们老早就预言了:你咋不上天呢!
     

    所以说:计算速度永远是不够的!因为新的应用会越来越复杂,越来也实时。对了!我还忘了一个更重要的限制:计算的能耗!NASA飞行器上的CPU最多就是32位的,说出来你可能不信,国际空间站上没有一个CPU是64位的,我猜一个最主要的原因是航天员不爱看硬盘小电影吧。
     

    另外一个流行的疑问是:我可以发明一种同样快的语言,但是没有C语言那么多的坑。想法是可以的,而且还真巧有这个语言,真巧它的名字叫D语言,真巧没有太多的人用!这是因为一个基本的事实。现在有太多,太多太多的C代码,他们大部分都在正常工作,就像Linux, Window, MacOS,Unix,Vxworks。你没有看错,这些操作系统的内核都是C,我虽然不确定C在Window中所占的比例,但是我相信微软的人不会傻到用C#去全部改写一个操作系统的内核。你想让这些人去用你的全新的语言,这就不是“有点”很傻,很天真了!
     

    而且有些代码,我们根本就不能改!NASA一个简单的5个CPU飞控软件编写完毕后,要进行一种“全覆盖”测试。如果CPU A坏了会发生什么?如果CPU A,B坏了呢?如果CPU A,C坏了呢。。。。?如果你愿意,你可以做个简单的数学组合。测试完毕后,别说重写,就算加个注释都不行。因为主管payload的大妈会非常严肃的质问你,为什么你上报的东西数量增加了,但是质量没有增加?你需要和她详细的解释:硬件和软件是不同的,硬件是那种摸起来硬硬的东西,但是软件不是那种摸起来软软的东西。看着大妈鄙夷的眼神,这个时候你会非常后悔自己手欠加入的哪一行注释。你还别不当真,这个是NASA的真实故事。
     

    那为什么C语言还下降这么多呢?很简单,有些任务本身就不是C语言的。我上学的时候还用C语言编过窗口界面呢?然后很快微软的人就推出了MFC,就是一大堆宏把底层的C windowAPI包装了起来。
     

    再后来这个技术也过时了。因为微软的人认识到,带有窗口的应用程序说到底不是C语言的本职工作,再这么一层一层包下去就有露馅的危险,于是他们发明了一个全新的语言C#来负责这个任务。
     

    Java也是这样,突出网络,易用,安全,跨平台。无论是Java, c#还是python, 他们都有意避开提高硬件的运行效率这个问题,因为这个问题上没办法和C竞争,也无法撼动Linux, Unix,GNU tool这些已有C代码的位置。剩下的就只是提高程序员的开发效率上大作文章。这对C语言是好事,把自己不善长的东西去掉,让自己跑的更快!
     

    伴随着嵌入和实时系统的兴起,AI,机器人,自动驾驶等。这些都是C语言的核心应用,而且在这种应用上面,C语言没有竞争者。所以我感觉C语言会稳定在自己核心的应用中,并开始逐步回升。
     

    最后说点闲话,C++不会淘汰C语言。有了对象后你会发现再简朴的对象也耗费资源,而且有了对象以后,总是不由自主的去想继承这个事,一但继承实现了,你会发现继承带来的麻烦远超过你的想象。Java的发明人James被问到如果可以从新设计Java语言的话,第一个要做什么事?他说:“去掉对象”!作为一个已婚,有两个孩子的程序猿,我感同身受。如果大家感兴趣,我可以再写一个博客,聊聊C++和C的真实区别所在。

    如果你看到这里,还什么都没记住。那就只记住一点:没人能预测未来。

    如果再有人对你说C语言已经过时了,最好自己思考一下,能求真最好,如果不能,至少要做到存疑。

     

    02、为什么C仍占据统治地位?

    于一种计算机行业的技术来说尤其如此。自1972年诞生以来,C语言一直保持生龙活虎的状态,时至今日它仍然是我们用来搭建软件世界的基础建筑材料之一。
     

    但有时一种技术能够长期存在,只是因为人们还没有来得及发明新的东西来取代它而已。在过去的几十年里,出现了许多其他语言——其中一些明确地被设计用于挑战C的主导地位,有些语言试图凭借自己的人气慢慢瓦解C语言的统治地位。
     

    为C需要被替换掉的观点争辩是简单的。编程语言研究和软件开发实践都暗示了如何比C更好地去做事。但历经数十年的研究和开发,C语言的地位却依旧稳固。很少有其他语言能够在性能、裸机兼容性或通用性等方面击败它。不过,2018年C是如何与那些明星编程语言竞争的呢,其中细节仍值得一看。

    C vs. C ++

    当然了,C最常被拿来与C ++进行比较,正如其名称本身所暗示的那样,C++作为对C语言的扩展而被创建出来。C ++和C之间的差异可以概括为C++更加广泛(褒)或更加宽泛(贬),具体取决于这个问题你是问的C还是C++程序员。(笑)
     

    虽然C ++的语法等方面仍然是类C的,但它提供了许多在原生的C中本不可用的非常实用的功能:命名空间(namespace),模板(template),异常(exception),自动内存管理(automatic memory management)等等。需要顶级性能的项目,例如涉及数据库,机器学习系统的项目通常是用C ++编写的,以便项目能尽可能地榨取以及利用到每一点性能。
     

    此外,与C相比,C ++在持续地更加积极地扩展。即将推出的C ++ 20会带来更多功能供开发者享用,包括模块,协同程序,同步库,以及概念,这些使模板更易于使用。C standard的最新版本只进行了少量更新,并侧重于保持向后兼容性。
     

    事实上,C ++中的所有附加功能同样也可能成为累赘。而且是很大的累赘。您使用的C ++专属功能越多,引入的复杂度就越高,对结果的修正就越困难。将自己局限于仅一个C ++子集的开发人员可以避免许多开发中严重的坑和额外负担。但是有些团队想要从根儿上防范C ++的过度复杂性。坚持使用C能迫使开发人员将自己局限于一个子集。例如,Linux内核开发团队就直接避开了C ++。
     

    选C而不选C++对您——以及任何将会维护你代码的开发人员——来说都是可行的,通过采用强制简约主义来避免与C ++的复杂性纠缠。当然,C ++拥有丰富的高级功能,这是有它自己的道理的。但如果极简主义更适合当前和未来的项目——以及负责项目的团队——那么还是选C更明智一些。

    C vs. Java

    几十年了,Java仍然是企业软件开发的主力军之一——并且也是宽泛而言的开发的主力军之一。许多最重要的企业软件项目都是用Java编写的——包括绝大多数Apache Software Foundation项目——而Java仍然是开发企业级需求项目的可行语言。


    Java的语法从C和C ++中借鉴了很多东西。但是,与C不同的是,Java默认情况下不会编译为本机代码。相反,Java运行时环境,JVM,JIT(实时)编译Java代码以在目标环境中运行。在适当的情况下,JIT编译后的Java代码可以接近甚至超过C的性能。


    Java背后的“一次编写,随处运行”的理念也允许Java程序在目标架构上进行相对较少的调整即可运行。相比之下,虽然C已被移植到许多架构中,但任何给定的C程序仍可能需要重新量身定做才能在,打个比方,Windows与Linux,两种不同的os之间正常运行。


    这种可移植性和强大性能的结合,以及庞大的软件库和框架组成的生态,使Java成为构建企业应用程序的首选语言。


    Java输给C的地方是一个Java从未打算竞争的领域:靠近底层结构运行,或直接与硬件打交道。C代码被编译成机器代码,由进程直接执行。Java被编译成字节码,这是一种随后会被JVM解释器转换为机器代码的中间代码。此外,尽管Java的自动内存管理在大多数情况下都是个优点,但C更适合于必须充分利用有限内存资源的情况。


    也就是说,在某些方面,Java在速度方面可以接近于C。JVM的JIT引擎在运行时根据程序行为优化例程,允许进行许多类型的优化,而这些优化是在未提前编译的C中无法实现的。虽然Java运行时自动执行内存管理,但一些较新的应用程序可以解决这个问题。例如,Apache Spark部分地通过使用绕过JVM的自定义内存管理代码来优化内存中处理。

    C vs. C#和.Net

    在推出近二十年后,C#和.Net 框架仍然是企业软件世界的主要组成部分。有人说C#和.Net是微软对Java的回应——一个托管代码编译器系统和通用运行库——C和Java之间的许多种对比也适用于C和C#或.Net之间。


    与Java(以及某种程度上来说Python也是如此)一样,.Net提供跨各种平台的可移植性和庞大的集成软件生态系统。考虑到.Net世界中有多少面向企业的开发,这些都是不小的优势。当您使用C#或任何其他.Net语言开发程序时,您可以使用为.Net运行时编写的大量工具和库。


    .NET另一个类似Java的优势是JIT优化。C#和.Net程序可以按照C语言提前编译,但它们主要由.Net运行时进行即时编译,并使用运行时信息进行优化。JIT编译允许对无法在C中执行的运行着的.Net程序进行各种就地优化。


    与C一样,C#和.Net提供各种直接访问内存的机制。堆,栈和非托管系统内存都可以通过.Net API和对象访问。开发人员可以使用.Net中的unsafe模式来实现更高的性能。


    但这些都不是没有代价的。托管对象和unsafe对象不能被任意交换,并且它们之间的编组会降低性能。因此,要最大化.Net应用程序的性能需要将托管和非托管对象之间的变动保持在最低限度。


    如果您无法承担托管与非托管内存之间变动造成的性能损失,或者.Net运行时对于目标环境(例如,内核空间)来说是一个糟糕的选择,或者可能根本不可用,那么C就是你所需要的。与C#和.Net不同,C被默认可以解锁对内存的访问权。

    C vs. Go

    Go的语法很大程度上借鉴了C——花括号作为定界符,语句以分号结束,等等。精通C的开发人员通常可以毫不费力地直接使用Go,甚至算上Go的独有功能,如命名空间和包管理,对开发人员来说也并不困难。


    代码可读性是Go的指导设计目标之一:让开发人员可以轻松掌握任何Go项目,并在短时间内熟练掌握代码库。C代码库可能很难理解,因为它们很容易聚集大量专属于某个项目或某个团队的宏和和#ifdef。Go的语法及其内置的代码格式以及项目管理工具旨在避免这种结构性问题。


    Go还提供了诸如goroutine和channel之类的附加功能,用于处理并发性和组件之间的消息传递的语言级别的工具。C需要开发者手动完成或由外部库提供,但Go提供了开箱即用的这些功能,使得构建需要这些功能的软件变得更加容易。


    Go与C最深层次的不同之处在于内存管理方面。默认情况下,Go的对象会被自动管理并自动进行回收。对于大多数编程工作来说,这非常方便。但这也意味着任何需要确定性处理内存的程序都会更难编写。


    Go确实包含了用于绕过Go的某些类型处理安全性的unsafe包,例如使用Pointer类型读取和写入任意内存。但unsafe会附带一个warning说用它编写的程序“可能是不可移植的,并且不受Go 1兼容性指南的保护。”


    Go非常适合构建命令行实用程序和网络服务等,因为这些很少用到太过细致的操作。但是,如果是低级设备驱动程序,内核空间操作系统组件以及其他需要严格控制内存布局和管理的任务,那么就最好用C来创建。

    C vs. Rust

    在某些方面,Rust是对C和C ++创建的内存管理难题的回应,也是对这两种语言的许多其他缺点的回应。Rust编译为本机机器代码,因此就性能而言,它被认为与C相当。但默认情况下,内存安全才是Rust的主要卖点。


    Rust的语法和编译规则可帮助开发人员避免常见的内存管理错误。如果程序有一个不符合Rust语法的内存管理问题,它就不会被编译。刚接触这种语言的新手,特别是以前用C语言的开发者,由于C语言为这类bug提供了充足的容错空间,所以他们接触Rust的第一步是学习如何安抚编译器。但Rust的支持者认为,这种短期的痛苦有一个长期的回报:更安全的,不会减缓速度的代码。


    Rust还通过其工具改进了C语言。默认情况下,项目和组件管理是Rust提供的工具链的一部分,与Go相同。有一种默认的,推荐的方法来管理包,组织项目文件夹,以及处理C需要单独处理的其他许多事情,每个项目和团队以不同的方式处理它们。


    然而,在Rust中被吹捧为优势的东西对于C开发者来说可能并没有太大吸引力。Rust的编译时安全功能无法禁用,因此即使是最小的Rust程序也必须符合Rust的内存安全限制。默认情况下,C可能不太安全,但在必要时它更灵活,更宽容。

    另一个可能的缺点是Rust语言的大小。即使考虑到标准库,C的功能也相对较少。Rust功能集非常庞大并且还在不断增长。与C ++一样,较大的Rust功能集意味着更强大的功能,但也意味着更高的复杂度。C是一种较小的语言,但更容易在头脑中进行建模,因此可能更适合那些对Rust来说太小,不值得大动干戈的项目。

    C vs. Python

    当今,每当谈论软件开发时,Python似乎总是能出现在对话中。毕竟,Python是“对所有项目的第二佳语言”,毫无疑问是最通用的语言之一,拥有数千个第三方库。


    Python强调的,以及它与C最不同的地方,是有利于开发速度而不是执行速度。一个可能需要一个小时才能用另一种语言写出来的程序——比如C——可能用Python几分钟内就能写好。另一方面,该程序在C中执行可能需要几秒钟,但需要一分钟才能在Python中运行完。(一个很好的经验法则:Python程序通常比它们对应的C语言程序运行速度慢一个数量级。)但是对于现代硬件上的许多工作,Python已经足够快了,这是它如今广泛应用的一个重要原因。


    另一个主要区别是内存管理。Python程序完全由Python运行时进行内存管理,因此开发人员不必担心分配和释放内存的细节。但同样,开发人员的轻松也是以运行时性能为代价的。编写C程序需要严格关注内存管理,但生成的程序通常是纯机器速度的黄金标准。


    但是,在二者的血脉中,Python和C共享一个深层的关系:Python运行时参考是用C语言编写的。这允许Python程序包装用C和C ++编写的库。第三方库的Python生态系统的很多重要模块,例如机器学习方面的库,其核心是C代码。


    如果开发速度比执行速度更重要,并且如果程序的大多数高性能部分可以被隔离到独立组件中(而不是遍布整个代码),那么纯Python或Python和C库的混合使得会是比单独使用C更好的选择。否则的话,C仍然是老大。

     

    03、C语言为何值得去学

    1. 嵌入式领域,C语言依然是首选语言,嵌入式并没有因为其他上层语言的发展而没落,现在嵌入式依然还在其自身的领域展现强大的生命力。手机,电视机,机顶盒,空气净化器等等电子产品都是其领域范畴,从长远看短时间内不可能被消失。而且智能机器人的崛起,C语言的使用频率又开始加大了。


    2. 操作系统内核代码还是C语言为主打,就语言的灵活性以及执行的效率来看C语言还是最合适的语言,而且在系统层次的代码,C语言还是首选语言。而且现在很多流行语言的底层绝大部分的C语言构建完成。从这个层面讲C语言是永远不会过时的,顶多算是应用范围变窄,但其作用依然强大。


    3. C语言的职位比例相对应用级语言是低了点,但是整个软件行业在发展,绝对的C语言编程职位并没有减少。而且对于有志于成为架构师层次的程序员来说,C语言还是必修课,构建软件框架还是需要对底层有所了解。


    退一步来讲,即使觉得C语言方面的职位比例低一些,不好找工作,可以先从C语言入手,把自己的知识体系建立起来,编程语言属于工具范畴,熟悉一种工具的使用,很容易触类旁通,切换到别的语言也相对轻松些,而且给整个职业生涯起了个好头,打好了基础为更上一层楼做足准备。


    C语言之所以流行这么年,生命力这么旺盛和本身鲜明的高效,方便灵活挂钩。即使在上层语言使用概率变低,并不妨碍在系统级别继续发挥作用。任何一种语言都有其存在的社会价值所在。C语言还是值得作为入门语言深刻的学习。

     

    4.C/C++程序员的收入没有受到影响,依据100offer的后台数据显现,现在经过100offer入职的程序员年薪最高达47W,最低22.4W,C/C++程序员的收入与其它编程语言的岗位相比并没有呈现下风。随着C/C++逐步变成某些特定公司和特定项目所需的语言后,高级C/C++程序员的收入也会更具有竞争性。


    知乎红人vczh说:「我在上大学的时分简直就只学习C/C++,后来实习的时分去了微软,成果到了那里才知道,那个组是不必C/C++的,怎么办?凭借着C++带给我的富裕的功底,我准时完结了老板给我的"两个星期内学会C#和WCF基础知识"的作业,顺畅开端作业。」


    当然,这只是vczh的个人经历,不具有普遍性,但不可否认的是C/C++仍具有不可代替性。某家创业公司CTO在接受采访时表示:「即使有许多人唱衰C/C++,但在今世,仍有许多许多项目的目标渠道暂时只供给C/C++编译器的支撑,仅从这一点而言,C/C++是不可能完全消逝的。」
     

    从应用范畴来说,C/C++适用于高性能计算、嵌入式体系、开发服务器软件、游戏、实时体系、网络通信等,短期内能完全代替C/C++的语言并不存在,所以依然具有很强的竞争性。

     

    04、除了C,需要掌握多种语言吗?

    想要掌握多种编程语言的9个理由

     

    1. 能用多种方式来解决同样的问题,掌握不同的编程语言意味着拥有更多的选择。毕竟,当你只有锤子时,一切看起来都像是钉子。

    2. 更有竞争力,拥有更多的就业机会。学习第二门编程语言,有时能加倍工作机会的数量。然而,这取决于你学习的语言种类。但无论怎么说,你将会有更多的合适机会,从而增加求职能力。

    3. 表明你具备学习新语言的能力。潜在的雇主会认为你并非是死板或者惯守成规的人。

    4. 学习是很有趣的。学习新的事物会让你的头脑保持兴奋。这将有助于你在新领域的成长和提高。

    5. 紧跟当前的技术发展趋势。了解哪个行业在独领风骚,就可以永远站在潮流的尖端,你的技能便不会过时。

    6. 这将提醒你为什么应该热爱你的“主”语言,或者如何将事情做得更好。有时候,只有尝试过新语言,才会知道主语言是何等的优秀。你会更加欣赏自己最爱的语言。与此同时,新语言可能会有一些惊人的特性,让你深觉相见恨晚。

    7. 有助于成为一个更加优秀的程序猿。学习新的语言,有助于提高在所有语言之间通用的技能,例如:设计和架构算法,或处理不同的数据结构。

    8. 针对工作选择最佳的工具。尺有所短寸有所长 - 有的语言更善于处理某些特定方面的事情。掌握了多种语言,你可以在工作中选用最佳的工具

    9. 表明你的学习能力强。没有任何事情比掌握第二语言更能证明你的学习能力。

     

    不想掌握多种编程语言的9个理由

     

    1. 掌握一种语言更容易。通常,集中精力和全心投入才能精通某一事物。如果不断地在多种语言之间进行切换,那么真正精通一门语言的概率就会降低。掌握一种语言也有助于你集中精力。

    2. 大多数人只需要一份工作,大部分公司只使用一种语言。在你被录用后,掌握多种语言不一定会有所帮助。有时候,只要掌握项目所用的语言就够了。

    3. 总有一些东西值得学习;有时候,这意味着要更深入地学习一种语言。

    4. 大多数情况下,专家能提更高的薪资要求,因为人们更愿意为专家支付更多的薪水。John Sonmez在其视频《 I’m Not Sure I Want To Be A Specialist》中谈到为什么多面手并不总是最好的。

    5. 即便仅掌握一种语言,仍然可以被认为是一个伟大的开发者。是否是伟大的开发者与你掌握多少种语言无关。关键在于你创造的是什么。因为只涉及一种语言,所以你可以花更多的时间进行创造。

    6. 你只需要学习有限的软件开发工具。大多数语言只有为数不多的一些工具。切换语言往往意味着要切换工具。只掌握一种语言,你就可以更快地掌握相关的工具。这将有助于提高工作效率。

    7. 更易于定位自己的市场。因为只掌握一种语言,基本上你只会朝这个方向安顿下来(即使不是出于自己的选择)。

    8. 你可以凭借任何一种语言解决大多数软件问题。不管有多少人告诉你,大多数语言可以用于解决任何问题。如果解决问题是你的主要目标(本应当是),掌握更多的语言并不一定有助于实现这个目标。

    9. 深入理解一件事比表面了解十件事更好。


    这并非是一个非黑即白的问题。和其他问题一样,最好的解决办法是取中间值:总有一片灰色地带。如果你是一个初学者,那么学习一种语言,并将其应用到前十多个项目中会比较容易。但此之后,建议你成为一个「T形」软件开发者。

     

    什么是「T形」软件开发者?


    所谓「T形」软件开发者在某一个特定的区域拥有很深的造诣,而且是一种语言的专家,T字母中的垂直线代表了这一点;此外,他们会继续广泛学习另一种技能,T字母中的水平线代表了这一点。


    那么,这与软件开发,特别是编程语言的学习,有什么关系呢?我的建议是精通一种编程语言,这将成为你以后的生计,并用于解决大部分问题。你应该尽你所能掌握这门语言。在此基础上,可以学习最适合工作的第二种语言或技能。
     

    T形软件开发者是一个多面手,精通于某一领域。


    在成为T形开发者的历程中,你将灵活地掌握多种语言,同时具备某个领域专家的优点。

     

    应该掌握哪种编程语言?


    一个常见的问题是,应当学习哪种语言。或者说,假如你是初学者,应当首先学习哪种语言。通常,我会选择有一定历史的语言作为主要语言。这种语言应当用于多个行业,并且有广泛的使用群体和大量的开发工具。符合这些标准的语言包括但不限于:C、C++、Java、JavaScript、C#、Python、Go等等。


    TIOBE软件基于这些标准持续跟踪软件语言的流行性,并编入索引中。你可以点击TIOBE Index查看完整的编程语言列表。索引会每月更新,前20名中的大多数语言都是不错的选择。未来10年,这些语言还会流行吗?我不确定。不过至少在未来几年内还是很可能保持流行的,我想,这对任何准备着手的项目都是够用的。

    说实话,关于是否需要掌握更多的语言,其实并没有绝对正确或错误的答案,不谈需求选语言都是耍流氓,最后的决定还是取决于你的需求。

    【参考资料】

    1、Serdar Yegulalp
    https://www.infoworld.com/article/3402023/why-the-c-programming-language-still-rules.html

    2、赵岩
    http://zhaoyan.website/blog/index.php/2017/07/15/future/

    3、佚名
    https://dzone.com/articles/do-you-need-to-know-more-than-one-language

    展开全文
  • 简单的说,编程就是为了借助于计算机来达到某一目的或解决某个问题,而使用某种程序设计语言编写程序代码,并最终得到结果的过程。 计算机虽然功能十分强大。可以供你上网、打游戏、管理公司人事关系等等,但是...
  • 首先来说说编程语言这个概念。 编程,其实就是让计算机听懂自己的话,让计算机帮自己想干的事情。编程语言,就是让你能够和计算机进行交流的一种语言。...还有听到“唉呀”就打的那部经典僵尸片。这些“起”,“立...
  • 除了1+1还有没有其它的方法 如1+1为什么等于2 首先要说到“面向过程的编程语言”、“面向对像的编程语言”、“结构化查询语言” 说专业一点 学面向过程主要是学“算法”以提高运算效率;“面向对像的编程语言”应...
  • 什么C语言

    2018-12-21 18:53:28
    计算机同样是用来帮助我们人类的工具。 想一想,假如你现在希望让计算机来帮助你做一事情,首先你需要做什么?是不是要先与计算机进行沟通?...语言除了C 语言以外,还有C++、Java、C#语言等等。 C 语言...
  • 首先来说说编程语言这个概念。 编程,其实就是让计算机听懂自己的话,让计算机帮自己想干的事情。编程语言,就是让你能够和计算机进行交流的一种语言。...还有听到“唉呀”就打的那部经典僵尸片。这些“起”,“立...
  • 什么学习C语言

    2013-09-18 08:37:35
    [+] C语言学习方法 ...为什么要学习、使用C语言?为什么要学习一个可能比自己都岁数大的编程语言?...还有一个原因是C语言是工程实践性很强的语言,它不是来自某个研究所某个大学学院,而是实实在在从项
  • C语言和C++有什么区别?

    千次阅读 多人点赞 2020-12-25 11:42:48
    由于引进了C++ 这个名字,写出了C++ 的参考手册 [Stroustrup,1984],与C语言的兼容性问题就变成了一个最重要的问题,而且也成为争论的焦点。 还有,到1983年后期,贝尔实验室里负责开发和支持UNIX、生产AT&T...
  • 什么要学习c语言

    2013-09-24 22:52:44
    什么要学习、使用C语言?为什么要学习一个可能比自己都岁数大的...还有一个原因是C语言是工程实践性很强的语言,它不是来自某个研究所某个大学学院,而是实实在在从项目需 要中产生,伴随着Unix的兴起而流行,语义
  • 什么要学习C语言

    2013-09-26 17:33:33
    (一)“项目驱动”式教学  ...既然如此庞大复杂的0S都可以用c语言编写,从狭义而言,还有什么系统软件和应用软件不能用c语言编写呢?由此可以肯定的说,c语言是一门十分优秀而又重要的语言。  c语言
  • 我们就从c语言开始学习编程,在我们开始学习编程之前先了解一下什么是程序和指令还有编程语言是如何诞生的。 什么是程序: 我们知道,计算机只是一个机器,它就是一堆物理零件的组成,它本身不会思考,不会...
  • 学了C语言,能开发什么项目?

    千次阅读 2019-04-19 14:35:28
    直至今天还有人在喊着C语言都过时的语言了,还有什么值得去学的,看现在的python,JAVA等语言现在用起来多简单,谁还去学习老掉牙的C语言,事实真的是这样的吗?小编作为专门下载了这两种语言的底层源码。由于篇幅的...
  • 什么要学习C语言

    2015-03-11 11:30:34
    什么要学习、使用C语言?为什么要学习一个可能比自己都岁数大的编程语言? 我在前面如何学习编程语言的博客文章http://sunxiunan.com/?p=1597 里提到,选择一门编程...还有一个原因是C语言是工程实践性很强的语
  • 很多人觉得用C语言作为入门语言觉得太难了,里面还有指针,回调,递归之类的操作太难了。为什么这么多人觉得C语言难?笔者来给代价分析一下。 第一 C语言是距离硬件非常近的语言,特别是和内存关联很近,主要还是...
  • 万事开头难,自学C语言最大的困难在于遇到问题不知道如何解决,还有不知道学到什么程度才能找到工作,这是自学编程语言最大的障碍。 学到中间不知道什么时候是个头,遇到问题没有解决的途径,这是自学过程中遇到的...
  • 什么要学习c语言

    2013-09-14 09:55:25
    什么要学习、使用C语言?为什么要学习一个可能比自己都岁数大的编程...还有一个原因是C语言是工程实践性很强的语言,它不是来自某个研究所某个大学学院,而是实实在在从项目需要中产生,伴随着Unix的兴起而流行,语义
  • (2)用C语言开发新的编程语言,这个是可以做到的,但你要学好编译原理那门课,例如我们现在用的强大的python,还有php…这些语言都是用C写的 (3)嵌入式开发 (4)编写底层的东西,例如编写驱动程序,你可以写一个...
  • 什么C语言不会过时?

    千次阅读 2018-11-29 15:40:47
    评价任何一门编程语言,都是招人骂的。...作为《C语言点滴》《drop of knowledge of C++》书籍的作者,《C语言新思维,第二版》的译者,我觉得我有责任系统的介绍一下这门语言,他的特点,还有他...
  • C语言预知

    2020-02-22 23:10:30
      首先Java、Python、JavaScript、Lisp、还有汇编,所有的语言都可以通过C语言实现,Java、PHP、Python、Ruby等绝大多数语言的底层都由C支撑,c,c++辅助开发底层。其次众所周知适者生存,不适者淘汰。随着当今...
  • 一、为什么嵌入式开发用语言?  因为所有操作系统的内核几乎都是C语言写的。 C的特点(为什么用C语言?) ①出色的移植性:移植性高低的判断?... 还有什么语言访问硬件? 汇编 访问效率比C快

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 500
精华内容 200
关键字:

c语言还有什么语言

c语言 订阅