Part1|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社エンジニアの「?」を「!」に。Part1ikaシェアツイートブックマークLINE皆様、明けましておめでとうございます。昨年はTechRachoの執筆もちょくちょくやっていましたが、改めて読み直してみると、昨年はBSDの記事を書いていないことに気づきました。マンネリ気味な所もあったのでここは思い切ってTechRachoに書くことによる願掛けの意味も込めて最近始めている趣味の開発で学んだ事を共有していこうと思います。前々からやろうやろうと計画していたのですが中々時間が取れずに日々過ごしていたので、ここでもう一度願掛けの意味で4.4BSD-Lite2のソースコードをC++に移植開発を始めています。言っても、久々のOSの深い所に入っていくため、それまで誰かに聞いて知った話が混じってしまったり本で読んだ知識を載せるのもよくありません。いうことで、TechRachoの記事で書くのは実際に調べたものだけを共有したいと思います(中には個人的な僕の間違った解釈も含まれているかもしれませんので、その際はレビューしていただけると幸いです)。OSのソースコード移植と言っていますが、まずは手始めにUNIXコマンドから開発を進めていく事で、深い所へネストしていきます。C++を選んだのかさて、開発に入る前になぜ僕が移植の開発言語にC++を選んだのか、その理由は以下の3つです。単純にC++の勉強をしたかった純粋な歯車の再開発はしたくない元ソースコードをちゃんと読み、理解し、次にそれを違う言語に移植する際の容易さ特に重要なのが2と3でしょうか。単純に今あるソースコードを丸々0からC言語でそのまま書いても面白くない、なおかつそれでは知識の深入りができなさそうというのがあり、ソースコードを正しく読んで理解し、そして移植の際の負担が比較的小さくなるようにという意味でC++を選択しました。移植に対するこだわり久々に低水準なところを開発することもあるため、忘れている所があるので基本は色々と調べながら開発します。その上で、僕自身の開発方針としてただ一つだけこだわりたいものがあります。それが抽象度の高いコードにするもちろん、既存のUNIXシステムのソースコードも抽象度が高いです。カーネルへの呼び出しはシステムコールを挟まなければいけませんし、そのシステムコールだけでも抽象度の高いコードは書けそうです。ここでの拘りはシステムコールやライブラリ関数どちらでもいいが、単純に関数一つで機能が実現できるのであれば、優先的に関数の機能を使うということだけです。既存の知識、技術で容易に解決できるものが目の前にあるのに、それを使えないギャップやストレスは苦痛でしかないし思考もストップしてしまうというのが一番大きな理由です(あえてここは、言葉を選んでます)。逆に言えば、これだけ守れば楽しく移植開発ができるのではないでしょうか。UNIXコマンドの移植を行なっていきましょう。最初に手を出したのはechoコマンドです。引数として与えられた標準入力を単純に標準出力に返すコマンドですね。4.4BSD-Lite2(以下、元コードと呼びます)のechoのソースコードは以下の通りです。exit(0);}これをC++に移植すると以下のような書き方が一番いいでしょうか(コードの部分だけ抜粋)。exit(0);}変わった所はfputsでストリーム出力しているだけですね。**voidに型変換することで一部のコンパイラの警告文を抑えているようです。ついて見てみましょう。*stream);streamで指定したストリームに文字列sを出力します。ここでは標準入力をそのまま標準出力に流し込み形で出力したので、それをワンライナーで行えるfputsを使うことにしました。c)putchar(c)で呼び出せます。stdout)と同じ挙動をするため、一文字を標準出力するならこっちを使います。いう関数一つでできる機能は見出しにも書いた通りでどんどん使っていきます。変更箇所は上記のみなので非常に簡単な移植で済みましたね。これをBSD的なやりかたでコンパイルしていきましょう。bsd.prog.mk元コードにあったMakefileを見てみましょう。filesbsd.prog.mkはソースコードをコンパイルするためのフレームワークみたいなものだということはわかります。.0このフレームワークも書き換えてもいいのですが、他のフレームワークを書き換える必要もあり、ここで時間をかけてしまうのはハイリスクな所があります。他のBSD各種はこの部分はどうやっているのでしょうか。OpenBSD(OpenBSDだけGitHubのソースコードでタグづけされていませんでした...)のbsd.prog.mkを見て見ましょう。bsd.prog.mk三種三様、コンパイル用のフレームワークと侮っていましたが、かなりの違いがありますね。OpenBSDはNetBSDのbsd.prog.mkをその前から引き継いでいる様ですね(この辺りの歴史どなたか詳しい人コメントお願いします)。11.1-STABLEのbsd.prog.mk(とその関連ファイル全て)を流用したいと思います(と言うか、クロスコンパイル環境を用意できない場合は普通にBSDのOSと合わせた方がいいです)。C++の拡張子ですが、ここはUNIXの歴史に基づいて.ccを選びました。部分でC++のソースファイルを明示的に指定してあげます。コマンドが作成できます。hogehogehogehogeまとめというわけで、UNIXコマンドの移植開発から学んだことまとめでした。タイトルにPart1と書きましたが、あまりにもマニアックなネタな気もするのでシリーズ化するかは微妙なところです。結局今回やったことってechoコマンドの移植開発とコンパイルに必要なbsd.prog.mkについてしか書けていないので、もう少し深い所にいきたい所ですね。そのため、僕のモチベーションが維持されるまではやっていきたいので、応援よろしくお願いします。追記(2018/01/11)思ったより各所よりフィードバックいただきました。ありがとうございます。echoコマンドという題材だったこともあり、C++の特徴、機能を生かしたコードにできていなかったかなとも思います。やる気がでてきたので、今度はもう少し複雑なものを題材に選んでPart2にしてみたいと思います。限界までFreeBSDの環境を構築したいシェアツイートブックマークLINEこの記事を書いた人ika1990年滋賀県生まれ。以前は某大学の学内SE。Web業界に行きたかった希望があり、2015年10月にBPSへ入社。元々の専門はネットワークなので、ネットワークの話をすることもしばしば。Storageを使ってはいけない(翻訳)#Tags#会社紹介#自社サービス#勉強会#Rails#PHP#デザイン#実績#週刊RailsウオッチCONTACTお気軽にご相談ください。(翻訳)CONTACTTechRachoでは、パートナーシップをご検討いただける方からのご連絡をお待ちしております。お気軽にご意見・ご相談ください。