![見出し画像](https://assets.st-note.com/production/uploads/images/11419004/rectangle_large_type_2_cd76c525a4fd3008c59a9f7d3051c630.jpeg?width=1200)
C言語学習の価値
苦しんで覚えるC言語(通称苦C) でC言語を今さらながらに学習している。
Cは私の場合、大学生時代に初めて大学で触った言語だ。しかし、私はこの時は変数代入の概念で早々に挫折し、「ポインタ?なにそれ美味しいの?」という有様で、試験は答えの丸暗記でほぼ通ったようなものだった。
その後、ほどなくしてプログラマのアルバイトの機会を得て、 Perl 、 JavaScript 、 PHP 、 Java と使うようになっていき、そこで、リファレンスの概念やオブジェクトの概念など(もちろん、変数代入も)を理解して、それなりにやっていけるようになっていった。 C言語のポインタも要はリファレンス(参照型)のようなものだろうという理解で片付け、その後も、Tcl/Tk、bash 、sed 、 awk 、Apex, node と使えるようになっていったが、頑なにC言語は回避してきた。それほど学部生時代の印象が最悪だったのだ。
しかし、このタイミングで C を私は学習している( C++ でも C# でもない C だ)。それは何故か?
一つには、 C を使うことでコンピュータが扱えるのは数字だけだということを身に染みて感じるため。一つには、メモリの使用イメージと管理の方法を習得するため。一つには、Cで書かれているオープンソースのコードを読めるようにするため。一つには、ソートをはじめとした基礎的なアルゴリズムを習得するため。
要は、一つ上のレベルのプログラマになるためだ。
各言語やライブラリは一枚皮を剥ぐと C の世界が広がっている(ことがままある)。本当にコアな部分は C で書かれているのだ。 だから、言語やライブラリの単なる利用者ではなく、開発にコミットしたいと思ったら C を知らないわけにはいかない。
そして、Cを学習してみて得たメリットがもう一つある。それは、 C はコンパイル言語であり、コンパイルには時間がかかるため、コンパイル&実行する前に注意深く設計、実装をする習慣が身に付くということ。この習慣がないと Try & Error を繰り返して実装するスタイルになるが、一回あたりの Try にスクリプト言語よりもはるかに時間がかかるので、累計で多くの時間を使ってしまう。まぁ、この辺りのことは Java でも身につきそうなものであるが。。。。
私は、スマホアプリの開発には React Native を使うのだけど、スマホアプリの開発はまさにコンパイルの時間が必要で、それは時間のかかる作業であるため、注意深く設計、実装するスタイルは重要になる。また、JSON データの効率的な取り回しについても C の学習で得られることの恩恵は大きい。
リンカーンは言った。
もし8時間、木を切る時間を与えられたら、そのうち6時間を私は斧を研ぐのに使うだろう。
C の学習は、まさに斧を研ぐ行為だと思っている。