web-dev-qa-db-ja.com

今日でもアセンブリ言語を学ぶことに何か価値がありますか?

特にゲームプログラマー向け。

本当にアセンブリルーチンが必要な場合は、助けを探すことができますが、80年代/ 90年代に戻ると、それは主流の言語の1つでした。コンパイラは一般的にほとんどの手書きのアセンブリコードに等しい(または勝る)ことができると私は読んだので、たとえば、アセンブリで一部のデバイスしかプログラムできない組み込みプログラマでない限り、今日それを学ぶことには本当の意味があるのでしょうか?

5
graham

アセンブリは主流の言語ではありませんでした。 80年代/ 90年代に人々が学んだのと同じ理由でそれを学びます。それ以前は、金属に近いです。

アセンブリ言語の学習:

  • 機械のしくみを教えます。
  • (理論的には)可能な限り最高のパフォーマンスにアクセスできます。

「理論上」と言うのは、費用がかからないからです。高水準言語(数学、I/O、一部の組織構造)で無料で入手できるものはすべて、文字どおりすべてを最初から構築しているため、アセンブリ言語のスローガンです。

そのため、Assemblyを使用すると、アセンブリは通常、専用のライブラリメソッドとインラインコードにありますが、高レベルの言語は、面倒な作業のほとんどを行います。アセンブリ言語は、パフォーマンスの最適化から最も恩恵を受けるコードの小さなビットを最適化します。

最新のコンパイラーは、認識コストをかけずに、アセンブリー言語のほとんどのパフォーマンス上の利点を提供します。しかし、Assemblyを学ぶことは、マシンが深いレベルでどのように機能するかをまだ教えており、Assemblyをそれほど使用しない場合でも、Assemblyを学習した後も、その知識はソフトウェア開発に影響を与えます。

アセンブリを学ぶことにした場合は、Atmel AVRなどの組み込みデバイスで学ぶことをお勧めします。学習するオペコードの数はコンピューターよりも少なく、心配するオペレーティングシステムはありません。

10
Robert Harvey

今日見落とされがちなアセンブリ言語の価値の1つは、教訓的な価値です。アセンブリ言語は、これまでプログラミングをしたことがない人にとって最高のエントリー言語だと私は思います。どうして?それはシンプルで裸だからです。アセンブリでは、基本的に3つの要素があります。レジスタ、オペコード、メモリアドレスです。これらの3つの基本的な要素を組み合わせる方法を学びましょう。ここでCを例にとります。これまでコーディングしたことがない人にとって、Cはかなり複雑です。すぐにあなたは関数を持っています、#includes、マクロ、構造体など。 Javaのような高レベルの言語に行くと、事前に理解する必要のあるクラスとオブジェクトの全体的な概念があります。新しいことを学ぶとき、私の個人的な意見は、私は小さく始めるのが好きです。このため、アセンブリは見過ごされている教訓的なツールだと思います。

コードを最適化する仕事に就くと、実際的な側面から見ると、アセンブリを読んで理解できることにも価値があります。最適化の多くは、コンパイルされたコードを読み取り、コンパイラーがどこで失敗しているか、コンパイラーがより高速なマシンコードを生成できるように上位レベルのコードを変更する方法を確認することです。

特にゲームプログラミングでは、80年代と90年代を振り返ると、主に緊急の必要性があったため、ゲームやその他の高性能ソフトウェアで多くのアセンブリプログラミングが行われていました。ほとんどのゲームでは、MMX/SSE/AltiVecなどのベクトル化命令などの特別なハードウェア機能にアクセスできるようにアセンブリコードを使用していました。今日、これらのベクトル化命令はコンパイラ組み込み関数として利用できるため、Assemblyを使用してそれらを作成してもほとんどメリットがありません。

ゲームプログラマーをアセンブリから遠ざけるもう1つの問題は、移植性です。最近、単一のプラットフォームでゲームをリリースする余裕のあるスタジオは多くありません。移植可能なコードを記述する必要があるため、Assemblyは最後の手段としてのみ使用されます。

PS3のような最新のコンソールでは、主に他の方法ではアクセスできない特別なハードウェア機能のために、かなりのアセンブリプログラミングがまだ見られました。しかし、次世代ハードウェアは、アーキテクチャとパフォーマンスの点でデスクトップPCに非常に近いため、アセンブリはそこでスペースを失っています。

8
glampert

もちろんvalueがあります。 コストを相殺するのに十分かどうかに依存します。

カーネルモジュール、デバイスドライバー、またはハードウェア固有のアトミックプリミティブに依存する高性能のロックレスアルゴリズムを定期的にプログラムする場合、アセンブリ言語が唯一の選択肢になることがあります。このようなプログラミングタスクを利用できるようにしたい場合は、アセンブリを学習するコストに値するかもしれません。

あなたが主にPHP Webアプリケーションを作成する開発者であり、他に何もすることに興味がない場合は、おそらくアセンブリをほとんど使用しません。

それでも、それを学ぶことはであり、より高いレベルで記述するコードの種類を分析するのに役立ちます。結局のところ、すべてのオブジェクト指向の高次関数を使用するコードにもかかわらず、私たちが作成するプログラムは、最終的には、オプコードのストリームにコンパイルされ、プロセッサーによって無意識に実行されます:ロード、ストア、ロード、ストア、cmp、ジャンプ、ロード、ストアなど.

学習アセンブリはあなたに視点を与え、そしてその意味でそれはを持っています。しかし、繰り返しになりますが、その価値が学習のコストに見合うかどうかは、おそらくどのようなプログラマーになりたいかによって異なります。

5
Charles Salvia