プロセッサを指定したとは思いません。プロセッサと環境によって異なる答え。一般的な答えはイエスです。一般的な理由はコンパイラーです。コンパイラーは、一般的に最適化を行うことはできますが、特定のターゲットに対してはあまりうまくいかないことがあります。あるターゲットには非常に優れていて、他のターゲットにはあまり向いていない人もいます。ほとんどの場合、それで十分ですが、ほとんどの場合、移植性のないアセンブラではなく、移植性のある C コードが必要です。しかし、C ライブラリは memcpy やその他のルーチンを手動で最適化し、コンパイラはそれを実装するための非常に高速な方法があることを単に理解できないことがわかります。部分的には、そのコーナー ケースはコンパイラの最適化に時間を費やす価値がないため、アセンブラーでそれを解決するだけで、ビルドシステムには多くの場合、このターゲットがCを使用する場合、そのターゲットがCを使用する場合、そのターゲットがasmを使用する場合、そのターゲットがasmを使用する場合があります。そのため、それはまだ発生しており、一部の地域では永遠に続く必要があると私は主張します.
X86 は、多くの歴史を持つ独自の野獣です。実際には、常に高速なアセンブラーの 1 つの塊を実際に作成することはできません。特定のマシン上の特定のプロセッサのルーチンを確実に最適化できます。日、コンパイラを実行します。いくつかの特定のケースを除いて、それは一般的に無駄です。教育的ですが、全体的に時間の価値はありません。また、プロセッサはもはやボトルネックではないことに注意してください。そのため、ずさんな汎用 C コンパイラで十分です。他の場所でパフォーマンスを見つけてください。
多くの場合、組み込み、arm、mips、avr、msp430、pic などを意味する他のプラットフォーム。オペレーティング システムを実行している場合と実行していない場合があります。したがって、コンパイラの弱点が明らかになります。また、プログラミング言語は、プロセッサに向かってではなく、プロセッサから離れて進化し続けていることにも注意してください。おそらく低水準言語と思われるCの場合でも、命令セットとは一致しません。コンパイラよりも優れたアセンブラのセグメントを生成できる場合が常にあります。必ずしもボトルネックになっているセグメントではありませんが、プログラム全体を通して、あちこちで改善できることがよくあります。それを行うことの価値をまだ確認する必要があります。組み込み環境では、製品の成功と失敗を分ける可能性があり、実際にそうです。
真のエンベデッドは、専門のエンジニアがいる専門市場です。別の組み込み市場、組み込み Linux roku、tivo など。サード パーティの開発者が必要なため、組み込み電話などはすべて、生き残るために移植可能なオペレーティング システムが必要です。そのため、プラットフォームは組み込みシステムというよりはデスクトップに近いものでなければなりません。前述のように C ライブラリまたはオペレーティング システムに埋め込まれているため、アセンブラーの最適化が行われる可能性がありますが、デスクトップの場合と同様に、手動で最適化するのではなく、ソフトウェアを移植できるように、より多くのハードウェアを投入する必要があります。また、サードパーティの成功にアセンブラーが必要な場合、製品ラインまたは組み込みオペレーティング システムは失敗します。
私が持っている最大の懸念は、この知識が驚くべき速さで失われていることです. 誰もアセンブラを検査していないからです。誰もアセンブラで書いていないからです。生成されるコードに関しては、コンパイラが改善されていないことに誰も気づいていません。開発者は、コンパイラを知っているか、より良いプログラムを作成する方法を知っていれば、同じコンパイラで、場合によっては同じソース コードを使用して、パフォーマンスを 5 ~数百パーセント向上させることができることに気付かずに、ハードウェアを追加購入する必要があると考えることがよくあります。通常、同じソース コードとコンパイラで 5 ~ 10%。gcc 4 が常に gcc 3 より優れたコードを生成するとは限りません。ターゲット固有のコンパイラは (常に実行するとは限りません)、gcc の周囲で円を実行できます。同じソース コードを別のコンパイラで使用すると、数百パーセントの改善が見られる場合があります。このすべてはどこから来たのですか?まだアセンブラを調べたり使用したりするのに苦労している人々。それらの人々の何人かは、コンパイラのバックエンドで働いています。フロントエンドとミドルは確かに楽しくて教育的ですが、バックエンドは、結果として得られるプログラムの品質とパフォーマンスを左右する場所です。アセンブラを書いたことがなく、時々コンパイラからの出力 (gcc -O2 -s myprog.c) を見るだけでも、より優れた高レベルのプログラマになり、この知識の一部を保持できます。誰もアセンブラーを知り、書きたがらない場合、定義上、高水準言語用のコンパイラーの作成と保守をあきらめたことになり、ソフトウェアは一般に存在しなくなります。このすべてはどこから来たのですか?まだアセンブラを調べたり使用したりするのに苦労している人々。それらの人々の何人かは、コンパイラのバックエンドで働いています。フロントエンドとミドルは確かに楽しくて教育的ですが、バックエンドは、結果として得られるプログラムの品質とパフォーマンスを左右する場所です。アセンブラを書いたことがなく、時々コンパイラからの出力 (gcc -O2 -s myprog.c) を見るだけでも、より優れた高レベルのプログラマになり、この知識の一部を保持できます。誰もアセンブラーを知り、書きたがらない場合、定義上、高水準言語用のコンパイラーの作成と保守をあきらめたことになり、ソフトウェアは一般に存在しなくなります。このすべてはどこから来たのですか?まだアセンブラを調べたり使用したりするのに苦労している人々。それらの人々の何人かは、コンパイラのバックエンドで働いています。フロントエンドとミドルは確かに楽しくて教育的ですが、バックエンドは、結果として得られるプログラムの品質とパフォーマンスを左右する場所です。アセンブラを書いたことがなく、時々コンパイラからの出力 (gcc -O2 -s myprog.c) を見るだけでも、より優れた高レベルのプログラマになり、この知識の一部を保持できます。誰もアセンブラーを知り、書きたがらない場合、定義上、高水準言語用のコンパイラーの作成と保守をあきらめたことになり、ソフトウェアは一般に存在しなくなります。フロントエンドとミドルは確かに楽しくて教育的ですが、バックエンドは、結果として得られるプログラムの品質とパフォーマンスを左右する場所です。アセンブラを書いたことがなく、時々コンパイラからの出力 (gcc -O2 -s myprog.c) を見るだけでも、より優れた高レベルのプログラマになり、この知識の一部を保持できます。誰もアセンブラーを知り、書きたがらない場合、定義上、高水準言語用のコンパイラーの作成と保守をあきらめたことになり、ソフトウェアは一般に存在しなくなります。フロントエンドとミドルは確かに楽しくて教育的ですが、バックエンドは、結果として得られるプログラムの品質とパフォーマンスを左右する場所です。アセンブラを書いたことがなく、時々コンパイラからの出力 (gcc -O2 -s myprog.c) を見るだけでも、より優れた高レベルのプログラマになり、この知識の一部を保持できます。誰もアセンブラーを知り、書きたがらない場合、定義上、高水準言語用のコンパイラーの作成と保守をあきらめたことになり、ソフトウェアは一般に存在しなくなります。c) より高度なプログラマーになり、この知識の一部を保持できます。誰もアセンブラーを知り、書きたがらない場合、定義上、高水準言語用のコンパイラーの作成と保守をあきらめたことになり、ソフトウェアは一般に存在しなくなります。c) より高度なプログラマーになり、この知識の一部を保持できます。誰もアセンブラーを知り、書きたがらない場合、定義上、高水準言語用のコンパイラーの作成と保守をあきらめたことになり、ソフトウェアは一般に存在しなくなります。
たとえばgccの場合、コンパイラの出力はアセンブリであり、アセンブラに渡されてオブジェクトコードに変換されることを理解してください。通常、C コンパイラはバイナリを生成しません。オブジェクトは、最終的なバイナリに結合されると、リンカーによって実行されます。これは、コンパイラによって呼び出される別のプログラムであり、コンパイラの一部ではありません。コンパイラは、C、C++、ADA などをアセンブラに変換し、アセンブラとリンカ ツールが残りの部分を処理します。たとえば tcc のような動的再コンパイラーは、何らかの形でその場でバイナリーを生成できなければなりませんが、それは規則ではなく例外だと思います。LLVM には独自のランタイム ソリューションがあるだけでなく、クロス コンパイラとして使用する場合にバイナリ パスへのコードを対象とする内部コードの高レベルを非常に視覚的に示します。
要点に戻ると、はい、あなたが思っているよりも頻繁に行われています。ほとんどの場合、命令セットと直接比較しない言語に関係しており、コンパイラは常に十分な速度のコードを生成するとは限りません。malloc や memcpy などの頻繁に使用される関数の数十倍の改善を得ることができれば。または、ハードウェア サポートなしで携帯電話に HD ビデオ プレーヤーを搭載したい場合は、アセンブラーの長所と短所のバランスを取ります。真の組み込み市場では、依然としてアセンブラがかなり使用されています。すべて C である場合もあれば、ソフトウェアが完全にアセンブラでコーディングされている場合もあります。デスクトップ x86 の場合、プロセッサはボトルネックではありません。プロセッサはマイクロコード化されています。表面的に美しいアセンブラを作成したとしても、すべてのファミリの x86 プロセッサで非常に高速に実行されるわけではありません。
arm、thumb/thumb2、mips、msp430、avr などの x86 以外の ISA 用のアセンブラを学習することを強くお勧めします。コンパイラを持つターゲット、特に gcc または llvm コンパイラをサポートするもの。アセンブラーを学び、C コンパイラーの出力を理解することを学び、実際にその出力を変更してテストすることで、より良い結果が得られることを証明してください。この知識は、アセンブラなしでデスクトップの高レベル コードをより速く、より信頼性の高いものにするのに役立ちます。