Bootstrap

(C++语言的设计和演化) C++的设计理念

(C++语言的设计和演化) C++的设计理念

前言

译者

豆瓣

出版社(异步图书)

本文主要摘取书本第4章 C++语言设计规则第6章 标准化第8章 库

是一些关于之父对于在 C++ 中设计和思考中得出的一些明文条例。

📖C++ 语言设计规则

📐规则和原理

目标

  • C++ 应该使认真的程序员感觉到编程序变得更快乐
  • C++ 是一种通用的程序设计语言,它应该
    • 是一种更好的C
    • 支持数据抽象
    • 支持面向对象程序设计

📐一般性规则

  • C++ 的发展必须由实际问题推动
  • 不应该牵涉到无益的对完美的追求中
  • C++ 必须是现在就能用的
  • 每个特征必须存在一种合理的明显的实现方式
  • 总是提供一条合理的明显实现方式
  • C++ 是一种语言,而不是一个完美的系统
  • 为每种应该支持的风格提供全面支持
  • 不试图去强迫人做什么

📐设计支持规则

  • 支持健全的设计概念
  • 为程序的组织提供各种机制
  • 直接说出你的意思
  • 所有特征都必须是能负担的
  • 允许一个有用的特征比防止各种错误使用更重要
  • 支持从分别开发的部分出发进行软件组合

📐语言的技术性规则

  • 不隐式地违反静态类型系统
  • 为用户定义类型提供与内部类型同样好的支持
  • 局部化是好事情
  • 避免顺序依赖性
  • 如果有疑问,就选择该特征的最容易说清楚的形式
  • 语法是重要的(常以某些我们不希望的方式其作用)
  • 清除使用预处理器程序的必要性

📐低级程序设计支持规则

  • 使用传统的(笨)连接器
  • 没有无故的与 C 的不兼容性
  • 在 C++ 之下不为更低级的语言留下空间(除汇编语言之外)
  • 对不用的东西不需要付出代价(0 开销规则)
  • 遇到有疑问的地方,提供手工的手段

📖标准化(扩充·评判准则)

为帮助人们理解在对 C++ 做一个扩充或修改时涉及哪些事项,扩充工作组构造了一集问题,对每个建议的新特征,通常都要问这些问题。

📐它精确吗?

(我们是否能理解你的建议是什么?)请为这个修改写出一个清晰而精准的陈述,说明它对当前语言参考标准的影响。

  1. 语法上需要做哪些修改?
  2. 对语言语义的描述需要做哪些修改?
  3. 它能否与语言的其他部分相互配合?

📐这个扩充的理由是什么?

(为什么你希望有它?为什么我们也会希望有它?)

  1. 为什么需要这个扩充?
  2. 谁会欢迎这个修改?
  3. 这是一个用途广泛的修改吗?
  4. 它是不是对某一组 C++ 语言用户的影响比对其他人的影响更大?
  5. 它在所有合理的硬件和系统中都能实现吗?
  6. 它能支持哪一类编程和设计风格?
  7. 它将阻止哪一类编程和设计风格?
  8. 哪些其他语言(如果有的话)提供了这一种特征?
  9. 它能有助于库的设计、实现和使用吗?

📐它已经被实现了吗?

(如果实现了,那么它是否完全是按照你所建议的形式实现的?如果没有实现,那么为什么你能假定由“”类似“实现或者其他语言得到的经验,足以移用到所建议的特征上?)

  1. 它对一个 C++ 实现有什么影响?
    1. 对于编译器的组织?
    2. 对于运行时的支持?
  2. 这样的实现完成了吗?
  3. 除了实现者自己,还有其他人使用过这个实现吗?

📐这个特征对代码有什么影响?

  1. 如果没有这个修改,代码将是什么样的?
  2. 如果不做这个修改会有什么影响?
  3. 使用新特征是否将导致对新工具的要求?

📐这个修改对效率,以及对 C语言 和目前的 C++ 的兼容性有什么影响?

  1. 这个修改对运行效率有什么影响?
    1. 对于使用这个特征的代码?
    2. 对于不使用这个特征的代码?
  2. 这个修改对编译时和连接时有什么影响?
  3. 这个修改是否影响现存的程序?
    1. 没使用这个特征的 C++ 程序必须重新编译吗?
    2. 这个修改是否影响与其他语言的连接?例如 Fortran 或者 C。
  4. 这个修改对 C++ 程序的静态或动态检查的可能程度有影响吗?

📐这个修改的文档及教学简单吗?

  1. 对于新手?
  2. 对于专家?

📐可能存在哪些理由支持不做这种扩充?

肯定存在反对的意见,而我们工作的一部分就是发现和评价它们,因为如果你给出一个讨论,就能节省时间。

  1. 它是否影响那些不使用的新特征的代码?
  2. 他是否很难学?
  3. 他是否会引出进一步的扩充需要?
  4. 它是否会导致很大的编译器?
  5. 它是否要求扩充的运行支持?

📐是否存在?

  1. 能服务于这个需要的其他代替性特征?
  2. 所建议的语法的其他代替形式?
  3. 所建议模式的更有吸引力或更一般的代替形式?

📖库

📐库设计的折中

  • 强调运行时效率?
  • 使修改之后的重新编译达到最小化?
  • 最大化跨平台的可移植性?
  • 允许用户扩展基本的库?
  • 允许在没有源代码的情况下使用?
  • 与现存的记法和风格混用使用?
  • 使之可以从不是 C++ 写的代码中调用?
  • 对新手也很容易使用?



📚个人读后感

《C++语言的设计和演化》这本书是C++之父的一本巨作。整体分为两大部分:

  • 第一部分是讲C++的起源。
  • 第二部分是讲核心机制的发展和演化。

第二部分相对来说读起来比较容易,且没有太多相对的顺序问题,想直接从哪一部分直接读都没问题。因为这就是一块一块的独立部分。

而第一部分的C++起源给了我极大的震撼。这个第一部分可以说是我个人近两年读的技术书籍最吃力的一部分。也极大的让我对C++有了更不一样的认识。

让我以前的一些疑问有了解答,比如:

  • C++之父决定C++的一切吗?
  • C++委员会到底是些怎样的人?
  • 为什么如xxx些特性或xxx库就是不加入标准呢?
  • 为什么在C/C++种这么多UB的问题不统一解决?
  • 为什么官方不规定一个统一的包管理工具?
  • 为什么不规定一个统一的构建工具?
  • 为什么不梭哈成完全面向对象的语言?
  • 这么多教于C语言的特性都是凭空想出来的吗?
  • 等等等等

我都得到了解答。其中有几个要点可以用于回答上述的一些问题:

  • 保持与C的兼容
  • 在现有硬件条件下的限制(上世纪的硬件条件)
  • 对于用户的使用自由度

同时我更加深刻的感受到了一门语言发展的不易,连之父自己都自嘲C++肯定是一门笑话最多的编程语言。这些笑话全是在C++从CFront或是更前,到Release或是更后的一次次演化和挣扎。

之父也提到自己喜欢读哲学和历史的书籍。确实本书我觉得本质是一本历史书籍,但更是一本哲学书籍,对C++的哲学,对编程语言的哲学,对编程人员的哲学,对编程应用的哲学,对编程支持的哲学。这也是我读的极为痛苦的一点(谁读点哲学不痛苦的呢)。




END

⭐关注我

关注我,学习更多C/C++,算法,计算机知识

B站:

👨‍💻主页:天赐细莲 bilibili

;