C言語の移植性


10

Cのような言語の移植性はどの程度正確に決定されますか?コンパイラはISA固有であることを学びました。これが本当なら、Cはどのように移植可能ですか?それとも、Cで書かれたソースコードだけが移植可能で、実行可能ファイルではないということですか?x86のサンプルアプリケーションに固有の実行可能ファイルISAは、Appleのアプリケーションとは別のものではありませんか(AppleがMotorola / PowerPCマイクロプロセッサを使用していると仮定)

回答:


27

Cで書かれたソースコードだけが実行可能ファイルではなく移植可能であるということですか?

正しい。一部の人々はそれを一度書いて、どこでもコンパイルすると呼びます。

http://en.wikipedia.org/wiki/Write_once,_compile_anywhere

もう1つの方法は、一度書き込み、どこでも実行することです。Javaはこの良い例です。

http://en.wikipedia.org/wiki/Write_once,_run_anywhere

また、プラットフォーム間の部分的な移植性を実現することはできますが、コードを変更せずにどこでも実行できると期待するべきではありません。


Cのソースコードは、さまざまなコンパイラ、ISA、OSに移植できません。標準タイプのサイズや配置などの単純なことはCでは標準ではないため、それ自体の他のインスタンスとデータを交換するソフトウェアの移植は非常に困難な場合があります。Cプログラマーが移植性を得るためにジャンプするフープの(おそらく難読化された)例については、GNU Autoconf / Automakeを参照してください。
Tim Williscroft、

3
@TimWilliscroft:移植性の問題は通常、非標準のライブラリと不適切なプログラミング方法が原因で発生します。Cまたはその標準ライブラリが原因ではありません。簡単な例は、非標準のGCC拡張を使用するか、IOのデータを正しくシリアライズ/デシリアライズできないことです。
ブレンダン

6

これはISA固有のものではありません。たとえば、次のように質問します。

x86のアプリケーションはアップルのアプリケーションとは別ですか?

はい、Appleはx86ハードウェアを使用していますが、そうです。Cバイナリは、アーキテクチャオペレーティングシステムに固有です。


1
@ Steven314:コメントは正接です。ハードウェアが標準であるかどうかに関係なく、OS XがLinuxなどのバイナリ形式(通常はELF)とは異なるバイナリ形式(Mach-O)であるという事実に関係します。
ミパディ

@Steve:EFIとBIOSは、起動とOS内部でのみ重要です。同じCPUなので、CPU命令セットであるハードウェアアーキテクチャは同じです。
vartec

コメントを削除したのは、主にMacのものを最初から含めるべきではなかったからです。ABI(アプリケーションバイナリインターフェース)と呼び出し規約についての私の言及は、まだ関連があるかもしれません(「アーキテクチャとオペレーティングシステム」に追加する3番目の項目)。それらは、ABIが特定のアーキテクチャー(例えば、使用可能なレジスター)向けに設計される傾向があるという点を除いて、ハードウェアに関連していませんが、バイナリーの移植性に関連しています。これはファイル形式の問題ではありません。ELFはWindowsとLinux(gcc)で使用されますが、オブジェクトファイルを別のファイルに移動することはできません。
Steve314、

@vartec Cバイナリもオペレーティングシステム固有であるとおっしゃいましたが、それはO / S自体がISA固有であるため、Cバイナリが間接的にO / S固有になるということですか?
KawaiKx

@Saurabh-OSがファイル形式を指定するため、すべてのネイティブ実行可能ファイルはOS固有です。また、C標準ライブラリはオペレーティングシステムを呼び出して多くの関数を実装する必要があるため、ファイル形式が標準化されていても、コード自体を別のOSで実行することはできませんでした。これは、JVM(Java仮想マシン)などの一部の仮想マシンコードとは対照的に、ネイティブコードにコンパイルされる言語の標準です。仮想マシン用にCをコンパイルすることは可能ですが、私が知っていることは一度も行ったことはありません。LLVMが最も近くなりますが、コンパイラーのバックエンドとして意図されており、compile-once-run-anywhere環境ではありません。
Steve314、

5

Cで書かれたソースコードだけが実行可能ファイルではなく移植可能であるということですか?

丁度。すべてのプラットフォームでCプログラムを再コンパイルする必要があります。Cコンパイラは、同じプロセッサ/メモリアーキテクチャのマシンとOSの間で、非常に限られた範囲でのみ移植可能なマシンコードを生成します。そのため、「Linux 64ビットIntel」や「Mac OS X 32ビットPowerPC」などのマルチプラットフォームアプリ(ブラウザなど)のさまざまなバイナリディストリビューションが表示されます(OK、最後の1つは単なる例であり、Appleが切り替えたのは知っています)数年前にインテルに:-)。


3

質問のほとんどは答えられていますが、耐久性はあなたが考慮に入れなければならないかもしれないもう一つのことではありません。

たとえば、JAVAは一度記述すれば、VMがインストールされている任意のプラットフォームで実行できます(現在、「ランタイム環境」と呼ばれています)。ただし、もう1つの利点は、1995年のJava 1.1コードを2011マシンで実行できることです。コードがi386でコンパイルされていて、AMD64アーキテクチャで実行しようとした場合、これは不可能です。

仮想マシン自体の改善も得られます。

次に、一般的に、移植性の低い言語から移植性の高い言語へと進みます。アセンブラ、Cなどの低レベルのコンパイル言語、次にC ++、次にインタープリター型言語、または仮想マシン内で実行される言語。

私は実際にはJavaの擁護者ではありません。少なくとも言語やコミュニティなどではそうではありませんが、Cと比較して移植性とパフォーマンスの低下を最小限に抑えたい場合は、この方法が適しています。


3

どこかで一度コンパイルすると、書き込みに関する良い答えが得られます。

Cは人気があり、Cコンパイラが将来のターゲットプラットフォームで利用できる可能性が高いため、Cを移植可能な言語として考えるのが好きです。別の要因は、プラットフォームに依存しない方法で一般的なプログラミングタスクを支援する標準ライブラリです。

したがって、言語の移植性は次の要素によって決定されます。

  1. 標準化のレベル。
  2. さまざまなプラットフォーム/アーキテクチャ用のコンパイラの可用性。
  3. ポータブルライブラリの深さと幅。

現実的には、ほとんどすべての複雑なCアプリケーションは、ハードウェアまたはオペレーティングシステムの依存関係のために、新しいプラットフォームに移行するためにいくつかの作業を必要とします。このプロセスは移植と呼ばれます。


3

「移植性」には複数の意味があります。Cに関しては、次のことを意味します。

  • コンパイラーは、さまざまなハードウェアおよびオペレーティングシステムプラットフォーム用のC用に実装されています。これは、70年代初頭には大きな問題でした。

  • 各コンパイラの実装が言語のわずかに異なるバリアントを認識するのとは対照的に、PascalやBASICなどの言語の複数のバリアントがあったため、Cが最初に設計されたときのビッグディール普遍的に認識されていない);

  • この標準のため、異なるプラットフォームでコンパイルした場合、適合コードは同じ動作を生成します。

ソースコードは、携帯型であるが、新しいバイナリは、各ターゲットのために生成されなければなりません。

ただし、Cソースが「自明」に移植できることはめったにありません。ほとんどのアプリケーションでは、特定のプラットフォームに固有の拡張機能を使用して、言語標準で定義されているものを超える必要があるため、実際にはソースコードは100%移植可能ではありません。

ただし、Cは実装にかなりの部分を残していることに注意してください。さまざまなデータ型の正確なサイズ、オーバーフロー時の動作などは、すべて実装次第です。標準は、実装が準拠しなければならない最小要件を提供しますが、実装はそれらの制限を超えて自由です。


0

ISAが何であれ、CはISA固有ではありません。PC拡張カード用の現在廃止されたスロットを参照しているのではないと思います。

非常に多くのプラットフォームに標準に準拠したCコンパイラがあり、ソースコードで完全に標準で定義された言語機能を使用している限り、任意のプラットフォームの任意のCコンパイラでコンパイルできます。

ただし、C標準では、実装の定義済みまたは未定義の動作として、機能の多くの動作が残されるという欠点があります。これは、C言語を低レベルのプログラミングでより一般的に使用できるようにするために行われ、正確に定義された動作が一部のプラットフォームでハードウェアがサポートするものと一致しないケースを回避します。ただし、移植可能なプログラムを作成するのは少し難しくなります。

また、一部の言語とは異なり、CにはJavaまたはC#が提供する種類の巨大なライブラリが付属していません。非常に移植性の高いライブラリを入手して、ほぼすべてのことを実行できますが、それらを構築して連携させるには、いくつかの作業を行う必要があります。

もちろんCには標準ライブラリがありますが、その範囲はJava、C#、Pythonなどと比較して比較的制限されています。


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