ソフトウェアがネイティブに実行されるとはどういう意味かと思っていました。そのようなソフトウェアとは何ですか?また、ネイティブに実行されないソフトウェアとはどう違いますか?特定のソフトウェアがコンピューター上でネイティブに実行されるかどうかを確認するにはどうすればよいですか?コンピューター上にネイティブに実行されるソフトウェアが既に存在する可能性はありますか?
ソフトウェアがネイティブに実行されるとはどういう意味かと思っていました。そのようなソフトウェアとは何ですか?また、ネイティブに実行されないソフトウェアとはどう違いますか?特定のソフトウェアがコンピューター上でネイティブに実行されるかどうかを確認するにはどうすればよいですか?コンピューター上にネイティブに実行されるソフトウェアが既に存在する可能性はありますか?
回答:
ソフトウェアは、プラットフォームで実行するように設計されている場合、プラットフォームにネイティブです。
プラットフォームは通常、オペレーティングシステムを指しますが、任天堂ゲームボーイなどのデバイスにも適用できます。
例としてゲームボーイを使用して、カートリッジからソフトウェアを取得します。これらのカートリッジには、ゲームボーイでネイティブに実行されるコードが含まれています。
エミュレーターは、あるプラットフォーム用に設計されたソフトウェアを別のプラットフォームで実行できるようにするレイヤーです。たとえば、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、この回答でいくつかの問題を見つけてくれてありがとう。
ネイティブコードは、通常、プラットフォームに依存しないコードの反対として使用されます。ネイティブソフトウェアを実行している場合、たとえばjavascriptやJavaバイトコードなどのプラットフォームに依存しないスクリプトではなく、コンパイル済みのバイナリを実行しています。コンパイル済みCまたはコンパイル済みC ++は、ネイティブコードの良い例です。
驚くほどいくつかの答えがありますが、標準は通常、CPUのオペコードにコンパイルされたコードであり、コンピューターを起動したOSのプログラミングライブラリに対して実行されます。この場合、実行するほとんどのコードはネイティブコードになります。たぶん、いくつかの反例が事態を解決するでしょう。
Javaはネイティブコードではありません。中間バイトコードにコンパイルされ、特定のチップセットで実行されます。Javaはネイティブコードを呼び出すことができます。Eclipseは素晴らしい例です-速度のために、Javaはいくつかのプラットフォームネイティブグラフィックス呼び出しを呼び出します。
MS Windows APIエミュレーターであるWINEを実行する場合、それはネイティブコードではありません。そのチップセット(x86)用に設計されたコードを実行していますが、それを起動したOSのコードではなく、置換ライブラリを実行しています。 MAMEは、異なるCPUおよびオペレーティングシステムのバイナリを実行します。
スクリプトはネイティブコードではありません。これらは、実行時にCPUで実行されるコードに変換する必要がある高レベル言語で記述されています。
ぼやけた線がいくつかあります。Webブラウザーはネイティブコードとして実行されますが、Java(バイトコードにコンパイル)またはJavascript(スクリプト解釈言語)も実行できます。
コンテキストに大きく依存します。私にとって、「ネイティブ」とは、アプリケーションが独自にローリングするのではなく、オペレーティングシステムが提供する機能とメカニズムを使用することを意味します。これは、ユーザーインターフェイス機能(ボタン、ウィンドウ、ファイル選択ダイアログ)に加えて、内部の機能(「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の「メトロ」アプリにも当てはまります。これらのアプリはさまざまな言語で作成でき、一部はコンパイル済み、一部はコンパイルされていません。
もっと抽象的な言葉で言えば、他の人にあなたの信頼を別の言語でプログラムを実行させるようなものです。
ネイティブとは、OSが彼が知っている最速で最も単純な方言であるバイナリを使用することを意味します。
長所:金属にダウンしているため、相互に通信できる言語の高速で大規模な可用性。短所:セキュリティ、OSの機能に制限された複雑なAPI、およびコンパイラは作成が困難です。これは、コンパイルされたプログラムが野生にリリースされるためです。
ネイティブではないため、コードはOSによって直接実行されません。彼はさまざまな方法で実行できます。主な方法は解釈され、プログラムのバイトコードバージョンを仮想マシンで実行します。
長所:APIはほとんど変更されるため、プログラマーは(少なくともこの特定の言語にこだわる場合)作業がはるかに簡単です。短所:パフォーマンス(多くの場合、軽度の低下であり、めったに問題になることはありません)、そして誰もが実際にこの特定の言語を使用するわけではないため、この技術を採用することも問題になる可能性があります。セキュリティも問題となる可能性がありますが、はるかに過小管理されています。どういうわけか。