土屋つかさの技術ブログは今か無しか

土屋つかさが主にプログラミングについて語るブログです。

冗長性の無いプログラミング言語を作ろう(2)

 でまあ「冗長性がないプログラミング言語」とはどういう物かと言いますと、よくわかりません(爆)。設計の過程で「別に冗長性は関係ないな」となったらタイトルを変えます。

起点

 今回新しく言語を作ろうと思ったきっかけは、複数のエンジニアさんと話をしていて、以下のような仮説を思いついたからでした。

・メソッドにはその構成要素である式について『個々の式に実行順序があるメソッド』と『個々の式に実行順序がないメソッド』の2種類があると考えられないだろうか?
・つまり、我々が「メソッド」と呼んでいるものは、実は2種類に分けられるのでないだろうか?
・であれば、それぞれを別の名前にすることで、コンパイラにヒントを送れないだろうか?

 この「メソッドの役割は機械的に2つに分割可能なのでは?」というのが土屋の中で興味深いアイデアだったので、その仮説を検証するために言語を設計することにしました。なので、この仮説自体が間違っていた場合、つまりどう頑張ってもこの分割不可能なケースがあると判明した場合、今回の言語開発は終了となります。

2種類のメソッド「式メソッド」と「制御メソッド」

 ひとまず、2種類のメソッドを以下のように定義します。

・式メソッド:式だけで構成されるメソッド
・制御メソッド:条件分岐/ループ/式メソッドだけで構成されるメソッド

・式メソッド
 ・式しか持たない。
 ・式メソッドは呼べる(式の中に式メソッドは含められる)。
 ・複数の式を持てる。
 ・個々の式は順序依存がない(順序依存がある場合はコンパイルエラー)
 ・個々の式の結果が全て返値となる(多値を返す)

・制御メソッド
 ・条件分岐/ループ/式メソッドしか持たない(式が記述されたらコンパイルエラー)。
 ・条件分岐/ループはどちらか一個しか記述できない(2個以上記述されたらコンパイルエラー)
 ・文同士の順序依存がある

 これだけだと仕様としてまったく不完全なので(例えば代入は式なのか制御なのかとか)、ここから仮想コードを書きながら、仕様の穴を塞いでいきます。

名前を付ける

 言語に名前がないと記事が書きにくいので、仮の名前として「uniq言語」としておきます。unique(一意)の頭4文字を取りました。

仮想コード1

 以前ブログで書いたこのコードから始めましょう。今の所予約語や文法はC#を意識しつつも仮です。

//制御メソッド
void funcA(){
  if (alpha < 1.0f){
     //処理A
  }
}

 "alpha < 1.0f"の部分が式なので、分割しなければなりません。

//フェードインが未完了の場合
bool exp isFadeinRunning(){ //"exp"は式メソッドを表す
  return alpha < 1.0f;
}

//制御メソッド
void funcA(){
  if (isFadeinRunning()){
     //処理A
  }
}

 式メソッドであることを示す為に"exp"という予約語を設定しました。これが実際に必要になるのか、それとも、コンパイラが自動的に判別できるのかについては今後検証していきます。

 お分かりかと思いますが、このように「式はメソッド化しなければならない」という言語仕様であれば、そもそも「ifの条件式の意図をコメントで説明すべきなのか、それともメソッドとしてくくりだすべきなのか」と考える必要が無くなります(なにせ言語仕様なので)。これが土屋の考える「言語仕様で冗長性を抑えることで、生産性を向上させる」ということです。