質問: cは新しいアーキテクチャ用の移植可能な言語ですか、それともisaに固有ですか? c言語はどのようにして命令セットに移植できますか(新しいアーキテクチャを意味します)?新しいアーキテクチャごとに新しいcコンパイラを作成する必要がありますか?
回答: c言語がどのような命令セットにも移植可能である(新しいアーキテクチャを意味する)。 そうではありませんが、cはほとんどの合理的な命令セットに移植可能で、既存の命令セットに近いです。架空の反例として、3進数(バイナリではない)または10進数を使用してコンピュータアーキテクチャを定義する場合があります。どちらも過去に発生しました(1960年代: ibm/162 は10進数、ロシア語 setun は3進数でした)。これらのマシンでは、c [クロス]コンパイラはまったく不可能です。過去の lispマシン (または smalltalk ones)または rekursiv または iapx432 マシンでは、cは非常に困難です(移植はほとんど不可能です。現在の [〜#〜] safe [〜#〜] darpaプロジェクトは、cに適さないアーキテクチャを定義しています。実際には、バイト(8ビット)、バイトアドレッシング、 harvard または von neumann アーキテクチャの可用性が、妥当なcコンパイラにほぼ必要です。 cおよびcでコーディングされた多くの実用的なプログラムは、ほとんどの32ビットまたは64ビット(または仮想の128ビット)のマシンに移植できます(24ビットまたは48ビットのマシン、または9ビットのマシンに移植するのははるかに困難です) -bits charおよび36ビットワード(原則として実現可能であっても)。もちろん、今日新しいアーキテクチャを定義する場合(例 [〜#〜] riscv [〜#〜] または [〜#〜] mill [〜#〜] ) 、あなたは実際にそれを多かれ少なかれc互換であると定義し(そしていくつかのposixのようなosを実行することができるいくつかの既存のプロセッサに近い)そしてあなたは設計します(そしてコードはしばしば [〜 #〜] gcc [〜#〜] または clang )、c クロスコンパイラ そうでない場合、アーキテクチャが根本的に異なる場合は、そのためのコンパイラとオペレーティングシステムの開発を検討する(そして予算を立てる)必要があります。また、特定のプログラム(linuxカーネル、firefoxブラウザなど)が新しいアーキテクチャに簡単に ported できるかどうかもわかりません。 ソフトウェアの移植性 はyes/no機能ではないことに注意してください( endianness 、 data alignment 、 cache coherence と考えてください) on マルチコアプロセッサ 、実装固有のコード、 asm命令 、 未定義の動作 、ライブラリの可用性、オペレーティングシステムapi- win api は [〜#〜] posix [〜#〜] )とは大きく異なります。 移植性のあるソフトウェアはなく、特定のコンピュータに移植されたソフトウェアだけです。 linuxディストリビューション for x86-64でも、さまざまな異なる パッケージマネージャー があり、同じソースコードをコンパイルするには、異なるディストリビューションで異なるパッケージが必要になる場合があります。たとえば refpersys は フリーソフトウェア - c++ 17 にコード化されており、linuxでは qt5 -を使用しています貢献しますが、名前が異なるさまざまなパッケージに依存します(そしてその commit e611de7f は ビルドオートメーション ツールに依存します omake 0.10.3ディストリビューションにパッケージ化されているが、omakeはgplされている free software ) 新しいアーキテクチャ用にcコンパイラを再度記述する必要がありますか? はい、それは クロスコンパイラ になる可能性があります。さまざまな例については、 [〜#〜] gcc [〜#〜] のソースコードを参照してください。それぞれが1年間のフルタイムの仕事を意味する可能性があります。