C言語をそのまま実行するプロセッサについての考察

\[ \newcommand{dn}[3]{\frac{\mathrm{d}^{#3} #1}{\mathrm{d} #2^{#3}}} \newcommand{\d}[2]{\frac{\mathrm{d} #1}{\mathrm{d} #2}} \newcommand{\dd}[2]{\frac{\mathrm{d}^2 #1}{\mathrm{d} {#2}^2}} \newcommand{\ddd}[2]{\frac{\mathrm{d}^3 #1}{\mathrm{d} {#2}^3}} \newcommand{\pdn}[3]{\frac{\partial^{#3} #1}{\partial {#2}^{#3}}} \newcommand{\pd}[2]{\frac{\partial #1}{\partial #2}} \newcommand{\pdd}[2]{\frac{\partial^2 #1}{\partial {#2}^2}} \newcommand{\pddd}[2]{\frac{\partial^3 #1}{\partial {#2}^3}} \newcommand{\p}{\partial} \newcommand{\D}[2]{\frac{\mathrm{D} #1}{\mathrm{D} #2}} \newcommand{\Re}{\mathrm{Re}} \newcommand{\Im}{\mathrm{Im}} \newcommand{\bra}[1]{\left\langle #1 \right|} \newcommand{\ket}[1]{\left|#1 \right\rangle} \newcommand{\braket}[2]{\left\langle #1 \middle|#2 \right\rangle} \newcommand{\inner}[2]{\left\langle #1 ,#2 \right\rangle} \newcommand{\l}{\left} \newcommand{\m}{\middle} \newcommand{\r}{\right} \newcommand{\f}[2]{\frac{#1}{#2}} \newcommand{\eps}{\varepsilon} \newcommand{\ra}{\rightarrow} \newcommand{\F}{\mathcal{F}} \newcommand{\L}{\mathcal{L}} \newcommand{\t}{\quad} \newcommand{\intinf}{\int_{-\infty}^{+\infty}} \newcommand{\R}{\mathcal{R}} \newcommand{\C}{\mathcal{C}} \newcommand{\Z}{\mathcal{Z}} \newcommand{\bm}[1]{\boldsymbol{#1}} \]

最近界隈を賑わわせているこちらの記事

C言語とは?開発できる製品や活かせる職種、学習方法を一挙紹介 | 【テックストックMAGAZINE】エンジニア向けスキル・キャリア情報

によると、

C言語は処理速度が高速であり、大量のデータ処理にも適しています。

一般的に、コンピューターがなんらかの動作を指示する際は、コンピューターが理解できる言葉へと変換する「コンパイル」という作業を行う必要があります。 しかし、C言語は元々コンピューターが理解できる形式の言語となっているため、他のプログラミング言語のようにコードを記述した後にコンパイルを行う必要がなく、処理速度が高速です。コンパイルにかかる時間を短縮できることで、プロジェクト全体の開発効率を高めやすくなり、工期の短縮にもつながりやすくなります。

とのことでした。

おそらく、この記事は、人里離れた山に籠ってプロセッサ開発をしている山伏が書いた記事だと思われます。 里で手に入れられる断片的な情報を基に、プロセッサを作った結果、我々の常識を外れた独特なプロセッサを作っていると考えられます。 ということで、低レイヤ仙人の貴重なお教えを読み解いてみましょう。

ハードウェア・コンパイラ

まず思いついた方法は、コンパイラをハードウェア的に実装する方法です。

インテルのμOPのように、C言語を内部的に変換する方法です。

「そのまま」実行する

コンパイラ無しに実行ということは、C言語のファイルを先頭から順番に読みながら、逐次実行できるということなのでしょう。

変数

通常、C言語の変数は、コンパイラがメモリ上に割り当てられ、変数はメモリ上のアドレスとして扱われます。

一方、このプロセッサでは、変数名を文字列のまま扱う必要があります。

そのため、アドレスをKeyとしたメモリ(RAM)ではなく、変数名をKeyとしたメモリ(CAM)を使用します。

制御文

C言語のIF文を実行することを考えてみましょう。

if(式){
    文
} ← 対応する括弧を探す

if を読み取り、式を評価し、False の場合、コードを走査し、対応する閉じ括弧まで飛びます。

制御文が現れると、対応する括弧が現れるまでストールします。{} が大きいとかなり時間がかかりそう。

ただ、プログラムの構造が見えるので、分岐予測はしやすそう。