TL;DR
- Build Your Own Text Editorを写経してテキストエディタを作ってみた。
- 端末エミュレータ向けのエスケープシーケンスや仕様、C言語特有の作法、オープンソースを改変する場合のライセンスの取り扱いについて知見が増えた。
- 写経はいいぞ。
まえがき
日頃文章を書くことが多いこともあって、ぼんやりとテキストエディタの仕組みや実装に興味があった。
そんな折、Build Your Own Text Editorというチュートリアルを見かけた。これはWriting an editor in less than 1000 lines of code, just for funにて紹介されたテキストエディタの実装を、実際に手を動かしながら追ってみるというもの。C言語で1000行程度、チュートリアルの内容も全部で184ステップ(それもかなり細かく刻みつつ丁寧に教えてくれてこのステップ数)ということで、順に写経していくだけならかなりハードルが低い。
テキストエディタの実装ということで興味にマッチしているし、C言語の記法をちょっとでも覚えたかったということもあったので、これをちまちまと写経してみた。
ソースコード
基本的にはチュートリアルの通りに写経した。ただし、以下の2点については留意して適宜元の実装やチュートリアルから変更した。
- C言語特有の省略記法は、なるべく(個人的な)理解のしやすさを優先する記載とした。
- 具体的には
if
やfor
の後のコードブロックの省略について、コードブロックを明示する方向にした(ご存知の通り、if
文などの後の処理が1行のみの場合には{...}
によるブロックの記載を省略できる)。
- 具体的には
- チャプターごとにどこまで実装されているのか残しておきたくて、各チャプター終了時点でのコードも都度残した。
学び
ターミナル(VT100)上でエスケープシーケンスを利用した実装の雰囲気を掴めた
現在の端末エミュレータは、過去ビデオ表示端末としてのデファクトスタンダードであったDEC VT100の動作をエミュレートしているものが多いらしい。
今回取り組んだチュートリアルでは、このVT100のユーザーガイド(VT100 User Guide Chapter 3 Programmer Information)やANSI escape code - Wikipediaを時折確認し、そこに書かれた情報を元に実装していた。考えてみれば当然のことだが、こうしたデバイスの仕様をチェックしつつそれに適した実装を進めていくということが重要なのだということを体感できたのが非常に良かった。
C言語特有の作法や関数の使い方などを実践的に理解できた
C言語自体は趣味レベルで学習していたし、ふつうのLinuxプログラミング 第2版 Linuxの仕組みから学べるgccプログラミングの王道などの写経もしてはいたのだが、まだまだ書き方などに不安が大きかった。
今回このチュートリアルを通して行ったことで、写経ながらも実際のアプリケーションをC言語で実装するという経験が少しでも詰めて、C言語での実装時の作法などを理解できたのも良い点だった。
ただし、チュートリアルは1つのファイルのみで完結するので、複数名・複数ファイルで行われるであろう実際の開発からは多少乖離があるように思う。コードを分割して実装するパターンについては、別途トライしてみたいかもしれない。
学習用のコードを公開したが、元のコードに改変を加える場合のライセンスの記載方法を理解できた
これはチュートリアル本体というよりソースコードの公開に伴って発生した疑問だったが、「既存のオープンソースのコードを改変して公開する場合に、ライセンスの取り扱いはどうするのが良いのか?」ということが気になった。
調べてみると、ライセンスで許容されている範囲でソースコードを改変・再頒布する場合には、「元ライセンスの著作者名を残しつつ、改変者のライセンス表示を追加する」という形が望ましいらしい。
今回あつかったkilo
は BSD-2-Clause license であるため、元の著作権表示・条件一覧・免責事項を記載することで、ソースコードの再頒布が許容されている。そのためこの記載を残したまま、今回改変者に当たる自分自身の名前を追記して公開することとした。
ライセンスは普段利用者側として意識はしているのだが、こうして改変者という立場になることは初だったため、改変者のケースでのライセンスの取り扱いは非常に参考になった。
あとがき
- 写経はいいぞ
- GitHub - codecrafters-io/build-your-own-x: Master programming by recreating your favorite technologies from scratch.のような自分自身で実装しつつ学習していくコンテンツが好きなので、こうしたチュートリアルには引き続きチャレンジしたい。