这更像是一个理论问题。我是 Comp sci 专业,对低级编程非常感兴趣。我喜欢了解引擎盖下的工作原理。我的专长是编译器设计。
无论如何,当我正在开发我的第一个编译器时,我遇到了一些令人困惑的事情。
当您用 C/C++ 编写程序时,人们知道的传统事情是,编译器神奇地将您的 C/C++ 代码转换为该机器的本机代码。
但有些事情并没有在这里加起来。如果我针对 x86 架构编译我的 C/C++ 程序,那么相同的程序似乎应该在具有相同架构的任何计算机上运行。但这不会发生。您需要为 OS X 或 Linux 或 Windows 重新编译您的代码。(再次为 32 位与 64 位)
我只是想知道为什么会这样?我们在编译 C/C++ 程序时不是针对 CPU 架构/指令集吗?Mac 操作系统和 Windows 操作系统可以在完全相同的架构上运行。
(我知道 Java 和类似的目标是 VM 或 CLR,所以这些不算数)
如果我对此给出了最佳答案,我会说 C/C++ 必须编译为特定于操作系统的指令。但是我读到的每个来源都说编译器针对机器。所以我很困惑。
有一个为语言研究开发的程序(http://people.csail.mit.edu/mcollins/code.html)。当我尝试在 Windows 上使用 Git bash 终端运行解析器时,出现错误:
bash: cannot execute binary file: Exec format error.
Run Code Online (Sandbox Code Playgroud)
首先,我认为这是因为我的 64 位操作系统,因为该文件是 32 位的。因此,我在 32 位系统上尝试了该程序,但得到了相同的消息。
关于如何解决这个问题有什么想法吗?:
file (program)显示:
ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.2.5, with debug_info, not stripped
Run Code Online (Sandbox Code Playgroud)
uname -srv对于我的 64 位操作系统,显示:
MINGW64_NT-10.0-19042 3.1.7-340.x86_64 2021-03-26 22:17 UTC
Run Code Online (Sandbox Code Playgroud)
uname -srv对于我的 32 位操作系统,显示:
MINGW32_NT-6.1-7601 3.1.7-340.i686 2021-03-26 22:01 UTC
Run Code Online (Sandbox Code Playgroud)
PS:如果你想尝试一下,这段代码应该可以在程序目录中运行,但它对我不起作用:
gunzip -c models/model2/events.gz | code/parser examples/sec23.tagged models/model2/grammar 10000 1 1 1 1 …Run Code Online (Sandbox Code Playgroud) 我在C中编写了一个简单的程序,并在Ubuntu上使用GCC编译它.这个文件会在另一台机器上运行吗?
c ×2
bash ×1
c++ ×1
compilation ×1
elf ×1
executable ×1
ubuntu ×1
unix ×1
winapi ×1
windows ×1