IE盒子

搜索
查看: 141|回复: 0

为什么有些程序员不喜欢 C++ 编码?

[复制链接]

2

主题

8

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2023-1-12 13:58:29 | 显示全部楼层 |阅读模式
C++ (发音为“C plus plus”)是 创建的一种高级 通用编程语言 由丹麦计算机科学家 Bjarne Stroustrup ”的扩展 ,作为C 编程语言 或“C with Classes 。 随着时间的推移,该语言得到了显着扩展,现代 C++ 现在 的设施外,还具有面向对象 、 通用 和 功能 除了用于 低级 内存 操作 特性。 它几乎总是作为一种 编译语言 来实现,许多供应商都提供 C++ 编译器 ,包括 自由软件基金会 、 LLVM 、 Microsoft 、 Intel 、 Embarcadero 、 Oracle 和 IBM ,因此它可以在许多平台上使用。

C++ 在设计时考虑了 系统编程 和 嵌入式 、资源受限的软件和大型系统, 性能 、效率和使用灵活性是其设计亮点。 C++ 也被发现在许多其他情况下有用,主要优势是软件基础设施和资源受限的应用程序, [13] 包括 桌面应用程序 、 视频游戏 、 服务器 (例如 电子商务 、 网络搜索 或 数据库 ),和性能关键型应用(例如 电话交换机 或 太空探测器 )。


C++ 由 国际标准化组织 (ISO) 标准化,ISO 于 2020 年 12 月批准和发布的最新标准版本为 ISO/IEC 14882:2020 (非正式名称为 C++20 )。 C++ 编程语言最初于 1998 年标准化为 ISO/IEC 14882:1998 ,然后由 C++03 、 C++11 、 C++14 和 C++17 标准进行了修订。 当前的 C++20 标准以新功能和扩大的 标准库 取代了这些标准。 在 1998 年最初的标准化之前,C++ 于 1979 年由贝尔实验室 的 Stroustrup 开发,作为 C 语言 的扩展; 他想要一种类似于 C 的高效灵活的语言,它还可以 提供高级功能 为程序组织 。 自 2012 年以来,C++ 已制定了为期三年的发布计划 , C++23 作为下一个计划标准。

在计算机编程中,如果我们真的不应该在实践中使用递归(必须维护和跟踪堆栈,而使用循环更容易),为什么我们要学习递归?

我需要补充一些想法:

迭代(循环)和递归完成相同的结果,重复行为,并且没有一个可以完成另一个不能完成的事情
大多数 CS 学生学习 C 派生语言或 Python 作为他们的第一语言,因此迭代更容易 ,因为你更熟悉它
CS 教育文献表明在两种情况下递归比迭代更容易学习,这很少见:普通学生有更多的数学经验,和/或学生永远不需要学习循环
迭代对于线性数据结构很有用,并且由于大多数程序员接触到的第一个数据结构是数组,因此迭代是一个很好的起点
对于树和图等非线性数据结构,递归比迭代有用得多
掌握具有挑战性的概念材料有利于我们思考编程和程序的方式
循环是一种人工构造; 必须添加特殊的语言功能来支持迭代,而递归是能够标记和调用代码块的自然结果

电脑主板中的北桥和南桥是FPGA吗?

FPGA 非常昂贵(而且速度慢/效率低),当固定芯片 (ASIC) 可以完成这项工作时,使用它们毫无意义。 主板是具有固定功能的批量生产产品,因此 ASIC 可以完成这项工作。您仅将 FPGA 用于原型设计(或真正的低运行产品,您无力为 ASIC 设置制造),或者当芯片需要定期更改其工作方式时(例如应用程序加速器)。
PS 当然,现代主板不再有北桥,现在所有这些东西都集成在 CPU 中 :)

“内存字节永远不会‘空’,但它的初始内容可能对您的程序毫无意义”。 这是什么意思?

RAM 中的每一位都有两个值之一:0 或 1。没有第三种状态“空”。 每个位不是 0 就是 1。当您第一次启动计算机时,RAM 中的每一位都处于初始状态。 它可能主要是 0,或主要是 1,或某种模式,或完全随机。 不管它是什么,每一位都有一些初始值。
现在,假设您开始运行一些代码。 如果您不初始化您使用的内存,并从未初始化的 RAM 中读取,您将取回值。 这些值对您的程序没有意义,因为它还没有在那里存储任何有意义的东西。它们只是随机值,不是由程序中的任何计算确定的。
现在,这只是时间的开始。 在你的代码运行了一段时间之后呢?如果您分配和取消分配内存,您将在某个时候重新分配之前分配、使用和取消分配的内存。 新重新分配的内存保留了上次使用时的值。 那些值在编写的时候可能是有意义的,但现在它们只是毫无意义的垃圾。

为什么 CPU 只有几千字节的缓存? 它是如何工作的?

现代 CPU 有数兆字节的缓存。

酷睿 I9–9900K

缓存 L1:64K(每个核心)

二级缓存:256K(每核)

三级缓存:16MB(共享)

我不会将 64K 的 L1 缓存称为“几千字节”。 这是一个比早期计算机( 包括大型机 )的大多数主存储器都大的缓存。 我们有一台 256K 的大型机,它是顶级的。 8 个核心中的每一个都有这么大的 L2 缓存 。 还记得 Windows NT 3.1 吗? 它在一台 16MB 的机器上运行,一台大到大多数人都没有的机器。 Core I9 有一个奇怪的 L3 缓存,比 WIndows 3.1 所需的总内存大 。

1960 至 1970 年代的顶级 IBM 大型机最大内存为 16MB。 您甚至无法形成大于 16MB 的内存地址。 谁会需要超过 16MB 来运行程序? 我们的 /360 上有 8MB,它是一个六英尺高、每边四英尺的盒子。

考虑以下问题:您正在处理一些文件。 文件柜存放在城镇对面的仓库中。 每次你需要从文件柜里拿东西时,你会开车去那里吗? 几周后,你得到一辆皮卡车,把文件柜放在上面,然后把它搬到办公室外面的大厅(L3 缓存)。 但这使用起来有点痛苦。 所以你拿了整个抽屉,把它放在你桌子旁边的地板上(二级缓存)。 您的办公桌旁边有您正在处理的最新文件(L1 缓存)。 这就是它的工作原理。 如果您想处理如何在核心之间管理缓存一致性的细节,那是一个完全不同的问题。 我曾经教过这个。 它涉及“缓存侦听”和“缓存拦截”等概念。

为什么有些程序员不喜欢 C++ 编码?

我曾经是那些程序员中的一员。


我从 1983 年开始编程,直到 1996 年左右,我的工作才涉及到对 C 的广泛采用,这比我作为一名严格的汇编语言程序员所能接受的要广泛得多。 我认为 C 是汇编语言的训练轮抽象。

直到它让我不必为两个游戏机编写一堆单独的代码。 我可以一次编写代码并为两个不同的平台编译它。 我意识到我仍然可以为需要高度优化的东西编写汇编语言,但所有平凡的东西我只需要写一次。 当时,C 编译器对于游戏机来说仍然相对糟糕,但如果对陷阱有正确的了解,它的效率几乎提高了三倍。 更不用说我可以相对快速地编写所有工具,这反过来又进一步提高了我的效率。

我拥抱一种工具的时间足够长,足以让我变得足够熟练,让它为我工作而不是对我不利。 我意识到过去我让本可以避免的实际障碍玷污了我对它的看法。 换句话说,我讨厌一些我还没有充分理解以看到好处的东西。 我也担心我的工作会变得容易。 现在任何人都可以使用 C 来制作游戏。这是一个荒谬的假设。 我现在爱上了C。

快进到 2005 年,我的工作现在要求我开始使用 C++。 同样的问题。 我不知道为什么会有帮助。 我也没有很好的 C++ 真实世界示例。 我周围的每个人都写了糟糕的 C++。 我和所有其他没有 C++ 经验的程序员一样抱怨样板。 “抽象导致性能不佳。”、“模板是为白痴准备的,会生成缓慢的代码。”等等。这些是包括我在内的人们的抱怨,他们只是把 C++ 当作 C 来处理一些额外的东西,而不是作为一种单独的语言来处理一些遗留问题C范式。 我敢肯定,我们做了大多数人所做的事情。 类而不是结构。 速记数学表达式的运算符重载。 琐碎代码共享的琐碎固有性。 我们在 C++ 方面很糟糕,并将我们的问题归咎于语言,而不是我们自己。 一旦我开始尊重这种语言,我就开始认识到它的一些好处,并再次让它为我服务而不是对我不利。 我再一次通过利用语言来提高效率,因为它可以解决问题,否则这些问题将成为用 C 实现的火车残骸。在我需要的时候推迟到 C,甚至是汇编语言(它变得越来越不重要)编译器变得更好的事情)。

我从所有这一切中学到的是,讨厌一种语言在很大程度上是恐惧和缺乏该语言经验的一个组成部分。 一旦你能正确使用它,你的批评就会受到教育。

然而,硬币还有另一面,那就是特定语言的社区。 有些语言周围环绕着部落、狂热和难以忍受的社区。 将他们的语言视为一种艺术形式,而不是一种帮助解决问题的工具。 别管他们。

所有语言都有缺陷,但它们最大的缺陷是使用它们的人。

不喜欢一种在专业领域广泛使用的语言应该被看作是进一步了解它的机会。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表