アキュムレータ (コンピュータ)

コンピュータにおけるアキュムレータ（Accumulator）は、総和を得るといったような計算に使うレジスタや変数のことである。特にCPUのアーキテクチャに関連してアキュムレータと言うと、演算装置の演算結果を必ず入れる特別なレジスタのこと。現代でもMCU（マイクロコントローラ）の一部はアキュムレータを採用している。

**概説**
CPUのアキュムレータ
アキュムレータと演算装置（ALU）の関係図。この図ではハンガリー語でAkkumulátorと書かれているが、英語ならAccumulator。
ジャーゴンファイルのaccumulatorの項の冒頭には "Archaic term for a register." とある。　この説明はつまり、「アキュムレータ」というのは、現在流に解釈すれば、レジスタの一種を古風な呼び方で呼んでいるもの、ということを言っている。（ただしこの説明では不十分であり、たしかにレジスタの一種ではあるが、実際には特別な位置づけのレジスタであり、演算装置との関係が特別なレジスタである。それを続いて説明する。）アキュムレータというレジスタは、演算装置（ALU）で行われた演算の結果の値が必ず送り込まれるレジスタであり、次の演算の際には、その値が、2つのオペランド（被演算子）の片方として扱われ、再び演算装置に送り込まれる、というものである。1970年代や1980年代のCPUでは、CPUに搭載できるトランジスタの数がかなり限られていたので、構造を簡素にしてトランジスタの数を減らすために、アキュムレータ方式というアーキテクチャが採用された。CPU内部では数の総和を求める作業は頻繁に行われているが、オペランドを次々と与えてゆき加算を繰り返してゆくと、このレジスタに総和の値（累積値）が入るわけで、この使用法がこのレジスタの典型的な使い方なのでアキュムレータ（累積装置）と呼ばれた。
例えばIntel 8080のAレジスタはアキュムレータである。Z80も同様にアキュムレータを採用しており「アキュムレータマシン」と呼ばれている。MOS 6502もアキュムレータを採用している。

**アキュムレータとアセンブリ言語**
アキュムレータを使うCPUのアセンブリ言語では通常、例えば次のような命令でアキュムレータを使う。
ADD memaddress
この命令は、memaddress のメモリ位置にある内容を読み出し、それをアキュムレータ上の値と加算し、結果をアキュムレータに格納する。命令上はアキュムレータは全く指定されていないが、この命令は暗黙のうちに必ずアキュムレータを使用する。なお、このようにアキュムレータをオペランドとして明示的に指定することなく使うマシンをアキュムレータマシンと呼ぶ。
なお複数のレジスタも持っているがアキュムレータとして特別扱いされるレジスタも持っている場合、ニーモニックにアキュムレータの存在があらわれるものもある。たとえば、1960年代にドナルド・クヌースが自著で提唱した仮想マシンのMIX では、アキュムレータへのロードを行う命令（LDA）やアキュムレータから他へのストアを行う命令（STA）がある。

**現代のアキュムレータ**
現代のマイクロコントローラの一部でも、アキュムレータを採用している。たとえば2011年にルネサスから発売されたRL78は、（2021年までの）累計で50億個販売されたが、このRL78はアキュムレータマシンである。
またマイクロコントローラには、アキュムレータとハーバード・アーキテクチャ（命令用メモリとデータ用メモリを別に置くアーキテクチャ）を組み合わせることで、簡素で低コストながら高性能なものがある。たとえばSTマイクロエレクトロニクスのSTM8ファミリである。
現代のx86プロセッサにもアキュムレータマシン風のところがある。AXレジスタ（8ビットプロセッサ時代のAレジスタに由来する。32ビットではEAX）がアキュムレータ的に扱われており、初期の命令セットでは一部の命令（代表的なものはMULとDIV）のソースの一方およびデスティネーションが暗黙でAXとDXに固定されている、AXを対象とする命令には短縮形がある、などのように、AXレジスタにアキュムレータとしての特別扱いがあった。後に拡張されるに従い、アセンブリ言語レベルでは任意の命令に任意のオペランドが指定できるようになりこの特徴は見えなくなった。しかし、機械語レベルでは後方互換性を保っているのでこの特徴は残っている。また、AXレジスタは関数の返り値を格納するレジスタとして使われるなど「よく使われるレジスタ」であり、そういった意味でこの語が使われることもある。

**歴史**
アキュムレータという名称は、accumulate（累算する）に由来する。
機械式計算機 WSR-16のアキュムレータ（手前のホイールの右側の16桁の部分）
1940年代のコンピュータについての資料である、フォン・ノイマンとGoldstineによる文献に次のようにある。
「我々の算術器官の第一の部品は…並列記憶器官であり、数を受け取ってそれを既に格納している数に加算する。また、その内容をクリアすることもでき、内容を他に格納することもできる。我々はこのような器官をアキュムレータと呼ぶ。これは計算機械としては昔からある原理であり、机上乗算器やIBMのカウンタやリレー計算機efn|リレー（継電器）を素子とするコンピュータ。やENIACなどで採用されている」
（現代風に解釈すれば）実行可能な命令は次のような操作をおこなう。- アキュムレータをクリアし、メモリ位置 x にある数を加算する。- アキュムレータをクリアし、メモリ位置 x にある数を減算する。- メモリ位置 x にある数をアキュムレータの内容と加算する。- メモリ位置 x にある数をアキュムレータの内容から減算する。- アキュムレータをクリアし、別のレジスタの内容をアキュムレータにシフトさせる。
さらにEDSACの場合、乗算用レジスタと、あるメモリの内容の積を、アキュムレータ（Aレジスタ）に足し込む、という積和演算として乗算機能が実装されており、ベクトルの内積などの計算に便利なよう設計されていた（なお、EDSACは「アキュムレータをクリアし、……。」というような命令を持たない、という、現代の機械語プログラマから見ると変な制限がある。足すか引くことはできるが、「アキュムレータに転送する」に相当する操作は1命令ではできない。アキュムレータをゼロクリアするには「アキュムレータからメモリ位置 x に転送し、アキュムレータをクリアする。」という命令を使わなければならない。しかる後にアキュムレータに足すことで、アキュムレータに転送する、に相当する操作となる。「後払い方式」（「払う」は、payの意味ではなくクリアするという意味）などとも呼ばれた）。
真空管コンピュータでは真空管を節約するためアキュムレータ方式を採用した。たとえば1956年に完成した日本のFUJICもアキュムレータ方式を採用し、3オペランド型の命令だった。
（命令セットアーキテクチャにもよるが）アキュムレータのような演算結果を必ず格納する役割のレジスタがないと、多くの場合、演算（加算、乗算、シフトなど）の結果を一々主記憶装置に書き込むことになり、たいていは次の命令でそれを読み出す必要が生じ、レジスタに比べて主記憶装置の動作速度は桁違いに遅いので、計算機全体として処理速度も低下した。なお性能上のペナルティを軽減するため、RISCの設計で言うバイパスに似た効率化を図った例もある。

**脚注**

**参考文献**
Goldstine, Herman H., and von Neumann, John, "Planning and Coding of the Problems for an Electronic Computing Instrument", Rep. 1947, Institute of Advanced Study, Princeton. Reprinted on pp. 92-119 in Bell, C. Gordon and Newell, Allen (1971), Computer Structures: Readings and Examples, McGraw-Hill Book Company, New York. ISBN 0070043574}.