2002.04.09 「び〜とな話題」よりこの文章はB-soft掲示板の前身の掲示板「び〜とな話題」で不定期に書いたBTRONの開発に関係する話題です。何かの役に立つかもと思い今回公開してみました。 読み返してみると書き換えたい部分なども多々ありますが、敢えて手を加えずに公開することにしました。 ★viについて(その1)1999/11/05 (金) 22:46メールビュアのマニュアルにも書いたようにメールビュア(Byメールもですが)viエディタのキー操作を真似ています。 そこで、viについて簡単に書いておきますね。 UNIXを使っている方はほぼ100%、viというエディタを知っていると思います。使っているかは別ですけど。(知らないというあなた、それはモグリです。でも、最近のLinuxブームでUNIXを使い出した方はいきなりMule(Emacs)を使える環境なので知らない方もいるかもしれませんね。) viはUNIX上ではMule(Emacs)とシェアを2分するエディタです。最近はシェアは減少方向かもしれません。 viは一言でいうと、「何でこんな使いづらいエディタが存在するのだ〜。」と使い始めたときに大抵の人が思うエディタです。私もそう思いました。UNIXでviを使うか他を使うかはこのときに我慢して使い続けるかどうかにかかっていると言えましょう。 ★viについて(その2)1999/11/05 (金) 22:49で、何が使いづらいかというと、viはコマンドモードと入力モードというモードがあるエディタなのです。Vzや秀丸など大抵のエディタはモードレスなものです。だから、キーボードを押すとその字が入力されるわけです。viではモードがあるのでキーを押しても字が入力できない。入力するには入力モードに切り替えるコマンド(iなどのキー)を指定しなければいけない。カーソルの移動はコマンドモードなので、テキストを編集するには、コマンドモードでカーソルを移動して、入力モードにして文字を入れて、またコマンドモードに戻ってカーソルを移動するというような繰り返しになるので、始めはめちゃめちゃ頭にきます。 では、なぜviがUNIX上で人気を2分するようなエディタなのでしょう?それは使いやすいからです。喉元すぎれば熱さも忘れるというように、キーの操作になれてくると、手を大きく移動させずに操作ができるviは非常に使いやすいのです。カーソル移動はh、j、k、lに割り当てられているので、ホームポジションに指を置いたまま操作できるのです。 何を言いたいか良く分からない文章になっちゃいましたけど、viとはそんなエディタなのです。 ★BTRONのファイル構造について(その1)1999/11/07 (日) 11:53今回はBTRONのファイルについて書きますね。 BTRONのファイルは複数のレコードから構成されています。 レコードとは実際のデータだと思えば良いでしょう。テキストデータや、プログラムなどのバイナリデータなどですね。 DOSやUNIXは1ファイルが1レコードになるので、「このテキストファイル」と言った場合、直接その中のテキストデータを指すことになります。 でも、BTRONの場合は、1つのファイルの中に関連したテキストデータやバイナリデータが別々のレコードとして一緒に保存されているで、「このファイル」と言うと、それら一まとめのものを指すことになります。 ★BTRONのファイル構造について(その2)1999/11/07 (日) 11:55で、このようなファイル構造を頭に入れておかないとBTRONのプログラム開発ではちょっと戸惑うことになります。DOSなどではファイルを開く(open)と、すぐにデータを読み書きしたり(read, write)、シーク(lseek)したりできるのですが、BTRONではファイルをオープン(opn_fil)した後、その中のどのレコードを操作するかを指定する必要があります。その関数がsee_recやfnd_recです。これでレコードを指定してあげて、やっとデータの読み書き(rea_rec, wri_rec)ができるのです。つまり、マルチレコード構造のためDOSなどより1つ手順が増える訳ですね。 このマルチレコードのファイル構造と、BTRONの特徴である実身/仮身との関係や、どういったレコードの種類があるかはまたそのうち。 ★BTRONのファイル構造(実践編)(その1)1999/11/08 (月) 22:56前回はBTRONのファイルとレコードの関係の話をしましが、今回はその実践編です。コンソール小物を使ってファイルとレコードの関係を見てみましょう。はじめに、小物メニューからコンソールを起動してください。ウインドウが開いて、[/SYS/WORK]%というプロンプトが出ると思います。 /SYS/WORKは現在いるディレクトリを示しています。あれ!BTRONにはディレクトリは無いのでは?と思うかもしれませんが、コンソール小物では実身/仮身の構造をディレクトリ表記で表示しています。 B-right/Vを起動したときに始めに開く初期ウインドウに対応するディレクトリは/SYS/USRなので、とりあえずそこに移動してみましょう。 cd /SYS/USR cdコマンドはDOSやUNIXと同じですね。ついでに説明すると、現在のディレクトリ内のファイルを表示するコマンドはlsです。UNIXと同じ。DOSのdirに相当するものですね。早速使って見ましょう。 ls ★BTRONのファイル構造(実践編)(その2)1999/11/08 (月) 22:59lsを実行すると初期ウインドウの中にある実身名(ファイル名)が表示されると思います。 それでは、今回の目的であるファイルの中のレコードを見ることにしましょう。ファイルのレコードを見るコマンドはfsです。 fs <ファイル名> と入力すると指定したファイルのレコードが表示されます。各行の一番左に出る数字がレコード番号で、1行が1レコードに対応します。fsコマンドで表示された行数の数だけのレコードをこのファイルが持っているということです。 他のディレクトリやファイルもcd, ls, fsを使って色々と見てみてください。まだ説明していませんが、実身/仮身とレコードの関係が見えてくると思います。 ★レコードタイプについて(その1)1999/11/09 (火) 23:09もう少し詳しいレコードの話をしますね。 レコードはテキストデータやバイナリデータが入るところと前に書きました。BTRONではレコードにどういったデータが入っているかを区別するためにその種類が定義されています。 これをレコードタイプと呼んでいます。BTRONでは0〜31の32個のレコードタイプがあり、それぞれ異なる定義がされています。 つまり、このレコードに5番というレコードタイプをつけるなら、これこれこういうデータ構造のデータを書き込まないとゆるしません。というような定義がされているわけですね。 この32個のレコードタイプがそれぞれどういうものとして定義されているかは3Bの仕様書や1Bのプロハン(BTRON1プログラム標準ハンドブックのことですね)に譲るとして、とりあえず押さえておくのは、0番と1番と8番の3つのレコードタイプ。 ★レコードタイプについて(その2)1999/11/09 (火) 23:100番はリンクレコード、1番はTAD主レコード、8番は実行機能付箋レコードと呼ばれています。 各レコードがどういったものであるかはまた後に説明するとして、再びコンソール小物で各ファイルにどういったレコードタイプのレコードがついているかを見てみてください。 コンソール小物でfsコマンドを実行したとき、各行の一番左側の数字はレコード番号と説明しましたけど、2番目のの数字は今日お話したレコードタイプを示しています。0や1や8が多いかと思います。 ★の発言について1999/11/10 (水) 19:48タイトルに★印がついたものは、BTRONの開発をしてみたいという方に少しでも役に立つかと思って、私が理解している範囲で、勝手に書いているものです。何の説明もせずに唐突にはじめちゃいましたけど。(注:何の説明もなく唐突にやめちゃうかもしれないです) 興味のない方は★印の発言は読み飛ばしてください。 それと、特に毎日出すとかというわけではなく、不定期なものです。 内容も突然違う話題に行ったりすると思います。 質問は歓迎です。答えられるかどうかはわかりません。 ★リンクレコード1999/11/11 (木) 23:06レコードタイプについて それでは、後回しにしていた0,1,8番の各レコードタイプの説明をしていきますね。 0番のレコードタイプはリンクレコードと呼ばれています。 名前の通りリンク情報がこのレコードに入っています。リンクとはなにかというと、このファイルが他のファイルとつながっているということ。私はこのファイルと関係していますよということです。で、このレコードにはリンク先のファイルに関する情報が入っています。 察しがいい人はもうわかっちゃてると思いますけど、このリンクレコードが、このファイルをウインドウとして開いたときに中にある仮身と1対1に対応しています。開いたウインドウの中で使われている仮身の数だけリンクレコードとして保存されている訳です。 例えば、基本文章の中で2つの仮身が使われているとすると、そのファイルには2つのリンクレコードが保存されています。 実際に仮身の入った基本文章をコンソール小物のfsコマンドで見てみればわかると思います。文章の中の仮身を増やしたり減らしたりして、fsコマンドでレコードを表示させると良いでしょう。 実際にこのリンクレコードがどういう使い道があるかは別の機会に説明しますね。 ★TAD主レコード1999/11/11 (木) 23:08次は1番のレコードタイプの説明です。 1番のレコードタイプはTAD主レコードと呼ばれています。これは、このファイルの主となるデータが保存されています。例えば基本文書エディタであればテキストデータがTAD形式でこのレコードに保存されています。 TADに関してはいずれ説明するとして、とりあえずは、このレコードには、テキストデータや図形データなど利用者が作ったデータが保存されていると思ってください。 これも同じように基本文章で文字を書いたり削除したりして、fsコマンドで見てみると、タイプ1のレコードの容量が変化するのがわかると思います。レコードの容量はfsコマンドで表示される各行の一番右に表示される数字です。 ちなみにリンクレコードの場合、一番右の位置には数字の代わりにリンク先のファイル名が表示されます。 ★実行機能付箋レコード(その1)1999/11/11 (木) 23:10最後に8番のレコードタイプですが、これは実行機能付箋レコードと呼ばれています。 これは名前の通り、実行機能付箋のデータが保存されているレコードです。 プロハンでは、 「実身の実行メニューとして表示され、実行される機能付箋である。」 という、わかった人が読めばわかる、大変親切(もちろん皮肉)な説明で記述されています。仕様書なので仕方がないのですが、プロハンの記述はこんな感じの文が多いです。 で、上の文で理解できた方はそれでOKなのですが、もう少し説明しときますね。この文の前半は、メニューの「実行」で表示される付箋を表すということです。つまり、メニューの「実行」のところでアプリケーション名がいくつか表示されますが、この数はファイルに付いている8番レコードの数だけ表示されるということです。 ちなみに、付箋イットはこの8番レコードをファイルに追加するソフトです。 これも、fsコマンドを使って、メニューの「実行」で表示されるアプリケーション名の数と、8番レコードの数を比べてみると関係が良くわかると思います。 ★実行機能付箋レコード(その2)1999/11/11 (木) 23:11で、プロハンの説明文の後半は何をいっているかというと、実はよく分からない。多分、実行機能付箋は実行できますよということ。つまり、付箋のオープン起動ができますよということを言いたいのだと思います。付箋のオープン起動とは、付箋をダブルクリックして実行することですね。 B-Softでは付箋をダブルクリックするとバージョン表示がされるという、いんちきな作りをしていますけど、本当は付箋が貼られたところの実身を使ってアプリケーションを起動するような用途で使われものです。たとえば、基本印刷の付箋を文章に貼って、ダブルクリックすると、貼られている文章が印刷されるというような用途で使われます。 以上、3種類のレコードの役割はわかっていただけたでしょうか。 ★データを読み込む(その1)1999/11/18 (木) 21:22ちょっと間が空いてしまいましたけど、これまで説明したところまで頭に入っていれば、DOSやUNIXでファイル操作のプログラムを書いたことがある人は、BTRON上でファイル(実身)に保存されているデータを読み書きするのは簡単です。 DOS/UNIXの場合、ファイルからデータを読み込むには、ファイルを開く、データを読む、ファイルを閉じるという操作順になりますが、BTRONではファイルを開く、レコードを選択する、データを読む、ファイルを閉じる、という操作順になることは前にも説明しましたね。 これを行うための標準関数(API)を以下にまとめておきます。 DOS/UNIX BTRON レコードの選択のfnd_rec()は、指定したレコードタイプを検索することでレコードを選択する関数ですが、直接レコード番号を指定してレコードを選択するsee_rec()とうのもあります。 ★データを読み込む(その2)1999/11/18 (木) 21:22もちろん、上のAPI以外にもデータを書き込むwri_rec()なども含めいくつかのファイル操作用のAPIがBTRONの仕様として用意されています。それらを適便、調べて使ってください。 ちなみに、ファイル操作関連のAPIは仕様書の「OS核 ファイル管理機能」というところにまとめて記述されています。 これでもうBTRON上でデータを読み書きできます。と、言いたいところなのですが、もう一つあります。 その説明を始める前に、BTRONでのデータ型(intとかcharとかのことね)のことを説明しておきます。BTRONのアプリケーション開発で主に使うデータ型は以下のようなものがあります。
B 符号付き8ビット整数
UB 符号無し8ビット整数 TC TRON文字コード(2バイト)のデータ このうち一番良く使うのはWですね。その次に、文字を扱うためのBとTCというのが良く使うデータタイプです。 W tmp; TC tcode[100]; などという感じで使用します。 ★データを読み込む(その3)1999/11/18 (木) 21:23それで、データの読み書きでもう一つ説明することとはファイルを開くときのopn_fil()関数の引数についてです。opn_fil関数は以下のように定義されています。 opn_fil(LINK *lnk, W o_mode, TC *pwd) o_modeやpwdは仕様書を見ていただければ特に問題ないとして、問題は一番始めの引数のlnkです。 DOS/UNIXでは、 open("test.txt", O_RDONLY); という感じで、開きたいファイル名を引数として渡してあげれば良いのですが、BTRONではそう簡単にはいきません。 BTRONではファイルを開くときはリンク(構造体)を引数として渡さなければいけません。 BTRONではディレクトリという構造はなくフラットな環境にファイルが存在しています。そして、ファイル名(実身名)の重複を許しているため、ファイル名だけではファイルを一意に特定できないため、opn_filの引数としてファイル名が使えないのです。 ファイル名に代わり使われるリンクの構造は以下のように定義されています。
typedef struct{ ★データを読み込む(その4)1999/11/18 (木) 21:28このリンク構造体の中身のうち「ファイル管理機能」のAPIで使われるのは、fs_nameとf_idの2つ。つまり、この2つを使ってファイルを特定しているっていうことですね。他のatr1〜5は「ファイル管理機能」では使っていません。外核の実身/仮身マネージャーあたりで使用しています。これらについてはいずれお話するかもしれません。 それで、始めの2つの変数についてですが、fs_nameはファイルシステムの名前です。ファイルシステムとはハードディスクだとかフロッピーディスクだとかのファイルを保存しておく場所のことです。決してここにファイル名が入っているわけではありません。あくまで、ファイルシステム名です。2番目のf_idはfs_nameのファイルシステムに保存されているファイルのユニークな番号です。つまり、BTRONではファイルシステム名とその中の一意に付けられた番号でファイルを管理しているのです。 と、LINKの中身を説明しましたが、実際にアプリ開発者がこの中身を直接いじることはあまりしません(少なくとも私はしたことないです)。 それじゃ、このLINKというのはどこから持ってくるのだ、という話になるわけですが、その話はまた今度。 |