忍んでいる肉球の足跡

プログラムに関連することを雑多に扱います

Kuinのドキュメントの感想

Kuinとは?

くいなちゃんが作成したプログラミング言語

twitter.com

Kuinのダウンロードと紹介 - プログラミング言語「Kuin」 - Kuina-chan

曰く、”簡単で高速な実用プログラミング言語
詳細は上記ページで読める。
近代のプログラミング手法の合理をどう設計に取り込んでいったのか。
それを「設計の理由」で読めるのでとてもわかり易いドキュメントで、
何を狙いにしているかがめちゃくちゃわかりやすかった。

Kuinのドキュメントを読もう!!

私がドキュメントを読む気になったのは、TLで流れてきたのとかなり手放しで褒められていたから気になったっていうのがある。 実際に読んでみると、初学者向けの言語として私も褒めたくなってしまった。

Kuinは「日本人のプログラミング初心者用の言語」として、とてもいい言語だと思う。 CやBASICのような旧来的な部分を取り除いて、近代的なプログラミングを学ぶことが出来る。 つまらない部分(下手なハマり方、環境構築、アルゴリズム・外部ライブラリ調べ等)を言語設計の方で、かなり潰しているのが伝わってくる。

逆算して

  • くいなちゃんが初心者がつまずくポイントをどう捉えているのか
  • 他の初心者言語と比べてどこが改良されているのか

等を考えていたから、文字起こししてみたのが今回の記事。

目次

Kuinのいいなって思った部分の紹介

Kuinの言語設計でいいな思った部分について深掘りしてく。
「設計の理由」を読めば、わかることばかりだけど前提としての補足とかを書く。

Kuinの言語設計の方針(の推測)

ドキュメントを読んでいて気づいたのは一貫していること。

  • 日本人のプログラミング初心者に混乱させない
    • テキストエディタでもコーディングできる短さを重視する
    • 近代的プログラミングの基礎を学べるように設計する
    • ゲームを作るための道筋でプログラミング以外のつまずく要素を排除する

ていう設計意思を感じ取った。

コーディング規則に関する部分の一覧

ドキュメントの中でコーディング規約の部分についてもかなり言及や改良がされていることに気がつく。

主に、

  • 近代的なコーディングに矯正(強制)する部分
  • コードの短さを保つための部分

に分かれている。

可読性に関して矯正・強制する部分
  • タブによるブロック記法の採用
  • switch case文の改良
  • const,varで定数と変数を分けること
  • 返り値がないならdoで明示する
  • 演算子関連
    • a :: b (代入)
    • a ?(b, c) (条件演算子
    • |,& (bool演算)
    • バイト列演算を関数化
  • \srcFile@globalVariable(外部ソースからの読み込み)
  • 待ち行列関連
    • 待ち行列の充実(stack, queue, list, array, dict)
    • 配列操作関数の充実
コードの短さを保つための部分
  • キャメルケースの推奨
  • 演算子関連の充実
    • a :$ bスワップ演算子
    • ^t(length)
    • #t(new)
    • ##a(ディープコピー)
    • a $> t(バイナリ符号化)
    • a $< t(バイナリ復号化)
    • +,* (private, overwrite)

代入::

例えば、Kuinだと代入は::。 これは他の言語だと珍しい。

珍しい理由は一番流行ったC言語とその派生が

  • = ←代入
  • == ←比較

だったから。

Cの派生では代入は慣習を壊さないように=が多い。
疑問に思わなかったけど、代入で=を利用するのは初学者に優しくないのかもね。

  • ===はタイポし易いこと、
  • 数学で等しいと意味が違うことで混乱する

今ではIDEで気がつけるけど、テキストエディタで条件式に=ってタイポして無限ループを発生させるのはあるあるだよね。 そう考えると、::はとてもわかり易いし、混乱させにくい設計になっていることがわかる。

switch case文の改良

  • break文を廃止していること
  • 一つのcaseで複数の条件をまとめて処理できるようになっていること

switch内のbreak文はcase文を手動最適化するためなので、通常用途では要らない。 だから高級言語だとbreak制御は少なめ。 switch caseというC言語の部分を引き継ぎながら範囲や複数の判定を許容して、コードが変わらないのはわかりやすい。

以下に見るように多くの言語でbreak文が廃止されている。
不自然だもんね。仕方ない。

あと、switch caseに関する豆知識。

  • Pythonのようにswitchは廃止されてて、if elseオンリーな言語もある
  • Rubyのようにcase whenだったり、ブロック自体が値持ったりするから書く人によって形がかわる言語もある
  • goやswiftのように、fallthroughbreakしないで次のcase文を読む)で対応する言語も有る

日本語エラー

地味にいいなって思った部分。
エラーが母国語で表示できることはアド。
エラーが母国語以外だと前提に語学力が必要になる。
機械翻訳はそれなりに仕事するけど、結構足りてないことが多い。

ゲームを作りたい時に必要な機能の網羅

ゲームやツールを作りたいって考えた時に必要な部分が標準機能として揃っているのがとてもいい

  • セーブデータのためのバイナリ符号復号化
  • リリースのためのデバックデータを排除してビルドできるようになっているし、
  • GUIメニューやボタンの作成と利用
  • グラフィックの描画機能を標準機能として実装済
  • 複数の待ち行列の利用(stack, queue, hash, list)

これらの要素は他の人にソフトを配布出来るソフトや機能を実装したいと思った時に、 だいたい調べる機能では有るけれど、言語の標準機能としてはまとめられていない気がする。

これらのことをするためには以下の手順を繰り返しながらやらなきゃいけない。

  1. どうやるか一つ一つ調べる
  2. アルゴリズムやどう動作するのかを理解する
  3. ライブラリを選択する
  4. ライブラリを取得して正しい場所に配置する。
  5. 利用方法やリファレンスをキチンと読んで利用する

)× n回

検索→理解→選択→構築→利用
と複数の種類の違う挫折ポイントが内包されている。

これらは環境構築に近く、非常に退屈で飽きてしまう作業である。 その部分を排除するために、標準のドキュメントや環境に含まれていることで参照する場所がわかりやすく プログラミングの難しさ以外の部分で折れてしまうことを防ごうとしているように見えた。

初心者言語と呼ばれる言語について私見

BASIC

メリット:
  • 高校の教科書に載る古典。
デメリット:
  • 古典であること
  • 標準で利用できる描画関数ことはすごいが応用が聞きにくい
  • コーディング作法の悪習を強要される
総評:
  • 日本のカリキュラムで教えている理由が謎。

C

メリット:
  • 現代のプログラミングの基礎、構造化プログラミングの走り。
  • いろんな言語でこの言語の片鱗を感じることが出来る。
  • なんでも作成できる。
デメリット:
  • 非常に学習コストや環境構築コストが重い。
  • 特に、ポインタやヘッダファイル、メモリ管理は直感的でない。
  • (includeを利用しないで利用できる)標準関数が少なすぎる。
  • アセンブリや低層レイヤーを触るなら非常に有用だが、簡易なソフトでは利用しない知識。
  • ライブラリがWeb上に散乱して居ること
  • 教育用にC89の作法が常態化しているという個人的な私怨。
  • 制限のきつい分、アルゴリズムの勉強を強制しやすいという意見が嫌い。
総評:
  • BASICよりはまし。
  • 初学者用じゃない言語。
  • 低レイヤーを勉強する人用

Python

メリット:
  • 海外で人気で、文献が非常に多い。
  • ライブラリはかなり揃っていること。
  • pipなどのライブラリ管理ツールがあること。
  • 標準関数が充実していること。
  • 読みやすいコーディング規則を強制される
デメリット:
  • 日本語文献が少なめであること。
  • バージョンで2,3で別れているので、検索のコツが必要
  • 静的型付けにハードル
総評:
  • 英語ができるなら、とても良い言語ではある。
  • 低レイヤー以外をかなり書きやすくコーディングできる。

Scratch

メリット
  • 画像を動かしやすい
  • マウスでプログラミング出来る。
  • 直感的にわかりやすい。
  • 一応、電子回路工作も出来る。
デメリット:
  • コーディング規則が学べない。
  • 書いたコードを管理しにくい。
  • CUIのアクセスが辛い。
総評:
  • 直感的に劇をプログラミング出来る。
  • ゲームやプログラミングをする体験が出来るツール。
  • コーディングや環境構築について深い知識があれば、ゲームや電子回路工作なども作成できるが正直微妙。

Kuin

メリット:
  • 日本語が中心であること。
  • 標準関数が充実していること。
  • よみやすいコーディング規則を強制すること。
  • 初心者の混乱しずらい言語設計で出来ている。
  • 日本語エラーが標準で出る。
  • 環境構築が容易。
  • 言語、ソフト作成~配布までのドキュメントが分散していないこと。
  • ゲームパッドなどに対応している
  • DLLをサポート
デメリット:
  • 日本語が中心であること。
  • リリースしたばっかりなので、外部ライブラリ・文献が少ない
  • ライブラリ管理ツールはわからない。
  • 通信周りがまだ貧弱?
総評:
  • 作品を作りながら学びたいというプログラミング初学者によさげ。

比較のまとめ:

上記の5言語のおすすめ度を独断と偏見で選ぶ。 他言語(Ruby,lisp,java等)を含めば最適はあるだろうけど、今回は上記5つの言語で比較。

学校の教育カリキュラムとするなら?

小学生 → 重要:直感的+わかりやすさ

Scratch >>> Kuin > Python >>>>>>> BASIC >>> C

中学生 → 重要:日本語+わかりやすさ

Scratch > Kuin >>> Python >>>>>>> BASIC >>> C

高校生 → 重要:汎用性+学習コスト+わかりやすさ

Python > Kuin >>>>>>> Scratch >>>>>> C >>>>>> BASIC

大学生 → 重要:汎用性+応用性+研究分野のライブラリ

Python>>> C >>>>>> Kuin >>>>>>> Scratch >>>>>> BASIC

初学者に「XXXXXXX」って訊かれたときに薦めるとしたら?

「作りたいものはないけど、プログラミングの基礎を知りたい」

Python >>> Kuin >>>>>>> C >>> Scratch >>> BASIC

「近代プログラミングを日本語で教えたい」
GUIを触ってみたい」

Kuin >>> Python >>>>>>> C >>> Scratch >>> BASIC

「通信したい、ウェブサイトを作りたい」

Python >>>>>>> C > Kuin > Scratch, BASIC

「〇〇なゲームを作りたいから言語のオススメを教えて」

Kuin >>>>>>> Python >>>> C > Scratch >>>>>>> BASIC

※ドキュメントを読んだだけで、Kuinを利用したわけじゃないので間違いがあるかも