一个C++编译器是为不同的平台(Linux,Windows等)多次编写的,这是真的吗?
Is it true that a C++ compiler is written multiple times for different platforms (Linux, windows etc)
我所知C++是一个ISO标准,所以它们提供了某种标准和即将发布的版本要实现的功能列表。
是不是每个平台所有者都会去为这些标准编写自己的实现?
或者是否有任何核心编译器代码实现一次,然后所有其他平台都会围绕它编写包装器?
还是他们从头开始编写自己的C++编译器?
是和否。编译器基本上由两部分组成:解析器(又名前端(和代码生成器(又名后端(。解析器负责识别C++语法。代码生成器根据从解析器获得的信息为目标平台(硬件类型和操作系统(构建机器代码。虽然解析器与平台无关,但代码生成器部分绑定到目标平台。因此,为了支持新平台,可以重用现有的解析器部分,但必须编写新的代码生成器部分。
基本上,ISO标准集是编译器供应商应该遵循的一组规则。但这些是执行的标准,而不是实际执行的标准。
每个主要的硬件供应商都知道如何最好地使用自己的硬件这包括以下方面:1( ABI 支持 - 这包括二进制格式、系统调用和其他接口2( 共享库。3(架构支持。
因此,Microsoft IBM,英特尔,甲骨文和惠普都有自己的C++编译器,可以在其最新的硬件上创建最佳代码。
但是,标准确实提供了必须购买的草案https://isocpp.org/std/the-standard
下表提供了编译器对新功能C++的支持。其中包括C++11、C++14、C++17,以及后来接受的标准修订版,以及各种技术规范。
http://en.cppreference.com/w/cpp/compiler_support
可能一旦他们创建了特定于平台的地方,简单地说,Windows exe或com文件将无法在Linux上运行,但是更高版本可以通过旧版本进行编译。
- 如何在 std::vector 中找到<bool>哪些索引是真的?
- int8_t和uint8_t真的是整数吗?它们有什么用?
- 你如何理解"std: :forward is just syntactic sugar"?这是真的吗?
- 指向数组unique_ptr在调用 release() 后会自动释放动态内存,这是真的吗?
- 列表的向量真的是向量吗?
- 一个C++编译器是为不同的平台(Linux,Windows等)多次编写的,这是真的吗?
- array::operator[] 真的是 noexexcept 吗?
- 数组的维度是在创建数组的那一刻确定的,以后不能更改的,这是真的吗?
- SSE42 & STTNI - PcmpEstrM比PcmpIstrM慢两倍,是真的吗?
- 当内存被分配到Windows中的进程中时,它总是会触发页面错误,这是真的吗
- 即使有C++11/14,给出的答案仍然是"Why switch statement cannot be applied on strings?"真的吗?
- 是的,构造函数返回是当前实例,但我们不能使用返回类型.是真的吗
- Pthread条件变量是连续轮询的替代品,是真的吗
- 在编译时计算C字符串的长度.这真的是constexpr吗
- int**= int*[] 对于数组来说,这是真的吗?
- O'Reilly "Objective-C Pocket Reference"声称C++不支持动态调度,这是真的吗?
- 当类的指针实例超出范围时不调用析构函数是真的吗?
- std::bind 绑定"by value",这是真的吗?
- 为iOS和Android编译c++代码(Xcode).这是真的吗?
- 表达"(ptr == 0) != (ptr == (void*)0)"真的是真的吗?