プログラミング

どうして私はC言語で仕事をしているのか

投稿日:

みなさんプログラミング言語は学んでますか?今から始めますか?
最初に学ぶべきプログラミング言語ってなんだと思いますか?そうです。C言語です。
C#でもC++でもObjective-Cでもなく、Pure Cです。
何を隠そうわたしはお仕事でバリバリにC言語を書くC言語屋さんなのです。
それではC言語を使う理由をご説明しましょう。

仕方ないんだもの

だって仕事がC言語の製品プロジェクトなんだもの

いまの時代C言語を学ぶ理由の最も大きな部分は、「仕方なく」です。
ホントはPythonがいい、妥協してもGoがいい、それがだめならせめてRustが書きたい。そういうモダンな欲求はすべて配属プロジェクトによって無に帰します。
上司から「オマエのプロジェクトはC言語だ」と言われれば拒否権はないのです。

ではなぜC言語の製品プロジェクトが存在しているのでしょうか。

だってウン十年以上開発してるんだもの

C言語というのははっきり言って今風ではないです。
そんな言語が採用されている製品というのはすなわち、今風ではない製品です。
開発当初は他に良い選択肢が無かったのでC言語で開発を始め、エンハンスだソース流用だと言って、他の言語に移る機会を失って今に至るわけです。
こういったスタイルのプロジェクトは巨大なソースコードを抱えていて、行くも地獄引くも地獄の暗黒プロジェクトになっています。
全部捨ててイチから作り直したい。

だって他の言語が動かないんだもの

モダンなWebエンジニアには信じられないかもしれませんが、世の中にはWindowsでもMacでもLinuxでもない環境があります。
具体的には組み込み・マイコン分野です。そしてそれらの環境において、用意されるプログラミング言語の選択肢はほぼC言語一択になります。
今どきRaspberry PiにもLinux入るやん、と言いたい気持ちもありますが、そういったOSすら認められない組み込み分野というのがあるのです。

コンピュータを純粋に計算機として使いたい

C言語が他の言語と比べて優れている点といえばやはり性能です。
圧倒的に早いです。

なせなら、「プログラムはプログラマが書いたとおりに動く」と言いますが、実際には「プログラマが書いてないこと」もある程度動いています。しかしC言語は「プログラマが書いたことしかしない」ので早いのです。
言うなれば他の言語はオートマチック車で、C言語は電子制御もパワーアシストもないマニュアル車のようなものです。

なので、コンピュータを純粋な計算機として使いたい学術分野ではある程度の需要があります。

とはいえ近年はコンパイラの進歩によってPure CよりもC++の方が性能が良いことも多いですし、機械学習などはライブラリがよく整備されたpythonなどが人気ですが。

下の階層まで見通しが効く

C言語というのは言語仕様があまり複雑ではなく、先に書いたとおり「プログラマが書いたことしかしない」言語なので、「このコードを書くとどう動くか」という見通しが立ちます。
それはつまり、C言語の下で動いているものに関心を持つことができる、ということです。

図で描くとこんな感じ。C言語そのものだけではなく、その下にコンパイラやOS、ハードウェアがあって、それらの上でプログラムが動いている。そしてプログラマは、それら下の階層を意識してプログラミングできるわけです。

比較して、たとえばpython等はこう。下の方には確かにOSやハードウェアがあるハズなんですが、pythonというものが巨大で複雑なので、OSやハードウェアまで考えることが難しい。

これは一長一短あります。
C言語であれば、たとえば「こういう書き方をすればLinuxで早く動くかな」といったような特定OS向けに特化したチューニングですとか、「この関数は多分CPU○○サイクルぐらいで動くだろう」といった極めてピーキーな性能調整ができるわけです。
一方で、C言語でプログラムを書く、というのは、C言語の言語仕様だけでなくコンパイラによる最適化やOS・ハードウェアアーキテクチャの知識が求められる、ということでもあります。
つまり、プログラミング言語の「理論」と「実装」の両面に詳しくなければいけない、ということです。

pythonなどのモダンな言語はOSやハードウェアの存在をうまく隠蔽しています。
つまり、プログラミング言語の「理論」を把握していれば「実装」については考えなくて良い、と言うことです。

余談ですがたいていのC言語プロジェクトでは現状こんな感じと化してるので、間違えても息の長いプロジェクトに配属されてはいけません。

まとめ

現在のC言語の立ち位置は、OSやハードウェアを効率的に操作できる言語です。ここでいう効率的に、とは「機械語を書くよりはわかりやすく」という意味です。
そのため現在では組み込みなどの一部分野でのみ積極的に利用され、他分野では「過去の遺産」と化してしまっています。

プログラムを学ぶのでC言語から始めたい?やめとけやめとけ!

-プログラミング

執筆者:

関連記事

GeoJSONで市町村境界をマージして都道府県境界にしたい(その1)

前回の続きで、国土地理院の「国土数値情報」っていうオープンデータで遊んでいます。独立した記事なので前回のは読まなくても良いです。 やりたいこと 国土数値情報で提供されている「行政区域データ」は、市町村 …

no image

C言語のポインタに関する補足説明

前回、C言語のポインタに関する解説記事を書きまして、そこそこの反響を貰うとともにいくつかの指摘を受けました。 前回の記事では幾つか「ウソではないけど真実と違う」記述がありまして、その点を補足としていく …

【Unity】GPUを使ってパンツを隠すスクリプトができた

かわいいスカートを履きたい!でもパンチラしたくない! それは誰もが抱く夢です。もちろん、3Dモデルだってパンチラしたくないと思っているハズです。 というわけで偉大なる先人がいます。 Unityでパンツ …

no image

[C言語]スペースを大量に入れるとバグが直るコードを書いてみた

↓こういうツイートがバズっていたので、実際に組んでみた。 修士の頃、授業の課題でC言語書いてる時にどうしても謎のエラーが出て困っていた。それを見たSE経験(金融系)がある社会人大学院生の同期の女性が「 …

no image

M5StickC Plusの明るさ(M5.Axp.ScreenBreath)、0~100かもしれない

M5StickC Plusで画面の明るさを調整するM5.Axp.ScreenBreath()という関数があります。 日本語リファレンスでは指定値7~12ということになっています。 また、公式ドキュメン …