No.2ベストアンサー
- 回答日時:
>アセンブラ言語
プログラム作成者が、そのケースだけに、適当と思うようにコーディングします(できます)。=(A)
>C言語で作成したプログラムを実行ファイルを作成する
これは汎用性(色々のソースのケースに対応できるよう、かつ誤りなく、出来るだけ短く)のあるように、「仕掛け」に基づいて機械語に落とされます。
ただ大切な点は、理論的裏付けがあり、しっかりしてます。
=(B)
さらにまた最適化などの、調整処理も行われます。
(A)と(B)は普通異なります。同じ短い課題を2人がコーディングしても相当ことなることは、OKWEB上の回答コーディング例でも良くあります。
だから差がでます。普通(A)<(B)でしょうが、下手なプログラマだと、(A)>(B)かも知れません。(「<」はコーディングステップ数の多少や実行処理時間の多少を意味します。)
個人運送業者に頼むのと、大手宅配業者に頼む例をイメージしました。後者は集配センターなど通ります。良く道を知っている業者なら地道を通り速いが、不慣れだと遅くなるかもしれません。でもシステムとしては後者がしっかり
してます。
>コンパイル時に吸収されてしまうわけではないのでしょうか
言っている中味が違います。同じ機械語になってないのですから。
コンパイラなどは、非常に洗練された・進んだ数学・論理・理論のロジックを用いて作られます。素人が一朝一夕に思いつくようなもので作られません。
しかし局部ミクロ的には個人素人プログラマの方が短い・速いコードになるかも知れません。改善の余地はあるのかも。
具体的なアドバイスをしていただき、どうもありがとうございます!運送業者の例がわかり易くて参考になりました。言われてみると、アセンブラは機械語を人間が理解できるようにした言語だったのですよね。必要に応じて最小限の処理のみを記述できるアセンブラが、結果として処理速度の速いソフトを開発できるのですね。俄然アセンブラに興味が湧いてきました。どうも有難うございました!
No.5
- 回答日時:
Cコンパイラが吐き出す機械語コードには速度的に限界があるからです。
たとえば、関数呼び出しのとき、Cコンパイラが作成したコードは一般にスタックを用います。
それに対して、直接アセンブラで記述すればレジスタで引数を渡すことができたりするわけです。
要は、Cコンパイラが吐き出すコードは規則に基づいているので、制約があるけど、直接アセンブラで記述すれば、なんでもありなので、最も最適化されたコードを記述することができるわけです。
ただし、最近のコンパイラは最適化の技術が向上しているため、速度の差は縮まってきているでしょう。
コンパイラの技術向上がCとアセンブラの差を縮めるのですね。僕としては、個人的にインラインアセンブラというのに興味が出てきました。ご回答どうも有難うございました!
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
インテルのMMXテクノロジですね。この技術がアセンブラに関わっているなんて、今まで思ってもいませんでした。わかるということは楽しいものですね。ご紹介いただいたサイトは、改めて読ませていただきます。まずはお礼まで・・。アドバイスどうも有難うございました!
No.3
- 回答日時:
Cの関数は通常だと呼び出し前のレジスタ状態をスタックに待避させて戻り時に復帰させます。
どこからどんなタイミングで実行されてもいいように安全保障があるわけです。
アセンブラだとそういうことも自分で記述しないと行われません。
ベーシックなんかだとエラー時に即アウトでなくエラーメッセージを表示させるルーチンにジャンプするなど、
高級(?)になるほど目に見えない無駄処理(?)が間にちりばめられるため、処理は重くなります。
保証がない処理は、その分速いけど危ないです。
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についての結果は一緒です。
最適化が極限まで行われれば、かなり効率のいいコードが出来ますが、コードの意味にまでは踏み込めないので、双方ともきちんと組んであれば、アセンブラの方が処理速度は速くなります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- C言語・C++・C# 至急お願いします。C言語で.imgのファイルを読み込んで1バイトづつ出力するプログラムを作りたいので 3 2023/01/16 22:49
- 発達障害・ダウン症・自閉症 WAISⅲについて 全検査 99 言語理解 88 知覚統合 110 作動記憶 92 処理速度 86 1 2022/11/22 10:18
- その他(プログラミング・Web制作) プログラミング 処理速度 1 2022/11/25 11:05
- C言語・C++・C# exeファイルが作れない(windows10) 6 2022/08/13 08:47
- C言語・C++・C# C言語の質問です。バイナリ形式で保存されたWindows Bitmap形式の画像ファイルを読み込み、 3 2023/07/19 14:58
- 病院・検査 動作性IQの低さについて 1 2023/03/23 23:41
- Excel(エクセル) マクロか関数で処理したいのですが、教えて頂けませんか。 8 2022/10/31 15:18
- C言語・C++・C# C言語について。 3 2022/11/05 20:30
- C言語・C++・C# c言語 Arduino 作成したコードを実行してみたところ,エラーが出てしまいました。どうすれば良い 4 2022/05/06 17:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ライン数とステップ数の違いは?
-
アセンブラのリンカのダウンロ...
-
アセンプラ16ビット8086
-
PC-9801でマシン語を学習するに...
-
SHの命令の意味について
-
アセンブリ言語について。
-
PICのPCL
-
バイナリの実行ファイルをgccを...
-
実行ファイルからソースはみれる?
-
アセンブラNASMで扱える命令に...
-
0xffffとは?
-
エクセルVBAのIf,Then 構...
-
ビットシフトってどんな時使うの?
-
コンピュータ言語とプログラミ...
-
一般のソフトで画像を扱う場合...
-
8ビットのデータの、先頭ビット...
-
fortran
-
03分22秒36のような時間の単位...
-
シーケンス制御についての質問...
-
パチンコやスロットについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ライン数とステップ数の違いは?
-
Windowsはオープンソースですか?
-
アセンブラからC言語に変換する...
-
実行ファイルからソースはみれる?
-
アセンブラ言語がわかりません。
-
アセンブラエディタ
-
PICに書き込むプログラムや変数...
-
SHの命令の意味について
-
このアセンブラの意味を教えて...
-
void __cdeclなど_
-
GCCの.cfi_系について
-
PC-9801でマシン語を学習するに...
-
アセンブラのLA
-
アセンブラで割り算
-
汎用レジスタのワーキングビッ...
-
エンディアンについて。
-
C to 68000アセンブラ
-
PICはアセンブラとC言語のどち...
-
素朴な疑問 (C言語とアセン...
-
アセンブラwordという単位
おすすめ情報