高レベルの開発者がアセンブリの学習に時間を費やすのは賢明ですか?[閉まっている]


33

低レベルのものに関する知識が私たちの仕事において非常に重要であることは明らかです。

しかし、あなたはすでに高いレベルでの商用ソフトウェアを開発し、している状況にし、すでに選択した方向性を持っていますが、任意のアセンブリのスキルを持っていない、それはあなたの方向に関連するものを勉強に集中することがより合理的ではないでしょうか?または、とにかく低レベルの基本を学ぶために時間を費やす必要がある理由はありますか?

遅すぎるときとそうでないとき そして手遅れではない場合、どのようにして最適な学習を行うのでしょうか(ある程度の深みと理解を得るために過度の時間を費やさないという意味で)?


1つの投稿で多くの質問:)
Shamim Hafiz

アセンブリ言語のステップバイステップを楽しみました。最初はプログラミングの趣味のようなものがたくさんありますが、作者は非常に面白いです。私は一般的なアイデアを持っていると便利だと感じました。私は主にJavaScriptを書きます。
エリックReppen

私の最初の(教えられた)言語はアセンブリ方言でした。他の人が指摘したように、それがどのように役立つかを見ることができ、チームの残りの部分に異なる入力を提供するのに役立ちます。
ジェイミーテイラー

回答:


43

誰もデバッグについて言及していないとは信じられません...

私は何年もアセンブリコードの行を書いていません。しかし、私それをかなり頻繁に読みました。高レベルのデバッグは、ソースとシンボルの情報があれば素晴らしいですが、ファンシーライブラリが顧客のマシンで未処理の例外をスローしている場合、ライセンスに含めることを要求するには遅すぎます...

しかし、私はまだ逆アセンブラーを開いて、最終的に高レベルのロジックが何をしているかを確認、不良データを元にトレースし、FPU制御レジスタを変更した人を見つけます...

これは私が考えているよりも頻繁に私のベーコンを節約しました。そして、学ぶのに遅すぎることはありません- 「ネット」にはたくさんの素晴らしい参考文献やチュートリアルあり、あなたのマシンで実行されているプログラムはすべて、実践的な環境を提供します。


10
+1、できればもっと賛成します。真面目な開発者は、他に理由がない限り、ASMを読み取ることができる必要があります。
メイソンウィーラー

3
これの帰結は最適化です。コンパイラーがコードをアセンブリーに変換する方法を知っていると、コードを劇的に高速化するのに役立ちます!
lambacck

3
+1アセンブリは、プロセッサが実際にどのように機能するかを理解させる唯一の言語の1つです。高水準言語を使用した開発に役立ちます。読まなければならない:blogs.msdn.com/b/ericlippert/archive/2010/09/30/...

デバッグ、最適化、または純粋な好奇心を問わず、基礎となるコンピューターを知ることは非常に役立ちます。真剣に、アセンブリ言語の少なくとも1つまたは2つのファミリを読むことを学びます。それを学んだ後に読んだり書いたりしなかったとしても、それはあなたが将来物事を理解する方法に影響を与えます。さて、あなたはむしろ少しくらいかもしれませんがない他の言語、...で書くならば
マイケルTrausch

1
@Mason:「すべての真面目な開発者」がASMを読むことができる必要があるかどうかはわかりません。JavaScriptを書いている場合や、シックフレームワーク(.NETやJavaなど)の上に構築されたプログラミング言語を使用している場合、ASMを読むことができるのは、真面目な開発者に不可欠だとは思わないでしょう。そうは言っても、コンピューターが非常に低いレベルで命令を実行する方法を理解することは、高次のプログラミング言語や環境でも非常に役立ちます。
スコットミッチェル

15

アセンブリ言語を学ぶ必要はありません。アセンブリ言語の仕組みを理解するだけです。XORが何であるかを知り、睡眠中にバイナリで数える必要があります。しかし、私の仕事でアセンブリコードを必要としたことはありません。

あなたが言うように、低レベルのものの知識は重要ですが、アセンブリの実用的な知識は重要ではありません。


1
第二に。優れた生計を立てることができ、ASMを読み書きする必要はありません。それを必要とするポジションがいくつかあります。コード内の競合状態の後にダンプを読み取ると、プロセスが停止しました。または、GPU並列化/ OpenCLのような非常にパフォーマンス重視のプログラムを作成する場合。これらのタスクを実行する必要がある開発ジョブの割合は非常に少ないです。
yzorg

11

低レベルのプログラミングスキルがまったくない場合は、空いた時間にいくつかを学ぶことを強くお勧めします。専門家になる必要はありません。ある程度の習熟度に達するだけです。コンパイラーやライブラリーに依存して行うのではなく、多くの数学作業を自分で行う必要があります。ほとんどのアセンブリ命令は1つのプロセッサ命令に対応しているため、プログラミングの読みやすさを理解するのに役立ちます。やや大きなプログラムの複雑さを自分で管理する必要がありますif...else。これは、アセンブリーの経験が読みやすさを教えてくれるので、より単純で高レベルのプログラムを書くのに役立ちます。

また、アセンブリは言語ではないことを忘れないでください!これは一般的な用語であり、基本的にはシンボリック言語に抽象化されたプロセッサの命令セットを意味します。プロセッサごとに命令セットが異なるため、アセンブリ言語も異なります。「アセンブリ」を学習するとき、言語ではなくプロセスを学習します。


8

あなたは常にカバーの下でピークに達し、あなたが立っている抽象化の下にあるものについてもう少し理解することから恩恵を受けるでしょう。私の大学教授がかつて「すべての優秀なプログラマーはハードウェアを理解している」と述べたように、あなたは回路を作成して操作する必要はありませんが、そこで起こっていることをある程度把握する必要があります-それはあなたが良い。

コンピューターの構成と設計をお試しください


1

はい -継続的な生涯学習は、ソフトウェア開発のキャリアに不可欠な要素です。プログラミングとクラフトを改善する方法について学び続けることに興味があるなら、そうです、完全に新しい言語とコードの記述方法にさらされるので、ある時点でアセンブリを学ぶ必要があります。同じ理由で、Ruby / Python(動的言語)、Haskell / F#(純粋な関数型言語)、Lisp / Scheme(関数型言語)などを含む多くの言語/プログラミングスタイルを試すことをお勧めします。

プログラミングクラフトの詳細を学ぶことに興味がなくなったら遅すぎると思います。たとえば、経歴の中で、管理からシステムエンジニアリング、セールス/マーケティングなど、プログラミングから別の領域にすぐに移行できる段階に達した場合。次の数年は、プログラミングクラフトではなく、その分野での開発に必要なスキルにもっと集中します。


1

それが何であり、コンピューターが何をしているのかを知る必要があります。KnuthのMIXのようなものを学ぶことはあなたを助けます。ほとんどの場合、コードの効率を判断できます。コンピュータプログラミングの芸術を入手して読んでください。より賢いプログラマーになります。


1

あなたの方向に関連することを勉強することに集中する方が合理的ではないですか?または、とにかく低レベルの基本を学ぶために時間を費やす必要がある理由はありますか?

回答:

  1. 組み込みシステムをプログラムする方向を変更する予定がない場合は、アセンブリを学習する理由はありません。アセンブリはCPUに依存していると考えても、いくつかの基本を学ぶことができますが、知識はCPUアーキテクチャとそのCPUの命令セットに基づいています。
  2. Windows用にコーディングするとしましょう。現在の方向性に役立つ可能性のある高レベル言語よりも低レベルを学習したい場合は、Windows Iディープ、Windows API、Windowsメモリ管理などを学習することをお勧めします。コーディングしているOS /プラットフォームを単に学習します。
  3. メモリ管理、ガベージコレクションなど、現在の高レベル言語のスキルを向上させます。低レベルにしたい場合。

0

あなたのキャリアが進むにつれて、あなたは利益が減少するポイントに到達すると思います。つまり、アセンブリ言語を早期に学習する必要があります。これにより、後に続くすべての基本的な理解が向上します。ただし、既に従業員で数年の経験がある場合は、物事がどのように機能するかをすでに感じているため、実際のナットとボルトの詳細を学習しても、それほど多くの洞察が得られない可能性があります。


0

アセンブリを勉強するのにどれだけの用途があるかわかりません しかし、少なくともCのような言語でプログラミングを行うことは有益です。私は最近、Cでプログラミングをしなければならなかったが、それはかなり啓発的であることがわかった。Cは、高レベル言語に存在する抽象化の多くを削除します。これらの抽象化にはコストがかかります。Cではより多くの低レベルの詳細を管理する必要があります。高レベルの言語では、これらの詳細が管理されます。Cでプログラミングを行うことにより、これらの詳細を認識する必要があります。そのため、日常の言語に戻っても、あなたはまだその認識を持ち、実際に何が起こっているかをよりよく理解するでしょう。それはあなたをより良いプログラマにするのに役立つはずです。


0

少なくともここ英国では、教育の専門職では、教師は彼らが教えるものをはるかに超えて資格を与えられなければなりません。中等学校(高校)の教師は、担当する科目の学位を取得する必要があり、初等(小学校)の教師も学位を取得し、GCSEレベル(高校)までのすべての主要科目に習熟している必要があります試験を終了しますか?

どうして?何かを上手に教えるため、あるいは実際に何かを上手に使うためには、それを理解する必要があるからです。そのためには、基礎となる構造、つまり作業を行う前の決定の連鎖を理解する必要があります。高レベルのコードを適切に理解するには、その上に構築されるレイヤー、その動作方法、その長所と短所がどこにあるかを理解する必要があります。これは再帰的です。下のレイヤーを理解するには、その下のレイヤーも理解する必要があります。

結局のところ、これがコンピューティングのまともな大学/大学のコースが他のすべてよりも優れた数学能力を要求する理由です。

Maths -> Physics                ->
      -> Chemistry -> Materials -> Hardware Design -> Microcode      -> Assembler
                                                   -> Bus Interfaces -> Peripherals

... Assembler    -> Low Level      -> High Level   ->
... OS / Drivers -> API Level      -> Applications -> User

これらの分野の知識が不足している場合、その下の理解が損なわれます。別のレイヤーを操作するレベルに近いほど、その中に接地することが重要です。

だから:あなたは、高レベルのコーダーとしてアセンブラーを知る必要がありますか?  それが役立ちます。


0

それは、スーパーコンピューターの第一人者としての私の前の人生で非常に重要でした。当時は、少なくとも数百行のアセンブラーを記述し、パフォーマンスを絞り出そうとするまで機械を理解していなかったと感じました。非常に少数のプログラマーがそのように深くなりたかったので、それは私を本当に不可欠なものにしました。そして、HWデザイナーのタイプと話をするとき、私はまだ共通の言語を持っています。

しかし、実際には、これに対するニーズ/メリットは、ほとんど数十年前です。コンパイラの進歩と順不同の実行HWの間に、アセンブラを書くことでヒーローを演じることができる範囲はほとんどありません。物事がどのように機能するかを理解することは有益だと思いますが。私は子供たち(新入生CS専攻)に、単純な仮想マシン上の非常に単純化されたアセンブラーでプログラミングするように教えることを計画しています。展開、ソフトウェアのパイプライン化、キャッシュ、プリフェッチ、ボトムローディングなどのようなもので遊べることを願っています。少なくとも、あるレベルでこのようなことが起こっていることを知っているでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.