【发布时间】:2019-05-21 22:21:07
【问题描述】:
我试图了解流行编译器不同部分的名称。我比较的编译器是 GNU Compiler Collection、Apple LLVM 和 Microsoft Visual C++。 (这些是编译器的正确名称吗?)下表是否正确:
| GCC | Apple LLVM | MSVC | |
|---|---|---|---|
| Backend | GCC | LLVM | MSVC |
| C frontend | gcc | clang | MSVC |
| C++ frontend | g++ | clang++ | MSVC |
还有;如果我在 mac 上使用命令 clang++ 编译我的 C++ 源文件:
$ clang++ --version
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
Target: x86_64-apple-darwin18.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
我正在使用的编译器的名称是什么?我应该说我正在使用 Apple Clang 吗?还是苹果 LLVM?还是别的什么?
【问题讨论】:
-
我以为微软是
CL.EXE(用于编译器/链接器)。 -
Microsoft 使用
cl.exe作为编译器驱动程序。 C 前端 (c1.dll)、C++ 前端 (c1xx.dll) 和编译器后端 (c2.dll) 是由cl.exe加载的独立 DLL。 -
我认为您可能正在尝试获得比现有更多的订单。 LLVM 开发人员不能可靠地区分 C 和 C++。谈论 C++ 特定功能或错误的人通常会说“clang 确实……”或“gcc 表现……”。也许他们应该区分,但话又说回来,也许人们也应该更加小心that and which。你自己可以说你在 macos 10.4.1 上使用了 apple clang 10.0.1,但实际上降低了一些精度。
-
不,我认为两者都可以。没有任何一个术语被如此多的人使用,以至于它可以被称为 the 正确的术语。无论好坏,人们都在使用不整洁的措辞。
-
部分问题似乎是人为区分两部分(前端/后端)。编译器确实需要一个解析前端和一个代码生成后端,但两者之间可能存在中间步骤。即使只有这两个部分,编译器之间的确切职责划分也可能不同。属于编译器 A 前端的任务可能位于编译器 B 的后端,例如处理内在函数。
标签: c++ gcc visual-c++ clang llvm