プログラミング

どうして私は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言語から始めたい?やめとけやめとけ!

-プログラミング

執筆者:

関連記事

no image

UnityのCompute Shaderに線分と三角形の衝突判定をさせる

はじめてCompute Shader使ってみた。でもあまり性能は出ないのでただの失敗の記録です。 まず元のアルゴリズムはコレ。 線分と三角形の当たり判定 – 富士見研究所 で、これをまず三角形の表裏問 …

no image

Unityでメッシュをさわるノウハウ

ヒマなので覚書。ウラを取っていない経験則なので話半分で読んでください。 あと、3Dの基本概念とUnity固有の話の区別が付いていないのでごめんなさい。 もくじ Meshクラスの基本 Unityでポリゴ …

no image

例え話をしないC言語のポインタの説明

もくじ まえおき 巷では「プログラマーになりたい人に初学者にとって、ポインタという考え方がわけわかめ」という話がよくあります。 そこでいろいろな人が「ポインタは住所だ」とか「変数がハコで」とか手を変え …

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

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

no image

“API”をなるべく分かりやすく説明してみる

“API”という言葉が一般にもよく使われ始めています。 しかし、非エンジニアにとっては馴染みのない言葉で、しかも謎の英略語なので、一部の人々からは「APIがなくなった」(=AP …