linux定时器王贤才,Linux之父Linus Torvald评价C++

article/2025/9/19 8:15:34

430101

Linux之父:C++一无是处 不适合LINUX内核开发

Linux之父Linus Torvalds曾经在三年前,因为微软的一位同学质疑Git用C语言开发,而将C++痛批了一顿。当时,他是这样评论的:

C++正处在困境当中,它既无助于简化,以实际用于进行原型化或者简单的GUI编程,又不是像C那样的简洁的系统编程语言,能够积极地鼓励你使用简单和直接的语言构造。

2010年6月5日到11日,他又在邮件列表中连续发贴,直截了当地炮轰C++。他明确表示:“我确实不喜欢C++,依我来看,它真的是一门很烂的语言。”

他还说,C++语言想解决的问题都不对路,都是一些皮毛问题,而没有涉及真正深层次的问题。C++的对象、模板和函数重载都基本上纯粹是C的语法扩展,是语法糖,总体上把C的语法和类型系统都弄得更糟。他建议,在系统编程里直接用C就可以,非系统编程里,应该选择一种有垃圾收集的语言,C++语言的特性基本无用,只会捣乱。因此,什么时候C++都不可能是正确的选择。

在另一个帖子中,他进一步说明,内核开发使用C语言而非C++的理由之一,是交流。在庞大的项目中,人们对不是自己开发的模块并不了解,能快速理解其他模块中函数的确切含义才能提高开发效率。而C++引入的各种抽象则使代码非常依赖上下文,想理解一段代码,需要看多得多的上下文。对于需要不断打补丁(小段代码)的内核来说,这是非常要命的。Linus也承认,在其他一些情况下,可能需要更多语言支持,语言级的内存分配机制如垃圾收集、并发、动态代码生成等等。但是内核开发不需要。而且,即使是这些方面,C++也不灵。他不忘嘲笑C++的new关键字很蠢。

有人问到,C++没有解决的深层次问题是什么?Linus回答,比如并发。他进而又痛批了一通:C++是狗屎,根本没啥设计,只是在C上面加了些渣滓而已。

有人问Linus对Go语言怎么看。他回答,Go语言里有些不错而且重要的东西值得关注,许多决策都很合理。但设计者自己称这个语言为实验性的,这当然有其原因。而且,引入一种新语言没那么容易,过二十年再说吧。

此外,Linus还在另一个帖子里痛批了面向对象语言。他认为面向对象语言以对象为核心,加一些相关联的方法,简直是呓语。重要的东西应该是数据结构,对象本身有啥重要?真正有意思的,是在不同类型的不同对象交互而且有锁规则的时候。但是,即使是这时候,封装什么“对象接口”也绝对错误,因为不再是单一对象的问题了。他的结论是,面向对象解决的都是一些小问题。

网易的云风为此撰写了一篇博客,其中谈到:

我想说,C 的三个特质(见引用文最后一段) 哪一点都不可忽略。Linus 这次强调的大约是第三点(即交流——编者注),也是 C++ 程序员们不屑一顾的一点。可对于多人协作构建的项目,这一点实在是太重要了。这并不是人人都聪明就能回避的问题。如果程序员们都足够睿智,反而更能意识到沟通之成本。其实即使是你一个人在做整个项目,从前的你和现在的你以及将来的你,同样有沟通(记忆)的成本。人不可能两次踏进同一条河流。

不过,他似乎只读了Linus谈交流的那篇帖子,所以得出了这次Linus比较平和的结论。呵呵,哪里平和,

简直是全盘否定啊。

Linux内核创始人Linus Torvalds说使用C语言而非C++的理由

[日期:2010-06-15]来源:cnbeta  作者:cnbeta[字体:大 中 小]

Linux内核的创始人Linus Torvalds最 近在一封邮件中说明了内核开发需要使用C语言而非C++的理由。

Name: Linus Torvalds (torvalds@linux-foundation.org) 6/8/10

anon2 (anon@anons.com) on 6/8/10 写道:

>

>效率对于内核的开发是个至关重要的问题。

>大部分志愿者为内核贡献代码,所以在相

>同条件下,使用更高效的语言能让你的工

>作效率提升,从而更快更出色的完成开发。

事实上,你错了

志愿者贡献的代码很优秀,而且他们似乎没有觉得语言的效率是个障碍。如果改换语言真的能提高效率,那么这将是使大众受益的事情——不仅仅是经济方面 的。一行行的写代码,而不和用户交流,即使使用再有效率的语言都是无用的,很多大型项目都有这个问题的。

内核方面,我们有大约1000个志愿者者为每一个内核的释出做着贡献(3个月前统计的结果)。现在有更多的人加入,但是我更为担心的不是代码,而是 编码方面的持续性和linux内核的发展方向。现在,我已不写代码很多年。我目前主管志愿者的代码是否进入内核,如果代码可以进入内核,我就说ok,进去 吧;如果不能,我就说No——当然这种情况比较少。

如果想做好一个产品,最重要的就是要与客户进行交流。内核的编写也是如此,缺乏交流是整个项目的瓶颈……避免交流缺失最好的办法就是拥有共同的 “culture”(信仰吧……),或者拥有共同的默契感(原文:潜规则,汗之~)。我们有很多文档指导人们如何去做以及怎样去做,但是在不同文化背景的 人们面前,这些文档是那么苍白无力……

(有很多书在介绍文化,你甚至可以在大学取得一个相关的PhD学位,然后穷极一生去学习,但是,但是你却从来没有深入了解过自己……)

c语言呢,也有自己的“文化”(Unix也是如此——让我想起了KISS)。一个语言,就应该简单而明确,而不是复杂冗余。c++有一个绝对让我不 爽的“特性”—— context-dependent,这只是意味着, 当你阅读代码时,本地视图(local view)却不能给你任何帮助。

这,在交流上可是个大问题……在庞大的项目中,人们对不是自己开发的模块并不了解,能快速理解其他模块中函数的确切含义才能提高开发效率,而C++ 引入的各种抽象则使代码变得晦涩难读。

如果你想提交代码(或者补丁),是不是感觉 “sctp_connect()” 比 “connect()” 简洁而且明了呢?(匈牙利命名?) ,剩下的交给编译器吧,编译器能知道你写的是sctp协议模块的,并完成一切。

项目开发中,我们尽量使用补丁和分支,邮件列表等形式,而不是对源码进行整体修改,这是因为唯一重要的在于改变,而不是结果。所以,这也是我们避免 歧义和代码关联性(context)的根本原因。——尤其是在内核项目上,绝对不能有半点马虎。绝大多数软件工程上都是如此,其实在日常交往中也应该如 此:说话含糊不正常的得不到好处。

因此,一个语言应该简单而明确。你不必顾虑过多,也不用学习冗长的语法和你不需要的东西。如果每个人都是项目专家,那么隐含方式调用函数 (implicit context)是个不错的主意——这就是为什么真正深奥的科学文献,基本上都是晦涩难懂的,除非你是一个专家,拥有大量的背景知识以及要素,才能有所了 解。但是如果是一个多人参与的大型项目,呃,这几乎是不可能的。

例如,我非常了解 VM 部分的代码,但我仍然需要读取各文件系统和网络的代码。即使像我这样了解的人,仍然把代码写的简明扼要,绝不会有任何“隐藏代码”。c就是这样一个语言, 读代码,就能知道它的作用。一个函数用来做一件事,而这个函数也只作这一件事情,不会再出现一些“微妙的问题”——这是“哪个版本的一个函数调用”。

这也就是为什么我认为c语言“简约而不简单”——尤其是对于一个os的内核来说,尤为重要;在特定的编程或系统亦是如此。这也是为什么我不认为在所 有项目中c都适合的原因。

不过,c++……我真得不认为它有什么出色的地方。垃圾回收和并发等等,这些才是真正重要的特性。可是c++……完全落在了c后边……

09-05 10:35


http://chatgpt.dhexx.cn/article/YMhxmHoM.shtml

相关文章

好书推荐--Linux之父Linus的自传《Just for Fun》

这本书非常有趣,它让你不由感到,在这个浮躁的社会,兴趣爱好是多么的重要!至少能让你收获快乐。巴菲特说过这样一段话:“没钱没人脉时,请逼自己做好这三件事。第一,找到自己的兴趣爱好&#xff1…

linus 用的linux版本,Linus Torvalds的重大消息

Linux创始人Linus Torvalds在内核邮件列表上宣布正式释出Linux Kernel 4.9,这个版本被称为时尚改进最大的版本,同时4.10合并窗口已经开启。但值得注意的是,为期两周的合并窗口预计将在圣诞节这天关闭,因为假期的原因Torvalds考虑缩…

Linus基础

1.使用whereis查找locate命令 使用which查找whereis命令 使用locate查找rm命令 2.使用find命令查找当前路径下的所有普通文件 使用find查找file1.txt,file2.txt,file3.txt 3.cut命令的使用 4.uniq新建uniq_data.txt 使用uniq命令输出的结果 使用uniqming输出值重复的行 使用…

Linus:我终于在 M2 芯片的 MacBook 上发布了 Linux 最新版本!

整理 | 彭慧中 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 近日,Linus Torvalds(以下简称“Linus”)宣布Linux Kernel 5.19正式版终于可以和大家见面了。这一版本意义重大,虽然它比原计划晚了…

Linus系统的详细安装教程:

第一步 首先创建虚拟机 1.打开VMware,点击左上角新建虚拟机如下: 2.选择相关选项(也可以选自定义,自定义完成下一步即可)如下图: 3.选择“稍后安装操作系统(S)"如下图: 4.版本也可以选择其他的Red Hat版本(CentOS是Red Hat中的一个开放版本)如下图: 5.…

为何 Linus 一个人就能写出这么强的系统,国人却做不出来?

点上方蓝色“菜鸟学Python”,选“星标”公众号 重磅干货,第一时间送到转自:默然 Coldwings(知乎) www.zhihu.com/question/63187737 他是谁,Linus! 林纳斯・托瓦兹(Linus Torvalds,…

Linux之父:Linus

林纳斯本纳第克特托瓦兹(Linus Benedict Torvalds),是Linux之父,是Linux内核的缔造者。 1991年,年仅22岁的芬兰程序员Linus Torvalds发布了自己独创的操作系统—Linux。他将代码公布在网上,爱好者们也贡献者…

关于 Linux 之父,你可能不知道的 7 件事

如果让你现在说出三个程序员的名字,Linus 很可能就在其中。作为世界上最著名的电脑程序员、黑客之一,Linus Benedict Torvalds 写出了 Linux 内核 1.0 版,发起了开源运动,开发了代码管理工具 Git。 这三个成就中的任意一个&#x…

润乾报表中API自定义数据集

报表的数据来源大部分来自数据库,正常情况润乾报表都能自动处理,但是也会有特殊的情况,例如通过中间件连接数据库而非直连?通过业务程序算出的数据传递给报表进行展现等等。因此需要用户自定义数据集,我们看一个例子。…

使用Java随机划分数据集为训练集和测试集

在做机器学习,推荐系统等等实验的过程中,我们难免会自己来手动划分数据集,一般都是用一些python开源库来划分,今天我们使用Java自己写代码来随机划分数据集。以下数据集的格式为user item rating ,如图: 下面为代码&am…

Java项目使用Redis缓存数据

Java项目使用Redis缓存数据 一、Redis的下载安装 1、下载gcc编译器 yum install gcc-c安装完成后检查是否安装成功,查看版本 gcc --version2、使用weget下载redis wget http://download.redis.io/releases/redis-6.2.4.tar.gz下载成功后使用 ll 或 ls 命令查看…

Java数据结构及原理实现

程序设计主要是数据结构算法,而数据结构在面向对象思维里是“容器”的意思,数据结构主要负责数据的添加,删除,修改,查找及对数据的其他操作。编程里面对着不同问题场景,选择哪种数据结构进行操作就非常重要…

Java数据集总结

Java数据集关系图(来自网上) 红色是接口,绿色是实现。其中 HashSet是通过内部持有HashMap实现TreeSet是通过内部持有TreeMap实现 除了上述基础数据集,还有一些其他数据集 LinkedHashMap 继承HashMapLinkedHashSet 继承HashSet&…

Java常见数据集合list、set、map

线性表 由零个或者多个数据元素组成的有限序列。第一个元素无前驱,最后一个元素没有后继,其他元素有且只有一个前驱或者后继 栈、队列 栈Queue队列Stack先进先出先进后出LinkedList:可以用它来实现双向队列。PriorityQueue:基于…

java数据集合

一)Collection接口:存储单列数据: (1)List:单列有序集合(可以重复): A、ArrayList:底层结构是数组,底层查询快,增删慢(非线程安全)&am…

windows VM12虚拟机安装苹果系统(Mac OX 10.11)

windows VM12虚拟机安装苹果系统(Mac OX 10.11) 本人最近需要使用苹果电脑生成请求文件,由于没有苹果电脑,只能安装个黑苹果对付一下了,以下是本人的经历。 首先需要工具 1、vm12安装包下载 提取码tcua; 2、unlocker208工具下载 提…

vm16安装macos12的详细配置

文章目录 版本情况macos安装unlock创建虚拟机虚拟机安装配置安装tools 优化部分参考文档部分 版本情况 VM16 macos 12.01 unlocker(破解) Github上的大佬Dr. Donk分享的Unlocker: https://github.com/DrDonk/unlocker/releases 资源相关链接&#xff1…

FileUtils中writeStringToFile和readFileToString的使用

使用FileUtils的前提必须先导入commons.io   jar包 maven 版本 <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.…

Java 使用FileUtils.copyFile复制文件

1、FileUtils.copyFile方法 copyFile方法有多种重载形式&#xff0c;下面截图只是其中比较简单的一种&#xff0c;详细见官方文档 2、业务代码&#xff1a; private File copyFile(Long baseTime, int orgId, int typeId, String sourcePath, String fileName) throws IOExce…

【Java基础知识 18】通过FileUtils.copyFile探索IO原理

目录 一、FileUtils.copyFile1、从实例出发2、还是蛮快的&#xff0c;探索源码一番... 二、FileChannel1、读操作2、写操作3、代码实例4、控制台输出 三、如何减少copy和上下文切换的次数&#xff1f;1、为什么不能舍弃内核空间这一步&#xff0c;直接读取到用户空间呢&#xf…