プログラム言語探訪 PostScript
前回のC++で少し触れた、大学の卒論で作ったプログラム。画面に書いたものを印刷するために使用したのがPostScriptでした。要するにプリンターで紙に印刷することを主目的とした言語なので、よくあるプログラム言語のように画面やキーボード、ファイルなどの入出力はせず、書かれている内容だけで完結するのが特徴です。
要するに「出力しますか? はい/いいえ」みたいなメッセージを出して確認するとか言った処理はできません。実行したらそのまま印刷一直線です。
基本的に「ペンでここからここまで直線を引く」とか、「円を描く」とか「文字を書く」という命令が基本で、構文もそれほど難しくないので、ちょっと勉強すれば誰でも使えるようになります。ただ、座標(100,100)がどの辺なのか、用紙サイズによって色々変わるし、等、気にすることは色々あるので……直接色々やるのって微妙かな……
そもそも、PostScript対応プリンタなんて、個人で持ってる人はあまりいないでしょうし。一応、PostScriptを読み込んで印刷データを生成する結構有名なソフトもあるので、プリンタなしでも……ただ、これが一般的かというと、うーん。
さて、このPostScriptで実際に図形を描いてみようとすると、いきなり壁にぶつかります。
PCの画面の座標軸って、左上が(0,0)。とあるドットの座標を(X,Y)とすると、Xが増えると右方向に、Yが増えると下方向に、という座標体系です。
それに対し、PostScriptの座標は左下が(0,0)で、Yが増えると上方向になります。
画面と上下が逆なんですね。ちなみにビットマップファイルと呼ばれる形式の画像データも上下が反転していたりします。どうしてそういうふうにしたのか……
とまあ、そんな感じなので、座標を指定するときに注意しないと、文章を印刷しようとしたのに下から上へ印字してしまったりします。また、文字の印刷では紙の幅を意識して自動的に改行なんてこともしてくれませんので、長さを計算して適宜改行をさせるという処理が必要です。用紙からはみ出した分をフォローしないのもPostScriptの特徴……というか仕様ですね。
なかなかに面倒ですが、OSのシステムコールとかAPIだけを使って文字列を画面に表示するときも自動的に改行してくれないというのは決して珍しいことではありません。
普通は、ほとんどの場合そういうシステムコールやらAPIに補助的な機能をつけたライブラリが提供されていて、自動的に改行されることが多いので、困らないんですけどね。ちなみに改行させるときも禁則処理……つまり、単語が不自然に分かれたり、句読点やカッコを意識したり、そういうフォローもしてくれないので全部自前でやる。それがPostScriptです。
さて、作者は卒論プログラムの中にPostScript出力の機能を組み込みました。そのとき、四角形とか楕円はPostScriptに座標を指定するだけでいいのですが、曲線は……なかなか大変でした。
最初は曲線を細かく分割した点の座標を取り出して線で結んでみたのですが、ダメでした。カクカクの線ができました。分割が荒すぎたんですね。しかし、どこまで細かくすればいいのか。色々試してみたのですがイマイチになってしまったので、仕方なくPostScript自身に曲線を計算するプログラムを組み込み、プリンタ自身に計算させるという方法に切り替えました。
まあ、PostScriptはプログラム言語ですからね。サブルーチンとか関数を作って呼び出すくらいのことはできるのです。
こうして、どうにかプログラムが形になったのですが、その後のデバッグは苦労しました。当時の大学の環境にデバッグ環境がなかったんですよね。どっかから持ってきてビルドすればよかったらしいのですが、当時はあまりそういう情報が無くて、必死に試行錯誤をしていました。
で、できあがったプログラムで図形を書いて印刷した結果、どうなったかというと……印刷されるまで十分くらいかかりました。きれいに印刷されるけど、印刷に時間がかかる。なかなか難しいものだと思ったものでした。プリンタも処理速度が向上しているはずなので、今ならもっと早いかも?
処理改善?ちょこっとやりましたけどね、あんまり効果がなかったです。
そんな感じで、多分もう作者が触ることがないだろう言語。それがPostScriptです。




