web-dev-qa-db-ja.com

カスタムCPU用のCコンパイラを作成するにはどうすればよいですか?

もちろん私がすでにアセンブラを持っているとすれば、カスタムCPU用のCコンパイラを作成する最も簡単な方法は何でしょうか?

Cコンパイラはアセンブリを生成するので、さまざまなCイディオムの標準ビットとアセンブリコードの一部を定義し、コンパイラを再構築して、ターゲットハードウェアのクロスコンパイラを取得する方法はありますか?

コンパイラ自体はCで記述し、LinuxまたはWindowsのネイティブ実行可能ファイルとしてビルドするのが望ましいでしょう。

注意:コンパイラー自体の記述方法についてではありません。私は大学でそのコースを受講しました。一般的なコンパイラーコンパイラーなどについて知っています。この状況では、可能であれば、既存のフレームワークを構成したいと思います。言語を変更するのではなく、任意のアーキテクチャをターゲットにできるようにしたいだけです。答えが「そのように機能しない」であることが判明した場合、thatの情報は、私自身と同様の仮定を行う可能性のある他の誰にとっても役立つでしょう。

45
JustJeff

LLVMバックエンドの作成に関する概要/チュートリアル

このドキュメントでは、LLVM表現をマシンアセンブリコードまたは他の言語に変換するLLVMのバックエンドを作成する手法について説明します。

[。 。 。 ]

静的コンパイラ(テキストアセンブリを生成するコンパイラ)を作成するには、以下を実装する必要があります。

  • レジスタセットについて説明します。
  • 命令セットを説明します。
  • ターゲットマシンについて説明します。
  • アーキテクチャー用のアセンブリープリンターを実装します。
  • アーキテクチャーの命令セレクターを実装します。
31
Pubby

クロスコンパイラの概念があります。つまり、1つのアーキテクチャで実行され、別のアーキテクチャを対象とするものです。 GCCがそれをどのように行うか(たとえば)を確認し、新しいアーキテクチャーをセットに追加します(それが拡張したいコンパイラーである場合)。

編集:私は数年前に新しいターゲットを追加する方法に関するGCCメーリングリストで質問を見つけました、そして誰かが this を指摘しました

9

簡単に言えば、それはそのように機能しないということです。

より長い答えは、新しいCPUタイプ用のコンパイラを書くのにいくらかの努力が必要だということです。ただし、コンパイラを最初から作成する必要はありません。ほとんどのコンパイラは、いくつかのパスで構成されています。ここに典型的なアーキテクチャがあります(多くのバリエーションが可能です):

  1. 構文解析(レクサーとパーサー)、およびCの前処理用。抽象構文ツリーにつながります。
  2. 型チェック。注釈付き抽象構文ツリーにつながります。
  3. 中間コード生成。アーキテクチャに依存しない中間コードにつながります。この段階でいくつかの最適化が行われます。
  4. アセンブリにつながる、または直接マシンコードにつながるマシンコード生成。この段階では、さらに最適化が行われます。

この説明では、ステップ4のみがマシン依存です。したがって、ステップ4が明確に分離されているコンパイラーを使用して、独自のステップ4をプラグインすることができます。これを行うには、CPUを深く理解し、コンパイラーの内部をある程度理解する必要がありますが、以前に何が起こるかについて心配する必要はありません。

非常に小さくない、非常にまれな、または非常に古いCPUのほとんどすべてに、 [〜#〜] gcc [〜#〜] のバックエンド(ステップ4)があります。 GCCバックエンドを作成するための主なドキュメントは GCC internals manual であり、特に マシンの説明 および ターゲットの説明 に関する章があります。 GCCはフリーソフトウェアであるため、GCCの使用にライセンス費用はかかりません。

vbcc(www.compilers.deにあります)は、Cで記述された、再ターゲット可能な優れたCコンパイラです。GCC/ LLVMよりもはるかに単純です。非常に簡単なので、コンパイラに関する事前の知識がなくても、数週間の作業でコンパイラを自分のCPUにリターゲットすることができました。

2
dsula

1)短い答え:

「いいえ。「コンパイラフレームワーク」のようなものはありません。水を追加し(独自のアセンブリセットにプラグイン)、かき混ぜれば完了です。」

2)より長い答え:それは確かに可能です。しかし挑戦的です。そしておそらく高価です。

あなたがそれを自分でやりたいのなら、私はGnu CCから見ていきたいと思います。さまざまなCPUとプラットフォームですでに利用可能です。

3)このリンクで他のアイデア(「関数とマクロのライブラリを構築するだけ」のアイデアを含む)を参照してください。これが私の最初の提案です。

http://www.instructables.com/answers/Custom-C-Compiler-for-homemade-instruction-set/

2
paulsm4

GCCやClangなどの既存のオープンソースコンパイラを変更できます。その他の回答から、詳細情報の入手先に関するリンクが提供されています。しかし、これらのコンパイラは簡単に再ターゲットするように設計されていません。特定のターゲットに配線された他のコンパイラーよりも、コンパイラーよりもリターゲットが「簡単」です。

ただし、比較的簡単にターゲットを変更できるコンパイラが必要な場合は、マシンアーキテクチャを明示的に指定できるコンパイラが必要であり、一部のツールは残りのコンパイラを生成します(GCCがこれを少し実行します。 Clang/LLVMは多くのことを行いますが、ここでは間違っている可能性があります)。

文献には、グーグル「compiler-compiler」というものがたくさんあります。

ただし、Cの具体的なソリューションについては、顧客の要求に応じてコンパイラーを生成するコンパイラーベンダーである [〜#〜] ace [〜#〜] をチェックする必要があります。無料ではありませんが、非常に優れたコンパイラを非常に迅速に作成すると聞いています。標準的なスタイルのバイナリ(ELF?)を生成すると思いますので、アセンブラステージをスキップします。 (ACEの経験や関係はありません。)

コードの品質を気にしない場合は、C ASTを使用して、Cの構文指定変換をアセンブラーに書き込むことができます。 C ASTは、GCC、Clang、多分ANTLR、および DMS Software Reengineering Toolkit から取得できます。

1
Ira Baxter