• ベストアンサー

素朴な疑問 (C言語とアセンブラの処理速度の違いについて)

C言語で作成したプログラムをビルドして実行ファイルを作成するのと、アセンブラ言語(?)をアセンブルして作成した実行ファイルは、どうして処理速度が違うのでしょうか?例えば全く同じ処理を高級言語と低級言語で作成した場合、出来上がったそれぞれの実行ファイルの違いは、コンパイル時に吸収されてしまうわけではないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

>アセンブラ言語 プログラム作成者が、そのケースだけに、適当と思うようにコーディングします(できます)。=(A) >C言語で作成したプログラムを実行ファイルを作成する これは汎用性(色々のソースのケースに対応できるよう、かつ誤りなく、出来るだけ短く)のあるように、「仕掛け」に基づいて機械語に落とされます。 ただ大切な点は、理論的裏付けがあり、しっかりしてます。 =(B) さらにまた最適化などの、調整処理も行われます。 (A)と(B)は普通異なります。同じ短い課題を2人がコーディングしても相当ことなることは、OKWEB上の回答コーディング例でも良くあります。 だから差がでます。普通(A)<(B)でしょうが、下手なプログラマだと、(A)>(B)かも知れません。(「<」はコーディングステップ数の多少や実行処理時間の多少を意味します。) 個人運送業者に頼むのと、大手宅配業者に頼む例をイメージしました。後者は集配センターなど通ります。良く道を知っている業者なら地道を通り速いが、不慣れだと遅くなるかもしれません。でもシステムとしては後者がしっかり してます。 >コンパイル時に吸収されてしまうわけではないのでしょうか 言っている中味が違います。同じ機械語になってないのですから。 コンパイラなどは、非常に洗練された・進んだ数学・論理・理論のロジックを用いて作られます。素人が一朝一夕に思いつくようなもので作られません。 しかし局部ミクロ的には個人素人プログラマの方が短い・速いコードになるかも知れません。改善の余地はあるのかも。

ketchappt
質問者

お礼

具体的なアドバイスをしていただき、どうもありがとうございます!運送業者の例がわかり易くて参考になりました。言われてみると、アセンブラは機械語を人間が理解できるようにした言語だったのですよね。必要に応じて最小限の処理のみを記述できるアセンブラが、結果として処理速度の速いソフトを開発できるのですね。俄然アセンブラに興味が湧いてきました。どうも有難うございました!

その他の回答 (4)

回答No.5

Cコンパイラが吐き出す機械語コードには速度的に限界があるからです。 たとえば、関数呼び出しのとき、Cコンパイラが作成したコードは一般にスタックを用います。 それに対して、直接アセンブラで記述すればレジスタで引数を渡すことができたりするわけです。 要は、Cコンパイラが吐き出すコードは規則に基づいているので、制約があるけど、直接アセンブラで記述すれば、なんでもありなので、最も最適化されたコードを記述することができるわけです。 ただし、最近のコンパイラは最適化の技術が向上しているため、速度の差は縮まってきているでしょう。

ketchappt
質問者

お礼

コンパイラの技術向上がCとアセンブラの差を縮めるのですね。僕としては、個人的にインラインアセンブラというのに興味が出てきました。ご回答どうも有難うございました!

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.4

C言語とアセンブラをちょっとかじればわかります。 ちなみに普通Cコンパイラはアセンブラではき出せるものがほとんどで、 VisualC++ではアセンブラと混在させてデバッグすることもできますし Cのソースの中にアセンブラを組み込むことも可能です。 どうして実行速度が違うのか。 単純な計算なら 最適化を最大に設定した場合、アセンブラで記述しても Cで記述しても実行速度はほとんど変わりません。 ※アセンブラで組んでも処理に無駄が多ければCより遅くなります。 日々CPUは命令数が増えていますがCのコンパイラはそれを全てサポートしているわけではありません。 例えばVC6.0で8個の配列に同じ足し算をするというコードをアセンブラでみると 8回足し算をしているのですが、MMX命令を使えば1回の処理でできてしまいます。 ※VC7.1はそこまで最適化されるかもしれません 以下のページが参考になるでしょう。

参考URL:
http://www1.kcn.ne.jp/~robe/pf/pf009.html
ketchappt
質問者

お礼

インテルのMMXテクノロジですね。この技術がアセンブラに関わっているなんて、今まで思ってもいませんでした。わかるということは楽しいものですね。ご紹介いただいたサイトは、改めて読ませていただきます。まずはお礼まで・・。アドバイスどうも有難うございました!

  • matyrcry
  • ベストアンサー率47% (101/213)
回答No.3

Cの関数は通常だと呼び出し前のレジスタ状態をスタックに待避させて戻り時に復帰させます。 どこからどんなタイミングで実行されてもいいように安全保障があるわけです。 アセンブラだとそういうことも自分で記述しないと行われません。 ベーシックなんかだとエラー時に即アウトでなくエラーメッセージを表示させるルーチンにジャンプするなど、 高級(?)になるほど目に見えない無駄処理(?)が間にちりばめられるため、処理は重くなります。 保証がない処理は、その分速いけど危ないです。

ketchappt
質問者

お礼

明快なご回答、参考にさせていただきました。どうも有難うございました!

回答No.1

例えば、変数a,bに値を代入して、足し算した結果を変数cに代入する、というプログラムを例にとりましょう。 int a, b; a=1; b=2; c=a+b; こんな感じです。 C言語ではそれぞれ変数はアドレスを持っています。 これをコンパイルすると、 ・変数Aのアドレスが指すメモリ領域に1を書き込む ・変数Bのアドレスが指すメモリ領域に2を書き込む ・レジスタR1に変数Aのアドレスが指すメモリ領域の内容を代入する ・レジスタR2に変数Bのアドレスが指すメモリ領域の内容を代入する ・レジスタR3にR1+R2を代入する ・変数Cのアドレスが指すメモリ領域にレジスタR3の内容を書き込む というような実行ファイルが出来ます。 ところが、アセンブリ言語では、レジスタの使用など自由自在ですから、変数a,bを使わずに、直接レジスタに代入することも出来ます。 ・レジスタR1に1を代入する ・レジスタR2に2を代入する ・レジスタR3にR1+R2を代入する ・変数Cのアドレスが指すメモリ領域にレジスタR3の内容を書き込む これでも、変数Cについての結果は一緒です。 最適化が極限まで行われれば、かなり効率のいいコードが出来ますが、コードの意味にまでは踏み込めないので、双方ともきちんと組んであれば、アセンブラの方が処理速度は速くなります。

ketchappt
質問者

お礼

アセンブラはレジスタに直接書き込むことができるから早いのですね。目から鱗のご回答、どうもありがとうございました!

関連するQ&A

  • C言語とJavaの違い

    C言語とJavaの違いの1つとして間違えていたら教えて下さい。 「C言語はコンパイル時に環境に応じて異なるモジュールが作成される危険性がでる場合があるのに対して、JavaはJavaVMという処理系でプラットフォームの違いを吸収されるので、JavaVMが搭載されていればどの環境でもJavaプログラムは動かすことができるでよいのでしょうか?」

    • ベストアンサー
    • Java
  • C、C++、Peal、PHPその他「高級言語」といわれる言語について

    僕はPICマイコン(16シリーズ)を趣味で使っており 言語はアセンブラを使っています。 で、質問なんですが最近ホームページを作りたくなり LINUXの勉強も含め自宅サーバーを立ち上げCGIをやってみようと思いました。 で、CGIといえばPealだろと思っていたので、その手の入門書や ネットの情報を見ると冒頭には大抵「大して難しくない」的な事が 書いてありました。 実際にやってみたんですがチンプンカンプンでした。 イメージとしては下記のような感じなんだと思うんですが マイコンのアセンブラと比べたらよっぽど低級言語な気がしてなりません。 アセンブラ=低級言語=人間にわかり難い C、C++等=高級言語=人間に解り易い アセンブラもはじめはチンプンカンプンでしたが、ある程度理解してしまえばそれなりに使いこなせるようになりました。 マイコンのアセンブラは命令数も少ないしイエスかノーだけで「もしも~」とかないので単純といえば単純なんですが・・・ 質問1 高級言語の「人間に判りやすい」っていうのは具体的にどういうことなんでしょうか? 質問2 最近やたらとPHPが流行ってる気がします。 もうPealは廃れてしまったんでしょうか?

    • ベストアンサー
    • Perl
  • 素朴な疑問

    情報処理の出題範囲というのを見ていて「アセンブラ言語 CASL II」と記述されているのを見て、あれ?と思いました。 私はアセブリ言語などと記述するのが正しいと思うのですが、なぜアセンブラ言語なのでしょう? たとえば、C 言語をコンパイルするのが C コンパイラで、C コンパイラ言語とは言わないから、アセンブラ言語という言い方も明らかにおかしいです。 情報処理技術者試験センターの公式な文章内にまで現れると、逆に自分の認識が間違っているのかと不安になります。もはや一般化してしまったのでしょうか? ご意見を聞かせていただけたらと思います。

  • C言語とアセンブラ言語による計算プログラミング

    "AB間の距離を求めなさい。" 下の画像において、AC=r1、BC=r2、∠ACB=α°とするとき、AB間の距離dを求めなさい。 上記の問題について困っております。 この問題の解答については、C言語とアセンブラ言語によるプログラミングで考えるようになっており、FPU(MATH COPROCESSOR)を使用し、C言語側で変数や関数宣言、printfなどでの計算結果出力を記述し、アセンブラ言語側で計算するプログラム問題です。 原則として、C言語側で計算してはいけない仕様になっています。 そして、2つのオブジェクトファイルをリンクさせ、実行可能ファイル(.exe)を作成し、コマンドプロンプト に計算結果を表示する。とういう問題です。 ・アセンブラ言語側での使用する命令のプロセッサアーキテクチャのタイプは「.386」 ・作成するオブジェクトのメモリモデルは、Windowsなので「FLAT」 図の画像は添付してあるので、どうかご回答のほどよろしくお願い致します。

  • アセンブリ言語とC言語

    アセンブリ言語とC言語について調べているのですが、この二つ言語のプログラムについて実質的に同じと言えることはなんでしょうか? また異なっていることはなんでしょうか?(たとえばアセンブリは低級言語であり、C言語は高級言語であるなどなんでもいいです。) 是非解答お願いします。

  • .NET C++の処理速度

    最近.NETについて調べていました。 .NETではコンパイル時にマネージドコードと呼ばれる中間ファイルが作成され、 それが.NETFramework上で動くという仕組みのため、C++で書こうがVBで書こうが 最終的にできあがるものは同じものになるということが分かりました。 私は、Cが有利な点は(Javaなど他の言語に比べ)処理速度が異常に早いことだと思っていましたが .NET上で動く場合はC++もVBも処理速度に差が出ることはあまりないのでしょうか? また、.NET、JVM、ネイティブのCの3つを比較した場合、 どのくらい処理速度に差があるでしょうか?(大雑把でもいいので) 私は [ネイティブC] >>>超えられない壁>>> [.NET] > [JVM] くらいかと思っているのですが‥ 以上、よろしくお願いします。

  • テキスト処理の速度の速い言語

    最大80MBまで増加するテキストファイルがあります。 あるアプリケーションのログファイルです。 最大80MBまで達します。 80MBまで達したら新しいファイルが作成され、 そこにログが出力されます。 このログファイルの中身を読み取り、 ある処理をして、計算結果や、必要な箇所を別のテキストファイルに 出力するプログラムを作成しました。言語はVBScriptです。 このプログラムを10分に一度実行する必要があります。 そこで問題になってしまったのが、処理時間です。 前回の処理が終わらないまま10分が経過して 次の処理が開始されてしまうのです。 特にまずいのがデータ量の多い期末や年度末です。 そこでVBScriptよりも速くテキスト処理を行える言語を教えて下さい。 BATでもJScriptでもPerlでもCでもC++でもJavaでも何でも良いです。 教えて下さい。 よろしくお願いします。

  • C言語について

    最近C言語でプログラミングを試みようとしてるのですが、コンパイルの時点でよく分かりません。 どのようなソフトでどのようにインストール・設定し、どのようにコンパイルするかなど、C言語でのプログラムのコンパイルから実行までを詳しく教えてください。

  • C言語についてどうしてもわからない疑問

    プログラミング初心者です。 C言語を勉強中に疑問に思ったことが2つあります。 まず1つ目。 C言語以外のプログラミング言語、例えばjavaとかC#とかjsとかpythonとかrubyとかPHPとか、には開発者にとって便利なライブラリとかフレームワーク(僕にはこの2つの明確な違いがわかりません。が、どちらも「開発者が定義しなくてもよい関数やオブジェクトの集合」という認識があります)がありますよね。 そのおかげで色んな人達がプログラミングし易くなりました。 ネット(はてぶのホットエントリとか)でも「馬鹿な俺がプログラミングを勉強して〇〇を作った」といった記事をよく目にします。 でも「C言語を使って」というのは聞いたことがありません。 そもそも、C言語はそいういったライブラリやフレームワークが少ないように感じます。 検索してもrailsとかjqueryのようなフレームワーク(ライブラリ?)は見つかりません。 これが無かったらプログラムなんて作れないのでは? しかし、世間にはC言語で作られたプログラムが多いのもまた事実。 C言語ではいったいどのように開発が行われているのか教えてください。 2つ目 unixとかlinuxといったOSはC言語で書かれている聞いたことがあります。 しかし、プログラムの開発は「コードを書く→コンパイル(→デバッグ)→実行」という流れですよね。 ではOSを開発するときに、そのコードをどうやってコンパイルするのでしょうか? コンパイラはOSの上に立っているとするなら、OSがない状態でコンパイラはどこに立てばいいのか。 そこがわかりません。 誰かこの2つの疑問に答えてください。 お願いします。

  • C言語の処理速度について

    こんにちは C言語を使い始めました。 あるコードで ソース(1):デバッグ用にログを多めに吐き出すようにしているソース。 ソース(2):ソース(1)からログ排出だけコメントアウトしたソース。 を作ってみました。 ですが、 ソース(1)で機能確認後、ソース(2)にすると途端に処理速度が遅くなります。 (1)(2)で実質的な違いはログ排出のみなのですが、理由が分からず困っています。 【質問】 C言語でログ排出だけカットしたソースの方が処理速度が異様に遅い。 この対処策を質問させて下さい。 もし同じ経験された方がおられましたら是非アドバイスを頂ければ幸いです。 よろしくお願いします。

専門家に質問してみよう