[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[OSASK 2430] Re: ASKA.



  こんばんは、川合です。


I.Tak. さんは 2001/11/11 21:14:37 の「[OSASK 2429] Re: ASKA(Re:
Readme.htm).」で書きました:

>> ところで、このページにはASKAについていろいろ書いてあったので、
>>僕なりにコメントします(なお、ASKAの文法仕様の9割は僕の好みで決
>>めました)。
> ぐう、ということは川合さんはCが好きなんですね。

  C言語が好きなのかと言われると、うーん、ちょっと悩みますが、構
文は好きです。可読性は悪くないと思います(特にアセンブラと比べれ
ば)。それで、どうせやるならできるだけ徹底してやってみよう、とい
うことです。

> あ、Cにも(ASKAにも)gotoがあるとは知りませんでした。
>別に気に入らないわけではありません。でも
>    if (ae) 文
>    if (l) 文
>とか書けたら少し嬉しいかなあ……あ、変数と紛らわしくなりますね。

  え〜、そうですか?・・・僕は、aeとかlとかはFORTRANみたいで嫌い
です(笑)。どうしてもということであれば、

#define _ae_ (unsigned) >=

などと定義しておけば、とりあえず使えます。プリプロセッサは偉大で
す!(笑)。

>>  ラベルも、
>>>    asmout("#mos_left:");
>>ではなく、C言語風に、
>>    mos_left:
>>と普通に書いても同じ効果を得られます。
> ああそれは多分、どっかにそういう風に書いてあったのをマネしたの
>だと思います。

  すみません。そういう残骸がまだ残っていましたか。かつてはASKAの
処理能力がなくて・・・と昔の苦労話を書いてもしょうがないですね(
笑)。

>>> ASKA が eax は未定義の変数だとか言い張ってエラーを出す。なわ
>>  で、どうしてeaxがエラーになるのかといえば、それはASKAがCと同じ
>>く大文字小文字を明確に区別しているせいです。もし、これが不便だと
> 大小の区別は慣れてますが(NASM使いですから)、普段全て小文字で
>書いてなんの問題も無かったんですよ。何がエラー?って悩みました。

  混乱させてしまったみたいで、すみません。でもこれは信念があって
決めた方針なので何とぞご理解ください(後述)。

> あれ、ASKAにもマクロが? ってlccがやるんでしたね。repマクロとか
>マクロ変数とかはなさそうですね。

  アセンブラみたいなマクロ変数はありませんが、プリプロセッサがで
きることは一通りできるので、結構重宝すると僕は思います。記述性を
高めるために独自拡張を施すという手もあるにはあったんですが、そう
いうことをやっていくとどんどんCらしさがなくなって、入門者が文法
を覚えるのが大変になってしまいます(今原さんが処理系を作るのも大
変になりますし)。それでとりあえず、そういう独自拡張はできるだけ
しないことにしました。

>>とは解釈しません。このような文法との整合性を取るために、
>>>    int *var == [EAX];
>>という文法を没にしました。
>(しばらく悩みましたが)分かりました。なるほどです。
>しかし…… alias int var = [DS:EAX]; とかなかったんですか。

  ええと、

    int var == [DS:EAX];

というのは文法的にはエラーじゃないです。試していないのですが、も
しこれが現在のASKA(ver.1.8beta)でエラーになるようでしたら、そ
れは僕の仕様のせいではなく、今原さんに処理系を開発するだけの時間
が十分に無かったせいです。将来のバージョンではできるようになるで
しょう。

  ちなみに僕はポインタ愛好家なので(笑)、そういう欠陥があったと
しても全く気が付いていません。僕の場合、上記の代わりに、

    int *pvar == DS:EAX;

    (offset) pvar = 0x1234;
    *pvar = ECX;

などとやるからです。

>>  そうです。ASKAは386|ASM形式で出力しますが、それは単にダイレク
>>トにバイナリーを出力するバージョンを作るのが面倒だっただけで、38
>>6|ASMの文法を踏襲するためのものではありません。
> じゃあeaxもレジスタですよねえ(^^;
>他にもニモニック関数(と勝手に呼んでしまう)がみんな大文字に
>なってるのとか。

  C言語では、インラインアセンブラ内でeaxなどが使えるのは知ってい
ます。しかし、インラインアセンブラ内の文法はもはやC言語ではなく
アセンブラです。ですから、Cの文法にそろえるとはいっても、eaxがレ
ジスタ名としてすぐに有効になるというわけではありません。

  いやもちろん、eaxもEAXもレジスタとして認識すべきであるという提
案が十分に意味のあることだということには異議がありません。しかし
それは予約語をどんどん増やすことになります。僕はC言語の美しさの
一つに予約語が少ないことを挙げているので、どちらもレジスタとして
解釈するという方針にはかなりためらいがあります。で、大文字か小文
字かと考えると、ここはあえて大文字にして、C言語の普通の変数では
ないことを強調した方が可読性が挙がるだろうと思ったのです。ニモニ
ック名が大文字に統一されているのも、この辺に由来します。

  それにプリプロセッサさえ使えば、小文字もレジスタ名として有効に
できるんですから、僕としては現在の仕様に満足しています。

  僕のおすすめは、自分の好きな言語仕様になるように#defineの山を
作って、そのファイルをいつも#includeして使っていただくことです。
プリプロセッサとの親和性が高いのもC言語の文法に似ていればこそで
これを活用しない手はありません。

  余談ですが、BASICからC言語へ移行したある知人は、

#define IF       if (
#define THEN     ) {
#define ELSE     } else {
#define ENDIF    }
#define WHILE(a) while ((a)) {
#define ENDWHILE }

などの自分専用のインクルードファイルを用意していました。これが美
しいかどうかは別ですが、これを初めて見た時は、プリプロセッサの記
述力の高さをあらためて思い知らされました。


  それでは。

--
    川合 秀実(KAWAI Hidemi)
川合堂社長 / OSASK計画総指揮 / カーネル開発班
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/