✍️

他言語写経トレーニング:Go言語でkiloエディタを実装してみる

2024/09/17に公開

Go言語でKiloエディタを実装してみる

先日、偶然こちらの記事を見かけて触発されました。

https://qiita.com/yo314159265/items/279d644cd9b3f40f8dc1

kiloエディタって?

上の記事で、kiloというエディタの存在を初めて知りました。
kiloは、Vimのようにターミナル上で動作するエディタで、C言語で書かれた1000行ほどのソースファイル1つのみで実装されているそうです。もちろんVimより低機能ですが、エディタとして最低限の機能が揃っています。

kiloエディタを作るチュートリアル

また、その簡易さもあってか、kiloエディタを実装するチュートリアルが用意されています。

https://viewsourcecode.org/snaptoken/kilo/index.html

このチュートリアルは、エディタの実装がひとつずつ丁寧に解説されており、またそれぞれのステップごとにコンパイルして動作を確認することができるようになっているので、分かりやすく飽きさせない作りになっていてとても素晴らしいです。

チュートリアルをGo言語で実践してみる

私はエディタがどう作られているのかよく知らなかったので、学習のためにチュートリアルを実践してみることにました。更に、現在勉強中のGo言語に置き換えて実践してみたら更に勉強になるだろうし、きっと楽しいのでは、と思いつきました。
(C言語は昔に経験あり、Go言語は趣味で勉強中です)

というわけで、現在進行系で実践中です。
今は第5章まで実装が終わり、最低限のエディタとしての機能が揃ったところです。

https://github.com/bugph0bia/go-kilo

本当は、もっとGoらしく書けるところがたくさんあると思いますが、まだまだ修行不足です。
でも、実践する中で、以下のような部分の知識を深めることができました。

  • エディタの実装について
    • ターミナルのRAWモードについて
    • 特殊キー(Enter、矢印キー、PageUp、Home、Ctrl+英字キー、…)の扱い
    • エスケープシーケンスの扱い
    • ASCIIコードの知識
  • Go言語について
    • 標準入出力
    • システムコール
    • ターミナルの操作
      • unix, term パッケージ
    • string型/rune型
    • スライスの扱い
      • slices パッケージ

他言語写経のススメ

こんな感じで、ある言語で書かれたチュートリアルを別の言語に置き換えながら行ってみると、言語に対する理解も深まって良いのではないかと思っています。
(何て呼ぶのか分からなかったので勝手に他言語写経って書いてみましたが、何か名前が付いているのかな)

ちなみに、今回はC言語からGo言語でしたが、以前にPythonからC++でもやってみたことがあります。

https://github.com/bugph0bia/DeZeroCpp

こちらは「ゼロから作るDeep Learning ❸」という書籍をテーマに、PythonからC++に置き換えながら実践してみた内容ですが、途中で挫折してしまいました。
でも、4年も前に挫折したリポジトリですが稀にスターを付けてくれる人がいて、同じテーマに取り組んでいる方がいるんだと思い、感慨深いです。
それにしても、PythonとC++はちょっと隔たりが大きかったです。その点、C言語とGo言語はどちらもシステムプログラミングに適していて書き換え易いので、プログラミング言語の選定も重要ですね。

感想

チュートリアルはまだ終わってないですが、楽しく進められています。

あと、Go言語を気軽に使えるようになりました。
普段、ちょっとしたツールを作るのにPythonを使っていたんですが、他の人に実行環境を渡しづらいこともあり、コンパイル型言語でPythonくらい気軽にコードを書けそうなGo言語を使えるようになりたいと思うようになりました。でも、Go言語になかなか慣れることができず、ついついPythonを使っていたのですが、今回のチュートリアルを進めた結果、気軽にGo言語で実装できるようになりました。
やってみて良かったです。

Discussion