NewtonScript講座 online第1回: Newtonの開発環境
NewtonはApple Computer社が1993年に発表したPDAです。最初に発売されたMessagePad、そしてRAMが増えたりシステムに多少の修正が加わったMP100、110、120と発売され、そして95年の12月に待望のOS 2.0を搭載したMP120が発売されています。右図がNewtonの画面です。
CPUにはARM610というRISCチップを使っています。これはだいたいMacintosh II fxと同程度の性能を持つ石です。Macをご存じない方は32bit CPUを積んでいると思って下さい。
OSにはApple独自のものが使われています。もちろんMac OSではありません(笑)。Newton OSです。これはマルチタスク、メモリ管理などの基本的な性能はもちろんのこと、とてもOSと呼ぶには高級すぎる機能を持ったなかなか素晴らしいOSです。
PDAらしいOSの特徴として、ファイルという概念がない、通信機能のサポートの充実などがあげられます。ファイルがなくてどうすんだーという方、おいおい説明していきますのでお待ち下さい。
言語としてのNewton Scriptの詳細をここで説明し出すととても終わらなくなるので簡単に説明します。文法的にはpascalに近いとらしいです。これは行の終わりのセミコロンとかそういうレベルの話です。らしいというのは自分はちゃんとpascalを知らないので(笑)、人の話としてお伝えします。大文字小文字の区別もありません。次のコードは簡単なfor文の例です。
// for文 for i:=1 to 10 by 2 do print(x);扱える型は単純なものとして30bit長の整数型、文字型、ブール型、より高度なものではシンボル(symbol)、文字列、実数、配列(array)、フレーム(frame)などなど。これらの詳しい説明はちゃんとした解説書を見て調べて下さい(無責任)。この中で重要なのがシンボル、配列、フレームです。
シンボルは非常に説明するのが難しいのですが、識別子です。わかる人はこれだけで、あぁ、あれね、で済むんですが、わからない方はそのままでかまいません。サンプルの中でいずれでてきますので、そこで覚えて下さい。
配列は普通の配列です。前にpascalと似ているといったくせになぜか0ベースです(笑)。配列の型というものはありません。つまり整数型の配列などがあるわけではなく、ただの配列なのです。配列の要素としてはなんでも入れられます。一つの配列の中に別の種類の型の値を混在させてもかまいません。配列の要素としてさらに配列を入れることも可能です。そのかわり多次元配列は用意されていませんが、必要ないことはお分かりでしょう。次のコードは配列の例です。
// 配列の例 [10, "Hello", [44, 31, 16], nil, "World"]フレームはレコード型のようなものです。フィールドに相当するものはスロット(slot)と呼ばれています。このフレームがNewton Scriptの中では最も重要な働きをします。スロットも配列の要素と同様になんの値でも受け付けます。別のフレームが来てもかまいません。次のコードはフレームとスロットの参照の例です。
// 配列の例
x := {slot1: "Hanshin", slot2: "Tigers", slot3: 60};
x.slot3; // この値は60です
簡単に変数についても触れておきましょう。変数には型はありません。なんの型でも入れることが出来ます。ある型の値の入った変数に別の型の値を代入してもかまいません。値の代入は簡単な型(整数型、文字型、ブール型)の場合は変数に直接その値が入ります。それ以外の型は参照値が入れられます。変数にはローカル宣言しない限りグローバルに作成されてしまいます。PDAはコンピュータと違いリスタートの間隔が長いので、その間はずっとその変数が生き残ってしまうことになります。変数を作るときは注意して下さい。さて突然ですがNewton Scriptはオプジェクト指向環境です。別の言い方をすればNewton Scriptはオブジェクト指向言語であるとも言えるかもしれません。でもC++などをご存じの型にとってはかなり毛色の違ったオブジェクト指向環境です。この違いはいずれ説明しましょう。とにかくオブジェクト指向であること、すなわち属性の継承とメッセージ送信です。
Newton Scriptではオブジェクトの単位はフレームになります。そしてあるフレームに_protoという名前のスロットがあり、その値が別のフレームであった場合、最初のフレームは_protoのフレームのスロットを参照できます。例で説明しましょう。
x:={a:1, b:2};
y:={_proto: x, c:3};
x:={a:1, b:2};
y:={_proto: x, a:4, c:3};
上の例ではyはxを継承していますのでy.aの値は1になります。また、下の例ではxを継承したyでさらにスロットaが定義されています。この場合はyで定義した方が優先されますので、y.aの値は4になります。メッセージ送信は、あるフレームにメッセージを送ると、そのメッセージに相当するスロットに定義してある関数が実行されるというものです。
x:={say: func() print("Hi!")};
x:say(); // "Hi!"が表示される
この場合にももちろん継承が有効なので、直接そのフレームがメッセージに反応しなくても_proto階層上のどれかが反応できればいいことになります。これらのオブジェクト指向の機能は次回予定しているビューシステム(View Sysem)で大いに使われます。
まず前者の方は今のところAppleから販売されているNewton Toolkit(NTK)だけしかありません。これが標準です。この連載でもNTKを使っていきます。この原稿を書いている時点ではまだMac版しか発売されていませんが、すでにWindows用のベータ版の配布も始まっています。Mac版の最新バージョンは1.6です。下図がNTKの画面です。

別の環境としてはNS Basicというものがあります。名前からわかるとおりBasic環境です。これを使えばNewton Scriptの文法は覚えなくてもかまいません。(ただし最終的にはNewton Scriptのバイトコードに落ちるわけですから、そのときの実行環境のためにもある程度Newton Scriptに関する知識はあるに越したことはありませんが。)
実際に商品レベルのソフトを作ろうとした場合、Newton上で開発する方法はとても実用ではありませんが、日曜プログラマーにとっては非常に手軽で面白い環境だと思います。リクエストがあるようならこの連載でも取り上げてみたいと思います。しばらくはNTKで行きたいと思います。
NTKではドローソフトのような環境で画面を作りながら、ブラウザーと呼ばれるエディターで細かい設定を行います。ちょっとみには最近はやりのクラスライブラリー用の画面エディターに見えますが、根本的に違うのはレイアウトだけでなく実際のコーディングもこのブラウザー上で出来るということです。ボタンを配置したら、その場でその動作も書けるわけです。Visual Basicなどに似ているんでしょうか。知らないことは書かないことにしましょう(笑)。

