IBM 650

テキサスA&M大学の IBM 650。 右にあるのが IBM 533 パンチカード・リーダ/パンチャー
IBM 650 の前面パネル（1956年製造） 二五進法表示になっている。
IBM 650の前面パネルの裏側
ファイル:IBM 650 EMMA.jpg|280px|thumb|ノルウェーの最初の IBM 650 (1959)。"EMMA" と呼ばれていた。CPU（右）、入出力装置（中央）、パンチカードソータ（左）。（オスロ、ノルウェー科学技術博物館）
650で使われていたタイプの真空管回路モジュール
ファイル:BronxScienceProgrammingClassroom1960.jpg|thumb|Bronx High School of Science での1960年の教室。IBM 650 の命令コード表が黒板の右上にある。
IBM 650（アイビーエムろくごーまる）はIBMの最初のコンピュータのひとつであり、世界初の大量生産されたコンピュータである。1953年に発表され、1954年の初出荷から生産終了の1962年までに2000システム以上が製造された。保守サポートは1969年に終了。

**概要**
650は主に科学技術計算用とされ、IBMのパンチカード機器（タビュレーティングマシンの進化した IBM 604 などの機械）のユーザーに対してまともなコンピュータへのアップグレードパスを提供する目的で設計された。同時期に科学技術計算用のIBM 701と、磁気テープ装置を基本としたビジネス用のIBM 702がリリースされたが、650が最も多く製造された。1958年までに800台が販売されたが、これは当時世界で販売されたコンピュータ全体の半分以上を占める台数である。トーマス・J・ワトソン・ジュニアはこれを「コンピュータ界のT型フォード」と称した。
2アドレス命令形式で、データもアドレスも二五進法の二進化十進表現である。メモリは磁気ドラムメモリである。比較的安価でプログラミングも単純であるため、潜水艦乗組員の能力のモデリングから高校でのプログラミング教育まで、様々な用途がここから生まれた。

**ハードウェア**
基本の650システムは以下の3つの機器筐体から構成される。- コンソールユニット (IBM 650)- 電源ユニット (IBM 655)- カード読取装置/パンチ装置 (IBM 533, 537)
オプション装備として以下のものがある。- ディスク装置 (IBM 355) - ディスク装置を備えたシステムを IBM RAMAC 650 Data Processing System と呼んだ。- カード読取装置 (IBM 543)- カードパンチ装置 (IBM 544)- 制御装置 (IBM 652) - 磁気テープコントローラ- 補助装置 (IBM 653) - 磁気コアメモリ、インデックスレジスタ、浮動小数点演算機構- 補助英字装置 (IBM 654)- 磁気テープ装置 (IBM 727)- 問合せ端末(IBM 838)- Tape To Card Punch IBM 46 Model 3、Tape To Card Punch IBM 47 Model 3 - 磁気テープからパンチカードへの変換を行う装置- 会計機 IBM 407
磁気ドラムメモリには2000個の符号付十桁のワードが格納できる（文字ならば、1ワードに5文字格納）。アドレス範囲は 0000 から 1999 で、今日の単位で言えば約8.5kBである。1959年に登場した Model 4 では磁気ドラムの容量が倍増して4,000ワードとなった。この装置は必要なデータが格納されている部分が回転によってヘッドのところに来るまで読み書きできないため、非常に低速だった（回転数は12,500rpmで、最適化した平均アクセス時間は2.5ミリ秒）。このため、各命令ワード内の二つ目のアドレスは次に実行すべき命令のアドレスを格納するようになっていた。プログラムを最適化するには、前の命令の実行時間から次の命令語を置くべきドラム上の位置を計算してアドレスを求める必要があった。"table lookup" という特殊な命令が用意されている。これは磁気ドラムの1トラック（50ワードが格納されている）の先頭ワードを比較のための値とし、その後に昇順に整列したデータが並んでいるものとして、ドラムが1回転する間に比較を行い、最初に等しいかまたは大きい値が出現したときのワードのアドレスをアキュムレータにセットする。これを使うと、1963年の1000倍高速なコンピュータの約3分の1程度の速度でテーブル比較が可能である（IBM 7040 で同じことを行うと1.5ミリ秒かかり、IBM 650 で table lookup 命令で同じことをすると5ミリ秒かかる）。高水準言語を使うと、（テーブル参照に限ると）IBM 7040 の方がずっと遅くなる。
オプションの補助装置（IBM 653）は1955年5月3日にリリースされたもので、以下の3つの機能を持っていた。- 60ワード分の容量の磁気コアメモリ。アドレスは 9000 から 9059。小さな高速記憶装置（アクセス時間は96μ秒で、ドラムの26倍の速さ）で、テープおよびディスクの入出力バッファとして必要とされた。- 3個の4桁サイズのインデックスレジスタ。アドレスは 8005 から 8007。ドラムメモリやコアメモリを追加したとき、それらの拡張された空間にアクセスする手段として使われた。
*浮動小数点演算装置。8桁の仮数部と2桁の指数部の二五進法で浮動小数点数を表す。これで表せる範囲は ±0.10000000E-50 から ±0.99999999E+49 までである。
IBM 533 パンチカードリーダ/パンチ装置は、26桁の英数字を読み取ることしかできない。拡張は可能だが、最大でも50桁を超えられない。そのため1枚から最大でも10ワードまでしか読み取れない（1ワードは5文字）。
1960年に発表された IBM 7070 は「トランジスタ化した IBM 650」としてアップグレードパスを提供するよう設計されている。1959年に登場した IBM 1620 は科学技術計算分野のローエンド用である。どちらも十進方式だが、命令セットの互換性はない。

**命令セット**
IBM 650 の命令は、2桁の命令コード、4桁のデータアドレス、4桁の次命令アドレスで構成される。符号は無視される。アキュムレータは20桁で、上半分の10桁と下半分の10桁ずつ別に扱われることが多い。符号は全体で1つである。磁気ドラムからデータを読み込むとディストリビュータという一種のレジスタに格納される。実行中命令はプログラムレジスタに保持される。算術演算は1桁相当の加算器を使って行う。浮動小数点演算機構や磁気コアメモリ、インデックスレジスタ、入出力装置を追加すると、命令も追加される。基本モデルには42種類の命令がある。あらゆるオプションを追加すると、全部で97命令となる。

**ソフトウェア**
ソフトウェアとしては、以下のものがあった。- BLIS (Bell Laboratories Interpretive System) - 言語処理系。数のみの3アドレス方式- IPL - 初期のリスト処理言語。IPL-V というバージョンが最も有名。- SPACE (Simplified Programming Anyone Can Enjoy) - ビジネス指向の2ステップコンパイラ（下記の SOAP を経由する）- IT (Internal Translator)- SOAP (Symbolic Optimal Assembly Program) - 機械語に一対一対応する言語- FOR TRANSIT - FORTRANの一種。ソースをIT（上記）に変換し、ITからSOAP（上記）に変換し、最終的にオブジェクトコードにする。- FORTRAN- GATE - 変数名が1文字という単純なコンパイラ- RUNCIBLE (Revised Unified New Compiler IT Basic Language Extended)- TASS (Technical Assembly System) - マクロアセンブラ

**日本での設置**
IBM 650は日本でも、神戸市甲南大学（1961年）などに設置された。

**注釈**

**出典**

**参考文献**
 format=PDF- format=PDF-  year = 1958-  doi = 10.1109/MAHC.1986.10010 - ドナルド・クヌースは The Art of Computer Programming の献辞に IBM 650 を挙げている。-  IBM Archives: Workhorse of Modern Industry: The IBM 650

**外部リンク**
  url = http://ed-thelen.org/comp-hist/BRL61.html#TOC - 40ページに渡り、IBM 650 の顧客、用途、仕様、コストなどの調査結果が記載されている。-  The IBM 650 at Columbia University-  An IBM 650 Simulator written in Python-  An IBM 650 Simulator-  History Galore at IBM Museum.-  IBM 650 documents at Bitsavers.org (PDFファイル群)-  IBM 650 assembler and byte code interpreters