パラダイム | 命令型 |
---|---|
登場時期 | 1976年[2] |
設計者 | Computer Systems Laboratory (CSL) |
開発者 | Xerox PARC |
最新リリース | Mesa 6.0 (Version 41) (1981年)/ 1981年7月 |
型付け | 強い静的型付け |
影響を受けた言語 | ALGOL 68, Pascal, Simula 67[3] |
影響を与えた言語 | Java, Modula-2, Cedar, PostScript[4] |
プラットフォーム | Alto, Xerox Star |
Mesa言語[1]は、1974年に米国カリフォルニア州パロアルトのゼロックス・パロアルト研究所(PARC)で開発されたプログラミング言語である。
MesaはALGOL風の言語で、モジュール化プログラミングを強力にサポートする。すべてのライブラリモジュールは、少なくとも2つのソースファイルを持っており、ライブラリのインターフェースを指定する定義ファイルと、インターフェースないのプロシージャの実装を指定する1つ以上のプログラムファイルからなる[5]。ライブラリを使用するためには、プログラムまたは上位レベルのライブラリが定義を「インポート」しなければならない。Mesaコンパイラは、インポートされたエンティティの全ての使用で静的な型チェックをする。
Mesaは,言語設計と実装において、特にソフトウェア例外処理、スレッド同期化、インクリメンタルコンパイルなど、他にもいくつかの革新的な技術を導入した。[6][7]
Mesaは,グラフィカルユーザインターフェース(GUI)を備えた最初のパーソナルコンピューターの一つであるXerox Alto上で開発された[3]。なお、Altoのシステムソフトウェアは主にBCPLで書かれていた[2][3]。Mesaは、後のXerox Starワークステーションや、GlobalViewデスクトップ環境のシステムプログラミングであった[8]。Xerox PARCは後に、Cedarを開発したが、これはMesaの拡張仕様であった。
MesaとCedarは、Modura-2やJavaなどの重要な言語の設計に大きな影響を与え、GUIの基礎やネットワーク環境など、Xeroxがコンピューターサイエンス分野で貢献した分野の発展と普及のために重要な手段となった。
Mesaはもともと、ゼロックスPARCの分室である、コンピュータシステム研究室 (CSL) で、実験的にマイクロコード化されたワークステーションである Alto のために設計された。当時はPARCとゼロックスがAltoを寄贈したいくつかの大学に限られていた。
Mesaはその後、ゼロックス8010 (Xerox Star, Dandelion) やゼロックス6085(Daybreak)などのゼロックス社の商用ワークステーション、特にPilotオペレーティングシステムのシステムプログラミング言語として採用された。
ゼロックス開発環境 (XDE) と呼ばれる統合開発環境では、ワールドスワップ機構を使用して、オペレーティングシステムPilotとViewPoint GUIアプリケーションの両方をデバッグすることができた[9][10]。これによりワールドの「状態」全体がスワップアウトされ、システム全体を止める低レベルのシステムクラッシュをデバッグできるようになった。この技術は、大規模なアプリケーションイメージ(数メガバイト)にはあまり上手く拡張できなかった。そのため、マイクロコード化されたワークステーションは段階的に廃止され、基本的なハードウェア命令セットのためにMesa PrincOpsエミュレータを実行するSPARCワークステーションとIntel PCが採用されるようになると、後のリリースでPilot/Mesaは使われなくなった。
Mesaはスタックマシン言語にコンパイルされ、これまでで最高のコード密度を達成したと言われていた(高レベルの言語ステートメントあたり約4バイト)。これは1981年に発表された論文で、Xerox Systems Development Department (当時はPARCの開発部門)の実装者が命令セットをチューニングし、その結果として得られたコード密度に関する論文を発表したことで知られている。[11]
Mesaは、当時ゼロックスが持っていた幅広い技術を学ぶ Mesaプログラミングコースを通じて教えられ、プログラマーが「ハック」と呼ばれる有用なプログラムを書いて終わった。このようなハックの実装例としては、1988年に書かれたBWSMagnifierがある。これは、ワークステーションの画面の一部を、サイズ変更可能なウィンドウと変更可能な拡大率で定義された通りに拡大できるようにしたものである。ゼロックスで訓練を受けたMesaプログラマーは、GUI、ネットワーキング、例外、およびマルチスレッドプログラミングの基礎に精通した。
ゼロックス社内では、Mesaは最終的にCedarプログラミング言語に取って代わられた。多くのMesaプログラマーや開発者が1985年にゼロックスを退職した。中にはDECシステムズリサーチセンターでMesaでの経験を活かして Modula-2+や、後のModula-3の設計に携わったものもいる。
Mesaはモジュールの境界を越えて型チェックを行う強力な型付きのプログラミング言語であったが、型システムには十分な柔軟性があり、ヒープアロケータはMesaで書かれた[12]。
インターフェースと実装が厳密に分離されているため、Mesaは真のインクリメンタルコンパイルを可能にし、アーキテクチャやプラットフォームに依存しないプログラミングを推奨している。また、イーサネットを介したリモートデバッグなど、ソースレベルのデバッグも簡素化されている。
Mesaは、4種類の例外を含む豊富な例外処理機能を持っていた。また、モニタを介したスレッド同期もサポートしていた。Mesaは、Pilotオペレーティングシステムによって導入された概念であるモニタBROADCASTを実装した最初の言語である[13]。
Mesa言語は、ALGOLやPascalに基づいた「命令的」で「代数的」な構文を持っている。大文字と小文字を区別し、大文字のみの識別子は予約されている。予約語や定義ずみの識別子はすべて大文字で書かれる[1]。
コメントは -- から行末、または次の -- が現れるまでである。
型宣言はPascalとよく似ており、基本型(INTEGER, CARDINAL, BOOLEAN, CHARACTER, LONG INTEGER, LONG CARDINAL, REAL)、数え上げ型、サブレンジ型、配列型、配列記述子(動的配列)型、レコード型、ポインタ型、手続き型などがある[14]。型宣言をすることもできる。Mesaは静的な型付けの言語であるが、それをすりぬけるためのUNSPECIFIED(1ワードの何でもはいる型)とLOOPHOLE組み込み手続きを使った型変換がサポートされている。定義ずみのSTRING型(レコード型へのポインタ)がある。
Pascalでいう集合型はないが、範囲を指定する演算子があり、範囲チェックやSELECTの選択肢、FORループの条件などに使うことができる。
代入やIF、SELECTなどは文としても式としても存在する。
ブロックはBEGINとENDで囲まれ、ALGOLと同様に中で変数などを宣言できる。ほかにループ用のDO..ENDLOOPがある。
PARCでは、1967年版のASCIIではなく1963年版のASCIIを使用していたため、Altoの文字セットにはアンダースコアではなく左向き矢印(←)が含まれていた。この結果、MesaやSmalltalkなどを使っていたAltoのプログラマは、複合識別子にキャメルケースを使っていいたが、これはPARCの標準プログラミングスタイルに取り入れられた。一方で、左向き矢印が使用できたことで、代数演算子にも左向き矢印を使うことができた。
モジュールは分割コンパイルの単位で、インターフェースモジュールと実装モジュールがあり、これによって異なるモジュールの間で静的な型チェックができるようになった[10]。あるプログラムからモジュールを使用する場合、DIRECTORY節によって使用するモジュールを指定する。
実行時には各実装モジュールに対してフレーム(インスタンス)が生成される。NEWを使って実行時にフレームのコピーを生成することもできる[15]。
Mesaはコルーチンをサポートしている。PORTという型があり、手続きのように呼びだすことである手続きまたはモジュールから制御を移すことができる。
また、FORKを使って手続きを非同期に走らせることもできる。
複数のプロセスの排他制御のためにはモニタというモジュールの一種を作り、そこで条件変数を定義することができる。条件変数はNOTIFYすることでロックがかかり、WAITでロックがはずれる。
Mesaの設計者が例外処理機能を実装したいと検討したとき、彼らは[誰?]コロラド州で博士号を取得したばかりで、アルゴリズム言語における例外処理についての論文を書いた人物を雇った。これにより、SIGNAL、ERROR、ABORT、RETRY、CATCH、CONTINUEというプリミティブを持つ、当時としてはもっとも豊富な例外処理機能が実現した。この言語にはシグナル処理の完全なカバレッジを検証するための型安全性チェックがなかったため、補足されない例外はリリースされたソフトウェアのバグの一般的な原因となった。
Mesaは、プログラミング言語 Cedar の前身である[16][17]。Cedarの主な追加機能は、ガーベージコレクション、動的型付け、Ropeによる文字列サポートの向上、限定的な型ポリモーフィズム、マルチモジュールソフトウェアパッケージの型安全部分を識別するための特別な構文で、決定論的な実行とメモリリークの防止を実現した。