このすみノート

Webエンジニアが技術や趣味を書くブログです。

くいなちゃんのKuinというプログラミング言語が凄い件

Kuinというプログラミング言語があります。

簡単で高速な実用プログラミング言語「Kuin」です!
http://kuina.ch/

Kuinというプログラミング言語は「くいなちゃん開発チーム」によって開発されています。10月17日に大規模アップデート版のリリースも決まっており、開発も精力的です。

v.2017.10.17
・数学・科学・アルゴリズムライブラリ「math」の追加
・正規表現ライブラリ「regex」の追加
~以下、省略。全文は下記のURLを参照してください~ http://kuina.ch/kuin/a201

本筋とは関係ないけど、バージョン番号を日付にするのって珍しい気がする。

公式レポジトリ

公式レポジトリはGitHubにあります。一見してみたのですが、コード内にコメントがほぼないので、ソースコードを読み解くのは難しいかもしれません。でも、コードは綺麗です。

github.com

くいなちゃんとの出会い

私がくいなちゃんを知ったきっかけは、Twitterのリツイートでした。

twitter.com

当初は、何かのキャラクターなのかな程度に思っていたのですが、調べてみたら、なんとプログラミング言語をリリースしているではありませんか!

エンジニアとしては好奇心に駆られますので、早速パソコンを引っ張り出しました。

なお、Kuinの開発環境はWindowsです。私は普段Macを使用していますが、サブ機のWindowsを引っ張り出しました。

Kuinを習得する方法

Kuinの習得は、チュートリアルで行います。丁寧なチュートリアルなので、チュートリアルに沿って進めていくだけで、ゲームが完成します。

「プログラミング言語Kuin」を初めて触る人に向けたチュートリアルです。 Kuinチュートリアル1 はじめてのKuin - プログラミング言語「Kuin」 - Kuina-chan

開発の様子

f:id:konosumi:20171015145557p:plain

お手軽だけど高性能なプログラミング言語

私が驚いたのは、開発を始めるまでの敷居の低さです。「kuin_日付.zip」のファイルをダウンロードして、kuin.exeを起動するだけで開発環境が整います。

言語を書いている感覚は、なんとなくRubyに近いような気がしています(ただの私的な直感です)。アットマークを変数の前につける文法は、私が今まで触った言語の中ではRubyでしか見たことがないな。

(注釈:Objective-Cの@"文字"とか、Perlの配列とか、数え上げればもっと色々あります)

Kuinでは、ローカルなものの識別子を指定するときは名前そのままを書き、グローバルなものの識別子を指定するときは名前の前に「@」を付けて書きます(図1-1)。
http://kuina.ch/kuin/b09

個人的に面白いなと感じたのは、文法のドキュメントに「設計の理由」が書いてあるところです。しっかり考慮された上で文法が設計されているので「設計の理由」を読むだけでもかなり勉強になると思う。

「設計の理由」を読んでいくと、過去の様々なプログラミング言語の設計に由来しているのだなということが分かります。

チュートリアルで制作したサンプルコード

チュートリアルを終えたので、完成したサンプルコードを以下に掲載します。

「コンパイルがすごく早い!」というのが素直な感想です。コンパイルから実行まで1秒もかかってないので、凄く快適です。

class Pos()
  +var x: float
  +var y: float
  +var veloX: float
  +var veloY: float
end class
  
var player: @Pos
var enemy: @Pos
var wndMain: wnd@Wnd
  
func main()
  do @wndMain :: wnd@makeWnd(null, %aspect, 1600, 900, "くいじゃん")
  do wnd@makeDraw(@wndMain, 0, 0, 1600, 900, %scale, %scale, false)
  do draw@clearColor(16#FF333366)
  do @player :: #@Pos
  do @player.x :: 400.0
  do @player.y :: 800.0
  do @enemy :: #@Pos
  do @enemy.x :: 1500.0
  do @enemy.y :: 800.0
  do @enemy.veloX :: -10.0

  while(wnd@act())
    if(lib@dist(@enemy.x, @enemy.y, @player.x, @player.y) < 50.0 + 40.0)
      do draw@rect(0.0, 0.0, 1600.0, 900.0, 16#FFCC3333)
      do draw@circle(@player.x, @player.y, 50.0, 50.0, 16#FFFFFF00)
      do draw@circle(@enemy.x, @enemy.y, 40.0, 40.0, 16#FFFF0000)
      do draw@render(0)
      do lib@sleep(800)
      do @wndMain.close()
    end if
    do @enemy.x :+ @enemy.veloX
    if(@enemy.x < -40.0)
      do @enemy.x :: 1640.0
      do @enemy.veloX :: -lib@rndFloat(6.0, 50.0)
    end if
    do @player.veloY :+ 1.0
    do @player.y :+ @player.veloY
    if(@player.y > 800.0)
      do @player.y :: 800.0
      do @player.veloY :: 0.0
    end if
    if(input@pad(0, %a) = 1 & @player.y = 800.0)
      do @player.veloY :: -20.0
    end if
    do draw@circle(@player.x, @player.y, 50.0, 50.0, 16#FFFFFF00)
    do draw@circle(@enemy.x, @enemy.y, 40.0, 40.0, 16#FFFF0000)
    do draw@render(60)
  end while

end func

さいごに

Kuinは「クラス名@関数名」みたいなスタイルの文法なので、アットマークが押しやすい位置にある日本語キーボード向けだなぁとか、細かくあげれば色々と所感はありますが。

くいなちゃんの言うように、今後ライブラリがより充実してきたら、高速性を武器に3DやAIや科学技術への発展の可能性も秘めた言語な気がする。

なにより、オブジェクト指向のサポートやメモリの自動開放といった我々が望むツボを押さえた上で、なおかつコンパイルが早くてサクサクなので、トライアンドエラーな書き方に向いているところが素晴らしいです。

KuinにおけるHello, world!

最後に余談ですが、Kuinは何も書かないと「Hello, world!」が出力されます。なので、何も記述しない0行のサンプルコードが成立します。一時期アメリカで話題になった、10分間「無音」の曲のごとく。

nlab.itmedia.co.jp