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

アキュムレータ（）は、コンピュータにおいて、演算装置による演算結果を累積する、すなわち総和を得るといったような計算に使うレジスタや変数のことである。特にプロセッサにあるそのようにして使える唯一のレジスタを指すことがあるがその意味では、ジャーゴンファイルのaccumulatorの項の冒頭に "Archaic term for a register." とあるように、基本的には古語である。
しかし、現代のプロセッサでもx86プロセッサにはアキュムレータマシン（後述）風のところがある。AXレジスタ（8ビットプロセッサ時代のAレジスタに由来する。32ビットではEAX）がアキュムレータ的に扱われており、初期の命令セットでは一部の命令（代表的なものはMULとDIV）のソースの一方およびデスティネーションが暗黙でAXとDXに固定されている、AXを対象とする命令には短縮形がある、などのように、AXレジスタにアキュムレータとしての特別扱いがあった。後に拡張されるに従い、アセンブリ言語レベルでは任意の命令に任意のオペランドが指定できるようになりこの特徴は見えなくなった。しかし、機械語レベルでは後方互換性を保っているのでこの特徴は残っている。また、AXレジスタは関数の返り値を格納するレジスタとして使われるなど「よく使われるレジスタ」であり、そういった意味でこの語が使われることもある。
歴史.
アキュムレータという名称は、accumulate（累算する）に由来する。
ごく古いコンピュータでは、命令セットでアキュムレータをオペランドとして明示的に指定することなく使っている。このようなマシンをアキュムレータマシンと呼ぶ。例えば、次のような命令である。
 ADD "memaddress"
この命令は、"memaddress" のメモリ位置にある内容を読み出し、それをアキュムレータ上の値と加算し、結果をアキュムレータに格納する。命令上はアキュムレータは全く指定されていないが、この命令は暗黙のうちに必ずアキュムレータを使用する。
1940年代のコンピュータについての資料である、フォン・ノイマンとGoldstineによる文献に次のようにある。
「我々の算術器官の第一の部品は…並列記憶器官であり、数を受け取ってそれを既に格納している数に加算する。また、その内容をクリアすることもでき、内容を他に格納することもできる。我々はこのような器官をアキュムレータと呼ぶ。これは計算機械としては昔からある原理であり、机上乗算器やIBMのカウンタやリレー計算機やENIACなどで採用されている」
（現代風に解釈すれば）実行可能な命令は次のような操作をおこなう。
さらにEDSACの場合、乗算用レジスタと、あるメモリの内容の積を、アキュムレータ（Aレジスタ）に足し込む、という積和演算として乗算機能が実装されており、ベクトルの内積などの計算に便利なよう設計されていた（なお、EDSACは「アキュムレータをクリアし、……。」というような命令を持たない、という、現代の機械語プログラマから見ると変な制限がある。足すか引くことはできるが、「アキュムレータに転送する」に相当する操作は1命令ではできない。アキュムレータをゼロクリアするには「アキュムレータからメモリ位置 x に転送し、アキュムレータをクリアする。」という命令を使わなければならない。しかる後にアキュムレータに足すことで、アキュムレータに転送する、に相当する操作となる。「後払い方式」（「払う」は、payの意味ではなくクリアするという意味）などとも呼ばれた）。
複数のレジスタも持っているが、アキュムレータとして特別扱いされるレジスタも持っている場合、ニーモニックにアキュムレータの存在があらわれるものもある。たとえば、ドナルド・クヌースのMIX では、アキュムレータへのロードを行う命令（LDA）やアキュムレータから他へのストアを行う命令（STA）がある。
アキュムレータのような役割のレジスタがないと、演算（加算、乗算、シフトなど）の結果を一々主記憶装置に書き込む必要があり、おそらく次の命令で即座にそれを読み出す必要が生じる。初期にはレジスタに使うトランジスタ（ないし真空管）を節約するため等の理由でそういった設計のコンピュータもあって、たとえばFUJICはそのような設計で3オペランド型の命令だった（その場合、性能上のペナルティを軽減するため、RISCの設計で言うバイパスに似た効率化を図った例もある）。