2015年01月20日の日記です

目次

01-20 高柳健次郎の誕生日(1899)
01-20 SIMON は世界初のPCか?
01-20 【追悼】森公一郎さん (LSI-C の作者)


高柳健次郎の誕生日(1899)  2015-01-20 10:37:51  コンピュータ 歯車 今日は何の日

▲目次へ ⇒この記事のURL

今日はテレビの父、高柳健次郎の誕生日(1899)。


テレビの父、と呼ばれる通り、テレビの基礎技術を完成させた人です。

日本人ですが、この方法が世界中で使われていたのだからたいしたもの。


テレビだけでなく、光と電気の関係する産業を起こしたのも功績です。

カミオカンデ作成には欠かせない、高性能の光電子倍増管を世界で唯一生産できる浜松ホトニクスも、高柳健次郎の教え子が興した会社です。


詳しくは、命日の際に書いています




ところで、アナログテレビ放送の時代、日本は NTSC でしたが、世界的には PAL という規格もありました。

全然違う規格なんで、テレビゲームとか作るときに大変なんだわ。


NTSC は秒60コマ。PALは秒50コマ。

1秒間に送り出せるドット数はほぼ同じで、結果としてPAL の方が解像度が高い。


静止画での美しさを取るか、動画にしたときの滑らかさを取るか、開発者の思惑が違ったのかなー、なんて思ってたのですが、これ、単に家庭用電源の交流周波数を元にしているんだそうです。


アメリカでは 60Hz 、ヨーロッパでは 50Hz。

なるほど、ただそれだけの話か。


NTSC も PAL も、それ以前の「白黒放送」との互換性を保ったままカラー化した方式です。

そして、白黒だった当時、一番簡単・安価に「周波数を作り出す方法」は電源の周波数をそのまま流用することだった、というのも理解できる話です。


#日本では地域によって周波数が違うので、発振回路が別途必要となり、安価な製品は作りにくい。

 国内でしか通用しない独自技術が必要となる、というルーツはこの頃からあったのだな。



▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

コンピュータ

歯車

今日は何の日

関連ページ

森公一郎 命日(2015) レイ・ドルビー誕生日(1933)【日記 16/01/18】

1988年のパソコン事情【日記 16/03/05】

1988年のパソコン事情【日記 16/03/05】

リロケータブル【日記 17/11/27】

別年同日の日記

06年 ウッドデッキ完成

07年 人生初ギャグ?

13年 ピクミン

17年 1996年のそのほかのゲーム


申し訳ありませんが、現在意見投稿をできない状態にしています

SIMON は世界初のPCか?  2015-01-20 12:12:48  コンピュータ 歯車

▲目次へ ⇒この記事のURL

少し前の GIGAZINE に、世界で最初の PC として「サイモン(SIMON)」を掲げる記事が出ていました。

ツイッターでは当日中に異論を唱えたのだけど、ちゃんとまとめておきましょう。


なお、異論を唱えたと言っても、GIGAZINE の記事が誤りだというわけではありません。

これについては後述。



以下、海外でサイモンについて詳しいサイトからの情報です。

技術を紹介したページなので、翻訳ではなくて、読み解いて解説しなおしたもの。


でも、元ページの図などを一緒に見るとわかりやすいです。




サイモンは、ラジオエレクトロニクス1950年10月号の表紙を飾り、それから1年にわたって解説記事が連載された機械です。


リレー回路を使ったデジタル計算機で、紙テープを使ってプログラムを作ることができます。

実用品と言うよりは、将来のコンピューター技術者を育てるための教育用でした。



プログラムには5穴紙テープを使います。

当時はテレタイプ用として普及していました。


#テレタイプについても解説したいけど、ここでは関係ないので割愛。

 まぁ、紙テープは当時の「普及した保存メディア」で、簡単に手に入ったことだけ理解できれば十分です。


5穴紙テープは、紙テープの「幅」方向に、5つの穴を開け、読み取ることができます。

この5穴を「1列」とします。1列が 5bit 、ということですね。


テープの続く限り、何列も穴を空けることができ、長いデータを保存できます。

また、テープ自体は切ったりセロテープで貼ったりして編集できます。

その意味で、長さの制限は特にありません。




計算機自体は、レジスタを 16本持ちます。CPU として見るとなかなか豪勢。

でも…メモリを持たない機械なので、これが「全メモリ」です。


レジスタは基本的に1本が 2bit です。

ただし、2bit のレジスタを2本まとめて 4bit として使えるレジスタ(IR1/IR2)が1本と、4bit のレジスタ(CR4)が1本あります。



テープにプログラムを組む場合は、5穴のうち4つを使い、それを3列で命令を表します。

(各列のつかわない1bitは、内部制御のフラグに使用します)


3列のうち、1つはデータを示します。

テープから読み込まれたデータは、常に 4bit で IR1/IR2 に入ります。


残る2列は、レジスタを表します。

1つは「送り側レジスタ」で、もう一つは「受け側レジスタ」の指定です。

先に書いたようにレジスタは16本なので、穴4つで完全に指定できます。


この「2つの指定レジスタ」間で、データのコピーが行われます。

送り側に IR1/IR2 を指定すれば、いまテープから読み込んだデータを別のレジスタに書き込むことも可能です。


SR1~SR6 は値の一時保存(Storage)用で自由に使えます。

OR1~OR3 は出力(Output)用。

CR1~CR5 は計算(Compute)専用。



OR1~OR3 は、ビットが電球に繋がっています。

計 6bit ありますが、OR3 は1個しか電球がつながっておらず、出力は5bitになります。


電球に繋がっている、ということを除けば普通のレジスタなので、読出しも可能です。





CR4 は 4bit ですので、IR1/IR2 の値を 4bit すべて書き込むことしかできません。

そして、CR4 に書き込みが行われると、CR1~CR3の数値を元に「計算」が行われます。


結果は CR5 に書きだされます。CR5 は読み出し専用で、書き込むことはできません。



CR4 に書き込む計算指示は 4bit ですが、9種類だけ作られていて、残りは未定義です。


以下、C言語風に書くと、命令はこうなっています。


算術演算:

CR1 + CR2

-CR1


キャリー付算術演算:

CR1 + CR2 + CRY

-(CR1 + CRY)


ビット演算:

CR1 & CR2

CR1 | CR2

~CR1


選択:

(CR2 > CR1) ? 1 : 0

(CR3 & 1) ? CR2 : CR1


以上の9個が全命令です。


キャリーは、算術演算・キャリー付算術演算で生じます。

これはレジスタではなく、計算回路に 1bit のフラグとして保持されています。



命令には、選択はあるけど、条件分岐はありません。それどころか、ジャンプ命令が無い。

メインメモリが無くて「紙テープ」にプログラムが書かれているのだから、ある意味当然です。




紙テープに直接書かれているプログラムが、直接「計算」を指示するのではなく、「データ移動」だけ。

計算指示は CR4 にデータを移動することで表現。


今の CPU から見るとちょっと変わったプログラム方法ですが、いまだってデータ転送がプログラムの中心で、計算は時々…だと思えば、それほど変わっているわけでもありません。


2bit の足し算しかできませんが、補数を求められるので引き算にも応用できます。

また、キャリーフラグはあるため、多倍長演算に拡張できます。


もっとも、結果出力が 5bit しかないので、結果が 0~31 に収まる計算しかできません。



紙テープには、各列 1bit づつの余りがあります。

これを使って、「プログラムの終了」を表現することができました。


でも、これはただ単に「終了」なのね。

条件が整ったら終了、とかではない。紙テープの終わりに来ても終了するのだけど、途中で明示的に打ち切れるだけ。


つまり、条件ジャンプも、条件停止もできません。データは制御できるけど、プログラムは制御できないのです。



これが何を意味するかというと、掛け算は作れても割り算は作れない、ということです。

割り算は「何回引けたか」が答えなので、「引けなくなった」という条件によって「停止」する必要がある。


ここら辺が、サイモンのプログラムの限界です。




ちなみに、後にスケッチパッドを作り、CGの世界を切り拓いたサザーランドは、幼少のころに兄と一緒にサイモンを使っていたそうです。


詳細はサザーランドの誕生日に書いたけど、彼はサイモンを改造し、割り算プログラムを作っています。


CR4 に与える命令は、4bit まで可能だけど9種類しかありませんでした。

残り7命令文、拡張の余地があります。


恐らくは、どこかに「条件停止」を追加したのでしょうね。


ジャンプ命令は無いので、「何回引いたか」を調べるために、理論上最大の長さまで命令を繰り返しておく。

(現代風に言えばループ展開です)


そして、割り算の結果が出た時点で条件停止します。

残りの命令は実行されずに終わるのだけど、それでいい。


これが、プログラムの紙テープが 2.4m にも達した理由でしょう。

複雑なプログラムを組んだから長いのではなくて、ループ展開したから長いだけ。




さて、最初に書いたように、僕はこの機械が PC だというのに異論がありますが、ギガジンの記事が誤りだとは思いません。


まず、GIGAZINE の記事は、海外記事を翻訳しただけの受け売りで、GIGAZINE の記者は記事の内容を理解できていません。

だから、GIGAZINE に誤りはない。誤りがあるとすれば元の海外記事。


この記事自体は「PCの定義」から始まっています。

なにを PC と呼ぶかは不明だけど、「定義した内容にしたがって」最初の PC を紹介する、という体裁。


ここでは、誰でも手に入るほど、入手容易で安価なデジタルコンピューターでプログラム可能なもの、とされています。


(GIGAZINE では、コンピューターを「計算機」と訳し、「デジタル計算機である」ことを定義としています。

 しかし、元記事では「コンピューター」と書かれているので、ここではコンピューターとします)



ところで、計算機(カリキュレーター)と、コンピューターは違います。

カリキュレーターは、ただ計算を行うだけの機械。


カリキュレーターの中には、計算手順をプログラム可能なものもあります。

なので、プログラム可能であることはコンピューターの条件ではありません。


元々、コンピューターは計算手…計算を行う「人」を意味した言葉です。

一定の手順…アルゴリズムに従って計算を行えます。


アルゴリズムには、条件の「判断」が多数含まれます。

そうでない場合、プログラムが可能で、その手順がどんなに複雑でも、単一の「計算式」を示しているにすぎません。


カリキュレーターとコンピューターをわけるのはこの部分です。

コンピューターであれば、プログラムの「条件分岐」か、最低でも「条件停止」を持っていることが条件となります。


そして、サイモンはこうした命令を持っていないのです。

(サザーランド兄弟による「改造サイモン」には条件停止がありましたが、改造するには高度な知識が必要です。これはすでに「特殊な訓練を受けていなくても使える」という元記事の要件を満たしません。)




ただ、どこまでがカリキュレーターで、どこまでがコンピューターか、というのも人によって解釈はさまざま。


サイモンは条件分岐や条件判断は持ちませんが、条件によって値を変える命令はあります。


元記事を書いた人たちは、古いコンピューターを保存するのを目的とした人たちですから、ここまでに書いたような議論は全部了解したうえで、あえて「サイモンが最初」と書いたのだと思っています。



当ページでは、リレー式計算機はコンピューターには含めていません。

電気では動きますが、物理的動作があるために遅く、いわゆる「電子計算機」としての要件を満たさないためです。


サイモンはリレー式なので、僕としては最初とは考えません。

部品が違うだけで原理的には同じなので、含めるという考えがあったって一向に構わないのですけどね。



GIGAZINEの記事中では、PDP-8 は「高かったから選外」となっているのですが、実際には PDP-8 は安価だったが故の大ベストセラーマシンで、長年売られていたために技術の進歩に合わせてどんどん値下げされました。


当初の値段は $18,500 で確かに高価なのですが(質素な家が買える値段、だったようです)、後には 1/10 程度まで下がりました。

特に「複数台買うと値引き」もあったので、会社のと併せて2台買ってしまおう(BUY TWO, TAKE ONE HOME)、なんてキャンペーンもあったようです。



そんなこともあって、最初の「個人でもなんとか所有できるコンピューター」としては PDP-8 はギリギリの線かな、と思っています。


#もちろん、本当に「気軽に」買えるのは、値段的にもサイズ的にも Altair8800 だと思います。


実際、PDP-8 ではゲームとか音楽演奏とか、仕事ではない、個人のためのフリーソフトが沢山作られました。

後のパソコン文化を先取りしていた、と言ってもいいでしょう。



あと、個人で遊べるコンピューターとしては TX-0 推し。1台しかないプロトタイプなので、所有は無理でしたが。

(GIGAZINE の記事にも出てきませんし)


テレビゲームも多数作られています。面白くもない計算用途ではなく、面白いからコンピューターを使う、というのは「個人のための」の重要要件だと思います。


ちなみに、サザーランドはサイモンで基礎を学びましたが、TX-0 でコンピューターの可能性に目覚め、後継の TX-2 でスケッチパッドを作っています。

当時はまだコンピューターが高価な時代。お絵かきのために「個人で占有する」なんていうアイディアは、当時としては驚きを持って迎え入れられました。


スケッチパッドのアイディアを元に SmallTalk が着想され、Alto が作られます。

Alto は、GIGAZINE の記事にも出ているね。


そして、Alto が Macintosh や Windows を生み出したわけで、PC のルーツをたどると TX-0 に行きつく、と思っています。



TX-0 は「個人でコンピューターを使う」というハッカー文化を生んだ機械でもあり、「誰かが作ったプログラムのソースを入手して改造できるのが当然」なんていう、オープンソースの概念はここから生まれています。


GNU の創始者である RMS も TX-0 の作った文化を知る最後の世代です。



▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

コンピュータ

歯車

関連ページ

森公一郎 命日(2015) レイ・ドルビー誕生日(1933)【日記 16/01/18】

1988年のパソコン事情【日記 16/03/05】

1988年のパソコン事情【日記 16/03/05】

リロケータブル【日記 17/11/27】

別年同日の日記

06年 ウッドデッキ完成

07年 人生初ギャグ?

13年 ピクミン

17年 1996年のそのほかのゲーム


申し訳ありませんが、現在意見投稿をできない状態にしています

【追悼】森公一郎さん (LSI-C の作者)  2015-01-20 17:46:26  コンピュータ 今日は何の日

▲目次へ ⇒この記事のURL

LSI-C の作者の方が一昨日亡くなった、という訃報を Twitter で読んだ


LSI-C ならずいぶんお世話になった、と詳細を読むと、LSI-C 80 の開発者だという。森公一郎さん。


アルバイトで一緒に開発を行った、という近藤嘉雪さんが訃報を伝えていた。


僕がお世話になったのは LSI-C 86 。80 は存在すら知らなかった。

しかし、86 は 80 の後に開発されたらしい。多分改良品なのだと思う。


というわけで、きっと僕もお世話になった方なのだ、と勝手に推察して思い出話など書く。




近藤さんによれば、LSI-C 80 は、参考にするものが無い状態で開発されたらしい。


もちろん、C言語を作るのだから、C言語の仕様書(K&Rかもしれない)などはあったのだろう。

C言語を使って、動作を確認することも出来たかもしれない。


でも、gcc など、今では手に入る「C言語処理系のソース」は入手できない状況での開発。


yacc とかは使えたのかな。

これが使えるとコンパイラを作るのはずいぶん楽になる。


もっとも、yacc は UNIX のツールで、メモリはふんだんにあるのを前提としている。

そもそもが、C言語自体が広いメモリと多数のレジスタを前提としている。


8080 で動作するように、CP/M で、64K のメモリで動作するように作った、というのだからすごいと思う。




現在でも、LSI-C 80 は製品として販売されているようだ。


もちろん、CP/M 用ではない。Windows などの現代の OS 上で動作し、8080 などのコードを生成する。

現在は Ver.3 だが、Ver.2 の時点で MS-DOS 用のクロスコンパイラだったようだ。


パソコンが 16bit の時代になっても、組込み用に 8080 や Z80 は使われていた。

クロスコンパイラに需要があるのだろう。



セルフコンパイルからクロスコンパイルに移行できた、ということは、コンパイラ自体もC言語で書いていたのだろう。


8080 上でC言語をC言語で書き、セルフコンパイルする。

…いや、それは難しいか。絶対無理とは言わないけど、開発効率が悪そうだ。


16bit マシン上で、8080 のコードを生成するコンパイラを作成し、16bit 環境からクロスコンパイルできるようにして、最後にコンパイラ自体を 8080 用にコンパイルしたのかもしれない。


そして、ver.2 の時に、同じソースを 8086 用のコンパイラにかけて(LSI-C 86 だろうか)、クロスコンパイル環境とする。

そうなると、森さんが作ったソースがまだ使われているのかもしれない。



#翌日追記:CP/M 上の BDS-C で開発されていたそうです。BDS-C は、1970年代からある 8080 用のC言語実装。

 詳細は最後に。




ネットで調べると使ったことのある方の話なども結構出てきて、「LSI-C 80 の生成するコード品質は異常」(に良い)だそうだ。

C言語と言う言語構造があまり 8080 向けではないのだが、それで品質の高いコードを生成するのだというからすごい。


先に書いたように、C言語で書いているのだとしたら、8080 上で動作するC言語を生成している、という時点でその品質は折り紙付きだ。


そして、ソースがCであれば、生成するコードの部分を作り変えたのが LSI-C 86 だったのではないかなぁ、と思う。




やっと LSI-C 86 の思い出話に入れた(笑)


当時はC言語は高価だった。安いものでも数万円から、信頼のある処理系なら10万円していた。

でも、LSI-C 86 は、「試食版」という名前のサブセットを、なんと無料で配布していた。


サブセットとはいっても、言語機能に特に問題はない。

テキストデータだけどマニュアルもちゃんとついてくる。


当時の MS-DOS は、8086 のメモリ管理にべったりだったので、メモリが 64K ごとに断片化していた。

C言語は本来「連続した大きなメモリ空間」を想定して作られているので、MS-DOS のCコンパイラでは「メモリモデル」という、複雑怪奇な仕組みを取り入れざるを得なかった。


コードとデータをあわせて 64K に収まるなら「タイニーモデル」。

コードとデータ、それぞれで 64K 以内、全体で 128K 以内なら「スモールモデル」。

コードは 64K 以内だけど、データが 64K 以上になるなら「ミディアムモデル」。

コードは 64K 以上だけど、データが 64K 以内になるなら「コンパクトモデル」。

コードもデータも 64K 以上なら、「ラージモデル」。

コードまたはデータが 64K 以上で、ポインタ比較などを使用する必要があるなら「ヒュージモデル」。


タイニーモデルで生成されるのが .COM ファイルで、これ以外は .EXE ファイルになる。




ヒュージの説明が必要だ。ラージとどう違うのか。


8086 では、64K 以上のアドレスが必要な場合は、2つのレジスタを足してアドレスを表現する。


もっと厳密に言えば、2つの16bit レジスタのうち、一つ(ベースと呼ぶ)は 4bit シフトしてから、もう一つ(オフセットと呼ぶ)はそのまま足す。

すると、20bit の結果が得られる。1Mバイトのアドレス空間だ。


一方、ポインタを比較しようとすると、基本的に「オフセット」をそのまま比較しようとする。

64K 以内なら、ベースは同じで、オフセットが違うだけ、のはずだからだ。



ところが、64K を超えると話がおかしくなってくる。

64K を超えたアクセスでは、ベースも頻繁に変わることになる。ポインタのインクリメント/デクリメントでいちいちベースを変えるのは面倒なので、普段はオフセットしか変えない。

しかし、いざベースを変えるときには、その時によって都合のよいベース値に変更される…


ここで、ポインタ比較が破綻することになる。



そこで、ヒュージモデルでは、ポインタを正規化する。

ベースを 16bit フルに使い、オフセットは必ず 0~15 、つまり下位 4bit しか使わないことにする。


インクリメント/デクリメントするたびに 4bit 境界のチェックが必要となり、速度は低下する。

しかし、これでアドレス比較は正しく行われるようになる。


これがヒュージモデルだ。

そもそも、MS-DOS でそんなに巨大なプログラムを作る必要がある時点で間違っている。

しかし、間違っていても必要な時はあるのだ。そんな時に、速度低下を覚悟で使うメモリモデルだ。



…さて、話を戻すと、LSI-C 86 も当然こうしたメモリモデルに対応していた。


でも、「試食版」では、スモールモデルしか使えなかった。

そして、もし生成物を配布するのであれば、対価を受け取らないこと、また LSI-C 86 試食版を使用したことを明記することが条件だった。




もっとも、普通のプログラムならスモールモデルで十分。

だって、コードとデータ併せて 128K って、その時点で 8bit 機の全メモリより大きなもの作れちゃうんだから。


当時は今のようにネット時代でもないし、多くの人は「自分のために」プログラムしているだけ。

そう考えれば、配布条件もたいした問題ではない。


だから、かなり多くの人が LSI-C 試食版のお世話になっていたはず。僕もその一人です。

と言っても、僕は X68k の人だったから、あまり MS-DOS は使ってない。


大学時代は電算機室に PC-98 がたくさん置いてあって、ある程度学生が自由に使えました。


#条件があって、講師の先生かティーチングアシスタントの大学院生、もしくは「マイコンクラブ」のメンバーが部屋にいないといけなかった。

 彼らなら、何かトラブルがあった時にすぐに対処できるから。

 でも、僕はそのマイコンクラブのメンバーだったから、自由に使えた。


学生が使うマシンにはハードディスクは付いてなくて、フロッピーディスク運用だったのだけど、当時は言語だってフロッピー1枚に収まることが多かった。

FORTRAN とか Pascal とか。


…でも、C言語ってライブラリが大きいから、フロッピーでの運用はちょっと辛い。

ところが、LSI-C 試食版はスモールモデルに絞ってあるから、フロッピー1枚に入るのね。


Comet の 98 移植版作ろうと思ってしばらく奮闘していたのだけど、学校で使っている時間だけだと思うように進まず、モチベーションが続かなくなってやめました (^^;


あと、Handy 98 と、HP200LX でも使っていた気がするな。

携帯機でコンパイル…というのが、実際には無駄なので、使えることに満足しただけだったように思うけど。



Windows の時代になってから、Java のプログラムをしていて「プリプロセッサが欲しい」と思って、LSI-C 試食版のプリプロセッサだけ使おうとしたこともありました。

まぁ、これは Windows のロングファイルネームに対応してなかったんで使えなかったのだけど、こういう時にすぐ思い出す程度には心に沁みついていた。




LSI-C の思い出はこの程度で、「今日は何の日」で、コンピューター関連のいろんな人の誕生日・命日などを書いている僕としては、訃報が伝えられた森公一郎さんの詳細が気になる。


名前で調べたらすぐにWEBページが見つかった。いつまで残されているかは不明だけど。


そこには、プロフィールとして次のように書かれていました。


年齢: 四つの'3'の日に生まれ、三つの'3'の日に33歳になった。牡羊座。


ディオファントスの墓碑のようです。


えーと、牡羊座は3月21日から4月20日。

3が多いのですから、3月30日か31日、または 23日が誕生日なのでしょう。


生年月日ですが、生まれ年に後二つの「3」が必要です。

1933年だとしたら、33年後は 1966 年。3がありません。


ここは、「昭和」33年でしょうね。1958年。

すると、33年後は 1991年。平成3年です。


恐らく、1958年3月23、30、または 31日生まれ。

56歳で亡くなられたのは、まだお若いです。


しかし、WEB ページを見ると人工透析を受けていることも書かれているので、恐らく腎臓の病で闘病しておられたのでしょう。


プログラマとしての偉大な先人の御冥福をお祈りします。




以降は翌日追記


LSI-Cに思い出のある方は多かったようで、想像以上に多くの方からの反響がありました。

上の記事はすでに修正していますが、当初「C言語は広いメモリと多数の32bitレジスタを前提とし…」と書いていましたが、これは勘違いです。


それ、gcc の最適化の前提条件だ。個別の実装系の話で、C言語全体の話ではありませんでした。


ちなみに、最初にC言語が作られた PDP-7 は 18bit マシン。PDP-11 は 16bit マシンです。

そのため、C言語自体は当初から特定のレジスタ幅を前提にはしていませんでした。


#とはいえ、PDP-11 のようなアーキテクチャを念頭に設計していた節はあります。


#18bit が中途半端に思える人は、TX-0の話読んでね。

 TX-0 を元に PDP-1 が作られ、その後継機が PDP-4 、PDP-7 です。PDP-11 は全く別の機械。

 PDP は開発順に番号が付いているので、系統がわかりにくいです。




日記に、BDS-C を使って CP/M 上で LSI-C を作ったとある、と指摘がありました。

はてなで日記を付けている、と氏のページにあったのですが、見に行った時点で非公開になっていました。


いま情報の裏を取ろうと InternetArchive を少し探しましたがどこにあるかわからず。

しかし、おそらくC言語で作ったのだろうなぁ、と思っていたのが裏付けられたので情報信じます(笑)


C言語使わずに 8080のアセンブラでいきなり書いていた、とかだと、LSI-C 86 とも、現在の LSI-C 80 とも無関係になってしまうから。

自分の思い出(LSI-C 86)につなげたかったのもありますし、氏が亡くなってもソースは受け継がれている、と思いたかったのもありました。




当初、当時のC言語は10万円位するのが普通だった、と書いていました。

TurboC や QuickC はもっと安かったよ、という指摘がありました。

うん、そうだったかも。


実は TurboC の DOS 版は購入して今でも持っています。社会人になって、Windows の時代になってから、安売りされていたのを買ったのだけどね。

安売りとはいえ、元が10万円していたら、当時の僕が手を出せないくらいの値段だったでしょう。


それでも、LSI-C 試食版が無料、というのは驚きでした。

当時の趣味プログラマーに大きな影響を与えたと思います。




「LSI-C 80 のコード品質が異常に良い」というのは言い過ぎではないか、という指摘がありました。

これはね、本文中にもあるように、実際のところは LSI-C 80 は使ったことないからわからないのよ (^^;

ただ、そう評価している人が居たからそのまま書いただけで。


各種評価ある中で、自分が思い入れがあるから「一番良い評価」を選んだのはあります。


ネットで見つかるいろんな人の話を読むと、レジスタの使い方が上手かったようです。

普通は変数はメモリに割り当てるわけですが、8080 はメモリアクセスが遅い。


そこで、一部の変数をレジスタに直接割り振るわけです。

まぁ、ここら辺のことは他のC言語でもやっていること。


興味深いのは、8080 ではレジスタごとに「使える命令」が違っていて、変数を単純にレジスタに割り振るだけでは無理が出てしまうのに、どうやっていたのかな、というところですね。

ここら辺、僕は使っていないので知らない。


そして、こちらも寄せられた情報ですが、LSI-C 80 では関数の呼び出し時に、引数をレジスタ渡しするそうです。


C言語の関数を呼び出す際は、一般的には引数をスタックに積んでから呼び出します。

でも、8080 では先に書いたようにメモリが遅いし、そもそもスタックが 16bit 単位でしかアクセスできない、という制約があります。


そのための工夫なのでしょう。

多分「品質が異常に良い」と評価していた人も、ここら辺の工夫を褒めていたのではないかな、と思います。



#引数をスタックに積んで…で、またツッコミが入りそうなので牽制。

 SPARC のことはもちろん知っていますし、printf("%d %d",a++,a++) の結果が処理系依存なのも承知。




MSX にも MSX-C というものがあったのですが、実は LSI-C 80 の OEM 版なのだそうです。


情報を頂いて裏を取ったら、詳細を書いているページを見つけました。


MSX-C のバイナリをダンプすると、LSI JAPAN のコピーライト表示が埋め込まれているとか。


MSX の CPU は Z80 だと決められているにも関わらず、8080 でも実行できるコードを生成するのだとか。

MSX 用に Z80 や R800 のコードを生成するようにする、後付けの「オプティマイザ」も有志の手で開発されていたようです。




▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

コンピュータ

今日は何の日

関連ページ

森公一郎 命日(2015) レイ・ドルビー誕生日(1933)【日記 16/01/18】

1988年のパソコン事情【日記 16/03/05】

1988年のパソコン事情【日記 16/03/05】

リロケータブル【日記 17/11/27】

別年同日の日記

06年 ウッドデッキ完成

07年 人生初ギャグ?

13年 ピクミン

17年 1996年のそのほかのゲーム


申し訳ありませんが、現在意見投稿をできない状態にしています

【BDS-C使い】 LSI C-80(CP/M)のOEM変化形のMSX-Cになりますが、BDS CやHI-TEC C(CP/M)でコンパイルしたものよりMSX-Cでコンパイルしたもののほうがサイズが小さくなるので最適化がすごいのは事実だと思いますよ。計測まではしてませんが多分速度も速いでしょう。ただし、8ビットOSでコンパイルする場合はMSX-C(多分本家のLSI C-80も)ではメモリが足らずにコンパイルエラーになることが多いし、8ビットマシン実機ではコンパイル速度がものすごく遅かったです。BDS Cのほうが実用的と個人的に感じました。ただし、LSI C-80のMS-DOS版ではそれらの欠点は感じませんでした。おそらく今のWindows版のLSI CはZ80開発には最強レベルでしょうね。ただしZ80が衰退した現在となるとLSI CのWindows版は有料なのでお金を出して買う人は少ないでしょう。BDS C(CP/M)、HI-TECH C(CP/M)は無料でエミュレーターでWindowsでも動き、他にも無料のz88dk(Windows等)、SDCC(Windows等)がありますし。 (2017-04-01 19:16:32)

【ななし】 JavaScriptのyaccを探していたらkmyaccが対応していると見つけて、二十数年ぶりにお名前を見て、でもウェブの更新がとまっているので心配していました。商用C言語コンパイラ実装者の末席のひとりとして、先達の業績には尊敬の念しかありません。ご冥福をお祈りいたします。 (2015-02-07 15:48:43)

【名無し】 MSX C ver 1.1 のパーサとコードジェネレータには"Copyright (C) 1985 by LSI JAPAN Co., Ltd."の文字列が埋め込まれてます。 (2015-01-24 13:14:13)

【中の人】 LSI-C86はLSI-C80を使って bootstrap していました、LSI-C80は最初はBDS-Cでbootstrapしていましたがある程度動き始めたら自身でコンパイルして最後は gcc と同様に自身で生成と言う開発を行っていました。 (2015-01-23 19:59:10)

【名無し】 >MSX-C のバイナリをダンプすると、LSI JAPAN のコピーライト表示が埋め込まれているとか。 手元のMSX-C ver 1.20pのパーサ(CF.COM)とコードジェネレータ(CG.COM)を確認してみましたがアスキーの版権表示があるのみでそのようなものは見当たりませんでした。バージョンに拠るのかもしれませんが…。 (2015-01-23 04:07:06)

【G-SHOES】 思い出深いのは,引数の引き渡しを可能な限りレジスタで行おうとしたコンパイラだったので,出来るだけ引数を少なく,短いビット長で行うように関数仕様を検討していました。16nitの引数を3つも4つも引数にすると間違いなくスタック経由になり,速度が撃オチです。そこで関数を分ける,逆に統合するなどの工夫をやっていたことを思い出します。森さんのご冥福をお祈り致します。 (2015-01-22 08:19:26)

【G-SHOES】 LSI-C80を仕事で使っていた人です。確かにいいコードを生成してくれるので信頼して使っていました。当時のZ80のCコンパイラは正直中途半端で,LSI-Cを使えば遅いCPUでも,小さいメモリでも,なんとか乗り切れた事が多く,極論するとコスト削減に貢献してくれていたということになります。 (2015-01-22 08:14:07)

あきよし】 おぉ、多数の指摘ありがとうございます。PDP-11が16bitだったのはご指摘の通りで、勇み足でした。他の件も含め、後で記事修正しておきます。 (2015-01-21 11:14:19)

【名無し】 「LSI-C 80 の生成するコード品質は異常」(に良い)というのはちょっと大袈裟ですね。生成されるコードのサイズや実行効率的にアセンブラの代わりになる程のものではなく、当時の他のコンパイラ製品と比べてレジスタの使い方が効率的だった、くらいの説明が適当だと思います。 (2015-01-21 05:03:49)

【名無し】 >当時はC言語なんて十万円くらいするのが普通で、 10万とかいい値段がするのはLettice-CやWhitesmith-C、MS-Cなんかで、TurboCやQuickC等安価な製品も存在しました。 (2015-01-21 00:11:42)

【名無し】 >8080 上でC言語をC言語で書き、セルフコンパイルする。 …いや、それは難しいか。絶対無理とは言わないけど、開発効率が悪そうだ。 日記に「80年代の初めに、BDS-CをつかってCP/MでLSI-Cを書いていました。」と書かれてますよ。 (2015-01-21 00:07:27)

【名無し】 >そもそもが、C言語自体が広いメモリと 32bit の多数のレジスタを前提としている。 C言語の起源が16bitのPDP-7だかPDP-11だかその辺なのでその説はおかしい。 (2015-01-20 23:54:31)


戻る
トップページへ

-- share --

12000

-- follow --




- Reverse Link -