とある6さいの女の子との出会いとExtension
久しぶりの投稿になります!4月中のエントリは自分がこの空白の2ヶ月間何をやっていたかという内容になると思います.エントリに書く話のネタだけは溜め続けてきました.最後まで読んでくださるとうれしいです.
進捗報告会でKuinを使ってアニメーションを教授に見せて、
— Masato (@Phys_Peach) 2018年11月29日
き「おお!コンパイルも実行も凄く速いけど、これ何?」
僕「あっ…Kuinという言語で…」
き「知らないなぁ…」
僕「去年配布が始まった言語で…」
き「へえ〜!」
とやり取りしたけど、くいなちゃん6さいによって作られたとは言えなかった
Visual Studio Code Extensionを少し勉強してプログラミング言語Kuinのコードスニペットの一部を実装した話です.私がくいなちゃん(6)に出会ったのは某日,みんな大好きTwitterでのことでした.プログラムの高速化が自分の中でトレンドだった当時の私は「コンパイルも実行も凄く速いけど」というワードに目が止まりさっそくKuinのことを調べました.
プログラムの高速化:例えばマイコンの宇宙放射線耐性を評価する指標としてSingle Event Upset(SEU)をみることにしましょう.真空チャンバに黒い半導体の塊を入れてそこに加速器から出てきた放射線をうまく当てます.
管制室ではあなたが放射線量とマイコンの状態を監視しています.内部で保存している2ビットの情報が意図しないタイミングで0から1,または1から0に変化したことを検出できればいいわけです.しかし,ループなり通信なり他の処理でもたついて時間がかかっているとまた元の値に戻ってしまいます.あぁーっと,こちらの選手,SEUは発生したのに正確に回数をカウントできていない!残念!
ではどうすればよいかというと,値を検査する速度をできるだけ上げるしかありません.高速化です.プログラムの中で遅延の原因になる要素をとにかく潰し,これ以上は速くできないと決意を固めて書き込み,あとはちゃんとしたデータが取れるよう祈るだけです.
正直な話をするとちょっとした下心もあり.スタバのJKどころか小学校のサッカー少年たちが「Pythonってチョースゲーよな」とおにぎり片手に語らう時代,界隈で強そうな人が「Juliaだろ!」と叫ぶと注目を集めてバズりますよね.そして思いました.「Kuin,ここで参戦するしかないのでは...?」と.
ページに飛んでみると,そこには優しい世界が広がっていました.
簡単で高速な実用プログラミング言語「Kuin」です! — くいなちゃん
私がKuinで好きなのは,言語の設計思想がちゃんと規則に反映されているところです.代入演算子や文とブロックのリファレンスをみればわかりますが,
代入演算子「::」はKuinの最も風変わりな設計の一つですが、これはPascalの代入演算子「:=」に由来します。 演算子の1文字目を読み込んだ時点で優先順位が決定できるとコンパイルが速く行えるため、1文字目が「=」と重複する「==」ではなく、かつ「:=」より入力が容易な「::」に決定しました。
とか
ブロック終端の「endブロック名」でブロック名を指定させている理由は、C言語の「}」やPascalの「end」などのブロック終端記号が並んだときにどのブロックに対応するものかが解りにくくなるという可読性上の理由です。コンパイル時の型チェックと同様に、ユーザが意図したコードになっているかをなるべくコンパイラがチェックしたほうがバグが減らせるため、多少冗長になってもブロック名を指定させて、コンパイル時に対応関係をチェックするようにしました。
など書かれているんですよね.くいなちゃんの丁寧さというか,愛というか,そういうものを感じる.また,こうした説明がすべて日本語だったり,公式のエディタ兼実行アプリkuin.exeの基調色がピンクだったりとプログラミング初心者にも優しくとりかかりやすい環境なのではないかと思います.
チュートリアルを1,2,3,4 ― はじめてのKuin,サイコロを振るプログラム,簡単なミニゲーム,横視点アクションゲーム ― と一通り済ませ,まずはチュートリアル4でやった横視点ゲームを充実させてみようと書き始めました.いきなり創作から始めると挫折するので.
5の音が鳴るピアノも待ってます!
横スクロールにしようとも考えましたがどうもうまくいかない.他にも加えたい要素がいろいろあってまだ完成してませんが,満足するところまでやってみます.これが終わったらKuinの特徴である高速処理を活用したツールづくりや音の入出力なんかもやってみようと考えています.
本題に入ります.ここまでずっとkuin.exeでファイルを編集していたのですが,実はエディタの挿入・エラー修正がピーキー過ぎてやりづらいなと感じてました.
ユウヤ:タイプ97は主機出力が圧倒的に不足している.ピーキーな機体特性にまるでかみ合ってない
唯依:だが吹雪で錬成された我が国の衛士は,貴様が絶賛する陽炎も同様に使いこなすぞ?
ユウヤ:……なにが……言いたいんでしょうか
唯依:……ハッキリ言おう.貴様は未熟だ!
— マブラヴ オルタネイティヴ トータル・イクリプス
kuin.exeのコードスニペットはかなり嬉しいんです.嬉しいんですが,求めていないところまで編集してしまうことがあり,それを元の状態に戻すまでに意外と手間がかかったりします.例えば上で引用したように,Kuinにはfuncやwhileを必ずend funcやend whileで閉めるという仕様があるのですが,中身の括弧を片方だけ消して他の場所からコードをコピペして機能追加~なんていう怠惰なことをするとすかさずendの行にインデントが加わり意図していた構造が崩れてしまいます.これはカーソルが別の行に移動する度に適宜,有効な記法になるよう直してくれるくいなちゃんの配慮がゆえなんですね.
ユウヤ:教えてくれ.不知火・弐型を使いこなすために,オレに足りていないものは,何だ?
はい,Visual Studio Code,どうぞ.
VSCodeでKuinコーディングをしてみようという判断です.以前公開したエントリのようにそもそもなぜ私がVSCodeにこだわるかというと単純に性能がいいから.Sublime Textは最速.無償版だとWould you like to purchase a license now?が時々ポップアップされてウザいという人がいますが,自分はあまり気にしていなくて,どちらかというと数多く個人開発された拡張機能のクセが各々強いことがマイナス印象です.Atomはデフォルトで高性能なんだろうけどモッサリ感がうーんなんとも.そのところVSCodeは比較的サクサク動作する方で,かつMicrosoft製の拡張機能がどの言語のものでも不満がない.ゆえにVSCodeです.
MicrosoftからKuinの拡張機能は2019/04/13現在,出てないんですね.しかし1つだけ検索にヒットしたものがありました.それがkonosumiさんが既に作られていたvscode-kuin-syntaxです.そのままインストールしました.
??? 「なんということでしょう,全部白文字で殺風景だったknファイルに彩りが加わわったではありませんか!」
vscode-kuin-syntaxの主な機能はシンタックスハイライトでした.GitHubでリポジトリを発見し,README.mdでkonosumiさんが「コード補完(スニペット)は,今後対応する予定です」とおっしゃっていたのを見て,勉強も兼ねてForkしてみるかというのがことの始まりでした.
VSCode拡張の開発をする際は以下のページにお世話になりました.
Visual Studio Code用のKuin言語の拡張機能を公開したので、作成から公開の流れを共有してみる - このすみろぐ
Visual Studio Codeの設定「虎の巻」:構文ハイライト/配色テーマ自作編 (1/4):特集:Visual Studio Codeを使いこなそう - @IT
Forkした当時,拡張ファイルの構造は以下のようになっていました.
今回私が実装したかったのはコードスニペットなので,package.jsonにsnippets属性を加えたのち,snippets.jsonを加えました.
その結果,Kuin言語仕様5 文とブロック,Kuin言語仕様6 列挙型,Kuin言語仕様7 クラスとkuin.exe標準のスニペットである「mainと空のウィンドウ」「mainとdrawコントロール」およびmainが最初の数文字を入力するだけで候補として表示されてエンターキー1つで入力できるようになりました.Kuin特有の記法により考慮した点がいくつかありました.
各パラメータは公式HP通り日本語:勝手に翻訳して混乱を招くことを回避
複数の記法があるblock, class, enum等:公式HPの記法を最も包括する記法を採用
ifブロックのelif, else,switchブロックのcaseは別に用意
戻り値有り無しで挙動が変化するret,funcは2つ用意
これから取り組みたいのはKuin言語仕様1 命名と予約語とKuin言語仕様101 kuin・libライブラリ以降のクラスをそれぞれKeywordとClassとして登録することです.すべてスニペットで解決してもよいのですが,予測表示が汚くなりそうなのとKuin拡張をCやPythonの拡張と同レベルまで作り上げたいという思いがあり,その方法を調査中です.IntelliSense in Visual Studio Codeを参照すればよいのかなあという段階です.
ちなみにForkした自分のリポジトリにはIssueが21コ立ってますが,全部自分で立てました.こういうGitHubの使い方もこちらで今回習得しました.
自分で立てたissueを自分にassignするの寂しすぎる
— けいらす / Kayrlas (@eagleutkk) 2019年3月17日
Issueの数が少なくなってたら進捗があります.変化なかったら何も進んでない状態だと思ってください...
今回,Visual Studio Code Extension開発の機会を与えてくださったkonosumiさんに感謝の気持ちでいっぱいです.お忙しい中,プルリクエストにも快く対応してくださり,ありがとうございました.
実はvscode-kuin-syntaxの細かい話やGit-flowの話もしたかったのですが,長くなってしまったので次回のエントリで続きを書こうと思います!
Additional Time
konosumiさんが4月14日の技術書典でKuinの本を頒布されます!