* プログラミング言語 Essen #1 -(by [[K]], 2016.07.20) ** これはなに? -まずは[[Essen]]を読んでね。ここは続きを書きます。 ** Essenの基本コンセプト -(1)C言語風の言語であること --LISPみたいなのはすごいけどやりすぎで自分に使いこなせる自信がない。代入はa=1みたいに書きたいし、加算もc=a+bで書きたい。 -(2)文法規則がシンプルで例外が少ないこと --C言語はそれほどシンプルではない。なぜfor構文の時だけカッコの中にセミコロンが書けるの? -(3)ifやforなどの構文や演算子の規則が、固定されたルールではなく、C言語で言うところのライブラリみたいなものであること --つまり制御構文を増やすこともできる。 ** 基本以外のコンセプト -インタプリタ。evalがやりたい。 -ローカル変数はある。 -変数に型はなく、値に型がある。 -gotoもある。ただしスコープのネストの内側にはジャンプできない。同じスコープか 、外側のスコープならジャンプできる(このスコープのルールさえ満たしていれば、関数の中から脱出することも可能だし、前方参照・後方参照も自由自在)。 -主にC言語で実装するが、できるだけシンプルに書きたい。 ** Essenが目指しているもの -EssenはPCを起動したらすぐ起動して、PCの電源を切るまでずっと起動したままにする感じで、シェルの代わりとして使う。 -Essenの変数はファイルの代わりに活用可能で、セーブしておくことができる。 -理想としては、すべてのPC作業をEssen上で完結させたい。 --Essenで書かれたテキストエディタがあり、Essenで書かれたゲームやツールとかもあって、それらがあれば事足りるイメージ。 --Essenはあまり大きなプログラムではないので、移植も容易で、つまり簡単にそれらの環境をさまざまな環境で再現できる。 -インタプリタなのでコンパイラ言語よりは遅いが、しかしそうはいっても速度比は10倍程度だろうと思われるので、アルゴリズムの比ほどではない(アルゴリズムの良し悪しで、速度は100倍くらい違うこともある)。つまり、Essenではアルゴリズムを追及してほしい。それでも速さが足りなければ、その時点で特に重い部分だけをC言語などで書き直せばいいと思う。何もかも高速化する必要なんてない。 ** [[Essen]]からの差分 -式評価アルゴリズムの変更: --a=2*3+4*(5+6); という式があったときに、[[Essen]]に書いたアルゴリズムではまず5+6=11を計算してしまう。 --でも世間一般で期待されているのは、おそらく2*3を先にやることだと思う。 #1: 2*3=6 #2: 5+6=11 #3: 4*11=44 #4: 6+44=50 --ということでこの順序で計算させることにした。 -整数の精度を256ビットから無制限可変長に: --nvが可変長整数を採用するらしく、それが非常にうらやましかったため(笑)。 ** C言語とは明らかに違う仕様 -(1)if文、for文、while文で、たとえコード片(コードブロックのこと)が1文しかなくても、{ }を省略することができない。 -(2)カッコは関数の引数の範囲を指定するか、もしくは配列や構造体を作る記号としての役目が割り当てられており、純粋に計算順位だけを指定したい場合は、直前にアンダスコアを付ける。 [例] a=2*_(3+4); -(3)C言語では、単に変数スコープを一段深くするために{ }を書くことがあるが、これをやるときは{ }で書くのではなく、_{ }と書くようにする。 --アンダスコアを付けないと、ただのコード片定数となってしまい、実行されない。エラーにもならない。 --アンダスコアは実は「関数」で、アンダースコア関数は、引数がコード片だったらそれを実行するし、コード片でなければその中身をそのまま返す。これにより(2)や(3)を達成している。 -(4)新出の変数に対して宣言はいらないものの、かといって何も気にせずに書けるルールにすると書き間違いが起きた時に発見できないかもしれないので、新出時には新出マークの#を付ける。 #a=3; abc.#def.#ghi = 0; abc.def.ghi = 0; // defやghiが新出でもわざわざ#は付けなくていい. ** C言語とは少し違う仕様 -文末のセミコロンは省略できる。ただしセミコロンを入れないと意味が変わってしまう場合などは、セミコロンを入れるしかない。省略は義務ではないので省略しなくても問題ない。 a = 0 b = 1 c = 2 * こめんと欄 #comment