プログラミング言語Kuinの言語仕様を、自分なりに補足しながら整理しました

少し前に、Kuin言語の本を書いてみたいという記事を書きました。あれから、時間を見つけてはKuin言語で遊んでます。

www.konosumi.net

まだチュートアリルを終えたくらいですが、とても楽しいです。Windows向けのアプリケーションになりますが、GUIのゲームがシンプルに作れます。

f:id:konosumi:20181024223226p:plain

基本文法や構文について勉強し、自分なりに補足なども加えてみました。せっかくですので、記事としてまとめてみます。

Kuin言語の思想について

Kuin言語の「設計の理由」を読んでいると、Pascalに多く影響を受けていることが分かります。

Pascal - Wikipedia

Pascalはプログラミング教育を意識している言語のようですが、Kuinもまた似たような印象を受けます。

GUIプログラミングは華やかな世界なので、プログラミングの取っ掛かりとしては最適なのではないかと思います。

言語仕様は公開されている

Kuinの言語仕様は、公式サイトで公開されています。

プログラミング言語「Kuin」

特に面白いのが、言語設計の意図や理由が記載されているところです。言語の細かい設計理由が語られる機会は、そう多くはありません。

なので、Kuin言語を使わない方であっても、読んでみると楽しめます。

設計の理由

このルールは「キャメルケース」と呼ばれますが、このルールを採用した理由はタイプ数もコード量も少なくなるためです。

また、グローバル変数とローカル変数とがぶつからないように別の命名規則を定めることがよく行われますが、Kuinではグローバルなものには先頭に「@」を付けるという構文ルールがあるためキャメルケースで統一しています。

引用:http://kuina.ch/kuin/spec1

Kuin言語仕様1

Kuin命名規則

Kuinの標準ライブラリで使われている規則を、Kuin命名規則と言います。ユーザーが開発するアプリも、Kuin命名規則に準拠して開発することが望ましいです。

Kuin言語仕様1 命名と予約語 - プログラミング言語「Kuin」

そんなに特筆するところはなく、わりとスタンダードだと思います。

ソースコード内は基本的にキャメルケースですが、ファイル名だけはスネークケースである点に注意が必要です。

Kuin略語辞典

Kuinで頻出する略語は、Kuin略語辞典にまとまっています。

Kuin言語仕様12 Kuin略語辞典 - プログラミング言語「Kuin」

「慣習的によく略されている単語は略す」の判断基準は、意外と難しいです(他の言語でも言えることですが)。

私的には、Linuxコマンドで略されるような略語が、慣習的によく略されている略語の判断基準なのかなと感じています。

Kuin言語仕様2 Kuinの型とリテラル

Kuin言語仕様2 型とリテラル - プログラミング言語「Kuin」

値型と参照型は、他のプログラミング言語の「値渡し」や「参照渡し」と、ほぼ同じです。値型は値そのものをやりとりし、参照型はメモリ参照をやりとりします。

文字列型がなく、"abc"が文字(char)の配列になるのは、C系のプログラミング言語に近いかもしれません。

配列に種類があります。リスト・スタック・キューは、FIFO(先入れ先出しや)やLIFO(後入れ先出し)などに特化したデータ構造です。データ構造を適切に選択できれば、パフォーマンスが重視される局面で重宝します。

Kuin言語仕様3 演算子

Kuin言語仕様3 演算子 - プログラミング言語「Kuin」

代入演算子が「a :: b」なのは、Pascal由来です。他にも、いくつか私は初めて見るような文法がありました。

// キャスト
a $ t

// インスタンス生成
#t

// 参照比較演算子
a =& b

// 型比較演算子
a =$ t

// 条件演算子(三項演算子)
a ?(b, c)

// 代入演算子
a :: b

取り急ぎは、型は「$」で表現し、インスタンスは「#」で表すくらいに理解しておくことにします。

Kuin言語仕様4 変数と関数

Kuin言語仕様4 変数と関数 - プログラミング言語「Kuin」

変数は「var」で宣言しますが、これもPascal由来です。

; var 変数名: 型名 (:: 初期値)
var str: []char :: "abcde"

スコープ周りはスタンダードで、あまり特筆するところはありません。

関数定義は、波括弧ではなく「func ~ end func」で括ります。個人的には、波括弧よりも見やすくて好きです。

func 関数名(引数名1: 型名1, …): 戻り値の型名
     関数の中身
end func

Kuin言語仕様5 文とブロック

Kuin言語仕様5 文とブロック - プログラミング言語「Kuin」

「return」は「ret」です。さらには「else if」が「elif」だったりします。

Kuinは、言語レベルで省略できるものは省略する方向で設計しているように見受けられます。

設計の理由

多くの言語では「return」ですが、x86アセンブリでは省略形の「ret」が使われるため、短いほうを採用しました。

引用:http://kuina.ch/kuin/spec5

基本構文も、関数と同じくendで構文を閉じます。

for(初期値, 終値, 増減値)
  処理
end for

if(条件)
  処理
end if

switch(比較する値)
case 値1
  処理
default
  処理
end switch

try
  処理
catch 例外コード
  処理
finally
  処理
end try

while(条件)
  処理
end while

Kuin言語仕様6 列挙型

Kuin言語仕様6 列挙型 - プログラミング言語「Kuin」

enum 名前
  要素名1
  要素名2
  要素名3 :: 要素の値
  …
end enum

Kuin言語仕様7 クラス

Kuin言語仕様7 クラス - プログラミング言語「Kuin」

以下の3つは、他の言語ではあまり見かけない書き方かと思います。抑えておいた方が良さそうです。

  • メソッド内では、自身のインスタンスを「me」という変数で参照します。
    • 注釈:selfやthisではありません。
  • プラス(+)はパブリック宣言です。
  • アスタリスク(*)はオーバーライド宣言です。

「self」よりも「me」のほうが短く書ける・・・など、Kuinは短く書くことを重視した言語思想が根底にあるように感じています(注釈:私の推測です)。

func main()
  class Parent()
    ; プラス(+)はパブリック宣言です
    +func f(n: int): int
      ret n * n
    end func
  end class
  
  class Child(Parent)
    ; アスタリスク(*)はオーバーライド宣言です
    +*func f(n: int): int
      ; meは自分自身のインスタンスです
      ret super(me, n) + n
    end func
  end class
  
  var child: Child :: #Child
  do cui@print(child.f(3).toStr() ~ "\n")
end func

Kuin言語仕様8 組み込みメソッド

Kuin言語仕様8 組み込みメソッド - プログラミング言語「Kuin」

Kuin言語仕様9 スコープとファイル

Kuin言語仕様9 スコープとファイル - プログラミング言語「Kuin」

スコープ周りは、特筆するところはありません。

Kuinのプログラムを複数のファイルに分割して書いた場合、他のファイルのコードは「\ソース名@識別子」というように呼び出します。

なお、他のファイルから呼び出しを想定している場合は、定義の先頭に「+」を付ける必要があります。

func main()
  ; 別のソースは「\ソース名@識別子」
  do \other@f()
  ; 標準ライブラリとして用意されているものは「ソース名@識別子」
  do kuin@wait(1000)
end func

Kuin言語仕様10 その他の構文

Kuin言語仕様10 その他の構文 - プログラミング言語「Kuin」

コメント

複数行コメントは、波括弧「{」と「}」で括ります。Pascalに由来します。特徴として、コメントは入れ子が可能です。

{
コメントです
コメントです
コメントです
}

単一行コメントは、行頭を「;」で開始します。x86アセンブラに由来します。

; コメントです

行分割

Kuinでは、単に行の途中で改行するとコンパイルエラーとなります。 途中で改行したい場合は、改行した直後の行頭に「|」を記述します。

func f()
  do @g
  |(
  | 2 + 3,
  | @a * @b,
  | @h()
  |)
end func

先頭に記述する理由は、Kuinは行頭に情報が集まる言語だからです。

設計の理由

Visual BasicやC言語のマクロなどでは、行の途中で改行する場合に行末に特定の文字を記述しますが、Kuinは行頭に重要な情報が集まります。

改行中かどうかが行頭で判断できるようにしました。

引用:http://kuina.ch/kuin/spec10

Kuin言語仕様11 コンパイラとIDE

Kuin言語仕様11 コンパイラとIDE - プログラミング言語「Kuin」

Kuinは、コンパイラとIDEがセットになっていることが特徴です。

環境のセットアップが不要なので、そういう意味でもプログラミングの教育に向いている言語である気がしています。

Kuin言語仕様12 Kuin略語辞典

Kuin言語仕様12 Kuin略語辞典 - プログラミング言語「Kuin」

4文字以下は省略しません。

Kuin言語仕様13 Kuinコンパイルエラー

Kuin言語仕様13 Kuinコンパイルエラー - プログラミング言語「Kuin」

Kuin言語仕様14 Kuin例外コード

コンパイルエラーや例外コードは、エラーが発生した時や必要になったら参照すれば良いと思います。

Kuin言語仕様14 Kuin例外コード - プログラミング言語「Kuin」

Kuin言語仕様15 Kuinコンパイル時定数の仕様

ほとんどのリテラルはコンパイル時に定数になります。定数同士の加算は結果も定数になることが保証されており、「5 + 3」はコンパイル時定数になります。

Kuin言語仕様15 Kuinコンパイル時定数の仕様 - プログラミング言語「Kuin」

さいごに

Kuinの言語を学んでいて感じることは、以下の3点です。

  • Pascalの影響が色濃いです。
  • 短くコードが書けることを重視しています。
  • 設計の理由がしっかり記載されており、意図の見える言語設計になっています。

まだ慣れない文法も多いのですが、慣れると、短く書けることが快適に感じられるようになるかもしれません。

しばらく触ってみたら、また感想を共有していきたいと思います。