ソフトウェアがネイティブに実行されるとはどういう意味ですか?


27

ソフトウェアがネイティブに実行されるとはどういう意味かと思っていました。そのようなソフトウェアとは何ですか?また、ネイティブに実行されないソフトウェアとはどう違いますか?特定のソフトウェアがコンピューター上でネイティブに実行されるかどうかを確認するにはどうすればよいですか?コンピューター上にネイティブに実行されるソフトウェアが既に存在する可能性はありますか?


2
「ネイティブ」は、どのプラットフォーム/ OSでも実行できるように設計されていることを意味します
-yuritsuki

私も...モデレーターは質問を読むのが難しいようです

5
@faB質問のクローズにモデレーターが関与していないことに気付いていますか?
slhck

質問のタイトルから、「オペレーティングシステム」またはプロセッサ自体(「ハードウェアへの直接アクセス」など)で「プログラム」を実行することの違いを考えるようになりました。
ブレークスルー

質問自体が悪いというわけではありませんが、このサイトには良くありません。回答から明らかなように、それはきれいに答えられるものではなく、それを取り巻く多くの議論を持っているものではありません。
フレイジャー

回答:


43

ソフトウェアは、プラットフォームで実行するように設計されている場合、プラットフォームにネイティブです。

プラットフォームは通常、オペレーティングシステムを指しますが、任天堂ゲームボーイなどのデバイスにも適用できます。

例としてゲームボーイを使用して、カートリッジからソフトウェアを取得します。これらのカートリッジには、ゲームボーイでネイティブに実行されるコードが含まれています。

エミュレーターは、あるプラットフォーム用に設計されたソフトウェアを別のプラットフォームで実行できるようにするレイヤーです。たとえば、Game Boyカートリッジのイメージを実行し、コンピューターまたは携帯電話でGame Boyゲームをプレイできるエミュレーターがあります。

互換性レイヤは、エミュレータ等の一種です。64ビットコンピューターとオペレーティングシステムが主流になったとき、既存の32ビットテクノロジーとの互換性が必要でした。64ビットと32ビットのアーキテクチャは非常に異なるため、64ビットマシンで32ビットソフトウェアを実行するには互換性レイヤーが必要になることがよくあります。64ビット版のMicrosoft Windowsでは、32ビットプログラムが新しい64ビットシステムで動作するように、Microsoftは互換性レイヤーを作成する必要がありました。一部のプログラムは、しばしば呼ばれるフォルダにインストールされている理由はここにありProgram Files (x86)x86手段「32ビット」。

互換性レイヤーは、エミュレーターよりもネイティブシステムにより密接な傾向があります。 VirtualBox オペレーティングシステム*のハードウェアをエミュレートし、エミュレートするシステムはホストシステムとの直接的な相互作用をあまり持ちません。 WoW64は、32ビットプログラムをより統合された方法で64ビットWindowsで実行できるという点で互換性レイヤーです。WoW64は、隔離された環境でプログラムをエミュレートするのではなく、プログラムの互換性を確保します。

変換ライブラリは、互換レイヤーのコンポーネントです。バイナリコードが非ネイティブで実行されるたびに、翻訳ライブラリは、外部の非ネイティブコールをシステムが理解できるネイティブコールにリダイレクトするのに役立ちます。元のTI-83用に作成されたアセンブリプログラムは、TI-83 / 84 +電卓と互換性がない場合があります。TI-83のアーキテクチャで意味のある一部の呼び出しがTI-83 / 84 +では無効になる可能性があるためです。翻訳ライブラリ(おそらくMirageOSのようなシェルに含まれる)は、TI-83の呼び出しがTI-83 / 84 +計算機の新しい更新された場所に行くことを保証します。

プラットフォームに依存しないコードは、通常ネイティブに実行される何かによって解釈される言語で書かれています。たとえば、PHPは、インストール済みのPHPバイナリによって解釈および実行されるプログラミング言語であり、Windows、Mac、およびUnixベースのオペレーティングシステム用にネイティブにコンパイルされています。Webスクリプターが記述するPHPコードはプラットフォームに依存しないため、これらのオペレーティングシステムにPHPがインストールされている限り、複数のオペレーティングシステムでコードを使用できます。


その他

訂正

* MichaelKjörlingこの回答でいくつかの問題見つけてくれてありがとう。

その他

「ネイティブ」と「非ネイティブ」の違いは、黒と白ではありません(クレジットからアフレイザーへ


3
ちょっとした選択:(VirualBoxではなくVirtualBoxです)VirtualBoxはオペレーティングシステムをエミュレートせず、ハードウェアをエミュレートします。そのため、VirtualBoxに任意のオペレーティングシステムをインストールできます(仮想化の制限が適用されます)。または、独自のオペレーティングシステムをゼロから作成することもできます。
CVn

1
ネイティブは、多くの場合、基礎となるプラットフォームのプライマリライブラリセットとAPIを使用していることを暗示しており、区別が少し曖昧になる可能性があります。Win32 APIアプリケーションが「ネイティブ」であるように、.NETアプリケーションを「ネイティブ」と見なさない人はかなり多く、同様に、Gnomeデスクトップで実行されるKDEプログラムを「ネイティブ」と見なさない人もいます。
フレイジャー

@afrazier:.NETアプリケーションは「共通言語ランタイム」で実行するように設計されており、Windowsで実行するには互換性レイヤーが必要だからです。または、Linuxで実行する別の互換性レイヤー。
ベンフォークト

@Ben Voigt:まだファーストパーティAPIであり、バイナリはネイティブx86 / amd64コードにコンパイルされます(実行時にCLRによって、またはngenを使用して事前に)、フレームワークはWindowsの最新バージョンに同梱されています。ただし、これはより大きな議論の一部であり、ここではあまり適切ではありません。
フレイジャー

Virtual Boxは技術的にはエミュレータではなく、Virtualizerです。過去のエミュレータは常に完全に異なるハードウェアをエミュレートしています。バーチャライザーの下では、OSとソフトウェアは実際にホストCPUでネイティブに実行されます。違いは、デバイスが仮想またはエミュレートされていることです。Virtual BoxのWebサイトでさえ次のように指摘しているのは、技術的なわずかな違いです:virtualbox.org/wiki/Virtualization
Matt H

4

ネイティブコードは、通常、プラットフォームに依存しないコードの反対として使用されます。ネイティブソフトウェアを実行している場合、たとえばjavascriptやJavaバイトコードなどのプラットフォームに依存しないスクリプトではなく、コンパイル済みのバイナリを実行しています。コンパイル済みCまたはコンパイル済みC ++は、ネイティブコードの良い例です。


3

驚くほどいくつかの答えがありますが、標準は通常、CPUのオペコードにコンパイルされたコードであり、コンピューターを起動したOSのプログラミングライブラリに対して実行されます。この場合、実行するほとんどのコードはネイティブコードになります。たぶん、いくつかの反例が事態を解決するでしょう。

Javaはネイティブコードではありません。中間バイトコードにコンパイルされ、特定のチップセットで実行されます。Javaはネイティブコードを呼び出すことができます。Eclipseは素晴らしい例です-速度のために、Javaはいくつかのプラットフォームネイティブグラフィックス呼び出しを呼び出します。

MS Windows APIエミュレーターであるWINEを実行する場合、それはネイティブコードではありません。そのチップセット(x86)用に設計されたコードを実行していますが、それを起動したOSのコードではなく、置換ライブラリを実行しています。 MAMEは、異なるCPUおよびオペレーティングシステムのバイナリを実行します。

スクリプトはネイティブコードではありません。これらは、実行時にCPUで実行されるコードに変換する必要がある高レベル言語で記述されています。

ぼやけた線がいくつかあります。Webブラウザーはネイティブコードとして実行されますが、Java(バイトコードにコンパイル)またはJavascript(スクリプト解釈言語)も実行できます。


.NET、VBA、XULIA-32(少なくともAMD64 CPU上)、...
CVn

3

コンテキストに大きく依存します。私にとって、「ネイティブ」とは、アプリケーションが独自にローリングするのではなく、オペレーティングシステムが提供する機能とメカニズムを使用することを意味します。これは、ユーザーインターフェイス機能(ボタン、ウィンドウ、ファイル選択ダイアログ)に加えて、内部の機能(「Open with ...」との統合など)にも適用できます。

たとえば、Windowsでは、ネイティブアプリは「WinAPI」を使用して、他のアプリケーションと同じボタン、スクロールバーなどを取得します。システムアプリ(メモ帳)でもネイティブのサードパーティアプリとまったく同じように動作します。

Javaアプリケーションは、多くの場合「Swing」を使用しますが、システムのコントロールを使用するのではなく、自分でコントロールを描画するため、外観がまったく異なります。利点は、プログラムがすべてのOSで同じに見えることです。

GUIを構築する別のオプションは、「QT」のようなクロスプラットフォームツールキットです。QTはOSにコントロールを描画するように要求するため、Windows、OSX、Linuxのどれを実行していても、非常にネイティブに見えるはずです。QTテキストボックスは、Windowsのテキストボックスのように見えますが、ネイティブではなく、一種のエミュレーションです。詳細にわずかな違いがあることに気付く場合があります(コンテキストメニュー、入力方法など)。

人々が「ネイティブ」と言うとき、プログラムは、仮想マシン(Javaや.NETプログラムなど)で実行される中間コードではなく、マシンコードにコンパイルされることをしばしば意味します。上記の例では、WinAPIとQTアプリはマシンコードを使用していますが、JavaプログラムはJavaバイトコードにコンパイルされています。多くのユーザーはWindows用の優れた.NETアプリケーションをネイティブであると考えているため、この使用法は少し問題があります。マシンコード。

同様に、GTKを使用し、Unixファイルシステム構造を認識し、おそらくUbuntuまたはGnomeにネイティブな.debパッケージに含まれるプログラムを検討します。JavaScriptで書かれたネイティブGnomeアプリもあり、ネイティブと呼ぶことができます!同じことがWindows 8の「メトロ」アプリにも当てはまります。これらのアプリはさまざまな言語で作成でき、一部はコンパイル済み、一部はコンパイルされていません。


2

もっと抽象的な言葉で言えば、他の人にあなたの信頼を別の言語でプログラムを実行させるようなものです。

  • ネイティブとは、OSが彼が知っている最速で最も単純な方言であるバイナリを使用することを意味します。

    長所:金属にダウンしているため、相互に通信できる言語の高速で大規模な可用性。短所:セキュリティ、OSの機能に制限された複雑なAPI、およびコンパイラは作成が困難です。これは、コンパイルされたプログラムが野生にリリースされるためです。

  • ネイティブではないため、コードはOSによって直接実行されません。彼はさまざまな方法で実行できます。主な方法は解釈され、プログラムのバイトコードバージョンを仮想マシンで実行します。

    長所:APIはほとんど変更されるため、プログラマーは(少なくともこの特定の言語にこだわる場合)作業がはるかに簡単です。短所:パフォーマンス(多くの場合、軽度の低下であり、めったに問題になることはありません)、そして誰もが実際にこの特定の言語を使用するわけではないため、この技術を採用することも問題になる可能性があります。セキュリティも問題となる可能性がありますが、はるかに過小管理されています。どういうわけか。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.