私は最近アセンブリを学び始めました。インターネットを見ると、アセンブリは役に立たないと言う人が増えていますが、そのような時間と労力を必要とする言語で物事をプログラムする価値はありません。高水準言語。高水準言語プログラムと低水準言語プログラムの間の効率は、今日注目を集めるほど実際には目立たないのでしょうか。また、アセンブリのような、より広く使用されている別の低水準言語はありますか?
4 に答える
高レベルの言語プログラムと低レベルの言語プログラムの間の効率は、今日では注意を払うほど目立たないのですか?
多くの場合、コンパイラは、開発者が記述できるよりもはるかに優れたアセンブリを生成します。コンパイラに勝てる開発者もいます。しかし、低レベルのコードを書くには細部に注意を払う必要があり、作成と保守が難しくなるため、効率化のためにアセンブリに実装されるのは通常、特定のコードのほんの一部です。違いは顕著です。しかし、開発者が誤った最適化を行った場合、それは目立たないこともあります。
Michael Abrash の Graphics Programming Black Bookを読むことをお勧めします。これには、アセンブリと最適化に関する多くの内容と、実生活からの素晴らしい話が含まれています。
より広く使用されているアセンブリのような別の低レベル言語はありますか?
アセンブラは、おそらく最も低レベルのアプリケーションプログラミング言語です。他の唯一の手段はバイナリ コードを手動で記述することですが、バイナリ オペコードは「言語」とは言い難いものです。
ただし、プログラミングはソフトウェアを超えています。ハードウェアもプログラムする必要があります。ハードウェアのプログラミングに使用できるハードウェア記述言語 (HDL) があります (つまり、独自の CPU を作成できます)。最も一般的な HDL 言語はVerilogとVHDLです。
単純な時代には、アセンブリを書くことが適切でした。C コンパイラのコード ジェネレータがまだあまり賢くなく、マシン コードの実行時間を予測するのが簡単だった頃にさかのぼります。
これで終わりです。人間は、最新のコード ジェネレーターに組み込まれたスマートさと、細部への絶え間ない注意のいずれにも勝るものはありません。データが正確に適切なタイミングで使用可能になるように、キャッシュ プリフェッチを挿入するタイミングを正確に把握するために必要な種類の詳細。また、命令を適切に並べ替えると、最高のスーパースケーラビリティが得られます。そして、ジャンプターゲットが整列するように、nops を適切に挿入します。そして、ループを機械的に展開する方法。そして、SIMD が提供する自動並列化を利用する方法。など。そして、これを 1 回だけでなく、コードが変更されるたびに何度も行う必要があります。
ええと、「アセンブリ」は、実際にはさまざまな種類のコレクションです。プログラミング対象のアーキテクチャに依存します。たとえば、x86 のアセンブリは、ARM、MIPS、または考えられるアーキテクチャのアセンブリとは大きく異なる可能性があります (そしてそうなるでしょう)。これは、アセンブリが、プロセッサが実行するバイナリ コードの 1 対 1 の変換であるためです。アーキテクチャが異なれば命令セットも異なるため、アセンブリ言語も異なります。
つまり、アセンブリは、単純なバイナリ コードを記述せずに実行できる最低の処理です。ただし、言語のグループではなく、特定の言語ではありません。したがって、たとえば x86 アセンブリについて話している場合、それを同じ低レベルの別の言語と比較すると、その別の言語もさまざまなアセンブリであることがわかります。繰り返しますが、それは別のアーキテクチャ用であるため、あまり役に立ちません。
高水準言語のコンパイラは日々賢くなっています。以前は、アセンブラーのトリックによってパフォーマンスが大幅に向上することがありました。現在、コンパイラはこれらのトリックの多くを実装しています。
例: 分割の代わりにシフトする、スイッチ/ケースのジャンプ テーブルでプログラム カウンターを操作する、関数が 1 回しか使用されない場合は関数をインライン化する、など。
最適化の余地はまだありますが、パフォーマンスの向上は非常に低いため、より高いレベルの言語を使用して保守性を高める方がよいでしょう。