【衝撃】MS-DOSの原点!?Microsoftの伝説的ソースコードが流出!禁断の歴史が今、明らかに!
引用元:https://news.ycombinator.com/item?id=43575884
ソースコード読むのめっちゃ楽しいんだよね(コメントが特に)。GW-BASICのソースコード見つけたんだけど、マジおもろいのがこれ。
>;WE COULD NOT FIT THE NUMBER INTO THE BUFFER DESPITE OUR VALIENT
>;EFFORTS WE MUST POP ALL THE CHARACTERS BACK OFF THE STACK AND
>;POP OFF THE BEGINNING BUFFER PRINT LOCATION AND INPUT A ”%” SIGN THERE
>;CONSTANTS FOR THE RANDOM NUMBER GENERATOR FOLLOW
>;DO NOT CHANGE THESE WITHOUT CONSULTING KNUTH VOL 2
>;CHAPTER 3 FIRST
編集:QBASICじゃなくてGW-BASICね。(https://github.com/microsoft/GW-BASIC)
へー、GW-BASICって元祖Altair BASICの子孫なんだって。「Translation created 10-Feb-83」って各ソースファイルにあるヘッダーは、Microsoftが8080アセンブリを8086に自動翻訳するツール使ってた名残らしいよ(手動で修正されたからビルド日じゃないけどね)。GW-BASIC以外にも、Microsoft BASICの6502と6809版のソースコードは昔から公開されてたみたいだけど(https://www.pagetable.com/?p=774 と https://github.com/davidlinsley/DragonBasic 参照)、オリジナルの8080 BASICコードの公開は今回が初めてだと思う。
valiantじゃなくてvalientじゃないの?
まあね。当時はスペルチェッカーって別アプリだったし。一番人気はMicroProのCorrectStarだったかな。プログラミングエディタに組み込まれてなかったし、コードにスペルチェッカーかけるなんて考えられなかった。
IntelliJ以外でコードにスペルチェッカー使ってる人見たことないわ。
cSpellだけで1300万インストールされてるよ。
https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker
Eclipseにはスペルチェッカーが組み込まれてるよ。多分ほとんどのファイル形式でデフォルトでオンになってるはず。みんなオフにしてるかもしれないけど、気に入ってそのままにしてる人もいると思うよ。
最近これ見つけた。
https://github.com/tekumara/typos-lsp
これ使ってる。
https://github.com/crate-ci/typos
GitHubのスターもたくさんついてるから、ユーザーも多いんじゃないかな。NeoVimで使ってるけどマジ便利。
"apellchecker"ってスペルチェッカーの名前としてマジ最高じゃん。
Codespellめっちゃ使えるよ。コマンドラインとCIで使ってる。
https://github.com/codespell-project/codespell
Emacsにはスペルチェック機能がついてて、バッファ全体をチェックする昔ながらのやり方も、入力しながらリアルタイムでチェックする機能もあるんだよね。でも、最近はJetBrains IDEでコーディングすることが多いかな。
Vim/Neovimユーザーなら、標準で結構使えるスペルチェック機能があるよ。カスタム単語を辞書に追加すればさらに便利になるし。:set spell
でオン、:set nospell
でオフにできるよ。カスタム単語を追加するには、対象の単語にカーソルを置いてzg
を押せばOK。
僕のvimrcファイルには、特定のファイルタイプでデフォルトでオンになるように設定してるよ:
> ”特定のファイルタイプと単語補完のためにスペルチェックをオンにする。
> 単語はカーソルを単語に置いて’zg’を押すことで辞書に追加できます。”
カスタム単語は~/.vim/spell/en.utf-8.add
みたいなテキストファイルに保存されるから、編集やバックアップも簡単だよ。
> custom additions
スペルチェック中に直接追加することもできるよ。カーソルを単語に移動して(コマンド忘れちゃった…)レアな単語、良い単語、悪い単語として登録できる。
VSCodeの拡張機能を使ってる人もいるよね。
最高のプログラマーってみんなスペルが苦手な気がするんだよね。なんでだろう?
俺が知ってる最高のプログラマーはそんなことないけどな。
人間なんてみんなスペルが苦手だよ。ライターだってそう。だからスペルチェッカーが必要なんだ。
母国語のフランス語よりも、一度も見たことのないエスペラント語のスペルの方が自信あるわ。欠陥だらけのシステムを責めるのはやめようよ。
そりゃそうでしょ。エスペラントは規格に合わせて作られた言語だし。フランス語や英語は自然に進化してきたから、矛盾や例外が多いんだよ。
Steve Jobsがよく言ってたのは、Microsoftにはセンスがないってことらしいよ。スクロールした時のフォントがちらつくエフェクトを見て、まさにそれだと思った。マジで気が散る。しかもリーダーモードで無効にできないし。ちなみに、Bill Gatesが世界のためにやったことには感謝してる。
デザインは面白いし、懐かしい感じもするけど、やりすぎだと思うな。あんなに気が散らなくても、同じような雰囲気は出せたはず。あと、リーダーモードはマジで対応してほしい。難しくないはずだし、オプションにするべきじゃないよ。 読みにくい上に、2年物のノートPCだとページを移動するだけでCPUとGPUがフル回転して、ファンが爆音になるんだけど。ただのブログ記事なのに、こんなにパフォーマンスが悪いウェブサイトは初めてかも。 それって、最近のウェブサイトがJavaScriptまみれの広告再生マシーンになってて、神様が意図したような1kB未満のHTMLじゃないのが原因だよね。 笑えるのが、今日HNのトップページに載ってたこれ。 それはGPUに処理をオフロードしてるからじゃないかな。低スペックPCだとカクカクするけど、CPUファンは静かだよね。GatesのノートはCPUに負荷がかかってるみたい。 マジでレベルが違う。うちの古いPCでも、前後ともスムーズに動く。うちのPCはThinkPad i7で、すぐに低速モードになるんだけど。 Tim Berners-Leeは色々なものに祭り上げられてきたけど、神になったのは初めて聞いた。 いや、2012年のオリンピック開会式を見た? Kernighan & Ritchieも仲間に入れてあげて。 でもさ、あの自己陶酔しまくりの嫌なやつがクソみたいなこと垂れ流してるのを忘れさせてくれるよね。 マジかよ、Bill Gatesの個人ブログがWordPressのプラグイン500個入りみたいなノリなのにはビックリだわ。俺の昔のMySpaceのプロフみたいじゃん。 ちなみに、Appleの発表イベントのぐるぐるスクロール効果も大概ヒドイよね。 個人的には好きだけどなー。好みは人それぞれだし。 DONKEY.BASをゲットしてみてよ!マジでハマるから! ふと思ったんだけど、この文章全部Billが書いたのかな?このエフェクト、Billが決めて入れたのかな?そもそもBillはこのエフェクト知ってたのかな? だよねー。こんなに色々デザインされてると、裏にそれなりの規模のチームがいて、ゴーストライターとかもいるんじゃないかって想像しちゃう。 まあ、Bill Gatesはバリバリの企業家だもんね。プログラミングじゃなくて、そっちで金持ちになったんだし。 BillGレビューはどうなったのさ?ほとんどの企業はやり方分かってないよね。 彼がどうやって今の地位を築いたのか、どんな人物なのかを忘れないことが大事だと思うなー。Behind the Bastardsは、みんなが賞賛するような人たちに対する現実を教えてくれる良いポッドキャストだよ。 それ、マジでイケてると思うわ。 あと、そのページのフォント、特に小文字の“f”がマジでイライラするんだけど。 めっちゃかわいくて、一瞬で好きになった。 “ヤツが世界のためにしてきたこと”って、Covidワクチンの著作権を取ったこと? 気持ちはわかる。ヤツのビジネス、倫理的に微妙だもんね。でも批判するなら、著作権と特許の違いくらい知っとけよ。 Intel 8080のエミュレーター書いたことあるぜ。Dec10/VAX/IBM VM CMSで動くやつ。簡単だったよー。8080は256個の値のswitchでいけるし。FORTRAN77でやった。 >BASICインタプリタをfloating pointで書くのはマジで難しい。GatesとAllenのBASICはマジですごかった。 Allenがやったのは、-10で動く8080エミュレータを書いたこと。8080は単純なCPUだから、エミュレータ書くのは難しくない。 Wozniakのやり方は、高校生の時に6502アセンブラプログラムを書く時にやってた。金がなくてちゃんとしたアセンブラ買えなかったから。グラフ用紙に3列で書いてた。アドレス、コード、アセンブラのopcodes。マジ集中できるし、ちょっと変更するだけでも大変。 俺もZX80でZ80アセンブラ始めた時そうだったわ。すぐopcode調べるのとか嫌になって、特に相対ジャンプ(特に後ろ向きのやつ)の計算ミスってクラッシュしまくってた。 高校時代にMSX Spectravideoのコンピューターを手に入れるためにデモプログラムを書いたんだけど、その時にZ80の逆アセンブラを書いてたんだ。でも2バイトのオペコードに対応してなかったから、一部しか完成しなかったんだよね。コンピューターのメモリ全体にpokeコマンドをしまくって、キャラクタのビットマップの場所を探し当てたのを覚えてるよ。 AllenはAltairのコンソールでマシンコードでローダーを書かなきゃいけなかったんだよね。BASICインタプリタ自体は、ローダーとテープリーダーを使って紙テープからロードされたんだって。AllenがAltairで最初に実行したBASICプログラムは、どうやら“2 + 2”だったらしくて、ちゃんと“4”って表示されたらしいよ。I/Oとか、Dec10でエミュレートするのが難しかったはずなのに、自分のコードにそんな自信を持ちたいな。 >which must have been tricky to emulate on the Dec10 いや、Dec10ベースのエミュレータではちょっと苦労したよ。メモリマップされたやつはちゃんと動かなかったんだよね。I/O命令をごまかしただけ。でも、学生にソートとか文字列検索とかをさせるための余暇プロジェクトだったから、あんまり罪悪感はなかったかな。アセンブラとかデバッガとかも入ってたし。しかも移植可能で、完全に標準的なFORTRAN77だったんだぜ! Dec10のエミュレータを最新のCPUで書いたらクールじゃないかってちょうど思ってたんだよね。 実は、プログラマーの同僚の一人が、Dec10を廃棄するときに周辺機器全部込みで買い取って、ガレージに設置しようとしたことがあったんだ。電源と奥さんが大きな障害だったみたいだけど。 面白いことに、Jobsによると、理由は不明だけどWozniakがApple Basicに浮動小数点サポートを追加することを拒否したから、Microsoftから浮動小数点数を扱うBASICのライセンスを取得する必要があったんだって[1]。 [1] Bill & Steve (Jobs!)が浮動小数点BASICについて回想:https://devblogs.microsoft.com/vbteam/bill-steve-jobs-remini… 浮動小数点エミュレータを書くのは(やったことあるけど)そんなに難しくないよ。まず、高級言語で書いてアルゴリズムをデバッグする。それから手でアセンブルするのは難しくない。 大変なのは、高級言語のステップを飛ばして、いきなりアセンブラでやろうとすることだよ。 Wozはすでに浮動小数点ルーチンを書いていて、それはApple IIのROM自体に含まれていて、PEEK/POKEで呼び出すことができたんだよ。ただ、BASIC言語自体には統合されなかったんだ! http://retro.hansotten.nl/uploads/mag6502/Apples%20Hidden%20… Apple Integer BASICってどれくらいの大きさだったんだろう? EmpireのFortran版を書いたときには、PDP-10を丸ごと自由に使うことができたと理解しているんだけど。 -10でプログラミングを学んだんだ。素晴らしい経験だったよ。 振り返ってみると、整数BASICを書くのは簡単なことだけど、70年代当時は、そんなものをどうやって書くのか見当もつかなかった。 1978年頃、Hal Finney(そう、あの人)がMattel Intellivision(その奇妙な10ビットマイクロプロセッサを搭載)のために2K EPROMに収まる整数BASICを書いたんだ。もちろん、Halは普通の熊より(ずっと)賢かった。 へー、知らなかった!90年代に知って、CodeConのプレゼンで初めて会ったんだよね。言いたかったのは、Integer BASIC全体よりもfloating-pointのサポートの方が大変だったかもってこと。ちなみにApple Integer BASICにはまだバグが見つかってないらしいよ。すごいよね。 fixed pointは、整数部と小数部に使うbit数が決まってるやつ。例えば8.8なら、整数部は0~255で、小数部は1/256ずつ増えて255/256まで。 コンピューターのメモリーに数字を保存したいけど、小数点とか数字以外の文字は使えないとするじゃん。だから、実数を数字の列としてエンコード/デコードするシステムが必要になるんだ。 つまりfloating point数は、数字とexponentと符号bitの3つでできてるんだ。 exponentよりdecimal point positionの方が分かりやすいよね。あと、mantissaはsignificandのことだった気がする(数字の部分)。engineering notation(exponentが3で割り切れるやつ)の方が便利じゃん?2・234×10¹¹とかを頭の中でbillionに変換するの嫌なんだよね。あと(floating pointと関係ないけど)数学者はもっと分かりやすい名前を付けるべき。「numerator」と「denominator」じゃなくて「upper」と「lower number」とかさ! significandとmantissa、いつもごっちゃになるんだよね。だから使わないことにした! 大学時代にassemblerでfloating pointルーチンを書いたな。理解できた時はマジで「aha」って感じだった。 仕様を読むのはマジで大変。でも実装はそこまで悪くない。sticky bitとかguard bitとか、実は結構シンプル。でも、IEEE arithmeticを使って、その限界を回避するalgorithmを作るのは難しい。 FP mathの仕組み(bitレベルでどうやってるか)をざっくり知りたいなら、Project Oberonのサイトに行って、FPGAでのRISCマシンの実装についてのPDFを見てみて。16章の8~10ページに、簡潔な説明があるよ。 初期のマシンでは浮動小数点演算が重要だったんだよね。おかげで「高性能な電卓」としての使い道が開けたんだから。データ保存が今ほど簡単じゃなかった時代には、ゲームとかリモート端末としての利用と並んで貴重だったんだよね。BASICに入ってたfloatの実装が当時一番一般的だったし(今のIEEE規格とは微妙に違ったりもするんだよね)。 わかるー。4KBとか8KBに収まるBASICで数学ができるってすごいよね。Bill Gatesが$150のAltair BASICを海賊版にされたって怒ったのがきっかけでTiny BASICが生まれたり、“copyleft”って言葉が作られたりもしたんだって。 InteractコンピューターのMicrosoft Basicのテープ、まだ持ってるよ。8080が入ってるんだ。 昔のTandy Color Computerが起動するときにMicrosoft BASICを参照してたのを覚えてるよ。https://tinyurl.com/2jttvjzk その音声をInternet Archiveにアップロードするべきだよ! Sol-20用のMS Extended Basicカセットも持ってる。これも8080ベースなんだ。 GatesとAllenのすごいところは、マジで技術力が高かったってことだよね。PDP-10のエミュレーター作って、インタープリター、ラインエディタ、I/Oシステムを全部4KBのメモリに収めるんだから。コードを読む価値あるし、それに加えてビジネスセンスもすごいし、20歳にしてはマジメに仕事してたよね。今の「fake it till you make it」みたいな、APIラッパーだけの製品ばっかりの業界とは大違いだよ。Microsoftみたいな会社がまた出てきてほしいな。 まあ、彼らも最初はハッタリかましてたけどね。まだ書いてないプログラムのソースコードがあるって言ってたんだから!でも、その後ちゃんと“making it”に本気だったんだよ。 確かに「fake it and then immediately proceed to make it」は、「fake it till you make it」みたいに嘘ついて取引をぶっ壊すよりは全然評価できるよね。 当時の複雑さなら、人間の脳でもまだ理解できたと思うんだよね。Wozの自伝を読むと、彼は最初のAppleコンピューターのすべての論理ゲートの役割を知ってたみたいだし。PDP-10もたぶん“人間の速度”で動いてたんだろうな… >「できるまで、やったふり」っていうのと対照的だよね。Microsoftは「できるまで、やったふり」の史上最強の会社だよ。IBM PCのOSの契約を、OSがない状態で取って、それを誰かから買ったんだから(確か)。 運と、リスクを取る覚悟が、予想もできない形で実を結んだんだね。PCの時代みたいなのを、俺の生きているうちに見られるかわからないな。もしかしたら、モバイルフォンか、インターネットかもね。もっとコメントを表示(1)
追記:マジかよ、全部アニメーションしてるじゃん。読みにくい…あと…インラインのコードサンプルが一つもないってどういうこと?デザイナーがコンテンツよりもアワード狙ってるだけじゃん。まるで他の人のソロパートを全部食っちゃうギタープレイヤーみたい。
https://animejs.com/
もっと凝ったアニメーションなのに、バターみたいに滑らか。
https://podcasts.apple.com/us/podcast/part-one-the-ballad-of…もっとコメントを表示(2)
BASICインタプリタをfloating pointで書くのはマジで難しい。GatesとAllenのBASICはマジですごかった。
floating pointルーチンはMonte Davidoffの功績。でもGatesとAllenがHarvard PDP-10でAltair BASICを、実機も見ずに書いて、AlbuquerqueのMITSでトグルスイッチで入力して一発で動いたのはマジですごい。
https://pastraiser.com/cpu/i8080/i8080_opcodes.html
それで、BASICをエミュレータ上でデバッグした。
Wozniakは、Appleのコードをアセンブラで手書きして、手作業でバイナリに変換してた。めっちゃ面倒でエラーしやすい。
同時期にAphで6800とかのコード書いてたけど、PDP-11でマクロアセンブラ使ってバイナリにしてEPROMに焼いてた。めっちゃ楽だった。(Dan O’Dowdがアセンブラ書いた。)
だから自分でBASICでアセンブラ書いたわ。
なんで難しいのかわからないな。AllenのPDP-10上の8080エミュレータがどうやって動いてたのか知らないけど、8080のI/Oをエミュレートするのは簡単そうに見えるけど。もっとコメントを表示(3)
floating pointは、小数点(.)の位置を変数にするんだ。だから、小数点以下の桁数を増やしたり減らしたりできる。Microsoft Basicは、数値に23bit、符号に1bit、小数点の位置に8bit使ってた。現代のIEEE754ほどじゃないけど、十分だったんだね。IEEE754を読むと、modern floating pointがよく分かるよ。Bruce DawsonのRandom ASCII blogもおすすめ。
fixed pointだと、メモリーに数字を書き込んで、小数点以下の桁数を決めておく。例えば、小数点以下2桁にすると決めたら、000123は00・0123、123000は1230ってことになる。6桁だと、0~9999を0・01の精度で表せる。
floating pointだと、小数点の位置(exponent)と数字(mantissa)の両方を書き込む。最初の2桁をexponent、残りの4桁をmantissaにすると、
>020123
は01・23、つまり1・23になる(exponentが2だから、小数点以下2桁)。同じ6桁でも、0~9999×10⁹⁶を1/10000の精度で表せるんだ。あとは分かるっしょ。
>1・ the digits
>2・ the exponent
>3・ a sign bit
scientific notationと同じだよ。
>https://en・wikipedia・org/wiki/Scientific_notation
あとはそれの応用。
コンピューターには、BASICのサンプルプログラムが載った良い感じの本が付属してたんだ。
>GatesとAllenで際立っているのは、マジで高い技術力だよね。PDP-10のエミュレータを作って、それからインタープリタ、ラインエディタ、I/Oシステムを全部4KBのメモリに詰め込んだんだから。
それってマジですごいの?当時はどのコーダーも全部4Kでやってたじゃん。