it-swarm-ja.com

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

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

27
Throsby

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

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

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

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

互換性レイヤーはエミュレータのようなものです。 64ビットコンピューターとオペレーティングシステムが主流になったとき、それらは既存の32ビットテクノロジーと互換性がある必要がありました。 64ビットアーキテクチャと32ビットアーキテクチャは大きく異なるため、64ビットマシンで32ビットソフトウェアを実行するには、互換性レイヤーが必要になることがよくあります。 Microsoft Windowsの64ビットエディションの場合、32ビットプログラムが新しい64ビットシステムで引き続き機能するように、Microsoftは互換性レイヤーを作成する必要がありました。これが、一部のプログラムがProgram Files (x86)というフォルダーにインストールされることが多い理由です。ここで、x86は「32ビット」を意味します。

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

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

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


雑多

訂正

* ありがとう MichaelKjörlingいくつかの問題を捉えるこの答え .

その他の

「ネイティブ」と「非ネイティブ」の違いは 白黒ではない です。 (クレジット afrazier

43
Deltik

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

4
Niklas

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

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

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

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

人々が「ネイティブ」と言うとき、それらはしばしば、プログラムが仮想マシンで実行される中間コードではなくマシンコードにコンパイルされることを意味します(Javaおよび.NETプログラムなど)。上記の例では、WinAPIとQTアプリはマシンコードを使用していますが、JavaプログラムはJavaバイトコードにコンパイルされています。この使用法は少し問題があります。今日では、多くのユーザーがWindows向けの優れた.NETアプリケーションを検討しているため、これは単なる.exeであり、内部でまったく同じコントロールとAPIを使用し、マシンコードにコンパイルされたプログラムとほとんど区別がつきません。

同様に、GTKを使用し、Unixファイルシステム構造を認識しており、UbuntuまたはGnomeにネイティブの.debパッケージで提供されるプログラムを検討します。ネイティブと呼べるJavaScriptで書かれたファーストパーティのGnomeアプリさえあります!同じことがWindows 8 "Metro"アプリにも当てはまり、さまざまな言語で記述できます。コンパイルされた言語もあれば、そうでない言語もあります。

3
jdm

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

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

[〜#〜] wine [〜#〜] を実行する場合、これはネイティブコードではないMS Windows APIエミュレータです。そのチップセット(x86)用に設計されたコードを実行していますが、それを起動したOSのコードではなく、代わりのライブラリを実行しています。 [〜#〜] mame [〜#〜] は、さまざまなCPUおよびオペレーティングシステムのバイナリを実行します。

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

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

3
Rich Homolka

より抽象的な言葉で言えば、別の言語でプログラムを実行する信頼を他の誰かに任せるようなものです。

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

    長所:金属に依存しているため、互いに会話できる言語の高速で大規模な可用性。短所:セキュリティ、複雑なAPI、OS機能に制限、またコンパイラは作成が困難です。コンパイルされたプログラムは、一般にリリースされるためです。

  • ネイティブではない、つまり、コードがOSによって直接実行されないことを意味します。彼は多くの異なる方法で実行できます。主な方法は解釈され、仮想マシンでプログラムのバイトコードバージョンを実行します。

    長所:APIはほとんど常に変更されるため、プログラマーは(少なくともこの特定の言語を使用している場合は)作業がはるかに容易になります。短所:パフォーマンス(多くの場合、穏やかな低下であり、問​​題になることはほとんどありません)。誰もが実際にこの特定の言語を使用するわけではないため、このテクノロジを採用することも問題になる可能性があります。セキュリティも問題になる可能性がありますが、それははるかに抑制されています。何とかして。

2
jokoon