什么时候需要编译C/C++?

Nat*_*sey 18 c c++ compiler-construction

此问题假定编写的C/C++代码是可移植的,不使用特定于平台的代码.

我开始学习C++以及如何编译代码.我知道C是为避免汇编语言而创建的,因为必须为不同的硬件配置重写程序.我也知道必须为不同的计算机配置重新编译C/C++.

这让我想知道什么是新配置.我可以从互联网上下载一个工作正常的可执行文件,互联网显然不知道我的硬件配置.是否必须为每个不同的CPU编译代码?为一个OS版本编译的代码是否适用于另一个OS版本?(Windows 7代码是否适用于Windows 8而无需重新编译?)

简而言之,什么条件定义了必须编译的新配置?

sor*_*h-r 13

C和C++是编译的编程语言.甲编译语言是一种编程语言,其实现方式是通常的编译器-从源代码生成机器代码翻译- ,并且不翻译.机器代码是由计算机处理器直接执行的一组指令.有两件事使程序与硬件/软件组合不兼容.您正在尝试运行二进制文件的机器(硬件)中最重要的一个.例如,您需要知道在64位CPU上编译的程序无法在32位或ARM处理器上运行.

几十个计算机体系结构和次结构.主要架构是x86,x86_64(amd64),可能还有ARM.如果您使用的语言将其代码编译为机器代码,则只能在具有与您的CPU兼容的计算机上分发二进制工件(除非您进行交叉编译).

硬件不是平台之间的唯一区别.通常,您的代码应在满足CPU之前由操作系统处理.执行此作业的操作系统部分称为应用程序二进制接口.即使在同一台机器上,也无法运行在Linux上使用Windows编译的ELF二进制文件,因为Win32可执行文件不同.

  • WINE = Wine不是模拟器 (2认同)

bol*_*lov 10

在硬件级别,必须为每个处理器体系结构编译C程序.为x86编译的代码可以在x86处理器上运行,无论是型号还是制造商(intel/amd),但是不能在Itanium架构上运行.

对于OS,如果程序使用特定于操作系统的库,则它仅适用于该操作系统.例如,CreateFile从Windows 使用的程序仅适用于Windows.有些方法,比如宏,程序可以根据编译的操作系统调用不同的函数.即使一个程序只调用便携式(ISO)函数,它仍然需要为每个操作系统(windows,linux,mac)重新编译,因为每个操作系统的可执行格式都不同(linux使用ELF,windows使用PE).

此外,例如,当您部署库时,对于特定的操作系统和体系结构,有时您需要有2个编译版本:发行版和调试版.

编译器具有针对某些体系结构的优化选项,因此您将获得可在任何x86体系结构上运行的程序,但针对Intel Nehalem处理器进行了优化.

有时,新处理器引入了透明的新硬件功能,即代码不需要重写,但是,为了使程序从中受益,必须使用可以点击的新版本编译器重新编译程序进入这些新功能.一个例子是Pentium Pro,它引入了新的条件移动指令(C代码不需要重写,但编译器需要知道它才能生成这些指令).

  • 即使C或C++程序不使用特定于操作系统的库,它通常也必须与特定于平台的运行时库链接.所以,例如,"Hello,world!" 即使硬件架构相同,为Windows构建的应用程序也无法在Linux上运行,反之亦然. (2认同)

Die*_*ühl 5

是什么让你认为C或C++ 已经被编译?它恰好是传统方法.至少有三种不同的C++执行方式:

  1. 传统上,编译C和C++是为了在给定系统上实现最大性能.
  2. 一些系统将代码转换为中间格式,然后由合适的虚拟机评估,例如,llvm这样做.显然它假设llvm安装在执行它的机器上.
  3. 可以解释C和C++.例如,cling是一个C++解释器.

编译步骤本身甚至在考虑运行程序之前验证是否满足某些约束,主要是为了捕获错误.除了捕获错误之外,能够在运行正在执行的内容之前确定具有一些性能优势.编译本机指令有几个性能优势:

  1. 代码可以对整数的大小做出明智的决定,支持浮点单元,所需的内存对齐等.
  2. 本机指令由系统的硬件评估,这往往会更有效
  3. 当链接到库时,可以在链接时确定各种函数的入口点,可能避免函数调用开销.

虽然为程序执行的启动和终止代码在不同的操作系统之间不同,但操作系统本身通常并没有太大的区别.此外,可用库和API如何访问常见操作是不同的,有时需要一种不同的方法来有效地编写应用程序.

  • 有效点,绝对值得注意,但并不能完全回答他的问题. (2认同)