C言語の標準関数を自作する:このシリーズについて
目次
はじめに
C言語には、普段何気なく使っている標準関数がたくさんあります。
strlen()、strcmp()、strcpy()……。
普段は当たり前のように使っていますが、
「これ、自分で作ってみたらどうなるんだろう?」
と思ったことはありませんか?
私はあります。
ということで、C言語の標準関数を自作してみるシリーズを始めることにしました。
……と言っても、別に新しいことを思いついたわけではありません。
C言語を勉強していると、一度くらいは、
「strlenくらいなら自分でも作れそう」
と思う瞬間がありますよね。
では、実際に作ってみましょう。
というのが、このシリーズの始まりです。
このシリーズの目的
このシリーズの目的は、標準関数を自作することそのものではありません。
標準関数を題材にして、C言語への理解を深めることが目的です。
例えば strlen() であれば、
- 文字列とは何なのか
-
'\0'とは何なのか - ポインタはどのように扱われるのか
-
size_tとは何なのか - 配列とポインタにはどのような関係があるのか
といった、C言語では基本的な内容を改めて考えることになります。
さらに、単純にコードを書いて終わりにするのではなく、
仕様を確認する → 要件を決める → 設計する → 実装する → テストする
という流れも意識して進めていきます。
「標準関数を自作してみた」というだけの記事ではなく、
一つの関数を題材に、C言語のコードをどう考えて作っていくのかも見ていければと思っています。
このシリーズのルール
せっかくなので、普通に標準関数を自作するだけでは面白くありません。
いくつかルールを決めて、自分自身を縛りながら進めていきます。
標準Cライブラリの関数は使わない
基本的に、標準Cライブラリの関数には頼りません。
例えば strlen() を自作するのであれば、当然ながら標準ライブラリの strlen() は使いません。
自分で作ろうとしているものを、そのまま使ってしまったら意味がありませんからね。
システムコールは利用OK
一方で、OSが提供するシステムコールは利用OKとします。
標準Cライブラリの関数とシステムコールは別物なので、ここは区別します。
このルールが後々どう効いてくるのかは……そのうち分かるかもしれません。
独自のコーディング規約を守る
さらに、このシリーズでは独自のコーディング規約も設定しています。
「せっかく自作するなら、普段とは違うルールで縛ってみよう」
という、ほぼ縛りプレイです。
どのような規約を設定しているのか、なぜそんな規約にしたのかについても、気が向いたら今後の記事で紹介する.....かもしれません。
どんな関数を作るのか
まずは、比較的分かりやすい文字列操作系の関数から始めます。
例えば、
strlen()strcmp()strcpy()strchr()
などです。
実際にどの関数を、どの順番で作っていくのかは、その時の気分や難易度などによって変わるかもしれません。
最初から「標準Cライブラリを全部自作します!」などと宣言してしまうと、自分で自分の首を絞めることになりますからね。というよりも、全部は無理です。一体いくつあると思ってるんですか。
どこまで続くのかは、私にも分かりません。
飽き性なので途中で飽きるかもしれませんし、モチベーションが続けば意外と長く続くかもしれません。
そのあたりも含めて、気長に見守っていただければと思います。
記事では何をするのか
各記事では、対象となる標準関数について調べたうえで、自作関数を作っていきます。
例えば strlen() であれば、まず標準 strlen() の仕様を確認します。
そのうえで、
- 自作関数にどのような要件を設定するか
- どのような設計にするか
- 実際にどう実装するか
- どのようにテストするか
といったことを順番に考えていきます。
ただし、すべての記事を完全に同じ構成にするとは限りません。
関数によって難易度や考えるべきポイントが異なるため、その関数に合わせて内容や構成を変えることもあります。
あくまで、
「その関数を自作するために必要なことを、その都度考えていく」
というスタンスです。
まずは strlen() から
ということで、最初の関数として strlen() を自作しました。
文字列の長さを取得するだけの非常にシンプルな関数です。
果たして、標準 strlen() を使わずに、自分で同じような関数を作ることができるのでしょうか。
……まあ、strlen() くらいなら簡単そうですよね。
実際にどのような仕様なのかを確認し、要件を決め、設計して実装してみました。
興味があれば、ぜひ読んでみてください。
おわりに
このシリーズでは、標準Cライブラリの関数を題材にして、C言語について改めて考えていきます。
普段何気なく使っている関数も、実際に自分で作ろうとしてみると、
「あれ? これってどういう仕様だっけ?」
となることがあります。
そして、調べて、考えて、実装して、テストしてみる。
その過程そのものが、C言語を理解する良い勉強になるのではないかと思っています。
……とはいえ、どこまで続くかは本当に分かりません。
モチベーションが続く限り、ぼちぼちやっていきます。
もし興味があれば、ぜひ一緒に「標準関数って、実際どうなってるんだろう?」を見ていきましょう。
🔗 関連記事・関連リンク
この記事の最新アップデートや、このシリーズの関連記事は以下のリンクからご覧いただけます。
内容は基本的に同じですので、お好みのサイトでお読みください。
🟢 Zenn
-
この記事の最新版はこちら。
-
「標準関数自作」Topicの関連記事はこちら。
🔵 Qiita
-
「標準関数自作」タグの関連記事はこちら。
🧡 note
-
このシリーズの記事はこちら。