このページでは C言語
の特徴について解説していきたいと思います。全部で13個の特徴について、1つ1つ詳しく解説していきたいと思います!
特に C言語
よりも高水準なプログラミング言語と比較しながら、C言語
にどのような特徴があるのかについて解説していきます。
Contents
処理が高速である
まず C言語
は、他のプログラミング言語に比べて実行速度が高速であるという特徴があります。要は処理が速いです。
では、なぜ速いのか?この点を少し深掘りしたいと思います。
最適化などの話もありますが、ここでは一番直感的に理解しやすい、CPU の処理の量の観点から解説していきたいと思います。
まず前提として、あなたがプログラミングしたプログラムは、基本的には CPU によって実行されます(場合によっては GPU などで実行される場合もあります)。そして、同じ CPU 上で実行した場合、基本的にはそのプログラムの実行速度は、実行する処理の量が少ない方が高速になります。
この点については直感的にも理解していただけるのではないかと思います。もしあなたが計算問題を解く場合、問題の難易度が同レベルなのであれば、問題数が少ない方が早く解き終わりますよね?それと同じ話です。
で、同じ CPU 上で実行した場合、同じ機能を実装したとしても、C言語
で記述したプログラムは他の言語で記述した場合と比べると高速に実行されることが多いです。つまりこれは、C言語
で記述したプログラムは、他の言語で記述したプログラムよりも単純に処理の量が少ないからと言えます。
もう少し具体的にいうと、C言語
の場合、プログラム実行時に実行する処理は、ほぼ、あなたがプログラミングした処理のみになります。その一方で、特により高水準なプログラミング言語の場合、あなたがプログラミングした処理以外の処理がバックグラウンドで自動的に実行されることが多く、C言語
に比べて処理速度が遅くなることが多いです。
一番分かりやすい例は、インタプリタ言語との比較かなぁと思います。
まず前提として、ソースコードに記述された処理を CPU が実行するためには、事前に CPU が理解できる形式に “解釈” してやる必要があります。
この解釈はコンパイラやインタプリタによって処理されますが、コンパイラやインタプリタも CPU によって処理されます。
C言語
はコンパイラ言語なので、プログラムを実行する前にコンパイラによって解釈が実行されます。なので、プログラム実行時に関しては、CPU が行う処理はプログラムに記述された処理のみとなります。
その一方でインタプリタ言語の場合、プログラム実行時に、解釈と、その解釈した結果の処理の実行が行われます。つまりコンパイラ言語と比べると、CPU はプログラム実行時に “解釈するための処理” を余分に実行する必要があります。
ですので、CPU が余分に処理を行う必要がある分、インタプリタ言語は、C言語
等のコンパイラ言語と比べると実行速度が遅いのが一般的です。もちろんコンパイラ言語の方が最適化しやすいなどの他の要素もあると思いますが、単純に処理の量の観点から考えると、上記の理由でコンパイラ言語の方が速いと考えることができます。
また、他の観点からも、C言語
の処理の少なさを確認することができます。で、ここからの話の方が C言語
の特徴を知る上で重要です。
例えば、下記のような +
演算を行う処理を C言語
で記述した場合と Python
で記述した場合とで比較すると、どちらが CPU の実行する処理量は少なくなるでしょうか?
c = a + b;
c = a + b
これは、Python
がインタプリタ言語であることを抜きにしたとしても、C言語
の方が処理の量が少なくなります。
まず、C言語
の場合、上記では、変数 a
と変数 b
の値をメモリから取得し、その取得した値を加算し、さらにその結果を変数 c
に対応するメモリに格納するという処理が実行されます。変数がポインタ型の場合はちょっとだけ処理が異なりますが、他の型の場合、全てこの処理のみで完結します。
その一方で、Python
の場合、上記の C言語
の場合に行われる処理のみだけでなく、”型の判断” という処理も必要になります。
Python
では型宣言が不要で、変数の型(変数が参照するオブジェクトの型)が動的に決まります。つまり、同じ変数を使った処理であったとしても、その処理よりも前の処理によって動的にその変数が参照するオブジェクトの型が変化します。
なので、変数を使用して処理を行うような場合、その変数が参照しているオブジェクトの型が何であるかを判断する必要があります(さらに、Python
では演算子のオーバーロードが可能なので、同じ +
でも、変数が参照するオブジェクトの型によって動作が異なる)。
要は、型を判断する処理が、C言語
に比べて余分に必要になります。
上記の処理を1回だけ行うのであればそこまで処理速度の差は気にならないと思いますが、例えばループの中で上記のような処理を行うと、その差が積りに積もって、C言語
と Python
の処理の速度の差はより顕著になります。
これは、型が動的に決まるプログラミング言語であれば、他の言語においても同様のことが言えるはずです。
また、メモリの解放の点でも C言語
は処理の量が少なくなります。
例えば C言語
の場合、メモリを動的に確保し、そして解放する場合は下記のように処理を記述する必要があります。
void mem_test(void) {
data = (int *)malloc(sizeof(int));
printf("%d\n", data);
free(data);
}
Python
の場合、同様の処理を行う場合は下記のように処理を記述します(int
型のサイズは違うかも)。
def mem_test():
data = int();
print(data);
あまり意味のないコードの例で申し訳ないですが、この2つの決定的な違いは、メモリの解放を明示的に処理として記述する必要があるかどうかですね。
C言語
ではメモリの解放を行うために free
関数を呼び出す必要がありますが、Python
の場合はガベージコレクションが動作し、参照しなくなったメモリは自動的に解放してくれるので、解放を行うための処理を明示的に記述する必要はありません(上記の場合、関数 mem_test
が終了すると自動的に解放される)。
で、この場合 C言語
は free
関数を呼び出す必要があるので、一見処理の量が Python
に比べて多いようにも感じますが、実は処理の量は C言語
の方が少ないです。
C言語
の場合、どのタイミングでメモリを解放するかがソースコード上に記述されているので(つまりプログラマーによって支持されているので)、どのタイミングで解放すれば良いかを CPU が判断する必要はありません。記述されたタイミングで解放すれば良いだけです。
その一方で、ガベージコレクションを行う場合は、どのタイミングでメモリを解放すれば良いかを判断する処理が必要になります。要は、そのメモリへの参照がなくなったかどうかを判断する処理が余分に必要になります。
で、この判断を行う必要がある分、ガベージコレクションが採用されているプログラミング言語の処理速度は、C言語
に比べて遅くなる傾向にあります(少なくとも CPU が実行する処理の量は多くなる)。
要は、C言語
の場合、基本的に実行される処理は、あなたがプログラミングして記述した処理のみです。他のプログラミング言語に比べて、処理が簡素化されています。小回りが効くと言ってもいいかもしれません。
その一方で、より高水準なプログラミング言語の場合、あなたがプログラミングして記述した処理だけでなく、他の処理もバックグラウンドで実行される処理が多いので、同じような機能を実装した場合でも、C言語
の方が高速である場合が多いです。
省メモリで動作可能
また、C言語
で記述したプログラム(機械語に変換した後のもの)はプログラムサイズが他のプログラミング言語に比べて小さくなります。
プログラムは、実行される際にメモリ上に配置されます。ですので、プログラムサイズが小さいほど使用するメモリ量を抑えることができます。ですので、C言語
で記述したプログラムは省メモリで動作可能であるといえます。
では、なぜプログラムサイズが小さくなるかというと、これも 処理が高速である で述べたのと同様の理由です。
プログラムには、CPU に実行してもらいたい処理が記述されていないといけません。従って、実行される処理が少ないほど、プログラムのサイズは小さくなります。
で、処理が高速である で述べたように、C言語
の場合、プログラマーが記述した処理以外のことはほぼ実行されませんが、他のプログラミング言語の場合、プログラマーが記述したもの以外の処理も実行されるので(例えばガベージコレクションや型の判断など)、その分の処理がプログラムに含まれることになります。
ですので、基本的に C言語
で記述したプログラムの方がプログラムサイズが小さくなります。
プログラムサイズだけでなく、プログラム実行中に使用するメモリ量も、おそらく C言語
は他のプログラミング言語に比べれば小さくなるのではないかと思います。これは、処理を実行するためにはメモリが必要なので、バックグラウンドで自動的に実行される処理が多くなる分、使用メモリ量もが多くなると考えられるからです(実際にプログラム実行中のメモリ量を比較したことはないです)。
スポンサーリンク
ハードウェアコストが抑えやすい
さらに、前述の通り、C言語
は他のプログラミング言語に比べてプログラムの動作が高速&省メモリで動作可能なので、同じ性能のプログラムを、他のプログラミング言語に比べて “性能の低い CPU & 容量の小さいメモリ” で実現することが可能です。
ですので、その分のハードウェアコストを抑えることができます。
特に各個人や各家庭で購入されるような家電製品などであれば、そのハードウェアコストがその製品の値段に直結しますので、より安い製品を提供できる可能性があります。従って、他社との価格競争において有利です(値段を下げずに利益を優先するようなこともできます)。
ただ、ハードウェアのコストは下げることができますが、後述する 開発時の生産性が低い で説明するように、開発にかかるコストは高くなりがちです。
なので、ハードウェアのコストは下げることができたとしても、開発にかかるコストがかかりすぎてトータルのコストが高くなる可能性もあります。
この開発コストを考慮して、特にハードウェアがリッチな環境で動作するソフトウェアを開発する場合、C言語
ではなく他のプログラミング言語が採用されることが多いです。
分かりやすい例がサーバー上で動作するアプリやソフトウェアですね!
サーバーの場合、ハードウェアが豪華で性能の高い CPU が搭載されています(コア数も多い)。さらにメモリを大容量のものが搭載されています。
ですので、C言語
でプログラミングしなくても十分高速に処理できるんですよね。CPU パワーでプログラミング言語の遅さをカバーすることができますので、十分な性能を実現することが可能です。
であれは、生産性の高いプログラミング言語を採用した方がメリットが大きいので、サーバー上で動作するソフトウェアは、例えば Python
や PHP
などでプログラミングされたものが多いです。
ただ、それでも処理時間がかかるような処理に関しては(例えば画像処理や行列演算など)、Python
や PHP
などから C言語
で開発されたライブラリを実行するようにすることで、高速化が図られたりしています。
ハードウェア制御が得意
これも C言語
の重要な特徴ですね!
C言語
は直接アドレスを指定してデータの読み書きできるので、ハードウェア制御(デバイス制御)が得意です。
デバイス制御は、そのデバイスのレジスタをビット単位で操作することにより実現されます。
さらに、メモリマップド I/O の場合、そのレジスタはメモリ上に配置されます。つまり、アドレスが割り振られていることになります。ですので、そのアドレスのメモリを直接変更することで、そのデバイスの制御を行うことができます。
で、C言語
の場合は、ポインタ等を利用してそのアドレスを直接指定して読み書きできるので、このデバイス制御が得意です。
ちょっとここは想像が入ってしまいますが、例えば、8つの LED を搭載したデバイスを制御するような場合、さらに、そのデバイスのレジスタがメモリ上の 0x1234
に配置されているとすれば、下記のような処理により、現在の各 LED の ON / OFF の状態を取得したり、ON / OFF を切り替えたりする制御が可能になると思います(各ビットの 1
/ 0
により、それぞれの LED の ON/OFF を切り替える想定で書いています)。
#include <stdio.h>
/* レジスタが配置されているアドレス値をLED_REGで定義 */
#define LED_REG (volatile unsigned char *)(0x1234)
int main(void) {
unsigned char leds;
int i;
/* レジスタの値を8bit分取得 */
leds = *LED_REG;
/* デバイスの情報を取得 */
for (i = 0; i < 8; i++) {
unsigned char led;
/* レジスタの第iビットの値を取得 */
led = leds & (1 << i);
/* LEDが付いているかどうかを表示 */
if (led != 0) {
printf("LED%dはONです\n", i);
} else {
printf("LED%dはOFFです\n", i);
}
}
/* 全LEDのON/OFFを逆転する */
*LED_REG = ~leds;
return 0;
}
ここでポイントになるのが、デバイス制御時にアドレスを直接指定して処理を行なっている点です(LED_REG
がアドレス 0x1234
の定数マクロになっている)。で、このアドレスを直接指定して処理を行うことができるプログラミング言語は限られており、その1つが C言語
なので、このデバイス制御は C言語
の得意分野ということができます。
メモリの操作もそうですね。
Windows や MacOS や Linux などの OS が搭載された PC 上で動作するプログラムは、OS からメモリを提供してもらい、そのメモリを使用して動作します。なのでアドレスを直接指定して処理を行うようなことはまずないと思います。やるとむしろバグになります。危険なので、これができないようになっているプログラミング言語が多いです。
ですが、組み込みなんかでは OS を介さずにメモリに対してアドレスを直接指定して読み書きするようなこともあります。
また OS を作るような場合も、OS 全体のメモリ管理を実現するために、C言語
などのようなアドレスを直接指定して処理できるようなプログラミング言語の方が便利です。
汎用性が高い
ここまで説明してきたように、C言語
は処理も高速で省メモリ、さらにはハードウェア制御も得意という特徴があり、汎用性が高いです。
これらの特徴があるので、組み込み製品や車を開発する際には C言語
はいまだに現役で活躍していますし、OS やデバイスドライバを開発する際にも欠かせない存在になっています。
また、処理が高速なので、システムやソフトウェアの大枠は他の言語で開発したとしても、特に処理が重い部分は C言語
(もしくは C++
など) を用いて開発されるようなことも多いです。
どんなものを開発する際に C言語
が利用されているかについては下記ページで解説していますので、どれだけ C言語
が幅広く利用されているかを知りたい方はぜひ読んでみてください!
スポンサーリンク
自由度が高い
また、C言語
はハードウェア制御も可能で低水準言語的な特徴も持ちながら、高水準語的な書き方もできる自由度の高いプログラミング言語です。
自由度が高いので、危険なソースコードも簡単に記述できてしまうという問題もあるのですが、その一方で、自由度が高い分、工夫次第でバグを減らしたり、流用しやすいソースコードに仕立てるようなことも可能です。
例えば、C言語
はオブジェクト指向はサポートしていませんが、自由度が高いので、工夫すれば擬似的なクラスなんかも実現することが可能です。これにより流用しやすいモジュールを作成することが可能です。
コンパイラ言語である
C言語
はコンパイラ言語になります。CPU が直接理解できる形式に解釈する処理は、一般的にコンパイラ方式で行われます。
処理が高速である でも簡単に説明しましたが、コンパイラ言語には、プログラム実行時の処理が高速であるというメリットがあります。基本的にインタプリタ言語よりも高速に処理が行えます。
ただ、コンパイラ言語はプログラムを実行する前にコンパイルを行う必要があり、このコンパイルが必要な分、手間も時間もかかるというデメリットがあります(リンク等も含めてコンパイルと言っています)。
ですので、ソースコードの修正を行うための手間と時間がかかります。
したがって、ソースコードの修正と動作確認を繰り返すような場合、開発に必要な手間とコストが一気に増えます。インタプリタ言語の場合は、修正すればコンパイルなしにすぐにプログラム実行できるので、修正と動作確認を繰り返すような場合でも、開発に必要な手間やコストはそこまで増えません。
ソフトウェア開発というのは、特に実装フェーズにおいては、主な作業はソースコードの修正(変更)と動作確認を繰り返すことになります。ですので、コンパイラ言語を採用した場合、開発時の生産性は低下すると考えた方が良いです。もちろん C言語
の場合もそうです。
小規模なプログラムの場合、コンパイルは一瞬で終了するので、コンパイラ言語のデメリットは感じにくいかもしれません。ですが、大規模なプログラムの場合、コンパイルを行うのに30分以上かかるような場合もあります。早く動作確認したいのにもどかしい…。
記述量が多い
処理が高速である でも述べたように、C言語
の場合、プログラム実行時に行われる処理は、ほぼプログラマーが記述した処理したのみになります。
なので、処理が高速というメリットもあるのですが、これによるデメリットもあります。
それは、プログラムで実行すべきことは全て、プログラマー自身がプログラミングする必要があるところです。
例えば C言語
には、標準ではガベージコレクションが無いので、メモリを解放すべき全てのタイミングで free
関数を呼び出す処理を記述する必要があります。
つまり、他のプログラミング言語だと、プログラミング言語自体がバックグラウンドで自動的に実行してくれるような処理も、C言語
ではプログラマー自身がプログラミングする必要があります。
ですので、その分、他のプログラミング言語に比べて、処理を記述する量(プログラミングするソースコードの行数)が単純に増えます。
スポンサーリンク
安全性が低い
また、C言語
は安全性が低いという問題点も抱えています。
例えば配列の範囲外にアクセスするような処理も記述可能で、そのような処理も実行可能です。で、これを行うとプログラムがどう動作するか分からない状態になってしまいます。いわゆるバッファオーバーランというバグになります。
配列の範囲外のメモリには、例えば他の重要な変数が配置されている可能性がありますので、その変数を意図せず上書きしてしまうと動作もおかしくなりますよね。そもそも配列の範囲外のメモリにアクセスするとプログラムが落ちて異常終了することもあります。
これは配列だけでなく、動的に確保したメモリ(malloc
関数で確保したメモリ)に関しても同様のことが言えます。
さらに厄介なのは、配列の範囲外にアクセスしてしまうような標準ライブラリ関数も多いところです。
例えば strcpy
や strcat
などは、引数で与える文字列の最後にヌル文字('\0'
)がないとバッファオーバーランが発生し、簡単に脆弱性の原因を作り出してしまいます。
一方で、他のプログラミング言語では、配列の範囲外にアクセスされるような処理が行われるときには例外を発生させたり、自動的に配列のサイズを大きくするように関数が作られていたりするので、配列の範囲外にアクセスされた際にも正常に動作することが可能です。
このような点から、他のプログラミング言語の方が C言語
に比べると安全であると言えます。
ただ、これを行うためには、配列へのアクセス時に配列のどこにアクセスされるかを都度確認する必要がありますので、その分処理量が増えて処理速度は低下することになります。
この点からも分かるように、C言語
は高速に処理が可能な分、安全性を犠牲にしているプログラミング言語なのです。
ですので、C言語
で作成したプログラムを安全に動作させるためには、安全に処理が実行されるように、プログラマー自身がプログラミングを行う必要があります。
例えば配列にアクセスするような場合には、その添字が配列のサイズを超えた値にならないように制御する必要がありますし、もしサイズを超えるような場合は、配列にアクセスする前にエラー制御するなどの処理をプログラマー自身が記述する必要があります。
もしこれを行わないと、配列の範囲外のアクセスが発生する可能性があり、もし発生した際には、プログラムが正常に動作しなくなります。
開発時の生産性が低い
前述の 記述量が多い で解説したように、C言語
の場合、他のプログラミング言語に比較してソースコードの記述量が増えますので、その分、開発時の生産性が落ちます。
また、安全性が低い で解説したように、C言語
の場合、安全性を保つためのような処理をプログラマー自身が記述する必要があるので、これも開発時の生産性を落とす要因となります。
つまり C言語
は、ソフトウェア開発の生産性が低いプログラミング言語と言えます(プログラム実行時の生産性は高い)。
さらに一番厄介なのが、記述量が増えることによって、その分テストや評価にかかる時間も増えてしまうことです。
例えば 安全性が低い で紹介した、配列の範囲外へのアクセスをしないようにする制御文を記述した場合、その制御文が意図した通りに機能しているかを確認する必要があります。
その一方で、配列の範囲外へのアクセスが発生しないようになっているプログラミング言語でプログラミングしている場合は、プログラミング言語側で配列の範囲外へのアクセスが発生しないことを保証してくれているので、その確認は不要になります。
要は、プログラミング言語側で自動的に実行してくれている処理については、プログラミング言語側で動作が保証されているはずなので、わざわざ確認する必要はないということになります。
ただ、C言語
の場合は、実行する処理は全てプログラマーが記述する必要があり、その記述したコードが意図した通りに動作するかどうかを、プログラマー自身、もしくはテストエンジニアなどが確認する必要があります。したがって、その分テストや評価の時間もかかり、ソフトウェア開発の生産性が落ちます。
さらに、コンパイラ言語である で解説したように、C言語
の場合、ソースコード修正から動作確認に要する時間が長いです。毎回コンパイル・リンクをしなおしてから実行する必要があります。これにより手間と時間がかかるので、その分生産性が落ちます。
ですので、ハードウェアコストが抑えやすい で説明したように、C言語
を採用することで、製品やサーバー等のハードウェアのコストを抑えることができるメリットもありますが、逆に開発コストがかかりやすいというデメリットもあります。
プログラマーの負荷が高い
おそらく、ここまで読んできた方はなんとなく察しておられると思いますが、C言語
は速度を優先するために便利さや安全性を犠牲にしたプログラミング言語であると言っても過言ではありません。
そして、その犠牲の代償を払うのはプログラマーです…。つまり、C言語
はプログラマーの負荷が高いプログラミング言語とも言えると思います。
まず 記述量が多い で説明したように、他のプログラミング言語で記述不要な処理も、C言語
ではプログラマー自らが記述する必要があるので、記述量が多くなり、プログラマーの負荷が高くなります。
また 安全性が低い で説明したように、他のプログラミング言語では、プログラミング言語自体が安全性を保障しているようなものも、C言語
の場合は、プログラマー自らが記述する必要があります。
この時に、どのようにすれば安全に処理ができるか・それを実現するためにはどう記述すれば良いかをしっかり考えながら記述する必要がありますので、記述量が増えるだけでなく、考えることも多くなり、プログラマーの負荷が高くなります。
ただ、負荷が増える一方で、いかにして負荷を減らすか・いかにして安全性を保つのかを考えるながら工夫していくところも C言語
でのプログラミングの楽しさではあると思いますので、これらが単純に悪いものと決めつけられるものでもないとは思います。
スポンサーリンク
ソフトウェア資産が多い
また C言語
は、最近流行っているプログラミング言語に比べると歴史が長く、その分 C言語
で開発されたソフトウェア資産が多いという特徴もあります。
ですので、ある程度歴史の長い企業であれば、C言語
で開発されたソフトウェアの資産も他のプログラミング言語よりも多く蓄積されており、新たな製品等を開発する際には、その資産を流用することで(再利用することで)、ある程度生産性を向上することができます。
例えば新たな製品を開発する際に、以前に発売した製品の機能と同じ機能を搭載するのであれば、その機能を実現するためのソースコード一式を流用することで、その部分の開発コストを下げることができます。
これは、流用した部分は実装の必要はありませんし、その流用した部分に対するテストや評価の工数を減らすことが可能だからです。製品化実績のあるソースコードということは、品質が担保されているはずなので。
まぁ、ただ、流用も結構難しいので単純に流用した分だけ開発コストが下げられるというものでもないと思います。流用した機能が全く同じ使われ方をするのであれば問題ないかもしれないですが、以前の製品の時と異なる使われ方をするような場合、流用した部分に変更が必要になる可能性も高いです。
その変更の影響範囲が局所的であればいいのですが、いろんな関数等に影響を及ぼす場合、影響を受ける側の関数も変更が必要になったりして、結局変更量も多くなったり、変更したので結局テストや評価をやり直しする必要があったりします。
なので、単に機能を実現するだけでなく、いかにして流用しやすいモジュールを作成するかという点も、C言語
開発においては重要になります。
例えば、C言語
では言語としてはオブジェクト指向(クラスなど)はサポートされていませんが、擬似的にオブジェクト指向を取り入れてプログラミングするようなことは多いと思います。
ノウハウが蓄積されている
また C言語
は、最近流行っているプログラミング言語に比べると歴史が長い分、プログラミング時のノウハウも多いです。
例えば高速化に対するノウハウも多いですが、安全性を保つためのノウハウも多いです。要は、先人たちが失敗したことを、今後再発しないようにノウハウとして蓄積してくれているわけです。
で、そのノウハウを文書化したものの1つがコーディングルールです。バグを防ぐためのソースコードの記述の仕方、バグを防ぐためにやらない方が良いことなどが、ルールとしてまとめられています。
さらに、ソースコードがそのコーディングルールに則っているかを自動的にチェックするようなツール(静的解析ツール)も充実しています。
ですので、そういったツールを活用することで、C言語
による開発の欠点の1つである安全性の低さをカバーすることが可能です。
例えば、開発中のプロジェクトのソースコードを毎日静的解析を行い、その静的解析でコーディングルールに則っていないと指摘された箇所を修正するだけで、ある程度安全性を保った開発を行うことが可能です。
こういった、ノウハウやツール、さらにはソフトウェア資産をうまく活用することで、ソフトウェア開発の生産性を向上させることもできますし、プログラマーの負荷も軽減することも可能です。
まとめ
このページでは、C言語
の特徴について解説しました!
大体 処理が高速である で説明した内容に、C言語
の特徴が詰まっているんじゃないかなぁと思います。
要は、ほぼプログラマーが記述したことしかプログラムとして実行されないので、処理量が少なくて高速です。で、これとほぼ同じ要因で、省メモリも実現することができます。
その一方で、高速である故に便利さや安全性が低いです。そして、その分開発時の生産性が低下したり、プログラマーの負荷が大きくなる原因にもなります。
ただ、C言語
は自由度が高いという特徴もあり、工夫次第で生産性の向上やプログラマーの負荷も軽減することができます。この工夫により、いろんなことができるのが、C言語
のおもしろさの1つだと思います。
C言語
を学んでいる方は、より C言語
の良さを活かしつつ、よくない点をいかにして工夫して解決すれば良いかも考えながらプログラミングに取り組んでみると良いと思います!
また、C言語
はこのページで紹介したような特徴(特にメリット面)を持っているので、さまざまな開発に利用されています。下記ページでは、C言語
で開発されているものの例をまとめていますので、こちらもぜひ読んでみてください!
オススメの参考書(PR)
C言語学習中だけど分からないことが多くて挫折しそう...という方には、下記の「スッキリわかるC言語入門」がオススメです!
まず学習を進める上で、参考書は2冊持っておくことをオススメします。この理由は下記の2つです。
- 参考書によって、解説の仕方は異なる
- 読み手によって、理解しやすい解説の仕方は異なる
ある人の説明聞いても理解できなかったけど、他の人からちょっと違った観点での説明を聞いて「あー、そういうことね!」って簡単に理解できた経験をお持ちの方も多いのではないでしょうか?
それと同じで、1冊の参考書を読んで理解できない事も、他の参考書とは異なる内容の解説を読むことで理解できる可能性があります。
なので、参考書は2冊持っておいた方が学習時に挫折しにくいというのが私の考えです。
特に上記の「スッキリわかるC言語入門」は、他の参考書とは違った切り口での解説が豊富で、他の参考書で理解できなかった内容に対して違った観点での解説を読むことができ、オススメです。題名の通り「なぜそうなるのか?」がスッキリ理解できるような解説内容にもなっており、C言語入門書としてもかなり分かりやすい参考書だと思います。
もちろんネット等でも色んな観点からの解説を読むことが出来ますので、分からない点は別の人・別の参考書の解説を読んで解決していきましょう!もちろん私のサイトも参考にしていただけると嬉しいです!
入門用のオススメ参考書は下記ページでも紹介していますので、こちらも是非参考にしていただければと思います。
https://daeudaeu.com/c_reference_book/