Bjarne Stroustrup访谈-抽象和手工编写的代码

Interview with Bjarne Stroustrup - abstraction and hand-crafted code

本文关键字:代码 Stroustrup 访谈 抽象 Bjarne      更新时间:2023-10-16

我读过Bjarne Stroustrup关于C++及其设计的采访。我被他在那里使用的术语弄糊涂了,所以我希望能澄清一些这样的时刻。

我在我的书《C++的设计与实现》和我的两篇编程语言史会议论文中记录了我的设计目标和对设计的限制,但简单地说,我的目标是

  • 与使用抽象时手工制作的代码相比,零开销
  • 与C的机器模型非常相似的机器模型
  • 一套极其灵活的抽象机制,以及
  • 静态型安全
  1. 在这种情况下,"手工编写的代码"是什么意思?。。Stroustrup指一些手工制作的抽象概念工具程序员可以创造吗
  2. 在这种情况下,"机器模型"是什么意思?一种语言与硬件交互的方式

我看了他提到的那本书(我相信这本书实际上是《C++的设计与进化》),但我仍然不太确定。这两个术语在谷歌上的搜索也不太好。

"机器模型"是指计算机在语言中表现自己的方式。例如,C和C++以或多或少相同的方式处理字节、内存位置、指针和整数类型。

这里的"手工制作"指的是不使用C++中提供的抽象,而是用C或汇编(或C++,只是不包括该抽象)高效编写的等效代码。这是一个"目标",而不是"约束"——C++并不是在所有情况下都能准确地实现它。

因此,举个例子,vector<int>并不总是实现与使用mallocfree编写的类似可调整大小的阵列完全相同的性能,因为该代码可以(当然也会)在必要时使用realloc来调整存储的大小。realloc通常不会为您节省任何时间,但当它这样做时,它会节省大量时间。vector不能做到这一点,因为分配器接口没有与realloc等效的东西,因此引入了少量开销。但vector几乎在所有时间都具有大致相同的性能,因此几乎达到了零开销的目标。

再举一个例子:在发布模式下使用一个不错的C++编译器,与编写my_int_pointer[3]相比,编写myvector_of_int[3]确实没有任何开销。与访问指针类型的局部变量(my_int_pointer)相比,访问局部变量的数据成员(存储在myvector_of_int中的数据指针)没有开销的原因可能并不明显,但它不需要任何额外的成本。

通过"手工制作"的代码,Stroustrup意味着抽象的手工实现;例如,手工制作的for循环将是循环体的N个副本。(参见Duff’s Device了解一个简单的实现。)

Stroustrup所说的"机器模型"是指编译器对机器的看法。例如,C和C++提供了字节、内存位置、内存访问顺序等大致等效的视图;相比之下,Fortran没有任何"字节"的概念,内存位置(或数组访问)与C/C++视图的对应性也不好。