filecoin交易所(www.ipfs8.vip):为什么我十分喜欢C,却很不喜欢C++_万利逆商

皇冠注册平台

www.ipfs8.vip)是FiLecoin致力服务于使用FiLecoin存储和检索数据的官方权威平台。IPFS网实时更新FiLecoin(FIL)行情、当前FiLecoin(FIL)矿池、FiLecoin(FIL)收益数据、各类FiLecoin(FIL)矿机出售信息。并开放FiLecoin(FIL)交易所、IPFS云矿机、IPFS矿机出售、租用、招商等业务。

,

作者 | Kostya Shishkov

译者 | 弯月 责编 | 欧阳姝黎

出品 | CSDN(ID:CSDNnews)

以下为译文:

虽然 C 语言并不是我所学的第一门语言,也不是我的最后一门语言,然则我仍然异常喜欢 C,当需要写程序时,我的第一选择照样 C。同时,我也会关注现代编程语言及其生长趋势,而且我还使用 Rust 编写了自己的营业兴趣项目。那么,为什么我没有甩掉 C 而选择其他语言呢?我对于 C++的看法又是若何的呢?

为什么说C不是最好的语言?首先,这个世上没有最好的编程语言。每种语言都有怪异的优势以及适用情形,以是只管你可以在 Excel 中编写光线追踪程序,但最好照样使用其他语言。因此,我们都需要领会编程语言的限制,不要埋怨 Web 服务器不是用 Fortran 编写的,也不要埋怨基本没有任何应用使用 Perl 或 C++作为内部剧本语言。我以为 C 语言不太理想的方面包罗以下几点(除了 C 对照老,生长不快之外,固然还与小我私人的喜欢有关)。

其次,有些时刻,C 的语言不够明确。好比,*可以是二进制乘法运算符、一元解引用运算符,也可用于声明指针。

再者,有些情形不够平安,例如越界接见数组这种极其常见的错误都没有运行时检查,这一点连 Borland Pascal 都比不了,更不用说更现代的编程语言了(只管你会为了提高性能关闭这个编译选项)。此外,指针让我们很难保持一切井然有序。再加上一些其他情形,好比挪用函数不需要事先声明原型,这样很容易将错误类型的参数转达给函数。

最后,C 的尺度库异常有限。有些编程语言甚至拥有开箱即用的 Web 服务器(或者至少有构建 Web 服务器所需的所有模块),但 C 尺度库甚至连 Web 服务器的容器也没有。

为什么我照样喜欢C?只管云云,我照样十分喜欢 C,由于它是一种简朴的语言。从某种意义上说很简朴,很容易表达自己的想法以及期望。

举个例子,假设两个数组有两个偏移量,其中一个可以为负数,若是使用C语言编写,则可以写成:

arr[off1 + off2]若是是Rust,则需要写成:

arr[((off1 as isize) + off2) as usize]通常,C 的循环也比 Rust 的迭代器组合更为精练(固然 Rust 也允许使用前一种方式,但 linter 并不知足,它会建议你使用迭代器来取代)。类似地,memset和 memmove也是功效十分壮大的工具。

在大多数情形下,你都可以预见到编译的效果,即工具在内存中的示意方式,以及若何通过差其余方式明白编译后的效果(新版 C 尺度中这一点变得更难题,这都要怪 C++,我稍后再详细先容)。另外,你也很清晰函数挪用的效果等等。由于这个缘故原由,C 被称为可移植的汇编语言,以是我异常喜欢 C。

我们拿汽车做个类比,C 语言就像一辆跑车,拥有手动变速箱,可以提供最佳性能,然则若是你不熟悉离合器和挂挡操作,那么变速箱很容易被损坏,甚至可能损坏发念头,固然,油门踩得过大也有可能冲出马路。然而,与自动变速箱相比,这种车辆的发动性能量更大,而且你可以展望性能,还可以炫车技,这些在其他车辆上都是不能能的。

这与C++有什么关系?下面,我们来说一说 C++,实在我不憎恶 C++。我不能否认,与 C 相比, C++ 拥有两个优点:

更好的程序结构:C++ 拥有命名空间和类,而且在某些方面Simula照样很精彩的。

拥有 RAII 看法:一个简朴的例子就是 C++ 拥有组织函数,可在确立工具时初始化工具;还拥有析构函数,在销毁工具时,做一些整理的事情。这个看法进一步生长,就靠近 Rust 的生命周期了。

另一方面,C++ 有两个特征,我异常不喜欢。

首先是这门语言的整体性子。其他编程语言拥有的盛行功效最终都市进入 C++。因此,每过几年,C++尺度就会添加一些新功效。最终,这门语言就变得有点怪异,没人能够完全掌握,而且许多功效都是剽窃的其他语言。基本上每小我私人在编写代码的时刻,都市选择一个 C++的子集,然后忽略其他功效的存在。另外,我们事实应该使用哪个 C++版本的功效,并没有一套尺度的方式。Rust 在包的局限内提供了版本治理。据我所知,C++也曾实验过引入“代际”的看法来实现同样的功效,但没有乐成。我经常听到有人独自编写 C 编译器,却从来没听说过有人编写 C++编译器。

其次,现实上 C++不仅是多种语言,而且照样一种元语言(即模板)。我领会 C++的确立初衷,也赞成它对于与类型无关的代码的处置,比 C 预处置器更好。但现实上,它发生的代码十分恐怖,原本是“头文件仅包罗声明,实现放在编译好的代码中”,酿成了“头文件包罗所有项目会用到的代码”。我不喜欢过于冗长的编译时间,但这种方式只能让情形更糟。

最后,我以为 C++的泛起反而给 C 带来了约束以及不良影响。我不是在讨论 C/C++,也不是指 C 与 C++的共通之处,我讨论的是耦合对尺度和编译器都有不良影响。一方面,C++确立在 C 之上,从而获得了极大的生长;另一方面,若是 C++中没有 C 遗留下来的大多数功效的话,情形可能会更好(固然,C++曾想法通过镌汰的方式逐步放弃某些 C 功效,但对于旧功效的支持仍然存在)。然则,C++ 24 能够在 C++ 21 的基础之上,生长成为一门自力的编程语言吗?大多数过时的功效都可以甩掉吗?我对此示意嫌疑。

C++编译器对C的影响现实上,C 语言被当成了没有某些功效的 C++。好比微软的 C 编译器直到2015 版才最先支持 C99 功效(即便云云,它照样以 bug 修复 bug 的方式来支持兼容性,由于客户可能会震惊地发现可变参数宏居然可以运行)。然则,无论是尺度的编译器照样其他编译器中都可以看到相同的方式,这些都是相关的问题。

主要问题在于,C 和 C++尺度都是凭证编译器开发职员的反馈而编写的,而且大多数都是 C++开发职员(有些人对现实天下编程一无所知,而且他们还以为现实天下的做法与自己的看法完全吻合,真是令人窒息的操作)。虽然我也没有遵照尺度的开发程序,然则我很确定 C99 及厥后版本中令人憎恶的诸多功效皆来自那些编译器开发职员。他们只从 C++的角度出发思量,而且还将这些功效强加给了 C,还美其名曰简化编译器。

固然我指的是“未界说的行为”以及编译器的处置方式。这已成为一大毒瘤(只要你的代码依赖于二进制补码算术,就会被认定具有未界说的行为,编译器会甩掉整块代码)。

在我看来,以下四种行为只管不值得提倡,但前两个也并非不能接受:

依赖于系统结构的行为(即依赖于 CPU 系统结构的行为)。包罗绝大部门算术运算。例如,若是我知道目的及其使用了两个协处置器,为什么编译器会选择另一种方式,仅仅是为了获得理论上的优化?同样的问题也适用于移位运算。若是我知道 x86 会忽略移位偏移量的高比特,在 ARM 上负的左移相当于右移,那么为什么不能专门针对该系统结构编写程序呢?事实,连整数的巨细在差异平台上都纷歧样。这种不能移植性只需忠告就好,让用户自行处置。

指针邪术和类型双关。这似乎又是编译器优化带来的限制。我赞成,在重叠的内存区域上使用 memcpy,差其余实现可能会给出差其余行为(现代的 x86 实现会从区域尾部最先复制),而且还依赖于地址的相对位置,但其他的规则就没什么原理了。例如,无法使用两个差异类型的指针同时操作统一块内存区域。我无法想象为什么这种行为被阻止,其缘故原由只可能是编译器优化。这样就不能能行使团结体将整数转换成浮点数。Linus 也曾吐槽过这一点,我就不用重复了。但在我看来,这样做的目的或者是更好的编译器优化,或者是出于 C++的要求(由于类型跟踪的要求)。

实现中界说的行为(即超出 C 尺度划定的行为)。我常用的例子就是函数挪用:凭证挪用的习惯约定和编译器的实现,函数的参数的求值顺序可能完全是随机的,因此 foo(*ptr++, *ptr++, *ptr++)的效果是未界说的,因此纵然你知道目的系统结构,也不应该依赖于这种行为。

完全未界说的行为。最常见的例子就是在一条语句中改变变量状态,例如著名的 I++ + i++,或者愈甚的 *ptr++ = *ptr++ +*ptr++。

由于 C++比 C 更高级(只管它由许多来自 C 的特征,但都不建议使用,应该使用 reinterpret_cast<>取代类型转换,用引用取代指针,等等),以是不要期待 C++程序员能够像 C 程序员那样明白底层代码。固然,由于 C++程序员占绝大多数,C/C++的耦合也极其常见,以是 C 编译器通常会举行扩展以支持C++,并使用 C++重写,以顺应其庞大度。以是很不幸,你不得不使用 C++编译器来编译 C 编译器(还好我们另有 LCC、PCC 和 TCC 等纯 C 编译器)。

总结 总的来说,我喜欢C所处的中层位置,它既可以完成一些底层的实现,例如轻松地操作内存,同时又可以享受高级语言的利益。另一方面,我对C++强烈的不满来自其在设计上的选择,而且这些设计影响了C尺度和编译器。

至少我不能能用 C90 稀奇版取代 C90,并冒充原来的版本不存在。

原文链接:/

声明:本文由CSDN翻译,转载请注明泉源。

《新程序员001:开发者黄金十年》

IPFS

www.ipfs8.vip)是FiLecoin致力服务于使用FiLecoin存储和检索数据的官方权威平台。IPFS官网实时更新FiLecoin(FIL)行情、当前FiLecoin(FIL)矿池、FiLecoin(FIL)收益数据、各类FiLecoin(FIL)矿机出售信息。并开放FiLecoin(FIL)交易所、IPFS云矿机、IPFS矿机出售、租用、招商等业务。

添加回复:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。