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可执行文件不同.
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++ 已经被编译?它恰好是传统方法.至少有三种不同的C++执行方式:
编译步骤本身甚至在考虑运行程序之前验证是否满足某些约束,主要是为了捕获错误.除了捕获错误之外,能够在运行正在执行的内容之前确定具有一些性能优势.编译本机指令有几个性能优势:
虽然为程序执行的启动和终止代码在不同的操作系统之间不同,但操作系统本身通常并没有太大的区别.此外,可用库和API如何访问常见操作是不同的,有时需要一种不同的方法来有效地编写应用程序.