15

C++ 编译器能否生成不太好的二进制文件?您可以在这里考虑输出的稳健性和性能。有没有可以使用的“最好的”C++ 编译器?如果不是,那么众所周知的编译器(g++、英特尔 C++ 编译器、Visual C++ 等)的优点是什么,当然还有不那么强的(已知的错误和问题)点。

当编译器产生不正确的输出导致关键任务软件失败时,是否有记录的案例?

4

9 回答 9

18

G++ 似乎是最受欢迎的。它是免费的、便携的而且非常好。Windows 端口(MinGW)在我最后一次使用它时(可能是一年前)确实过时了。

英特尔 C++ 编译器被认为是生成最快代码的编译器(但众所周知,它会为 AMD 处理器生成错误的 SIMD 代码)。您可以在非常严格的条件下在 GNU/Linux 上自由使用它。
我已经使用了一段时间,我喜欢它会发出其他人不会发出的巧妙警告这一事实。

VC++ 通常被认为是最好的 C++ IDE,据我所知编译器也相当不错。它是免费的(就像免费啤酒一样),当然只能在 Windows 上使用。
如果您对 Windows 编程感兴趣,我建议您使用此编译器,因为它始终是最新的,并为此目的提供了更多高级功能。

我建议在 Windows 上使用 VC++,在其他操作系统上使用 G++。自己尝试免费版的 I++,看看它是否物有所值。


当编译器产生不正确的输出导致关键任务软件失败时,是否有记录的案例?

是的,可能,但我会说大多数时候这可能是程序员的错。例如,如果有人不知道浮点运算是如何工作的,那么很容易编写不可靠的代码。一个好的程序员还必须知道 C++ 标准保证什么可以工作,什么不能工作。程序员还应该知道编译器的限制是什么,例如它实现标准的程度以及它的优化程度。

于 2009-07-11T23:18:38.727 回答
3

首先,您使用的平台通常决定了要使用的编译器。

其次,您关于稳健性和性能的问题。我不确定您所说的稳健性是什么意思。但是,如果您的意思是编译的二进制文件的正确性,我不得不说,只要您使用您提到的任何编译器的稳定版本,您就不会遇到“健壮性”问题。这些编译器都非常成熟,已经在无数现实生活中的项目中使用过。所以我根本不用担心鲁棒性。

关于性能,这是一个很难回答的问题,因为每个编译器都有不同的优化技术,理论上可以产生不同的性能。我希望有比我更博学的人可以告诉你这件事。

实际上,鉴于您提到的编译器都是高质量和成熟的编译器,您应该问的问题不是哪个编译器更健壮,而是:

  • 哪个是支持我的目标平台的编译器
  • 哪个编译器适合我的开发环境和工具?
  • 哪个编译器是我的开发团队和集成商最熟悉的。

然而,优化技术的问题是一个悬而未决的问题,而且是一个不平凡的问题。我希望有人能对此有所了解。

于 2009-07-11T23:04:27.383 回答
3

由于您在评论中提到“作为商用飞机系统的一部分”,因此可能值得查看实际在该领域或其他安全关键产品领域保持认证的公司提供的编译器。绿山软件就是其中之一。风河是另一个。

于 2009-07-12T04:48:46.043 回答
2

除了 Bastien Léonard 的回答:还有一个多平台 C++ 编译器 — Comeau。它是最符合标准的 C++ 编译器。最新版本支持 C++0x 核心语言。

于 2009-07-12T10:56:47.317 回答
1

您使用的平台是什么?例如,Visual C++ 在 Linux 上对您没有用处。

实际上,出于这些原因,您提到的三个是我会选择的三个。

gcc/g++:开源,经过验证,通过在许多 Linux 和 UNIX 系统上的多年协作经验改进。不那么强的一点仅仅是它是一个独立的命令行工具。您可以制作或可能找到您自己的 IDE 风格的环境,但可以这么说,它不会以这种方式“发布”。

Visual C++:得到 Microsoft 的良好支持,大量代码示例和文档 (MSDN),自然挂钩到 Windows API。不那么强的一点是它不是特别“视觉”。如果您习惯于 Visual Basic(比如说),您会发现 Visual C++ 的工作方式完全不同。

英特尔 C++ 编译器:唉,我没有使用英特尔编译器的经验,但我相信它支持并行性并具有高精度数值库。

另一个可能值得一提的是 Borland 的 C++Builder。它通过与 Delphi 的 VCL 兼容而成为一个快速的应用程序开发环境,具有丰富的附加控件,但相反,在 C++Builder 中开发的代码不容易移植到其他 C++ 编译器。

于 2009-07-11T23:04:46.010 回答
1

如果您谈论的是高性能计算意义上的输出代码的高性能,您可能还对Portland Group 的编译器IBM 的 XL 编译器感兴趣。

于 2009-07-12T04:50:21.407 回答
1

优化编译器的重点是它应该生成一个在功能上与原始程序等效的优化程序。当然,功能等效与可观察的效果有关;国家自然就不一样了。在我看来,任何可以生成错误翻译的编译器都是不好的,尽管我认为您可以在不同情况下放松某些问题。主流编译器的一个优点是可以更快地修复错误。

至于性能,编译器通常进行两种类型的优化:独立于平台的优化(在源代码级别/语法树/中间表示)和特定于平台的优化。

我猜想最好的独立于平台的优化可能是对现有编译器的各种学术修改(但可能是不同的优化)。这些优化最终被认可并最终成为主流。

至于平台特定的优化,我认为制造这些平台的公司通常有最好的优化(例如,内部英特尔编译器),但它们还没有集成到通用编译器中,最终也会慢慢下降。

于 2009-07-12T04:55:02.803 回答
1

http://www.compilers.net/Dir/Free/Compilers/CCpp.htm

微软有一个很好的免费编译器,但如果你在 unix 或 mac 上工作,那对你没什么好处。

Borland 也有一个很好的免费编译器。

我已经尝试了几个免费的编译器,并且对 Dev-C++ 感觉最舒服。总包的大小相对较小,有 windows 和 linux 两种版本。对我来说,测试 C++ 语言的极限是完美的。它编译速度快,使实验变得容易。

I recommend you this software called Digital Mars C/C++ Compiler,and you can get it from http://www.brothersoft.com/digital-mars-… it is a free C/C++ compiler for the for Win32, Win16, DOS32 and DOS environment.

于 2009-07-12T11:12:46.940 回答
-8

我在使用 Cygwin 时发现了一些问题,这种代码无法编译但会在编译器内部产生分段错误。相同的代码适用于 MinGW。

[编辑] 这是编译器报告:

lista.h: In constructor `Lista<Dado>::Lista() [with Dado = int]':
principal.cpp:15:   instantiated from here
lista.h:13: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://cygwin.com/problems.html> for instructions.

我没有产生错误的源代码了,所以我不能提交报告。

[/编辑]

于 2009-07-11T22:59:30.573 回答