欧易

欧易(OKX)

国内用户最喜爱的合约交易所

火币

火币(HTX )

全球知名的比特币交易所

币安

币安(Binance)

全球用户最多的交易所

C++大神JohnCarmack的编程传说!还在抱怨C++难学吗?

时间:2022-10-09 17:54:22 | 浏览:461

  你是否也曾发现那些顶级球星常常能够轻松做出各种高难度动作,而其他球员却无法做到。你是否也在疑惑这其中的原因,为什么顶级球星看起来毫不费力?  作为一名C++程序员,John Carmack 的源代码就像顶级球星的球技一样震撼着我。其代码

  你是否也曾发现那些顶级球星常常能够轻松做出各种高难度动作,而其他球员却无法做到。你是否也在疑惑这其中的原因,为什么顶级球星看起来毫不费力?

  作为一名C++程序员,John Carmack 的源代码就像顶级球星的球技一样震撼着我。其代码简单而强大,我很想知道自己如何才能像他一样优秀。

  让我们来探索 Doom3(游戏:毁灭战士) 的源代码,深入其中,寻找这些代码简单但强大的原因。

  2011年11月23日,id Software(游戏软件公司)延续自己的传统,发布了他们之前引擎的源代码。这些源代码被众多开发者审阅,下面是其中一个针对 Doom3 的反馈信息:

Doom 3 BFG由 C ++编写,C++是一门既强大又复杂的编程语言,它可以编写出无比优秀的代码,但同时也可能让你欲哭无泪。幸运的是,id Software的 C++子集(拥有类的 C 语言)可以让你轻松运用 C++ :

没有异常

没有引用(使用指针)

尽可能少使用模板

常量无处不在

拥有类

多态性

继承

  它仅仅是 c++ 98 标准的一个子集。以下是 Doom3 的一些特性:

1、提供一个强大的基类

  众多的类都从 idClass 继承而来:

  idClass 提供了下列服务:

  (1)实例创建

  (2)类型信息管理

  (3)事件管理

2、字符串操作非常简单

  通常来说,字符串是一个项目中最常用的数据类型,许多功能都需要字符串来完成,我们需要使用函数来处理它们。

  Doom3 定义了一个 idstr 类,它几乎包含了所有与字符串操作相关的方法,非常实用。这样一来,你就不必像其他框架那样需要根据不同的字符串类来定义自己的方法。

3、源代码与GUI框架(MFC)高度解耦

  在很多使用 MFC 的项目中,代码与它们的类型高度耦合,并且你可以找到任何代码在 MFC 中的类型。

  在 Doom3 中,代码与 MFC 高度解耦,仅有 GUI 类与之直接相关。如下面的 CQLinq 查询所示:

  这个特性大大提升了开发效率。的确,只有 GUI 开发人员必须关心 MFC 框架,而对于其他开发人员来说,则并不需要在 MFC 上浪费时间。

4、提供了一个非常强大的utility程序库(idlib)

  几乎在所有项目中,utility 程序类都是最常用的,如下查询结果所示:

  从以上查询结果可以发现 utility 是用得最多的。如果 C++ 开发人员没有一个强大的 utility 程序框架支撑,那么他们将不得不花费大量的时间自己编写。

  idlib 几乎提供了很多实用的类和方法,可用来处理字符串、容器和内存。这有利于提升开发人员的工作效率,让他们更加专注到游戏逻辑上。

5、容易理解

  作为 C++ 开发人员应该都知道开发解析器和编译器并非易事,而 Doom3 成功实现了一个硬编码的编译器。并且 Doom3 的实现代码非常简洁也很容易理解。

  下图展示了编译器使用的类之间的依赖关系:

  以下是编译器源码的代码片段:

  过去我也曾研究过很多解析器和编译器的源代码。但是,这是我第一次发现一个编译器的源代码如此易懂,除了编译器之外,整个 Doom3 的源代码也一样容易理解。这真的很神奇。当我深入研究 Doom3 的源代码时,发现这些代码真的写得太好了。

  Doom3 的源代码只使用了 C++ 标准的一个子集,它非常简洁并且易于理解和维护。它遵循代码设计、命名和格式化的基本规范,并没有使用高级技术。

  John Carmack 的编程秘诀是完全遵循维基百科定义的 KISS 原则:

KISS 是由美国海军在1960年提出的一项设计原则,KISS 是 “ Keep it simple, stupid ” 的缩写。KISS 原则指出,相比于复杂的系统,越简单的系统往往运行效果越好。因此简单性应当是设计过程中需要关注的关键指标,同时应当尽量避免不必要的复杂性。

  KISS 原则的核心思想是:相比于复杂的系统,越简单的系统往往运行效果越好。

采用新C++标准时的注意事项

  新标准引入了许多有趣的新功能。但是不要认为使用这些功能就可以让你的代码变得高效。实际上,许多新功能对开发通用库更为有用,特别是与通用编程相关的功能。

  不要强迫自己使用所有的新功能,在绝真正需要或者有助于提高代码效率时使用即可。例如,这篇文章就讨论了过度使用 auto 关键字的缺点。

想要在程序员生涯内有更高的成就的话,C/C++就是一个既可以强化思维能力,又可以打好编程基础的编程语言,你想要做软件开发,成为核心程序员的话,学习C/C++的话笔者有一个C/C++的编程俩千人羣(Q艘索:C/C++编程学习13群)你如果感觉自学C/C++语言有困难的话,有兴趣学习或者了解一下C/C++编程的小伙伴就可以进来交流。

相关资讯

编程和乐高机器人啥关系、编程启蒙到底怎么做|逃妈说编程(下)

于是快马加鞭地赶出了下篇。 其实本来写完上篇后我脑袋里对下篇的框架已经有了大概的构思。但后来从文章的留言,读者微信群里的讨论,以及大家私下给平台小助手、给我发的微信留言中发现,“咦,原来大家最关心的问题跟我之前的设想还是有点儿出入哦~”。于

少儿编程热,需要冷思考编程培训需要来次“编程”

少儿编程热,需要冷思考(大家谈)在不少城市,少儿编程课外培训日渐火爆。很多人认为,作为数字世界的通用语言,学习编程能有效锻炼孩子的思维能力。但也有人提出问题:受理解力所限,幼儿园阶段就送孩子学编程是否符合教育规律?出于“莫输在起跑线上”的心

孩子应不应该学编程,编程的优缺点要知道,孩子才能真正学以致用

孩子成长中的每一件事都不是小事,成长是一次没有返航的旅程。家长为了孩子能够长成参天大树,会带孩子学各种各样的知识,少儿编程便成为了很多家长的心头好。对于编程课,你了解多少但是很多家长并不知道孩子适不适合学习编程,也不知道编程是什么?就知道学

少儿编程培训值得吗?业内老师:跟真正编程两码事

少儿编程越来越火,从一线城市到二三线城市,编程培训机构如雨后春笋般涌现。少儿编程培训为什么这么火?家长们的“狂热”究竟值不值得?家长:人工智能是趋势,希望孩子早接触“机器人课程确实挺贵的,一下子就交了1万5左右的套餐费,每次课大概160元左

少儿编程十大培训机构有哪些?少儿编程课程怎么选?课程全面测评

这两年,少儿编程越来越火了,不少地区已将它纳入中小学教育。不少国家的政策将少儿编程以及人工智能编入了教育学习项目,甚至浙江编程是高考选考科目,各位宝妈们都处处欲动,很重视孩子的编程教育。想必很多家长在给孩子选课的路程多少经历了很久,那么小编

C/C++编程笔记:C语言编程知识要点总结!大一C语言知识点(全)

一、C语言程序的构成与C++、Java相比,C语言其实很简单,但却非常重要。因为它是C++、Java的基础。不把C语言基础打扎实,很难成为程序员高手。1、C语言的结构先通过一个简单的例子,把C语言的基础打牢。C语言的结构要掌握以下几点:(1

C/C++,被誉为“最经典的编程语言”,不仅是因为编程入门需要学

1、从C到C++计算机诞生初期,用机器语言或汇编语言编写程序;第一种高级语言FORTRAN诞生于1954年;BASIC语言(1964)是由FORTRAN语言的简化而成的是为初学者设计的小型高级语言;C语言是1972年由美国贝尔实验室的 D.

编程入门:编程语言(Java、C++)先学那个好?

这个问题在入门阶段一直是争议十分大的问题,反正学长每次去网上找新手应该学什么编程语言的时候,就会出现五花八门的推荐,n多语言,n多推荐,搞的新手一会听说这种语言适合新手,于是学习这种语言。一会又有人说xx语言是垃圾、弱爆了,学了也没用,之类

编程入门:如何正确认识编程?除了高薪,我再告诉你一些秘密

假期在家待得怎么样?是不是天天过着衣来伸手饭来张口的日子,当然也时常伴随着妈妈的“嫌弃”和“唠叨”?哈哈~文章来源:博学谷接下来,丫姐跟你说一件丫姐在过年期间发生的有意思的事儿:小侄子:姑姑,你会不会编程?我答:会啊...小侄子:那你教教我

编程语言盘点:2021年程序员五大编程语言!C++不在其中?

选择第一门语言是非常重要的,因为这是搭建基础的开始,自此以后我们会逐渐走进并了解编程世界。但老实说,选择哪一种编程语言并不十分重要,重要的是我们需要掌握它,并用它来提高自己解决问题和开发的能力。此后,要再从一种语言切换到另一种语言就会变得轻

编程:史上最全的计算机编程语言列表来了!你不进来了解一下吗?

计算机编程语言可用于将指令传达给计算机。它们基于某些句法和语义规则,定义了编程语言中每种结构的含义。现在我得到了一个凡是可以找得到的每种编程语言的列表。我将它们分为以下几类:解释型编程语言函数式编程语言编译型编程语言过程式编程语言脚本编程语

初学编程:C语言/C++编程新手入门学习方法及书籍推荐

C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样

C/C++编程笔记:运算符—所有编程语言的基础!一文带你搞懂

运算符是任何编程语言的基础。因此,如果不使用运算符,则C / C ++编程语言的功能是不完整的。我们可以将运算符定义为符号,以帮助我们对操作数执行特定的数学和逻辑计算。换句话说,我们可以说运算符对运算对象进行运算。例如,考虑以下语句:c =

C/C++编程笔记:《C语言》——数组知识详解,学编程建议收藏!

不要看这个图简单,底层就是这样的。数组是一个整体,它的内存是连续的;也就是说,数组元素之间是相互挨着的,彼此之间没有一点点缝隙。这一点很重要,连续的内存为指针操作(通过指针来访问数组