2012-07-23 1 views
6

私は最近アセンブリを学び始めました。インターネットを見てみると、アセンブリが無駄ではないと言う人がますます増えていますが、そのような時間と労力を必要とする言語でプログラムを作成する価値はありません高レベルの言語と比較して。高レベルの言語プログラムと低レベルのプログラムとの間の効率性は、現在注目されるほど顕著ではないのですか?もっと広く使われているようなアセンブリのような低レベルの言語がありますか?アセンブリーは唯一の低レベルプログラミング言語ですか、そうでない場合は最も広く使用されていますか?

+1

あなたが求めている質問の一部は、難しい事実よりも多くの意見を求めています。余分な速度(人々はコンパイラが非常に優れていると言っていますが、何十年も余分なスピードを得ることはできませんが、それでもなお真実ではありません)は、余計な時間を費やす価値があります。よく知られている意見では、あなたはできるだけパフォーマンスが悪いものでなければならず、「ムーアの法則は今後10年を早めるでしょう」と正当化しています。 – harold

+0

現在のコンパイラを打つのは本当に難しいです。また、自分自身に尋ねることもできます。プログラムを最適化するために何時間も費やす($ 100 /時間で)ようにしたいのですか?あるいは、RAMと余分なCPUに100ドルを費やしたいですか?ハードウェアは安く、良いプログラマは高価です。 –

+0

@BoPerssonあなたは1時間に100ドルを稼ぐ?とにかく、その推論のラインは、あなた自身だけを使用しようとしているソフトウェアでのみ機能します。そうでなければ、百万人があなたの代わりにあなたの競争相手のソフトウェアを買うより多くのラム*に$ 100を費やさなければならないでしょう。 – harold

答えて

10

は多くの場合、コンパイラは、開発者が書くことができるより多くの、より良いアセンブリを生成

、今日

高水準言語プログラムと に注意を払うのに十分な本当にさえ気にならない低 レベル1の間で効率です。コンパイラに打ち勝つことができる特定の開発者がいます。しかし、低レベルのコードを記述することは細部にもっと注意を払う必要があり、書くことや維持することは難しいですが、効率の面からアセンブラで実装されるのは、通常は小さなコードです。違いは目立つことがあります。しかし、開発者が誤った最適化を実行するかどうかは、目立たないこともあります。

マイケルAbrash's Graphics Programming Black Bookを読むことをお勧めします。これは、アセンブリと最適化+実生活からの素敵な話がたくさんあります。

さらに広く使用されているアセンブリのような別の低レベル言語がありますか?

アセンブラは、おそらく最も低いレベルアプリケーションのプログラミング言語です。他の唯一の手段は、手でバイナリコードを書くことですが、バイナリのオペコードはほとんど「言語」と呼ばれることはありません。

しかし、プログラミングはソフトウェアを超えています。ハードウェアもプログラムする必要があります。ハードウェアのプログラミングに使用できるハードウェア記述言語(HDL)があります(つまり、独自のCPUを作成することができます)。最も一般的なHDL言語はVerilogVHDLです。

+0

@kjh:どうぞよろしくお願いします。私はちょうどAmazonの本のためのばかげた価格に気づいた。無料でオンラインでも入手できます - http://www.gamedev.net/page/resources/_/technical/graphics-programming-and-theory/graphics-programming-black-book-r1698 –

7

ライティングアセンブリは、より簡単な時間で適切でした。 Cコンパイラのコードジェネレータがそれほどスマートではなく、マシンコードの実行時間を予測するのは簡単でした。

人間は、現代のコードジェネレーターに組み込まれたスマートも、細部への絶え間ない注意も克服できません。キャッシュプリフェッチを挿入するタイミングを正確に把握して、データが適切なタイミングで利用できるようにするために必要な詳細な情報。どのように並べ替え命令を使用すると、最高のスケーラビリティを得ることができます。そして、ジャンプターゲットが一直線に並ぶように、ちょうど正しい位置にnopsを挿入するループを機械的にアンロールする方法。また、SIMDによって提供される自動並列化を利用する方法。 Etcetera。そして、コードを変更するときにこれを1回だけ繰り返すのではなく、何度も繰り返します。

3

より高度な言語のコンパイラが毎日スマートになっています。これまでのアセンブラでは、パフォーマンスが大幅に向上する可能性があります。今日、コンパイラはこれらのトリックを多く実装しています。

例は、シフトの代わりに除算、スイッチ/ケースのためのジャンプテーブルのプログラムカウンタを操作し、それらは一度だけ使用される場合の関数をインライン化など

は依然としてoptimalisationの余地があるが、パフォーマンスの向上は非常に低く、より高いレベルの言語を使用して保守性を向上させる方が良いでしょう。

3

「アセンブリ」は実際にはさまざまな種類のコレクションです。それはあなたがプログラミングしているアーキテクチャに依存します。たとえば、x86のアセンブリは、ARM、MIPS、または考えられるアーキテクチャのアセンブリと大きく異なる可能性があります。これは、アセンブリがプロセッサが実行するバイナリコードの1対1の変換であるという事実によって引き起こされます。異なるアーキテクチャーは異なる命令セットを持つため、アセンブリ言語も異なります。

実際、アセンブリは単純なバイナリコードを書かずに行けることができる最低です。しかし、それは言語のグループではなく、特定の言語ではありません。したがって、例えばx86アセンブリなどについて話していて、それを同等の低レベルの別の言語と比較すると、他の言語も多種多様なアセンブリであることがわかります。そしてもう一度、それは別のアーキテクチャーのためであり、それほど有用ではないでしょう。

関連する問題