正直、これを言うと賛否両論あると思いますが、
そもそも自分がC言語が最初に触ったプログラミング言語だからです。
自分は高専で本格的にC言語を学ぶ前に、
中学生時代に友人から無料コンパイラを手に入れて、
少しだけコードを書いて動かしていたことがあります。
まぁ、そんな自分でしたけど、最終的にポインタを理解できたのは会社に入ってからでしたけどね。
確かに他の言語と比べると、C言語は難しいです。
というか、みんな使っている言語は全てC言語の後に開発されたもので、
C言語の欠点を補う形で開発されました。
なので、ポインタやメモリの概念は意識しなくて済みましたが、
そこに大きな落とし穴があります。
メモリを意識することの重要性
メモリを意識しなくても良くなりましたが、メモリ自体は存在するからです。
これまで経験したのは、
Javaでガベージコレクションが働かない状態でオブジェクトが残ってて、動かしているとメモリを消費していく設計になっていたり、
AWSのLambdaを実行するとき、Pythonで大きなファイルを開こうとしたらメモリが足りなかったとか。
関数コール時にオブジェクトは参照型という話もありますが、
これもポインタによる参照渡しを、ポインタを使わずに利用できるようにしたもの。
参照渡しの場合、データがあるメモリアドレスを渡すだけなので、通常のデータ渡しよりも処理が早くなります。
CPUの動きが理解できる
プログラミング言語には3種類ありまして
(自分が高専時代は2種類と学びました)
- コンパイル系(C、C++、Rust等)
- 中間言語系(Java、C#等)
- インタプリタ系(Python、PHP、Javascript等)
の3つです。
インタプリタ系は実行する度にプログラムコード読み込み、処理を行います。
扱いやすい言語ですが、動作は比較的遅いと言われています。
中間言語系はプログラムコードをビルドし、実行できる形に加工するのですが、
それを実行するためには別途仮想マシンというプログラムが必要になります。
これはビルドしたファイルがあれば、仮想マシンがある環境どこでも動作できるという特徴を持ちます。
コンパイル系はソースコードを機械語に翻訳し、そのままCPUが理解できる形に変換されます。
直接CPUが理解できる形式であるため、実行速度は速いとされています。
そして、もう一つ特徴があって、
機械語は逆アセンブルできるのです。
アセンブラは機械語の内容を人間が理解できる文字列に置き換えたもので、
これを読んでいけばCPUやプログラムがどんな動きをするのか?というのを理解できます。
CPUには独自の記憶領域「レジスタ」がありまして、
- メモリからレジスタに値を読み出す
- レジスタの値に対して計算する
- レジスタにある計算結果をメモリに戻す
と言う動きを繰り返しています。
こういったCPU周りでどんなふうにプログラムが動いているか、というのが見えちゃいます。
C言語が出来れば他の言語の習得も早い
これは、
他のメジャーな言語がC言語以降に生まれたもの
ということと、
プログラミングに関する基本的な知識がC言語に詰まっている
ということから、
C言語が出来れば他の言語の習得も早いと言われています。
C言語の需要はまだありまして、
組み込みプログラミングの世界では未だにC言語が主流です。
OS周りはRustに置き換えるという話もありますけどね。
他の言語はフレームワークが発達しているので
フレームワークの習得の方が大変かもしれない。
まぁ、これは他の言語を学んでいたとしても必ず出てくる壁なので。
しかも今は昔と違ってコンパイラが簡単に手に入るので、
学習のためのハードルがかなり下がりました。
みんなも余力があればC言語に挑戦してみましょう。