PostScript(PS)は、ページ記述言語であり、動的型付けのスタックベースのプログラミング言語です。電子出版やデスクトップパブリッシングの分野で最も一般的に使用されていますが、チューリング完全なプログラミング言語であるため、他の多くの用途にも使用できます。PostScriptは、 1982年から1984年にかけて、 Adobe SystemsのJohn Warnock、Charles Geschke、Doug Brotz、Ed Taft、Bill Paxtonによって開発されました。最新バージョンであるPostScript 3は、1997年にリリースされました。
PostScript言語の概念は、1976年にコンピュータグラフィックス会社であるEvans & SutherlandのJohn Gaffneyによって考案されました。[ 2 ] [ 3 ] [ 4 ]当時、GaffneyとJohn Warnockは、ニューヨーク港の大規模な3次元グラフィックスデータベースのインタプリタを開発していました。
同時期に、ゼロックスPARCの研究者たちは最初のレーザープリンターを開発し、ページ画像を定義する標準的な手段の必要性を認識していた。1975年から76年にかけて、ボブ・スプロールとウィリアム・ニューマンはPressフォーマットを開発し、これは最終的にゼロックスStarシステムでレーザープリンターの駆動に使用された。しかし、Pressは言語ではなくデータフォーマットであったため柔軟性に欠け、PARCは後継となるInterpressの開発に着手した。
1978年、当時ゼロックスPARCに所属していたジョン・ガフニーとマーティン・ニューウェルは、 VLSI設計やタイプおよびグラフィック印刷の研究に使用されたJ & MまたはJaM [ 2 ] [ 5 ](「ジョンとマーティン」の略)を開発した。この研究は後に発展し、インタープレス言語へと拡張された。
ワーノックはチャック・ゲシュケと共に会社を離れ、 1982年12月にアドビシステムズを設立した。彼らはダグ・ブロッツ、エド・タフト、ビル・パクストンと共に、インタープレスに似た、よりシンプルな言語であるポストスクリプトを開発し、1984年に市場に投入した。
Meanwhile, in the spring of 1983, Steve Jobs came to visit Adobe and was dazzled by PostScript's potential, especially for the new Macintosh computer he was developing at Apple.[6] To John Sculley's frustration, Jobs licensed the PostScript technology from Adobe by offering a $1.5 million advance against PostScript royalties, plus $2.5 million in exchange for 20 percent of Adobe shares.[7] During a series of meetings in 1983, Jobs also repeatedly offered for Apple to buy Adobe outright, but the founders kept turning him down.[7] In December 1983, the two companies finally signed off on the PostScript licensing deal, and Adobe had to shift focus immediately from high-end, high-resolution printing devices to the consumer-oriented Apple LaserWriter laser printer.[8]
At that time, the 300-dpi Canon laser printing engine to be used in LaserWriters was seen as good enough only for proof printing (i.e., for crude rough drafts of material whose final drafts would be sent to professional high-resolution devices), but Jobs presented Adobe with the challenge of making PostScript render high-quality output to such a low-resolution device (which for most consumers would be their only printing device).[9] In response, Warnock and Brotz solved the so-called "appearance problem" of making the stem width of letters scale properly so that they look good at all resolutions.[10] Their breakthrough was so important that Adobe never patented the technology, in order to keep its details concealed as a trade secret.[10] Many years later, Warnock revealed the trade secret in a 2010 lecture, and in 2022, Adobe publicly released an early version of PostScript's original source code from February 1984.[11] Paxton worked on several other related improvements, such as font hinting.[10] This work occurred after February 1984, meaning that Paxton's improvements were not included in the source code release and are still protected as trade secrets.[11] Adobe was also responsible for porting PostScript to the Canon's Motorola 68000 chip.[10]
AppleとAdobeは、1985年1月23日のAppleの年次株主総会でLaserWriterを発表しました。[ 12 ] これはPostScriptを搭載した最初のプリンターであり、1980年代半ばのデスクトップパブリッシング(DTP)革命の火付け役となりました。 [ 13 ]当初のPostScriptロイヤリティは、販売されたレーザープリンター1台につき定価の5%で、LaserWriterの当初の定価6,995ドルのうち350ドルに相当し、Adobeの初期の頃はロイヤリティがほぼすべての収入源となっていました。[ 14 ](Appleは後に契約を再交渉し、出荷されたプリンターの台数に基づいてライセンス料を支払うようにしました。)[ 14 ] 技術的な利点と普及率の高さが相まって、PostScriptは印刷アプリケーションのグラフィック出力に最適な言語となりました。PostScript言語のインタープリタ(ラスターイメージプロセッサのRIPと呼ばれることもあります)は、1980年代と1990年代のレーザープリンターの一般的な構成要素でした。
しかし、実装コストは高かった。コンピュータは生のPSコードを出力し、それをプリンタが解釈してプリンタの自然な解像度でラスタ画像に変換する必要があった。そのため、高性能マイクロプロセッサと十分なメモリが必要だった。LaserWriterは12MHzのMotorola 68000を使用しており 、接続されたMacintoshコンピュータよりも高速だった。[ 15 ] 1987年までに、AdobeからPSとフォントのライセンスを取得するコストは、プリンタ1台あたり400ドルから900ドルになった。[ 16 ]レーザープリンタエンジン自体が1000ドル以上した頃は、PSの追加コストはわずかだった。しかし、プリンタ機構の価格が下がるにつれて、PSの実装コストはプリンタ全体のコストに占める割合が大きくなりすぎた。さらに、1990年代にはデスクトップコンピュータが接続されたプリンタよりも強力になったため、リソースが限られたプリンタにラスタライズ処理をオフロードすることはもはや意味をなさなくなった。 2001年までに、PostScriptを内蔵した低価格プリンターはほとんどなくなりました。これは主に、PostScript非対応の安価なインクジェットプリンターとの競争が激化したことと、PostScript画像をコンピューター上でレンダリングする新しいソフトウェアベースの手法が登場し、あらゆるプリンターで利用できるようになったことが理由です。PostScriptの後継であるPDFは、そのような手法の一つを提供し、電子文書配信の事実上の標準としてPostScriptに取って代わりました。
ハイエンドプリンターでは、PostScriptプロセッサは依然として一般的であり、これを使用することで、文書印刷に必要なCPU処理を大幅に削減し、PostScript画像のレンダリング処理をコンピュータからプリンターに移行させることができる。
PostScript言語の最初のバージョンは1984年に市場にリリースされました。レベル1という修飾語は、レベル2が導入されたときに追加されました。[ 17 ]
PostScript Level 2 は 1991 年に導入され、速度と信頼性の向上、ラスター内画像処理 (RIP) 分離のサポート、画像解凍(例えば、JPEG画像を PostScript プログラムでレンダリングできる)、複合フォントのサポート、再利用可能なコンテンツをキャッシュするためのフォームメカニズムなど、いくつかの改良が含まれていました。[ 17 ]
PostScript 3(Adobeは「レベル」という用語を廃止し、よりシンプルなバージョン管理を採用した)は1997年末に登場し、古い演算子の辞書ベースの新しいバージョンが多数追加されたほか、より優れたカラー処理と新しいフィルタ(プログラム内での圧縮/解凍、プログラムのチャンキング、高度なエラー処理を可能にする)が導入された。
PostScript 3 は、最大 4096 階調のグレー (PostScript Level 2 で利用可能だった 256 階調ではなく) による滑らかなシェーディング操作の導入、および追加のインク色(スポットカラーと呼ばれる) を合成カラーページに追加できるカラー空間DeviceN の導入により、当時雑誌制作で広く使用されていた既存の独自のカラー電子プリプレスシステムを置き換えるという点で重要でした。[ 17 ] [ 18 ]
InterpressとPostScriptが導入される以前は、プリンターは入力されたテキスト(通常はASCII形式)に基づいて文字を出力するように設計されていました。このための技術は数多く存在しましたが、ほとんどの技術に共通していたのは、文字がタイプライターのキー、金属帯、または光学プレートに刻印されていたため、物理的に変更するのが困難だったことです。
ドットマトリクスプリンターの普及に伴い、この状況はいくらか変化しました。これらのシステムでは、文字はプリンター内部のフォントテーブルで定義された一連のドットとして描画されます。ドットマトリクスプリンターは高度化するにつれて、ユーザーが選択できる複数の内蔵フォントを搭載するようになり、一部の機種ではユーザーが独自のカスタムグリフをプリンターにアップロードできるようになりました。
ドットマトリクスプリンタは、ラスターグラフィックスを印刷する機能も導入しました。[ 19 ]グラフィックスはコンピュータによって解釈され、一連のエスケープシーケンスを使用して一連のドットとしてプリンタに送信されました。これらのプリンタ制御言語はプリンタごとに異なり、プログラム作成者は多数のドライバを作成する必要がありました。
ベクターグラフィックスの印刷は、プロッターと呼ばれる専用機器に委ねられていた。ほとんどすべてのプロッターはHPGLという共通のコマンド言語を使用していたが、グラフィック印刷以外の用途には限られていた。さらに、プロッターは高価で動作も遅いため、普及率は低かった。
レーザープリンターは、プリンターとプロッターの長所を兼ね備えています。プロッターと同様に、レーザープリンターは高品質の線画を印刷でき、ドットマトリクスプリンターと同様に、テキストとラスターグラフィックの両方を印刷できます。プリンターやプロッターとは異なり、レーザープリンターでは高品質のグラフィックとテキストを同じページに配置することが可能です。PostScriptは、あらゆるメーカーのプリンターで使用できる単一の制御言語を提供することで、これらの特性を最大限に活用することを可能にしました。
PostScriptは、従来のプリンタ制御言語の枠を超え、それ自体が完全なプログラミング言語となりました。多くのアプリケーションは、ドキュメントをPostScriptプログラムに変換することができ、そのプログラムを実行すると元のドキュメントが生成されます。このプログラムは、プリンタ内のインタープリタに送信されて印刷されたドキュメントとして出力されたり、別のアプリケーション内のインタープリタに送信されて画面に表示されたりします。ドキュメントプログラムは送信先に関係なく同じであるため、デバイス非依存と呼ばれます。
PostScriptは、テキストを含むあらゆるものを直線と3次ベジェ曲線で指定するオンザフライ・ラスタライズ機能(従来はCADアプリケーションでのみ見られた機能)を実装している点で注目に値します。これにより、任意の拡大縮小、回転、その他の変換が可能になります。PostScriptプログラムが解釈されると、インタプリタはこれらの命令を、出力に必要なドットに変換します。このため、PostScriptインタプリタは、PostScriptラスタイメージプロセッサ(RIP)と呼ばれることもあります。
PostScript自体と同じくらい複雑なのが、フォントの扱い方です。フォントシステムは、PSのグラフィックプリミティブを使用してグリフを曲線として描画し、それを任意の解像度でレンダリングします。このアプローチでは、多くのタイポグラフィ上の問題を考慮する必要がありました。
一つの問題点は、フォントが小さいサイズでは線形に拡大縮小されないため、グリフの特徴が比例して大きすぎたり小さすぎたりして見栄えが悪くなることです。PostScriptは、フォントヒンティングを導入することでこの問題を回避しました。フォントヒンティングでは、水平または垂直の帯状に追加情報が提供されるため、ラスタライザーが維持すべき各文字の特徴を識別するのに役立ちます。その結果、低解像度でも見栄えの良いフォントが実現しました。以前は、この目的のためには手動で調整されたビットマップフォントが必要だと考えられていました。
当時、フォントにこれらのヒントを含めるための技術は厳重に保護されており、ヒント付きフォントは圧縮され暗号化されて、AdobeがType 1フォント(PostScript Type 1フォント、PS1、T1、またはAdobe Type 1とも呼ばれる)と呼ぶものになりました。Type 1は、完全な言語ではなく、アウトライン情報のみを保存するためのPSシステムの簡略化でした(この点ではPDFも同様です)。Adobeは、独自のフォントにヒントを追加したい人にType 1技術のライセンスを販売しました。この技術のライセンスを取得しなかった人は、Type 3フォント( PostScript Type 3フォント、PS3 、またはT3とも呼ばれる)を使用するしかありませんでした。Type 3フォントはPostScript言語の高度な機能をすべて備えていましたが、ヒントの標準化されたアプローチはありませんでした。
Type 2フォント形式は、コンパクトフォント形式(CFF)の文字文字列で使用するために設計され、フォントファイル全体のサイズを削減するために実装されました。CFF /Type2形式は後に、 OpenTypeフォントにおけるPostScriptアウトラインの処理の基礎となりました。
CIDキー付きフォントフォーマットは、OCF/Type 0フォントの問題点を解決するため、複雑なアジア言語(CJK)のエンコーディングや非常に大きな文字セットの問題に対処するために設計されました。CIDキー付きフォントフォーマットは、標準のCIDキー付きフォントの場合はType 1フォントフォーマットと、CIDキー付きOpenTypeフォントの場合はType 2フォントフォーマットと組み合わせて使用できます。
Adobeのシステムに対抗するため、Appleは1991年頃に独自のシステムであるTrueTypeを開発しました。TrueTypeの発表直後、AdobeはType 1フォントフォーマットの仕様を公開しました。Altsys Fontographer( 1995年1月にMacromediaに買収され、2005年5月からはFontLabが所有)などの市販ツールには、Type 1フォントを作成する機能が追加されました。それ以来、多くの無料のType 1フォントがリリースされており、例えば、TeX組版システムで使用されるフォントもこのフォーマットで利用可能です。
1990年代初頭には、 BitstreamやMetafontなどが開発したアウトラインベースのフォントを保存するためのシステムがいくつか存在したが、いずれも汎用的な印刷ソリューションを備えていなかったため、広く普及することはなかった。
1990年代後半、AdobeはMicrosoftと共同でOpenTypeを開発しました。OpenTypeは基本的にType 1とTrueTypeフォーマットの機能的な上位互換です。PostScript出力デバイスに印刷する場合、OpenTypeフォントの不要な部分は省略され、ドライバによってデバイスに送信される内容は、OpenTypeフォントに含まれるアウトラインの種類に応じて、TrueTypeフォントまたはType 1フォントの場合と同じになります。
Adobeは2023年1月まで製品でType 1フォントをサポートしていましたが、OpenTypeフォントを優先するため、その時点でサポートを完全に終了しました。[ 20 ]
コンピュータプリンタとLinotronicなどのハイエンドタイプセッターの両方がPostScriptを実装しました。[ 21 ] 1980年代、Adobeはラスターイメージプロセッサ(RIP)として知られる実装のライセンス料から収益の大部分を得ていました。1980年代半ばに多数の新しいRISCベースのプラットフォームが利用可能になると、Adobeの新しいマシンのサポートが不十分だと感じる人もいました。
こうした事情とコストの問題から、PostScriptのサードパーティ製実装が普及するようになった。特に低価格プリンター(ライセンス料がネックとなる場合)やハイエンドの組版機器(スピードを追求するあまり、Adobeが提供できるよりも早く新しいプラットフォームのサポートが求められる場合)で顕著だった。ある時期、Microsoftは買収したPostScript互換インタープリタであるTrueImageをAppleにライセンス供与し、AppleはMicrosoftに新しいフォントフォーマットであるTrueTypeをライセンス供与した。最終的にAppleはAdobeと合意に達し、自社プリンター向けに純正のPostScriptをライセンス供与したが、TrueTypeはWindowsとMacintoshの両方で標準のアウトラインフォント技術となった。
今日では、サードパーティ製のPostScript互換インタープリタがプリンターや複合機(MFP)で広く使用されています。たとえば、以前はPhoenixPageとして知られていたCSR plcのIPS PS3 [ 22 ]インタープリタは、 Hewlett-Packardが開発しLaserJetおよびColor LaserJetシリーズで販売されているものを含め、多くのプリンターやMFPで標準となっています。プリンターおよびMFPメーカーが使用するその他のサードパーティ製PostScriptソリューションには、Global GraphicsのJaws [ 23 ]とHarlequin RIPがあります。いくつかの他のアプリケーションとともに、無料ソフトウェア版としてGhostscriptがあります。互換性のあるインタープリタのいくつかは、Undocumented Printing Wikiに掲載されています。[ 24 ]
一部の基本的な低価格レーザープリンターはPostScriptをサポートしておらず、プラットフォームのネイティブグラフィックフォーマットをPostScriptに変換するのではなく、単にラスタライズするドライバーが付属しています。このようなプリンターでPostScriptのサポートが必要な場合は、Ghostscriptを使用できます。また、TeleType社のT-ScriptやBrother社のBR-Script3など、市販のPostScriptインタープリタも多数存在します。
PostScriptは、グラフィカルユーザーインターフェース(GUI)の導入により商業的に成功を収めました。GUIによって、デザイナーはレーザープリンターへの出力用にページを直接レイアウトできるようになったからです。しかし、GUI自体のグラフィックシステムは、一般的にPostScriptに比べてはるかに洗練されていませんでした。例えば、 AppleのQuickDrawは、PostScriptの複雑なBスプラインや高度な領域塗りつぶしオプションではなく、基本的な線と円弧しかサポートしていませんでした。PostScript印刷を最大限に活用するには、コンピュータ上のアプリケーションがホストプラットフォーム独自のグラフィックシステムを使用してこれらの機能を再実装する必要がありました。そのため、これらの機能の実装の違いにより、画面上のレイアウトと印刷出力が完全に一致しないという問題が数多く発生しました。
コンピュータの処理能力が向上するにつれ、PSシステムをプリンタではなくコンピュータに搭載することが可能になりました。これにより、PSは印刷システムから、ホスト自身のグラフィック言語としても使用できるシステムへと自然に進化しました。このアプローチには多くの利点がありました。画面とプリンタで出力結果が異なる可能性を排除できただけでなく、コンピュータに強力なグラフィックシステムを提供し、レーザーエンジンのコストが低下していた時期にプリンタを「単純な」ものにすることも可能になりました。実際の生産現場では、PostScriptをディスプレイシステムとして使用することで、ホストコンピュータは画面に低解像度でレンダリングしたり、プリンタに高解像度でレンダリングしたり、あるいはPSコードをスマートプリンタに送信して外部印刷したりすることが可能になりました。
しかし、PostScriptは印刷を念頭に置いて開発されたため、対話型ディスプレイシステムでの直接使用には不向きな機能が数多く存在しました。特に、PostScriptは、特定のコマンドが表示されるまでコマンドを収集しshowpage、表示された時点でそれまでに読み込まれたすべてのコマンドを解釈して出力するという仕組みに基づいていました。対話型システムでは、これは明らかに不適切であり、またPostScriptには対話機能が組み込まれていませんでした。例えば、マウス操作のためのヒット検出機能は、プリンターでPostScriptを使用する場合には当然適用されませんでした。
スティーブ・ジョブズがアップルを退社してNeXTを設立した際、彼はAdobeに、新しいワークステーションコンピュータのディスプレイシステムとしてPSを使用するというアイデアを提案しました。その結果生まれたのがDisplay PostScript、略してDPSです。DPSは、多くの文字列検索を32ビット整数に変換することでパフォーマンスを向上させるための基本的な機能を追加し、すべてのコマンドで直接出力のサポートを追加し、GUIが図を検査できるようにする機能を追加しました。さらに、PSコードをC言語から直接呼び出せるようにするための「バインディング」セットも提供されました。NeXTは、オブジェクト指向グラフィックスシステムを提供するために、 NeXTStepシステムでこれらのバインディングを使用しました。DPSはNeXTと共同で開発されましたが、Adobeが商用販売し、1990年代にはほとんどのUnixワークステーションで一般的な機能となりました。
サン・マイクロシステムズは別のアプローチを取り、NeWSを開発した。PSがCプログラムと対話できるようにするというDPSのコンセプトとは異なり、NeWSはPSを拡張し、コンピュータのGUI全体を実行するのに適した言語とした。サンは、タイマー、マウス制御、割り込み、および対話に必要なその他のシステムのための多数の新しいコマンドを追加し、内部的に完全にオブジェクト指向となるようにデータ構造と言語要素を追加した。実際、完全なGUIが3つ、NeWSで作成され、一時的にワークステーションに提供された。しかし、X11システムの標準化に向けた継続的な取り組みにより、X11がサンシステムに導入され広く使用されるようになり、NeWSは広く普及することはなかった。
PDFとPostScriptは同じイメージングモデルを共有しており、両フォーマットはほとんどの場合相互に変換可能です。ただし、より古いフォーマットであるPostScriptには透明度がありません。そのネイティブオブジェクトモデルは完全に不透明に描画します。この点を除けば、両フォーマットとも印刷時に同じ結果を生成します。しかし、PDFにはPostScript言語のような汎用プログラミング言語フレームワークがありません。PDFドキュメントは、効率的なアクセスを目的とした静的データ構造であり、インタラクティブな表示に適したナビゲーション情報が埋め込まれています。[ 25 ] : 9
PostScriptはチューリング完全なプログラミング言語であり、連結型プログラミング言語群に属します。Forthに似たインタプリタ型のスタックベース言語で、動的型付け、 Lispに見られるデータ構造に触発されたデータ構造、スコープ付きメモリ、そして言語レベル2以降はガベージコレクションを備えています。言語構文は逆ポーランド記法を使用しており、演算の順序は明確ですが、スタックのレイアウトを念頭に置く必要があるため、プログラムを読むにはある程度の練習が必要です。ほとんどの演算子(他の言語では関数と呼ばれるもの)はスタックから引数を取り、結果をスタックに配置します。リテラル(例えば数値)は、スタック上に自身のコピーを配置する効果があります。配列型と辞書型に基づいて高度なデータ構造を構築できますが、型システムに対して宣言することはできません。型システムはそれらをすべて配列と辞書としてのみ認識するため、このようなユーザー定義の「型」に適用されるさらなる型付けの規律は、それらを実装するコードに委ねられます。
PostScriptプログラムでは、コメントを導入するために「%」文字が使用されます。慣例として、すべてのPostScriptプログラムは、すべてのデバイスがPostScriptとして正しく解釈できるように、インタープリタ指示として「%!PS」文字で始めるべきです。
PostScript プログラムは通常、プロローグとスクリプトと呼ばれる 2 つの部分に分かれています。プロローグには手続きが含まれており、プログラマーによって記述されます。スクリプトは、これらの手続きにデータを渡します。スクリプトは、PostScript 以外のプログラミング言語を使用して自動的に生成されることがよくあります。[ 26 ]
「Hello World」プログラムは、特定の言語で完全なプログラムの簡単な例を示す一般的な方法であり、PostScript(レベル2)では次のようになります。
%!PS /Courier % 希望のフォント名を指定します20 selectfont % ポイント単位でサイズを選択し、% 現在のフォントとして設定します72 500 moveto % 現在の位置を% 座標 72, 500 に移動します (原点はページの左下隅です) (Hello world!) show % 括弧内のテキストを描画しますshowpage % ページにすべて印刷しますまたは出力デバイスにコンソールがある場合
%!PS (ハローワールド!) =PostScriptは長さの単位としてポイントを使用します。ただし、他のポイント単位とは異なり、PostScriptでは1インチあたり正確に72ポイントを使用します。したがって、次のようになります。
例えば、 長さ4cmの垂直線を引くには、次のように入力するだけで十分です。
0 0 moveto 0 113.385827 rlineto strokemulより読みやすく慣用的な表現としては、以下の同等の表現が考えられます。これは、単純な手続き定義と数学演算子およびの使用例を示していますdiv。
/cm { 72 mul 2.54 div } def % 1 インチ = 2.54 cm 正確に0 0 moveto 0 4 cm rlineto stroke(厳密に言うと、ほとんどのプリンターは用紙の物理的な境界の周囲に構造上印刷できない余白があり、0 0 座標はその角に合わせて調整されているため、[ 25 ] :セクション 4.3.1 を参照、実際に何かを見るには別の開始点を使用する必要があるかもしれません。)
PostScriptのほとんどの実装では単精度実数[ 25 ] :付録B(24ビット仮数部)を使用しているため、実数を指定するために9桁を超える10進数を使用することは意味がなく、計算を実行すると許容できない丸め誤差が発生する可能性があります。
PostScript文書をレンダリングするために使用できるソフトウェア: