我们知道每个processor
都有自己的指令集(ex-8085处理器有自己的INSTRUCTION SET)。因此,使用该处理器执行任何指令
该指令必须是其指令集之一(意味着我们只能执行8085处理器上属于8085指令集的那条指令)。
所以我的问题是,如果我们编写任何程序(假设我们使用c语言编写程序),那么在使用编译器编译之后(因为我们知道编译器生成的代码可以在机器ex..gcc或turbo c上执行)它会生成代码用于在机器上运行,即在处理器上执行的代码(属于该处理器INSTRUCTION SET的指令集)。我们的编译器如何知道我们正在使用哪个处理器并将整个程序转换为可由我们的处理器执行的指令
例 - 1)如果我们在装有奔腾处理器的机器上安装turbo c。如果我们在这台机器上执行我们的c程序,它必须将整个程序转换为属于奔腾处理器指令集的指令集如果我们在有机器上安装turbo c然后它必须将整个程序转换为属于i7处理器指令集的指令集。
那么编译器如何知道我们正在使用哪个处理器以及为什么编译器对于操作系统是不同的,根据上面的解释,处理器必须是不同的?
(我很长时间没有找到这个问题的答案,而且很快就会发表声明)
答案 0 :(得分:1)
某些编译器只能为特定系统生成机器代码。如果要为不同的系统进行编译,则必须完全使用不同版本的编译器或不同的编译器。
其他编译器知道如何编译许多不同的处理器。但除非您另有说明,否则它会假定您要为您正在运行的相同类型的计算机生成代码。因此,如果您在80x86 Linux上运行编译器,它将为80x86 Linux生成机器代码。
编译一种类型的系统并为另一种类型生成代码称为交叉编译。执行此操作时,您必须告诉编译器目标体系结构是什么。
执行此操作的方式取决于特定的编译器。如果从CLI编译,它可能是命令行选项,如果使用GUI,它可能在设置对话框中。
答案 1 :(得分:0)
同一架构系列中不同处理器型号的指令集并不完全不同。该体系结构的指令集具有各种子集,并且不同的处理器将具有不同的子集选择。通常,随着处理器变得更加复杂,有一个基本指令的子集(或几个子集)随着时间的推移而增长,并且各种额外的子集包含当前可选的指令,具体取决于orocessor模型。
当编译器编译时,它会编译一些目标,其中包含一组允许使用的指令子集。通常,默认目标是基本指令。生成的编译程序可以在任何带有这些基本指令的处理器上运行,但如果使用了一些可选指令,它可能无法获得性能。
此类体系结构的编译器通常具有可用于告诉它们要定位哪个处理器模型或编译器可能使用哪些指令子集的开关。生成的程序只能在具有指定指令的处理器模型上运行。它可能因其使用的指令而表现更好,但如果没有这些指令则不会在处理器型号上运行。
编译器可能会根据其运行的系统自动调整其目标。有指令和系统调用报告有关当前处理器上可用的指令子集以及操作系统版本和功能的信息,因此编译器可以使用它们来定制其目标。因此,默认情况下,编译器可能会为您执行它的系统进行编译,但如果您为其提供请求,则可以编译其他目标。
最终,编译器只是一个计算机程序。它运行,读取输入和写入输出。该输出可以是编译器旨在支持的任何计算机的程序。