[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/