初号機完成を目指して
試作品の完成により、僕のプログラム開発速度は飛躍的に上がっていった。
まずはエディタがストレスなく動くのがいい。
またディスプレイとして使っていた表示版を四倍の大きさに広げたのだ。
これはカイゼルさんが作って届けてくれた。
キーボードはまだできていないが、表示面積が広がることで、ずっと視認性が上がったし、エディタの行数桁数が上がったのでプログラムが書きやすくなった。
まだ固定長データの端末方式のエディタだが、そのうち完全なスクリーンエディタにしたい。
そして今作っているのはC言語風コンパイラだ。
精霊言語はあくまで精霊に命令するための言語だから、プログラム言語としてはいささか問題がある。
最大の問題はすべてのキーワードがグローバルなため、キーワードの重複を避けてプログラムしないといけないということだ。
これはローダーでプレフィックスを付けるという仕組みで回避できたが、問題は変数だ。
グローバル変数しかないということは、再帰呼出しという自分自身を呼び出すプログラムが書けないということだ。
再帰呼び出しは近代のプログラム言語に必ず入っている機能と言っていい。
再帰がなくてもループで表現できないこともないのだが、再帰呼出しができればプログラムがスッキリするというメリットが有る。
今は関数の最初で僕自身が必要な変数をスタックと呼ばれる先入れ後出しのエリアに保存して、終わりの際に戻すことでローカル変数を実現している。
これを自動的にできるようになれば大きく手間が省ける。
また精霊に命令する場合は、パラメータ1の指定、パラメータ2の指定…と必要なパラメータを指定した後命令語を実行するのだが、普通のプログラム言語の場合、命令語、パラメータ1の指定、パラメータ2の指定…と並んでいる場合が多い。
計算式も同じような感じだから、a=b+cのような形にしたい。
ただ、この世界は二掛ける四に三を足すみたいな文章で記述するのが一般的で、まだ数式は発明されていないので、これを機に普及させたいところ。
それもあってコンパイラを作ろうと思ったのだが、作るのにあたってできるだけ簡単なコンパイラということでC言語のサブセットを選択。
C言語の言語構造は他の言語に比べて簡単だし、今でもこれを発展させたC++言語がそれなりのシェアを確保している。
なによりシステム向けのプログラムを組むのに非常に適した言語であるので、OSなんかは多くがC言語の派生言語で書かれているのだ。
僕もメインはC++言語使いだから慣れているというのもあるし。
C言語も、使える機能を限定すればコンパイラを作るのもそう難しいものではない。
現に僕も昔、C言語のサブセット風味コンパイラを作ったことがある。
コンパイラの作成で肝になるのは字句解析と構文解析だ。
字句解析は文字列を分解していくつかの意味のある塊にするのが役割だ。
たとえば数字やラベル、予約語、演算記号などを分解する。
構文解析ではそれの並びや意味を解析する。
元の世界ではlexやyaccという字句解析や構文解析を簡単なパラメータで記載することによりコンパイラのベースとなるプログラムを生成してくれるツールがあったが、もちろん異世界にはないので、全部自分で作らなければならない。
当時は僕もyaccなどは使っていなかったのでそこは問題ないけどね。
僕が昔作ったコンパイラは、再帰降下という方式のコンパイラで、その名の通り再帰呼び出しで構文解析していたので再帰呼び出しのない精霊語で書くのはめんどくさい。
しかし一度簡単なコンパイラを作ればそのコンパイラ自身で拡張していけるので、まずは再帰可能な簡単なコンパイラから作っているというわけだ。
そうこうしているうちに、カイゼルさんがキーボードの試作品を持ってきてくれた。
「おー。結構それっぽいですね」
この世界で初めて見ることになるキーボード。
キートップはただの四角い木のブロックだが、昔のMZ80Kのキーボードやノートのパンタグラフキーだって似たようなもだから気になるほどでもない。
僕はキーを一つ押してみる。
スーッと下がってピタリと止まる。
少し固めか。
押し心地としてはメカニカルの赤軸に近いか。
押し初めは軽いが少しずつ重くなって一番下で一番重くなる。
とはいってもそれほど極端に重くなるわけではない。
ゆっくり押せばそうかなと思うくらいで、すばやく押せば平均的な重さが指に伝わってくるようだ。
赤軸というのはCHERRY社が発売しているメカニカルキーボード用のスイッチで、軸の色によりその特性の違いを表している。
例えば青軸というのが押すと一旦貯めがあってストンと落ちる。その時カチカチといういかにもメカという感じのクリック音がするのだが、いかんせんうるさすぎてオフィスでは使えない。押している本人は気持ちいいのだが。
赤軸というのはこの押し始めの貯めやクリック音がないタイプで僕も愛用していた。
他にも色々なバリエーションが有るようだが基本的にはクリック感の違い、キー押下圧の違いなどで軸の色が変わってくる。
このキーボードは反発剤にスプリングが入っているだけだから、赤軸と似た感じになるもの当然か。
「いいです。想像以上です。バネの反発力が少し強いみたいですが、大人ならこのくらいでいいかもしれません」
僕の手が小さく力もないので、ちょっと固めだが問題があるというほどでもない。
「ちょっと接続してみましょう」
これまでのキーボードは平面だったから、キートップの文字表示位置を表面に合わせると押した時に表示位置が少しずれる。
まあ、このへんは後で調整すればいいでしょう。
今のキーボードに刻印はない。
これはキー一つ一つに刻印すると手間がかかるからだ。
手作りをなめてはいけない。
刻印を掘ってインクを流すだけでも一〇〇個ともなれば一日でできるかわからんぞ。
「表示はこれでいいか。反応点はストロークの三分の一くらい。ここまで押したらキーを反応させてっと」
僕はキー検知シーケンスを修正してOSを立ち上げ直す。
どうかな?
「おー。打てる。気持ちいい!!」
久々の打鍵感。
平面キーボードでは味わえない快適さだ。
「坊っちゃんよぉ。よくそんなばらばらの配置で打てるよな」
「バラバラな方がいいんですよ。使用頻度の高い文字が打ちにくいところに固まっているより全然打ちやすいです。それにこの程度ならすぐになれますよ」
特に自国語の場合、『あいうえお』のように母音子音の順で並んでいるため、これをそのまま左側縦に並べると左手小指と薬指が大変なことになる。
ローマ字と同じように文字は母音か、子音+母音の形だから、一文字打つたびに左手小指と薬指が酷使されるというわけだ。
キータッチなんか覚えてしまえば、苦にもならないけど、左手小指と薬指に負担がかかるのはずっと、いや、ちゃんとしたタイピングができるようになればなるほど負担がかかるから、ある程度バラバラな方がずっといい。
今度タイピング練習ソフトを作ってみようか。
簡単なものなら直ぐにできるだろう。
「できればキートップは台形状にして指の形に沿うようにしてくれるともっと打ちやすくなると思うんですが」
「それをやると金はともかく時間がかかるぜ」
「そうですよねー」
金はともかく時間がかかるのはいかんともしがたい。
「型にはめて一気に作れるといいんですが」
「型か? それも有りかもしれないな」
「出来るんかい!」
「出来ると思うが、やはりやったことが無いからな。作り方とか強度とか、色々研究が必要だ。すぐに出来るというわけでもないし、無駄になるかもしれない。うまくいけば量産するときは楽になるかもしれない」
「研究が必要なんですね。まあ、急ぎでは無いので落ち着いてからにしましょう。先にホコリを入らないようにする工夫はいかがですか?」
「そっちはまだ部屋の改装中だ」
隙間があるのが普通の部屋でクリーンルームを作るのは難しい。
隙間を全部埋めて、洗浄した空気も入れないといけないからだ。
「とりあえず使えない部分を排除するシーケンスは作ったので、四〇九六ページまでは安定して動くことを確認しています。八一九二ページだと流石にバッドセクタだらけになるので実用的にはちょっと厳しいですね」
八ビットマシンの四〇倍。
これはたぶん中期の三二ビットマシンに匹敵する速度だ。
これだけの早さがあれば初期のwindowsが動かせる! かもしれない。
まあ、その前に、もっとアプリを充実させないといけないんだけどね。
多分マシンは今の段階でも十分だ。少なくても当分は。
八ビットどころか三二ビットマシンからがスタートだ。
今後も研究と開発は続けていく必要があるが、急ぐ必要は無い。
急がなくてはいけないのは、これをどのような形で発表し、売り出していくかだ。
このままだとハードもソフトもコピーし放題だからな。
ハードは魔導士爵なら簡単に作れるだろうし、ソフトも複写の魔法があれば簡単にコピー出来る。
国王様から専売のお墨付きをもらえればいいのだが、登録手数料や権利金として最初に納めるお金が結構高いし、その後の売上からの上納金も馬鹿にならない。
また、ソフトを配布する時の問題がある。
今はパソコンを二台並べてコピーするしかないから何かUSBメモリのようなデバイスを用意しなければならないだろう。
売り出すまでにはまだまだ障害が多い。
だが、これでとりあえず必要なハードは揃った。
後はとりあえず必要なソフトを揃えれば、初号機の完成と言っていい。
「先生。先生が作った魔導具って、どうやって複製されるのを防いでいるんですか?」
魔導具だってシーケンスを使っている。これは真似されないのだろうか?
「魔導具であれば封印処理をします。封を破れば自身を消去するシーケンスを組み込んでおきます」
「魔導書の場合はどうするんですか?」
「どうもしません。他人に知られたら複写や改造、魔導具への応用をされると思った方がいいでしょう」
「先生はシーケンスは売らないんですか?」
「売りますよ」
「コピーされるかもしれないのに売るんですか!?」
「ええ。売る時には思いっきり高く売ります。そうすれば、ただでコピーしてあげる人はそうは居ません」
「それはそうでしょうけど、買った人が別の人に売ることもあるんじゃ無いですか?」
「それも含めての高値です。私は1人に売ればいいので、手間が省けていいともいえます」
コピーする権利ごと売る感じか。向こうの著作権でも買い取りと売上から規定のパーセンテージ分支払う方法があるわけだし。
「そりゃ、先生みたいに高値で売れるシーケンスが書ければそうなんだろうけど、俺らみたいな若手だと、信用も技術も無いから無理だけどな。なんで、若い頃は、魔導具を作って糊口を凌ぐって訳だ」
「魔導書の半分のシーケンスは、そうやって一般に広がったものですが、後の半分は、親や親族から譲られたものや自分で開発あるいは改造したものになります。魔導書は、貴族にとって切り札ですので、無闇に公開するものではありません」
どんな能力を持っているか丸わかりだと、対策を立てるのも容易だ。しかし、それがわからないとなれば、万全な対策など不可能となる。
なので貴族にはシーケンスを一般公開するという意識自体が無いのかもしれない。
そうなると、オープンソースとか、フリーウエアという考え方は馴染まないかもな。
これらは無償で使えるものであるが、今では無くてはならないものになっている。
スマホのOSなんかもオープンソースを利用していて、OS自体はただで配って、機器の販売とサービスで稼ぐのが、今の主流になりつつある。
Windowsだって、そんな感じになりつつあるしね。
前の世界だってコピー問題は深刻だった。
海賊版が大量にばらまかれた結果、アクティベートしないと使えないとか、正規使用者が不便を強いられていたものだった。
それを考えれば、最初からオープンにしてサービスで稼ぐという手もあるが、実際のところ母数が小さいとサービスで稼ぐのは厳しいだろう。
ユーザーが貴族だけだとすると、せいぜい数千人だからな。
利用料を高くすればユーザーが減るし、安くしても数千人で打ち止めだ。
サービスに魅力がなかったら、数百人だって怪しい。
スマホゲームが基本無料でやっていけるのは数十万とか数百万とかのユーザーの中に、少数の重課金者がいるからとも言われている。
ユーザー数が多ければ一部の人から集金するだけでもやっていけるのだ。
だが今はとてもそのようなユーザー数は望めない。
庶民まで出回ってもせいぜい数万か?
今の手工業では無理か。
下級貴族だって一家に一台ならともかく一人一台となると結構怪しいぞ。
最初はしばらくユーザー数が限られるのであれば、ソフトは魔導具に組み込んで勝手にのぞき見たり改変できたりしないようにしないといけないな。
今はシーケンスがそのままファイルとしてディスクに書き込まれているから、BIOSに復号シーケンスを入れてOSやアプリは暗号化したものを配布するか。
そしてBIOS部分を封印処理すれば、復号化の仕組みや複合キーを知るすべはなくなるはずだ。
さらにガラス基盤自体を箱で覆ってさらに封印処理すれば、中を開けて直接ガラス基板を見ることができなくなるだろう。いわゆるブラックボックスだね。
解読方法がわからないかぎり、OSやアプリを解析することはできなくなる。
しかし暗号化ソフトを公開すれば、復号シーケンスを作るやつが必ず出てくる。しかし公開しないと新しくアプリを作ってくれる人が出てこない。
実際のところ全部自分ひとりで作るのは不可能だ。
精霊コンピュータは実行ファイルイコール精霊語のシーケンスだからな。
向こうの世界のパソコンの実行ファイルは機械語や中間コードと言われる仮想マシン用の機械語での配布だから、コピーされることはあっても、再利用されたり大幅に改造されたりという事態は少ない。
せいぜいゲームとか一部改造されて、チート行為が行われるくらいか。
しかし精霊コンピュータはまんまソースコードの配布だし、暗号化してもそれは失われない。
もとのソースコード情報を失わせる手段があれば、アプリの無断改造は減るはずだ。
「仮想マシン方式にするか?」
仮想マシンとはソフトウエアで空想上のPCを作り上げ、その空想上のパソコン上で機械語プログラムを動かす仕組みのことだ。
Windowsマシンでファミコンのゲームを動かすようなものと考えてもらっていい。
PC本体には仮想マシンを実現するソフトを入れておけば、あとは精霊語ではない、それこそWindowsのプログラムだって動かせる。
ただし、別の機械をエミュレートするため、めちゃくちゃマシンパワーがいるが。
中期の三二ビットマシンの速度だと、せいぜい八ビットマシンのエミュレートくらいで限界か?
せっかく三二ビットの速度までこぎつけたのに元に戻った気分だ。
完璧なものとか考えていたらいつまでたっても初号機はできないぞ。
ここはあえて不完全なものを出して、反応を見てから対応を考えたほうがいいかもしれない。
先生たちと父上に相談してみよう。
精霊コンピュータのことなら世界一知っているが、貴族のことやこの世界のことなどはまだ知らないことだらけだ。
全部知ってからなんて言っていたらいつまでかかるかわかったものじゃない。
「先生、カイゼルさん、今後の方針について一緒に考えてください」
「ええ、構いませんよ」
「おう、カネになるんなら、いくらでも付き合うぜ」
僕はこれまでは考えてきたことを二人に話し、どういう方法で公開するのが一番いいか。
どういった機能を盛り込むべきか話し合った。
おおよそまとめてあとは父がどう判断するかに委ねられた。
なにせこの中では絶対権力者だ。
僕たちがこうしたいと言っても、はねられればそこまでだし、命じられればそうしなければならない。
特に利益やリスクに関することならば父としての立場より貴族、王族の立場が優先されるのだから。
僕と先生はこの話し合いでまとめた機能と方針で初号機発表の準備に取りかかった。
C言語のサブセット風味コンパイラ作成も実体験ですね。
最初はアドベンチャーゲーム用の言語エンジンとして、インタープリター言語を作ってたのですが、実際の処理をする部分をアセンブラ命令にして出力すればコンパイラになると気づき、そこから開発が始まりました。
このコンパイラはアセンブリ言語のテキストを出力するタイプのコンパイラで、オブジェクトコード出力はアセンブラ頼りでしたけど。
言語仕様としてはC言語のサブセットのサブセットという感じでしたが、機能が少ない上1パスで最適化も最小限にしたので、コンパイル速度は撃速でした。
当時使っていたBDS-Cより何倍も早かったですね。
コンパイル&GOが手軽にできるようになったので、開発速度はかなり向上しました。
その後組み込み用のスクリプトとしてインタープリタが必要になった際は、このコンパイラを仮想マシンコードを出力&実行するタイプのインタープリタを作成しました。
インタープリタ=>コンパイラ=>インタープリタとBASIC=>C++=>C#と期せずして似たような進化を遂げた自作ツールで、今でもエディタのマクロ言語用に現役で使用されています。