質問するログイン新規登録

意見交換

15回答

759閲覧

変な質問かもしれませんが、CはPythonより簡単という話がXで盛り上がっていてCについて質問です

u2025

総合スコア260

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

2クリップ

投稿2026/04/25 04:57

0

2

テーマ、知りたいこと

背景としては質問タイトルに書いた通りでCについて、Xでよく話されていて、Cは未定義動作が多いからPythonより難しいという反論意見なども目にします。

実際にはPythonの方が適した場面が多いのでPythonの方が簡単なんだと思うのですが、C言語を使っている人に聞きたいのですが、C言語を使う理由として、速度がPythonより早いからC言語を使うというのを聞きますが、つまりC言語で開発する時は単に動くだけじゃなくて速さがいくつ以内じゃないと行けないみたいなのが決まっていたりするのですか?こう書いた方が早いとかはどうやって判断するんでしょうか?いくつか書いて比較するのですか?また、未定義動作が多くて難しいというのも聞きますが、実際には車や金融システムで使われると聞きますが、そんな難しい言語を使いながら人の命や大きなお金を預かるシステムを作っていて不安などはないのですか?プログラマはとても優秀な人しかなれないのでしょうか?あと、速さの確認もですが人のミスで未定義動作のコードを書いてたりすると思いますが、それはいいのですか?絶対にその状態で人に使われないのかそもそも入り込まないような作り方をするのかとか。

背景、状況

テーマ、知りたいことに書いた通りです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

回答15

#1

nanashi123

総合スコア179

投稿2026/04/25 09:44

C言語を使う理由はC言語が圧倒的に速いかつライブラリが充実しているためです
多くの言語はCやC++のエコシステムに依存しています
これは最近流行しているRustについても同じです
C++でさえextern “C”をサポートしてC言語との連携を主眼に置きます
つまり、Cを扱えるという事自体が大きな資産であるということです

C言語が柔軟な理由は、速度の他にもアセンブラとの連携があります
Cのコンパイラはアセンブリを直接出力します
いったんアセンブリとして吐き出されたプログラムは、元の言語の種類に関わらずリンカによってプログラムを統合できます
言語側がアセンブリを生成できる機構さえ備えていれば、C言語の全ての資産を利用できます
Pythonを通して呼び出されるC言語の関数も、そうしてアセンブリがC言語と連携することで動作しています
そしてPython単体で同様のプログラムを作るよりも圧倒的に速度面で有利だという事実があります

このような低レイヤー領域においては、C言語の理解は避けられない行程となります
Rustでシステムを開発する時でも、C言語のエコシステムに対する知見は必須です
現代のコンピュータ技術を支える大元をほぼC言語が担保しているので、単純には置き換えられません
未定義動作はメモリを柔軟に扱うからこそ必要になります
ただし全てが自由という訳ではなく、プログラマが扱えるメモリ領域には権限の概念があります

その他C言語の言語的な利点としては

•アセンブリ出力とヘッダーファイルによるプログラムのカプセル化
•標準ライブラリによるシステムコールの汎用化
•リンカの採用によるプログラムのモジュール化

などがあります
特に動的ライブラリによるモジュール化はプログラムの差し替えや拡張を容易にする点で大きな恩恵です
最も既存の資産についてはRustによる置き換えが推進されるところでもあります

#2

ymmr

総合スコア157

投稿2026/04/25 10:17

全然C言語のシステム運用とかしたことはなく、SIerにいたときに同期から話を聞いたりした程度ですが回答します。
過去障害ありましたが全銀ネットはC言語でしたね。他行への振込ができなくて大問題になって記者会見していました。開発時はわからないですが、この障害が発覚したときNTTデータのPMはもう想像がつかないくらいの気持ちだったでしょうね・・・
https://www.zengin-net.jp/announcement/pdf/announcement_20231201.pdf

全銀ネットはミッションクリティカルなシステムで、トランザクションの規模もレイテンシーの要件もかなり厳しいはずなので、速さの観点もそうですし、JavaなどのGCが走る言語ではダメで、Cのような手動でメモリ管理できる言語を採用すべきなんだと思います。たぶん。

#3

thkana

総合スコア7809

投稿2026/04/25 11:39

編集2026/04/25 11:42

Cで未定義動作が「多い」、というより他の言語で未定義動作の話を聞いたことがない気がしますがそれはともかくとして、私はCの方が難しいと考えていますがしかし

未定義動作が多いから

というのは視点がずれている気がします。

そもそもとしてその手の議論では言う人毎に「簡単」「難しい」について、観点がばらけていると思います。
C言語は言語構造というか規則が「簡単」です。規格書が、C23draftのpdf版で3.9MBぐらい。Pythonは、3.14のドキュメントをtextでダウンロードしたら13MBとか。乱暴な比較ではありますが、まぁ単純にいってしまえば1/4とかの規模。
でも、プログラムを組むことを考えれば、例えば文字列なんか扱ってみればどう考えてもPythonの方が「簡単」でしょう。Cの方が言語本体が簡単というか単純な分、また、コンピュータの内部についての知識も必要になってくる分、その上で構築しなきゃいけないプログラムは難しいかどうかはともかく「複雑」にはなるでしょう。
比較するポイントを明らかにせずにどっちが簡単、なんて話をしても意味がないと思います。
ちなみに、言語やライブラリの部分は皆が共通に使うものです。その部分が複雑でも、多数の使用例ができ、皆で様々な使い方をしていれは自然とバグも潰されていくでしょう。一方、アプリケーション自体は原則として「それぞれ異なる」ものです。当然ながら、全てのチェックは開発者が負わざるを得ません。開発者のすることが少なくて済む/責任が軽くて済むなら、その方が「簡単」と呼ぶにふさわしいのではないか、というのが私の考えです。

で、私の場合は組み込み屋ですから、そもそもPythonなんて乗るわけがないメモリ量でプログラムを開発するのはごく普通です。まぁ、Micro Python/Circuit Pythonなんかが動くマイコンも珍しくはありませんが、コストを切り詰めた8bitや16bitマイコンではもはや話になりません。C一択、というのはごく普通にあることです。
もちろん、機械の動作を規定するソフトウェアであれば、あるタスクの応答は何ミリ秒以内でなければならないとか、ある動作の間隔が何十マイクロ秒以内じゃなきゃいけない、なんてことも普通で、単に速い遅いというより「動作が読める」ことが重要になってきます。Python等ではガベージコレクションとかが影響します。
なお、プロの仕事の場合は「この方が速い」ではなく、「決まった時間内に確実に動作が収まる」が求められることがほとんどで、意味も無く速さを求めることは求められません(たまに趣味に走ってやってしまう人もいますけれど)。

組み込み以外の分野でいうなら、C以外の言語が実用的になったのにはハードウェアの高速化というのが大きく効いているものと思います。Cでなければまともな速度が出なかった処理が、(マルチコア化なども含めて)ハードウェアが速くなったことでインタープリタであるPythonでも大抵はなんとかなってしまうわけです。

人のミスで未定義動作のコードを書いてたりすると思いますが、それはいいのですか?

いいわけありません。で、そういうことをおっしゃるのは多分プロの仕事をちゃんとはご存知でないのだと思います。まずはMISRAのような、ありがちなミスを防止するコーディングのガイドラインもあるので必要に応じてそういう「ルール」に沿ってコードを書きます。コードを書いたらそれでソフトウェアの完成とするものではありません。テストをするし、レビューも受けるのが普通です。また、ソースコードを静的解析をするQACとかCodeSonarとかいったツールを使えば結構小うるさく指摘をしてきます(ただしツールは高価...)。
「売り物」のソフトウェア開発では、100%の保証ではないにしても、可能な限り不良を流出させない努力がされるのが普通でしょう。それはCでも他の言語でも変わりません。

#4

u2025

総合スコア260

投稿2026/04/25 14:08

そういうことなのですね
未定義動作のあるC言語を使うのはMISRAのようなガイドラインがあるから、未定義動作を気にせずに長所である速度を活かせるからということでしょうか?
MISRAのようなガイドラインがあるから、車の事故や金融の事故が起きずにプログラマーは安心できるということでしょうか?
じゃあ、未定義と言ってる人にはMISRAのようなガイドラインがあることを知らないプロの仕事をちゃんとはご存知でない人という意見なわけですね。
ご明瞭な回答ありがとうございました。
すみません。これは質問ではないのですが、アセンブリとリンカというのでC言語が早くてPythonはメモリ量的に乗らないと書いてあるのですが、なんでCPUに直接プログラムせずアセンブラをC言語で書くのですか?OSに入力させるとかなら時間が無駄だと思いました。
気になったら質問してみます。

#5

thkana

総合スコア7809

投稿2026/04/26 01:15

そういうことなのですね

いや、なんだか伝わっている気がしません...すみません、説明ヘタで。

MISRAのようなガイドラインがあるから、未定義動作を気にせずに長所である速度を活かせるからということでしょうか?

ではないです。精一杯気にして、踏まないようにする手段のひとつがガイドラインというだけ。完璧でもないし、採用も任意です。MISRA嫌いだ、という人もそれなりに居ますし。

未定義処理を避けるには、十分な知識がまず必要です。そのうえで、レビューして検査ツールやガイドラインなどの手段を講じることで、かなり避けられる、という話。「これをすれば大丈夫」、そんな1/0の話じゃないです。そういう意味では「未定義動作があるから」の一点で論じるのも違う気がします。

また、「速度」について速い遅いの話はしたつもりはないのですが...どこで「速度を活かせる」ことになったのでしょう?

Xの該当の投稿を読んでいるわけではないので、そちらの投稿/投稿者については判断材料を持ちません。私は、私の読んでいる範囲の内容について、プロの仕事をご存知ではない方が書いているという推測をしているだけです。

これは質問ではないのですが、

のあとは、こう言ってしまってはナンですが、技術的に意味のある文章になっていません。これから知っていけばいいだけの話なので責めるものではありませんが。この文章からすると元の質問もちょっと背伸びしていて、まだ「ちゃんとわかる」には前提知識が足りない気がします。

#6

coffee_9999

総合スコア4

投稿2026/04/26 05:08

私は業界人ではないので、速さと、効率について。

C言語が速いと言われますが、組み方次第で劇的に変わります。
この前、暗号プログラムをCで組みました。
しかし、あまりにも遅いので、マルチスレッド式に改善したら、10倍以上の処理速度が実現できました。
Pythonでも同じではないかと思います。

ですが、開発効率は、確実にPythonが上でしょう。
そう考えると、開発速度をとるか、開発効率をとるか、トレードオフだと思います。

C言語は車などに使われているようですが、私の知る限りでは、マイコンでもPythonが
動く環境があるようです。
これから普及していって、pythonが車などにつかわれるようになってもおかしくないと思います。
しかし、pythonで作っても事故は起きるものだと思います。
つまり、どれだけデバックやテストを行ったのか。
そこに尽きると思います。

#7

fana

総合スコア12401

投稿2026/04/26 07:01

編集2026/04/26 07:12

末端の雑魚の立場からすると,
コードを書く人が言語を選択できる場面ってそんなにあるのだろうか…? とか.

C言語を使う理由

それは「Cで」と(どこか,遙か上の方から)指定されるから,でしかない…….

「C++で」って言われたら C++ になるし,「C#で」って指定されたら C# でやることになる.
(「Pythonで」っていう指定をされたことは幸運にもまだ一度もない.)

おそらく,言語の選択は「動作が早い」とか「未定義がどうの」みたいな話ではなくて,「発注元の担当者が扱える言語だから」とかそういう要素によって成されているのだろうと思う.

速さがいくつ以内じゃないと行けない

カメラ画像が入力で……みたいなやつとかだとそれなりに速度を要求されはしますね.

こう書いた方が早いとかはどうやって判断するんでしょうか?いくつか書いて比較するのですか?

必要であればやります.
でもほとんどの場合,アルゴリズムとかデータ構造とかそういうレベルでの比較(差し替え)になる感じだと思うので,そこらへんは言語に依らない話になるのかな,と.

#8

u2025

総合スコア260

投稿2026/04/26 08:21

3件のご回答を受けてそう読解しました

#9

u2025

総合スコア260

投稿2026/04/26 08:31

また、視点の違うご回答ありがとうございます。
今後はPythonが車に使われたりする事もあるということなのですね、
やはり未定義動作がある言語だと車や医療機器、航空機で使うのは怖くないのでしょうか?
また、どこか遥上の方からプログラミング言語やツールを指定されるということになると、作っている人は誰の指示でそうしているのか分からないということでしょうか?また、プログラミングしない人が決めているとなると余計に怖いですね。偶然起きてないだけで、より安いとかマージンを得られるからそういう選択になっている可能性もあるということでしょうか?怖くて不安になってきました。
ありがとうございます。

#10

fana

総合スコア12401

投稿2026/04/26 10:28

実際には車や金融システムで使われると聞きますが、そんな難しい言語を使いながら人の命や大きなお金を預かるシステムを作っていて不安などはないのですか?プログラマはとても優秀な人しかなれないのでしょうか?

現実のことはわからないけど,{車や航空機,金融システム,医療機器}みたいなやつに関しては

プログラマはとても優秀な人しかなれない

ということであってほしい.

#11

thkana

総合スコア7809

投稿2026/04/26 11:50

プログラマはとても優秀な人しかなれない

ということであってほしい.

なんとなく「ネットサーフィン」してたら https://www.simulationroom999.com/blog/automotive-development-software/ みたいなところに行き着いて、

自動車業界のソフトウェアエンジニアのプログラミングスキルは決して高い方ではない

とか言ってる方いますね。残念ながら。
まぁ、自動車は組み込みでもかなり特殊な業界とは聞いているので、そういうこともあるのかも知れない、と思ってしまいます。「この通りにすれば一定の品質は担保される」みたいな型がカッチリできていて、逆にそこからの逸脱は許されないとか。
あと、自動車といっても旧来のエンジンとか車の走行に関わるような部分と、最近の「コネクテッド」な部分だとかなり様相がちがったりするんじゃないかと想像はしますね。それこそ、カーナビなんてPythonが入ってても全然不思議はないわけで(この辺は実態は知りません)。

#あと、パチンコ台の業界もかなり特殊だとか。

#12

otn

総合スコア86640

投稿2026/04/26 14:29

編集2026/04/26 14:36

Cは未定義動作が多いからPythonより難しいという反論意見なども目にします。

未定義動作が多いことと、言語の難しさは、関係するんですかね?「覚えることが多い言語は難しい」ということなのでしょうか。
わたしは規格(言語仕様)に未定義動作の記述があることと難しさはあまり関係ないと思います。入門者の間はそんなこと気にしなくていいし、上級者になればそのあたりは理解できているでしょう。入門者から初心者になり、初心者を卒業するときに、そのあたりの仕組みを一通り理解していればよいくらいかと思います。

そもそもCの言語仕様に「未定義の動作」「処理系定義の動作」「未規定の動作」などがあるのは何故かを理解していますか?

Pythonの公式サイトに載っているリファレンス(仕様書に相当)は、公式サイトで公開されているCで書かれたPython処理系(CPython)についての仕様です。処理系が1つなので1通りの実行結果しかない。
(細かいことを言うとCでコンパイルして処理系を作るので、Cに依存する部分は環境によって異なりますし、OS依存のライブラリもあるし、メモリサイズによっては実行時エラーになったりならなかったりのケースなどはあるでしょうね)

Pythonの言語リファレンス冒頭にはPypyなど他の処理系への言及がありますが、

これらの各実装はこのマニュアルで文書化された言語とは多少異なっている、もしくは、標準のPythonドキュメントと何処が異なっているかを定めた情報が公開されているでしょう。あなたが使用している実装上で、代替手段を使う必要があるかどうかを判断するためには、各実装の仕様書を参照してください。

ということなので、「CPythonに限らず、どの処理系でも動くPythonプログラムを書きたい」と思えば公式リファレンスだけ見ていてはだめだということです。まあそんなことをしたいと思う人はあまりいないでしょうが。
「この仕様書の通りに書けばどの処理系でも動くPythonプログラムになる」という仕様を新たに定めればおそらくCの「未定義」「処理系定義」に相当する記述を使うことになるでしょうね。(他の処理系のことをよく知らずに書いているので「おそらく」ですが)

Cは、元々はDEC社のミニコンで開発された言語ですが、その後広く使われるようになり、メインフレームコンピューターや、組み込みマイコンなどでも使われているので、処理系が非常にたくさんあります。処理系作成者に対して「この部分は作りやすいように処理系仕様を自由に作っていいよ」というのが、「未定義の動作」「処理系定義の動作」「未規定の動作」です。昔のRAMが16KB、32KBとかの8bitパソコンで処理系が動いたりするには自由度は大きい方がいい。今の組み込み系はコンパイルはパソコンなどでやっているのでしょうけど、コンパイル後のプログラムサイズの制約がきついのは同じでしょう。
もし、PythonのようにCの処理系が実質ほとんど1つしかないのであれば、その処理系のリファレンスマニュアルに従って書けばいいので、明示的な「未定義」などは出てきません。

JISのCの規格書には、

参考 未定義の動作に対して,その状況を無視して予測不可能な結果を返してもよい。翻訳時又はプログラム実行時に,文書化された,環境に特有な方法で処理してもよい(診断メッセージの発行を伴っても伴わなくてもよい。)。(後略)

ということなので、規格書で未定義などとなっている部分を、マニュアルに全部書いて未定義なものを無くした処理系を作ることは十分可能です。将来的にもその処理系だけで動けばいいのであればそれを使えば十分です。CPythonだけで動けばいいというのと同じことですね。

難しさという意味では、「CのISO/JIS規格に適合するすべてのC処理系で、同じ動作をするプログラムを書く」のが難しいということかもしれません。
ただ、汎用のライブラリを書いてソースを公開するとかじゃなくて、とある業務のプログラムをCで書く場合にはそこまで目指す必要はないと思っています。まあ、あえて「規格では未定義がだ自分の使う処理系では定義されている機能」を使うかどうかですが、タブーではないと思いますよ。
汎用ライブラリを書く場合は、内容の難しさが同程度だとすると、「CPythonだけ考えればいい」と「すべてとは言わないがメジャーなC処理系では同じ動作になることをテスト済み」だと後者が大変ですね。まあ、「多数の処理系でテストまではしてないが、未定義の動作、処理系定義の動作、未規定の動作を使っていないことをチェックプログラムでチェック済み」で良しとするのですかね。

Pythonに比べてのCの難しさがあるとすると、アセンブラがCPU視点、他の多くの言語が人間視点だとすると、Cはその中間くらいなので、コンピューターアーキテクチャの理解が無い状態でCを学ぶのは、「新しい事柄に慣れるのに時間がかかる人」には難しい気がします。かと言って「簡単なアセンブラプログラムが読めるくらいになってからCを学べ」というのも違う気がします。
※「新しい事柄に慣れるのに時間がかかる人」は別に頭が悪い人ということではなくて、今までの自分の知見にこだわるあまり、そこから遠いことをすぐに受け入れられない人を時々見かけるので、そういう人のことです。「それって結局~~~っていうこと?」と自分の今までの知見の範囲で理解しようとする。過去の知見の範囲ではすごく出来る人だったりしますが。

#13

actorbug

総合スコア2567

投稿2026/04/26 21:33

参考までに、CPythonとPyPyとで、以下のような挙動の違いがあります。

#14

Manabu

総合スコア155

投稿2026/04/27 00:34

なんでCPUに直接プログラムせずアセンブラをC言語で書くのですか?

プログラムというのは機械語という整数の集まりに過ぎないので、もし自由にメモリへアクセスできたらこの数列を書き換えてしまう危険が付き纏います
C言語で関数ポインタを取得することで簡単にこの配列へはアクセスできますが、コンパイラやOSによって厳格に制限されています
この安全装置を取り払った世界を想像してみてください
それがプログラミング言語の存在意義でもあります
自由と秩序を天秤にかけた世界でプログラムは成り立っています
C言語の存在及び選定はその回答の一つです

#15

otn

総合スコア86640

投稿2026/04/27 02:07

編集2026/04/29 15:11

そもそも、

やはり未定義動作がある言語だと車や医療機器、航空機で使うのは怖くないのでしょうか?

というような発想が出てくるというのは、「未定義動作」をどのように理解してたのでしょうか?

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

この意見交換はまだ受付中です。

会員登録して回答してみよう

アカウントをお持ちの方は

関連した質問