一体いつから FPGA はハードウェアだと錯覚していた？


注意:タイトルは煽りです。この記事は筆者の主観が入っており、正確なものではありません。ネタ的な話なので軽く聞き流してください。

# はじめに


この話をするにあたって、まず言葉の定義をしておきます。多分、ここの認識が違っていると、以降の話で混乱します。なお、ここでの定義は記事の後の方で再定義されることがあります。


## ハードウェアとソフトウェア



そもそもハードウェアとソフトウェアって何でしょう？ 

私にとって、ハードウェアとソフトウェアは、「仮に100人にサービスを提供したい場合、100「個」作って個人個人に配る必要があれば、それはハードウェア、1「個」作って個人個人のハードウェアにダウンロードできるのはソフトウェア」です。

例えば、コンピューターシステムの場合、CPU、メモリ、ストレージ等はハードウェアで、そのCPUで動く命令列やデータはソフトウェアです。あるいは、家庭用ゲームの場合、PlayStation4 やファミコンなんかはハードウェアだし、そのうえで動くゲームはソフトウェアです。もっと対象を広げて、家で映画やアニメを見るときに、プレイヤーや液晶モニタはハードウェアで、その上で見ることのできるコンテンツはソフトウェアですが、これは対象を広げすぎかもしれません。




## コンピューター・プログラムと論理回路


物事を分類するにあたって、「ハードウェアvsソフトウェア」による分類のほかに、もうひとつ、「コンピューター・プログラムvs論理回路」の分類があることを挙げておきます。

コンピューター・プログラムは文字通り、コンピューターのプロセッサが実行できる命令列(データを含む)です。

論理回路(英: logic circuit)とは、論理演算を行う電気回路及び電子回路です。コンピューターのプロセッサ自体は論理回路で作られているのでここに含まれます。




## ハードウェア、ソフトウェア、コンピューター・プログラム、論理回路の関係


「ハードウェア vs ソフトウェア」と、「コンピューター・プログラムvs論理回路」の関係は互いに独立しています。これを図で表すと次のような2元表になります。

![Fig.1 ハードウェア、ソフトウェア、コンピューター・プログラム、論理回路の関係](https://qiita-image-store.s3.amazonaws.com/0/24981/65c6f285-d432-e7c0-6dae-d25736ca5246.jpeg "Fig.1 ハードウェア、ソフトウェア、コンピューター・プログラム、論理回路の関係")

Fig.1 ハードウェア、ソフトウェア、コンピューター・プログラム、論理回路の関係

<br />




## FPGA の位置づけ


上記の２元表に、「私なりに」対応するものを割り当てていくと次のようになります。


![Fig.2 FPGAの位置づけ](https://qiita-image-store.s3.amazonaws.com/0/24981/d6e2b340-64fa-56c9-d41d-da397eecde6d.jpeg "Fig.2 FPGAの位置づけ")

Fig.2 FPGAの位置づけ

<br />

この図のように、私の中では FPGA はソフトウェアに分類されています。これが今回の記事で私が主張したいことです。


# 錯覚するまでの経緯



## FPGA登場以前


最初にFPGA として市場に出てきたのは、1985年にXilinx 社がXC2064を製品化した時です。それまでは論理回路はハードウェアでしか作れませんでした。FPGAが広く認知されるまで、ハードウェアとソフトウェアとして明確に分類出来たのが、「ハードウェア＝プロセッサ(他メモリなど）」と、「ソフトウェア＝その上で動作するコンピュータ・プログラム」しかありませんでした。


![Fig.3 FPGA登場以前](https://qiita-image-store.s3.amazonaws.com/0/24981/28e254ef-5c2a-fcce-acfa-98153f154f82.jpeg "Fig.3 FPGA登場以前")

Fig.3 FPGA登場以前

<br />

この時代では、ソフトウェア=コンピューター・プログラムという認識でも問題なかったのです。


## FPGA 登場以降


1985年に FPGA が登場しました。これは従来ハードウェアでしか実装できなかった論理回路がソフトウェアで実装できる画期的な製品だと私は理解しました。

![Fig.4 FPGA登場以降の私の認識](https://qiita-image-store.s3.amazonaws.com/0/24981/809149fb-672e-f8a2-67e5-b01a9f7283ad.jpeg "Fig.4 FPGA登場以降の私の認識")

Fig.4 FPGA登場以降の私の認識

<br />

しかし、どうやら世間一般、特にコンピューター・プログラムに携わる人達（以下、業界人）はそうは思わなかったようです。



ここからは私の妄想です。



業界人「せっかく、コンピューター・プログラムだけでソフトウェア業界として確立してきたのに、今さら論理回路がこっち側（ソフトウェア）に入ってきても困る。」

業界人「コンピューター・プログラムの常識やアルゴリズムが論理回路では通用しないから面倒なことになった。」

業界人「論理回路までソフトウェアになったら、ソフトウェアエンジニアは論理回路まで知らないとダメなのか？」

業界人「せっかくソフトウェアっていうカッコいい名称が手に入ったのに、FPGAなんかに使わせたくない。」

業界人「そうだ、ソフトウェアの定義を変えてしまおう。例えば、ソフトウェアはコンピューター・プログラムに限定してしまって、その対比としてハードウェアがあるみたいな。」



というようなことがあったかなかったか、結局次のようになったみたいです。


![Fig.5 FPGA登場以降の業界人の認識](https://qiita-image-store.s3.amazonaws.com/0/24981/f4556d47-a235-00de-ffa1-4517b3be5e8d.jpeg "Fig.5 FPGA登場以降の業界人の認識")

Fig.5 FPGA登場以降の業界人の認識

<br />



例えば、Wikipedia でソフトウェアを検索すると次のようになっています。



> ソフトウェア（英: software）は、コンピューター分野でハードウェア（物理的な機械）と対比される用語で、何らかの処理を行うコンピュータ・プログラムや、更には関連する文書などを指す。



とあります。この「対比される用語」ってのがまた曲者で、「ソフトウェア＝コンピュータ・プログラム」と「それ以外＝ハードウェア」みたいな印象を与えますね。

また、同ページには



> LSIなどを例にとると、LSIの物理的な回路そのものはハードウェアであり、その回路によって表現される処理手順はソフトウェアと考えられる。   
一般的なソフトウェアは、補助記憶装置の中に機械語として記録されている。なお機械語は中央処理装置（CPU）の製品種別ごとに異なっている。ソフトウェアの利用時には補助記憶装置の内容が主記憶装置に読み込まれた後、中央処理装置において、データの移動、計算、制御フローなどの処理が実行される。これにより機械語は、コンピュータの状態を次々と変化させる。従ってソフトウェアは、ハードウェアの状態を変化させる命令列と考えられる。



ともあります。



ここの「LSIなどを例にとると、LSIの物理的な回路そのものはハードウェアであり、その回路によって表現される処理手順はソフトウェアと考えられる。」ってところだけを見ると FPGA もソフトウェアと考えられなくもないのですが、その後の「一般的なソフトウェアは〜」はコンピューター・プログラムのことを指しています。



かくして FPGA はソフトウェアの座を追われ(?)ハードウェアとして扱われることになったのです（くどいですが私の妄想です）。




# で、何が不都合があるの？


仮に FPGA がソフト(ソフトウェア)でなくハード(ハードウェア)だと認識(錯覚)されたとして、何が不都合があるのでしょうか？　単に名称の違いじゃないのか？   
という疑問が生じますが、実は大有りだと私は考えています。

というのも、FPGA をハード(ハードウェア)として認識していると、ASIC や LSI の劣化版としてしか FPGA を見ることが出来ず、FPGA 本来の実力を引き出せないからです。ここらへんの話は長くなるのでまた別の機会に書きたいと思います。