软件本机运行意味着什么?


27

我一直想知道软件本地运行意味着什么。此类软件究竟是什么?与非本机运行的软件有何不同?如何确定给定的软件价格是否可以在计算机上本地运行?我的计算机上可能已经有本机运行的软件?


2
“ native”意味着它旨在在任何平台/操作系统上运行
yuritsuki 2013年

我也没有...似乎主持人很难阅读问题...

5
@faB您是否意识到没有主持人参与结束问题?
slhck

我承认,问题标题让我想到了在“操作系统”下或在处理器本身(例如直接硬件访问)下运行“程序”之间的区别。
2013年

这并不是说问题本身是不好的,但对这个站点不是很好。正如答案所证明的,这不是一个可以完全回答的问题,并且围绕着它有许多论点,根据FAQ,它的结束完全合适。
afrazier

Answers:


43

如果软件被设计为可以在平台上运行,则该软件是平台本身的。

平台通常是指操作系统,但它也可以应用于诸如Nintendo Game Boy之类的设备。

以Game Boy为例,它从墨盒中获取软件。这些墨盒包含在Game Boy上本地运行的代码。

仿真器是一层,允许为一个平台设计的软件可以在另一个平台上运行。例如,有些模拟器可以执行Game Boy墨盒的图像,并允许您在计算机甚至手机上玩Game Boy游戏。

兼容层是一种像的仿真器。当64位计算机和操作系统成为主流时,它们需要与现有的32位技术兼容。由于64位和32位体系结构非常不同,因此通常需要兼容层才能在64位计算机上运行32位软件。对于Microsoft Windows的64位版本,Microsoft需要编写一个兼容性层,以便32位程序仍可以在新的64位系统上运行。这就是为什么某些程序经常安装到名为的文件夹中的原因Program Files (x86),其中x86表示“ 32位”。

与仿真器相比,兼容性层更倾向于本机系统。 VirtualBox 模拟操作系统*的硬件,并且它模拟的系统与主机系统之间没有太多直接的交互。 WoW64是一个兼容性层,它允许32位程序以更集成的方式在64位Windows上运行。WoW64帮助使程序兼容,而不是在孤立的环境中模拟程序。

翻译库是兼容层的组分。只要二进制代码非本地运行,翻译库就会帮助将外部非本地调用重定向到系统可以理解的本地调用。为原始TI-83编写的汇编程序可能与较新的TI-83 / 84 Plus计算器不兼容,因为某些在TI-83架构中有意义的调用可能在TI-83 / 84 +中不再有效。翻译库(可能包含在MirageOS之类的shell中)可以确保对TI-83的调用转到TI-83 / 84 +计算器中新的更新位置。

独立平台的代码是用一种通常由本机运行的语言解释的语言编写的。例如,PHP是一种由已安装的PHP二进制文件解释和执行的编程语言,该PHP二进制文件已经针对Windows,Mac和基于Unix的操作系统进行了本机编译。Web脚本编写者编写的PHP代码与平台无关,只要在这些操作系统上安装了PHP,该代码就可以在多个操作系统上工作。


更正

*谢谢MichaelKjörling这个答案上遇到一些问题

其他

“本机”和“非本机”之间的区别不是黑白的(致谢


3
次要nitpick :(是VirtualBox,不是VirualBox,并且)VirtualBox不模拟操作系统,而是模拟硬件。因此,您可以在VirtualBox中安装所需的任何操作系统(受虚拟化限制),甚至可以从头开始编写自己的操作系统。
CVn

1
Native还经常暗示它正在使用基础平台的主库集和API,这可能会使区分有些模糊。有很多人不认为.NET应用程序是“本机”,例如Win32 API应用程序是“本机”,类似地,有些人也不认为在Gnome桌面“本机”上运行的KDE程序。
afrazier 2013年

@afrazier:这是因为.NET应用程序旨在在“公共语言运行时”上运行,并且需要兼容层才能在Windows上运行。或不同的兼容性层以在Linux上运行。
Ben Voigt

@Ben Voigt:它仍然是第一方API,二进制文件被编译为本地x86 / amd64代码(无论是在运行时由CLR还是预先与ngen一起使用),并且该框架已随Windows的最新版本一起提供。但是,这是一个较大论点的一部分,在这里并不恰当。
afrazier 2013年

从技术上讲,Virtual Box不是模拟器,而是Virtualizer。时间流逝的模拟器始终模拟完全不同的硬件。在虚拟机下,操作系统和软件实际上在主机CPU上本地运行。区别在于设备是虚拟的或仿真的。甚至Virtual Box网站在此处指出的技术差异也很小:virtualbox.org/wiki/Virtualization
Matt H

4

通常将本机代码与独立于平台的代码相对使用。如果运行本机软件,则运行的是已编译的二进制文件,而不是运行平台无关的脚本(例如javascript或Java字节码)。编译的C或编译的C ++是本机代码的很好示例。


3

令人惊讶的是,有两个答案,但是标准通常是:将代码编译为CPU的操作码,并在引导计算机的OS编程库中运行。在这种情况下,您运行的大多数代码都是本机代码。也许一些反例可以解决问题。

Java不是本机代码。它被编译为中间字节码,然后在特定芯片组上运行。Java可以调用本机代码。Eclipse是一个很好的例子-为了提高速度,Java调用了某些平台本机图形调用。

如果运行WINE,这是MS Windows API模拟器,则不是本机代码。尽管您正在执行为该芯片组(x86)设计的代码,但您不是在运行引导它的操作系统的代码,而是在运行替换库。 MAME为不同的CPU和操作系统运行二进制文件。

脚本不是本机代码。它们用高级语言编写,然后必须在运行时将其转换为在CPU上运行的代码。

有一些模糊的线条。您的Web浏览器以本机代码运行,但也可以运行Java(编译为字节码)或Javascript(脚本解释语言)。


.NET,VBA,XULIA-32(至少在AMD64 CPU上),...
CVn

3

这在很大程度上取决于上下文。对我来说,“本机”是指应用程序使用操作系统提供的功能和机制,而不是滚动使用它们自己的功能。这可以应用于用户界面功能(按钮,窗口,文件选择器对话框),也可以应用于内部功能(例如与“打开方式...”集成)。

例如,在Windows上,本机应用程序将使用“ WinAPI”来获取与其他应用程序相同的按钮,滚动条等。它们在系统应用程序(记事本)中的行为与本机第三方应用程序中的行为完全相同。

Java应用程序经常使用“ Swing”并看起来完全不同,因为它们自己绘制控件而不是使用系统控件。好处是该程序在每个OS上看起来都一样。

构建GUI的另一种选择是跨平台工具箱,例如“ QT”。QT会要求操作系统为其绘制控件,因此无论您运行的是Windows,OSX还是Linux,它们的外观都非常本机。一个QT文本框看起来就像一个Windows文本框,但是它并不完全是本机文本框,而是一种模拟。您可能会注意到细节上的细微差别(例如,上下文菜单,输入法等)。

请注意,当人们说“本机”时,它们通常意味着程序被编译为机器代码,而不是编译为在虚拟机中运行的中间代码(例如Java和.NET程序)。在以上示例中,WinAPI和QT应用程序正在使用机器代码,而Java程序被编译为Java字节码。如今,这种用法有点问题,因为许多用户会认为Windows原生使用.NET应用程序做得很好-它只是一个.exe,使用完全相同的控件和API,并且与已编译的程序几乎没有区别。机器代码。

同样,我会考虑一个使用GTK的程序,它了解Unix文件系统的结构,并且可能来自Ubuntu或Gnome原生的.deb软件包。甚至还有用JavaScript编写的第一方Gnome应用程序,人们都可以称其为Native!Windows 8“ Metro”应用程序也是如此,可以用多种语言编写,有些可以编译,有些则不能。


2

用抽象的术语来说,这就像让其他人信任以其他语言执行程序一样。

  • 本机意味着操作系统将使用他所知道的最快,最简单的方言二进制。

    优点:快速,大量的语言可以互通,因为这取决于语言。缺点:安全,复杂的API,受限于OS功能,而且编译器也很难制造,因为一旦编译后,程序就会被大量发布。

  • 不是本机的,这意味着您的代码将不会被操作系统直接执行。他可以通过许多不同的方式执行,主要的方式可以被解释并在虚拟机中运行程序的字节码版本。

    优点:API几乎会发生变化,因此程序员工作起来更加容易(至少在使用这种特定语言时)。缺点:性能(通常会略有下降,很少会成为问题),而且并不是每个人都会实际使用这种特定语言,因此采用此技术也可能是一个问题。安全也可能是一个问题,但它的控制力要大得多。不知何故。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.