最初のプログラミング言語としてのアセンブリ?[閉まっている]


12

最初のプログラミング言語としてアセンブリ(ある種のバリアント)を教えることはどれほど良い考えだと思いますか?たとえばJavaやPythonを学習するよりも多くの労力がかかりますが、「少なくとも1日のプログラミング」(少なくとも多くの高レベル言語と比較して)から多少なりともマシンを十分に理解できます。どう思いますか?少なくとも余分な努力をする準備ができている人にとって、それは現実的なアイデアですか?長所と短所?

注:私は教師ではなく、ただ好奇心が強い


5
私はコンピュータサイエンスではなく、ソフトウェアエンジニアリング/開発研究その方が適し人々に考える
イムランオマールBukhshを

1
@Imran私は原則として同意しますが、私が考えることができるすべての大学レベルのプログラムは、コンピュータサイエンスの学位を持っています。これは、主にソフトウェアエンジニアリングで働く人々によって獲得されます。(この質問はプログラミングのキャリアの深刻な基礎に関するもので、たとえば高校の調査コースではないと仮定しています)
G__

7
@Imran-少し驚くべきことがわかりました。コンピュータサイエンスは確実に数学と理論に傾いていますか?ビットをいじくり回し、無数の動きを何度も繰り返すよりも、セット、抽象代数、漸近記法に興味があります。
Steve314

2
確かにコンピューターサイエンスには抽象的主題がありますが、いくつかの点で非常に「ハードウェアに近い」ものでもあります。私はかつてコンピューターサイエンス会議であるLICSに参加しました。さまざまなソートアルゴリズムのデータの局所性に関する論文があったことを思い出します。これは、アルゴリズムの実際的な効率の研究に理論的基礎を与えると思います。私は個人的にそれを見つけ、アセンブリに関しては(...チューリングマシン、カウンターマシン)いくつかの理論的な計算モデルにはいくつかの類似点を持っている
ヨハ

1
すべてのプログラマーは、少なくともアセンブリの動作について読む必要があります、IMO。それは私に多くの洞察を与え、私は通常あなたが得ることができるほどクロームに近づいていません。ジェフダンテマンのアセンブリ言語ステップバイステップは、初心者向けの楽しい読み物です。
エリックReppen

回答:


14

アセンブリコードで新しいプログラマを刺激するのは難しいでしょう。ダイナミックなこんにちは、ユーザーWebサイトは、より少ない労力ではるかにクールです。基本的なレッスンが同じだと言っているわけではありませんが、入門コースには大きなインスピレーションを与える内容が含まれています。そうでない場合、2番目のコースはありません。

私は初期のプログラミングコースがSchemeで教えられたことを覚えています。ほとんどの場合、.exeにコンパイルしてプログラムを「実行」することが簡単にできなかったことに不満を感じました(MS Visual Basicがプログラミングのすべてだと思っていました)。何年も経って初めて、私が遊んでいた強力なツールを理解しました。最初はもう少し実用的なものを少し経験したことがあれば、もっと感謝し、それらの教訓をよりよく理解できたと思います。


20
LEDの点滅とモーターの動きに非常に驚いた多くの学生を見てきました。
-whatsisname

1
@Whatsisname +1、それはエレクトロニクスに巻き込まれずに実行できる限り、素晴らしい印象的なデモになります。もちろん、「ドライバー」がインストラクターが提供するブラックボックスである場合、それはRoombaハッキングなどの高レベル言語でも実行できます。
G__

1
多くの新しいプログラマーは、VIC20、C = 64、および同様のマシンでのアセンブリに触発されました。
ガイウス

2
@Gaius最初は違います!それらのマシンの電源を入れると、基本的なインタープリターになります。かなりの量の経験を経てアセンブリが入り、基本的なことの限界に
達しました...-G__

1
@whatsisnameは、しかし、あなたはアセンブリ学ぶことなく点滅LEDと移動モータにArduinoのようなものを使用することができます
ケン劉

12

ソフトウェア工学とCSの学生、そして一般的にエレクトロニクスよりもプログラミングに興味のある人にとって、それはひどい考えだと思います。

実行できますが、実行する必要があるという意味でありません。当時、家庭用コンピューターで本当にクールなことをする方法は、最初に組み立てを学ぶことでした。これは、初期のハードウェア制限によるものでした。高レベルの言語は、強力かつ十分に高速ではありませんでした。最近では、より高レベルの言語を使用して、より短時間でよりクールなことを実行できます。

単純なゲームの高速プロトタイプを作成してアルゴリズムのバリエーションをいじったり、レジスタや低レベルのものに苦労したりすると、もっと面白そうに聞こえますか?


3
ピアニストとして、私は確かにいくつかの曲に飛び込むのがより面白いと思いましたが、まともになるためには、アルペジオ、音階などを練習する必要があります。のような)あなたはピアノが内側から外側にどのように機能するかを知る必要があります。どれだけあなたがあなたのクラフトを知りたいかということです。
ジョン

10
CashCommonsの@John:悪い例え。アセンブラから始めることは、ハンマー、キーボード、重り、ダンパーを始めるようなものです。それから、音楽理論(5分の1の円)に進み、ブラックキー、ホワイトキービジネスについて説明します。その後、スケールを演奏する前に、さらに多くの音楽理論に移ります。
S.Lott

3
@ S.Lott:Ehhhhh ...あまり買わないで。トランジスタを心配することなく、アセンブリで「hello world」タイプのプログラムを作成できます。プログラマーになるためにチップ設計者である必要はありません。あなたが話している知識は、ピアノを組み立てたり修理したりするための基礎になります。
ジョン

3
CashCommonsの@John:「ピアノの構築または修理」。これは、アセンブラとの類推です。アセンブラーのささいな「ハローワールド」を書くことできますが、それは単なるOS API呼び出しであり、実際にはアセンブラーの恐ろしい詳細をすべて無視します。I / Oドライバーを作成するには、アセンブラーが不可欠です。ハンマーとダンパーは、パフォーマンスではなく、構築と維持に関するものです。
S.Lott

1
@ S.Lott:うーん...特定の命令セットはチップに依存していると思いますよね?いい視点ね。
ジョン

7

ひどい考えだとは思いませんが、これらの生徒にプログラムをどれだけ複雑にするのでしょうか?アセンブリにはさらに多くの作業が必要です。非常に基本的なものから始めて、下位レベルでの作業に感謝した後、作業しやすいものに移動しても構いません。初めて生徒が頭の中でアイデアを得ると、次のHalo、MS Office、AutoCADなどをコーディングし、単純なアセンブリ言語にどれだけの作業が入るかを見ると、怖がってしまう可能性があるので、明確にするアセンブリよりも良いものがあることを理解し、概念を理解したらそれらに移動します。また、Cのような他の何かと並行してassemlbyを教えることもできます。

また、どのアセンブリ言語ですか?MIPSは比較的簡単に使用でき、エミュレーターで実行されるため、実際のマシンに問題を引き起こす危険性はないと思いますが、現在よりも優れたツールがあるかもしれません。

それ正しく行われていれば、これうまくいく可能性があります。注意してください...


問題の複雑さのために+1。私の投票は、いくつかのアセンブラーの実装を高レベルの言語の実装と比較することです。そして、おそらくx86ではなく、エミュレータで68000アセンブラを使用します。x86/ amd64アセンブラがどのように進化したかはわかりませんが、68000は8086の方法よりもずっときれいで、操作が簡単でした。また、おそらく検討する価値があります-LLVMで入手できるような仮想マシンアセンブラ。実際のアセンブラと同じではありませんが、多くの類似した原則を共有しており、おそらくより関連性があります。
Steve314

かなり良いアイデアのようにC音と同時に教育ASM
ANTO

Steve314 @:私はx86のアセンブラでないんだけど、それはより多くの8086よりも複雑得ているように見えます
デヴィッド・ソーンリー

@David-期待していますが、いくつかの点でもっとシンプルになっているかもしれません。8086日間、使用可能なアドレスモードの範囲は、使用している特定のレジスタと命令に依存していました。68000には(ほとんどの目的で)データレジスタとアドレスレジスタがあり、各タイプは非常に均一に使用されており、これはインデックスではなく、ベースポインターでも面倒でもありません。時間が経つにつれて、それは変わったのでしょうか?68000にはさらに多くのレジスタがあり、メモリの出入りをある程度節約しました。とにかく、基本的なアセンブラーの原則を得るためにSIMDのことを学ぶ必要はありません。
Steve314

@David-セグメント化されたアドレス指定を忘れた(抑制された)とは信じられません。これは、高級言語では十分に悪いものでした。セグメント化されたアドレッシングが再びありますが、仮想メモリなどに関連する別のことであり、アプリレベルのプログラマーが心配する必要はありません。
Steve314

7

アセンブリは、エレクトロニクススクール(1900年代に遡る)で最初に学んだ言語であり、自然な選択のように思えました。ディスクリートコンポーネントから、抵抗-トランジスタロジック、ロジックゲート、集積回路、プロセッサ、そしてアセンブリのプログラミングまで、コースを進めました。これらのクラスの学生の多くは、これまでどの言語でもプログラミングしたことがなかったため、すぐに使い始めました。

そのため、適切な基礎が学生に提供されている場合、アセンブリ第一言語に適した選択となります。ただし、アプリケーションまたはWeb開発者を目標とする人にとって、アセンブリはおそらく低レベルの出発点だと思います。


7

一つのことは、アセンブリを最初に学んだ人がそれを作れば、すばらしいプログラマになるということです。

これは私が運転する方法を学んだときを思い出します。私の母は主張した

あなたが自信を得るまで自動運転車で学び、それから私達の手動車を運転できる。

彼女は、私が必要以上に気を散らされることを一度に望まなかったのです。

それをプログラミング方法の学習に適用します。学習者にすべてを一度に投げる必要がありますか?彼らは変数が何であるかを学習すると同時に、どのような種類のレジスターにどれだけのデータを保存できるかを学習しますか?

私のクラスの半分以上がアセンブリクラスに失敗しました。これは、その時点で2年以上プログラミングの知識があると考えていた人々のグループでした。

私がすべてをもう一度学ばなければならなかった場合、私の個人的な好みは、私にとって可能な限り多くのことをする言語から始めることです。それから、私が学ぶように、下位レベルの言語に向かって後退します。


1
これは良いアドバイスだと思います。ある時点でビットとバイトとプロセッサーがそれらで何をするかを認識することが重要ですが、それらから始めるのは非常に無駄な努力です
davidk01

1
インストラクターがアセンブリ言語のクラスを教えるのに星未満の仕事をした可能性を考えましたか?
ジョンR.ストローム

彼は素晴らしい仕事をしたと思います。
CrazyPenguin

3

少なくとも余分な努力をする準備ができている人にとって、それは現実的なアイデアですか?

番号

しかし、人は機械をよく理解しているでしょう

なぜそれが有利なのですか?これがどのように価値があるかについての例やヒントを提供できますか?

長所と短所?

利点:なし。

短所:

  • フラグ、状態、レジスタ、複雑なメモリアドレス指定スキーム、I / Oデバイス、DMA、割り込み、クロックサイクルなどに関する雑然とした雑学。いずれも、最新のVMベースの言語とコンピューティングの理解に役立ちません。

  • コンピューターが実際に適用される実際の問題解決からの切断。

  • エンドユーザーからの離婚と、エンドユーザーが解決する必要のある実際のデータと処理の問題。

  • マシンと仮想マシン、コンパイラーとインタープリター、そして世界を支えているカメの全スタックについての不必要な説明。

  • 多くの詳細な「これは、最終的に到達する高レベル言語での「オブジェクト」の物理的な実装です」。

  • 最終的に到達する高レベル言語での詳細な「メソッド関数のディスパッチ方法」。

  • 多くの「これは80386には適用されませんが、80586チップセットには適用されます」説明。

  • 多くの低レベルOS API呼び出しは、ASMプログラムに、誰かに役立つように見えるものを何でも実行させます。

最初のプログラミング言語のポイントは、チップセットをマスターすることではありません。

最初のプログラミング言語のポイントは

  1. コンピューティングについての考え方を理解します。

  2. 有用なデータ処理の方法を理解します。

  3. 何かを成し遂げる方法を理解する。設計-コード-テスト。


1
@ S.Lott-もちろん、それは私の最初の質問のポイントではありませんが、より高いレベルの言語に行く前にこれらを持っている方が有利かもしれません。誤解しないでください、あなたは有効なポイントを作ります。
アント

3
-1あなたの多くの不利な点私は利点を考慮します。上から使用する前に、低レベルがどのように機能するかを知ることをお勧めします。基礎は重要です。
11

1
プログラミング言語としてのアセンブラーは、高レベル言語よりもデータ構造、ロジック、およびより低レベルの基盤をはるかによく公開します。両方とも場所があり、アセンブラは高レベルの言語よりも簡単に理解できる可能性があります。ただし、あまり複雑なものを達成しようとしない限りです。人々は最初は複雑なことをしようとしてはいけません。
11

4
アセンブラーの利点は、実際のコンピューターがどのように機能するかを示すことです。ええと。すべてが実際に実行されるもの
ポールネイサン

1
@ S.Lott-いいえ、しかし、それはあなたが収集した古い知識のほとんどを非常にうまく利用し、時間をかけて新しい知識を追加できることを意味します。見てください。Pythonなどの高レベル言語には新しいバージョンが付属しますが、古い知識はまだ使用できます(実際、Pythonはv3との後方互換性を破りました)
アント

3

カリキュラムを設計するように命じられた場合、私は最初の学期に2つのコースを同時に実行します:asm +基本的なコンピュータ組織/アーキテクチャ、およびSchemeで設立されたSICPベースのコース。2学期は、Schemeのデータ構造と基本アルゴリズムに焦点を当てます。

2年目は、Delphi、C ++、またはC#のいずれかを使用した1年間のプロジェクトで、最新のソフトウェア設計(OO設計、機能設計、ソフトウェアエンジニアリング、バージョン管理など)に焦点を当てます。

その効果は、抽象的なものと実践的なものの両方に強力な基礎を与え、3年目と4年目に詳細なコースに導くことです。


3

私はTA入門コンピューターサイエンスクラスに慣れていましたが、それは悪い考えだと思います。

  1. アセンブリでは、ロジック(これに当てはまる場合)と、概念と数値の間の非常に難しい翻訳の両方が使用されます。Intro CSの学生は、多くの場合、ロジック(ループ、if / else、ブール式)だけで苦労します。どの数字がどの論理式を意味するのかを心配する前に、本当にこれに対処する必要があります。高レベルの言語を使用すると、以前にそのように考える理由がなかった学生のために、このロジックが抽象化されます。
  2. イントロCSクラスは、CSを継続するCS専攻のみが受講するとは限りません。多くの場合、彼らはまた、選択科目の興味深い科目を「ツアー」している他の工学専攻と非専攻でも採用されています。アセンブリは、ハードコアで熱心なCS学生の基礎には最適ですが、専攻を検討している学生や専攻を履修するつもりはないが分野の紹介を希望する学生にとって、プログラミングとはどのようなものかをあまりよく説明していません; また、ほとんどの分野で単独で非常に有用でもありません。
  3. 高水準言語は、実際のプログラミング作業の中核をより透過的にします。アセンブリは、基本的なメモリの概念、基本的なパフォーマンスの概念など、いくつかの重要な基本的なトピックに当てはまりますが、最近ではIMOというより重要な保守可能な読みやすいデザインを作成することはできません。初期の学生は、昔ながらの「本物のプログラマは誰も処理できないコードを書く」という考えを持っているようです。また、高級言語を教えることは、コーディングが素晴らしいだけでなく、共同作業であることを教えるのに役立ちます。

そうは言っても、アセンブリ/コンピューターハードウェアは非常に初期のクラスである必要があると思います。理想的には、メジャーの第1四半期です。生徒にベルトの下で1つの高レベル言語を取得させ、すぐに低レベルのハードウェアに飛び込んでからデータ構造に移行します-理想的にはメモリの管理を必要とする言語で。


非常によく言われます-私は同意します。最初のコースでは、ポイントに到達し、学習しているスキルのエンドツーエンドの有用性を示し、想像力を燃やす必要があります。また、アセンブリ言語の最適な時期は、1つの高レベル言語の後です。それは、コンピューターが実際に高レベルのものをどのように理解しているかを「ボンネットの下」で見る動機になります。学生の出会いエレクトロニクス、チップ、センサー、など:高レベル言語の葉他の強力なインパクト後に初めてアセンブリ言語を見て
アサドエブラヒム

3

アセンブリは、BASICの直後の私の第二言語でした。しかし、私が学んでいたときは別の時間でした。My Commodore 64には他の言語も用意されていましたが、高速に見えるようにしたい場合や、一度に複数のことをしたい場合は、アセンブリ言語と割り込みの処理方法を学ぶ必要がありました。Commodoreにウィンドウシステムを提供したGraphic Environment Operating System(GEOS)もすべてアセンブリでした。概して、これまで見た中で最高のアセンブリAPIでした。また、コードをスタイルできる場所で使用した唯一のプラットフォームでもありました。そうです、イタリック体と異なるフォントサイズを使用できます。これは、コメントを読むのに役立つことが証明されています。

Commodoreの仕組みについて多くのことを学びましたが、Motorollaチップには非常にシンプルなオペコードセットがありました。255個未満のオペコードを別々に保持することはそれほど難しくありません。私がいたではないチップとシステムアーキテクチャがあまりにも異なっていたインテル8086用のプログラミングにMotorolla 6510チップ上の私の経験をパーレイすること。AmigaのMotorolla 68000チップに移行するのと同じ問題があったと思います。

要するに、私はアセンブリが良い第一言語であるべきだと言う人に心から反対しなければなりません。その理由は次のとおりです。

  • 固有の構造も、アプリケーションの機能を分解する一般的な方法もありません。これはまさに、高レベルの言語を非常に便利にするものです。
  • ライブラリ内のメソッドを正しく呼び出す方法など、役に立たないことを知る必要があります。ライブラリがCによって作成された場合、スタックを操作すること(すべてを正しい順序で取得することを意味します)が、別の言語ではレジスタを設定することを意味する場合があります。これらはすべてコンパイラーまたはインタープリターによって処理されますが、最適化することはできません。
  • コードを別のチップで使用することでき、別のハードウェアプラットフォームで壊れる可能性が非常に高くなります。

最近、アセンブリ言語は、コンパイラが生成したアセンブリよりも手作りのアセンブリの方が速い特定の有限アクションを高速化するために使用されます。アプリケーションの主な構造は、C、C ++などのような高レベル言語で行われます。もちろん、コンパイラの作成を開始する場合、アセンブリプログラミングは非常に重要になります。私たちのうち何人ですか?


1

私は高校3年生の時に集会をしました。私はすでにJava、Pascal、C、C ++のクラスを受講していましたが、どれも上手ではなく、アセンブリで本当にうんざりしていました。誰かが私のためにコンパイラを動作させることができるようになる前に、1、2ヶ月。

最初にアセンブリ言語を学ぶことは必要でも賢明でもないと思いますが、アセンブリの最初の数週間で彼らがあなたに教えるもの、プロセッサの動作方法、およびいくつかのデバッグのトリックについて学ぶのは賢明です。そのようなものは、初心者として非常に興味深く、啓発的であることがわかりました。


0

なぜそれができなかったのかわかりませんが、それがどれほど良いアイデアであるかは、あなたがそれを教える群衆によっても異なります。Web開発者になることを最終目標とする人は、Python、Rubyなどのようなものをすぐに作成しても満足できないため、退屈してしまうかもしれません。彼らが最終的にハードウェアまたは他の低レベルのプロジェクトで働きたいなら、それは大丈夫だと思う(それが理にかなっているのに十分なコンピュータアーキテクチャの背景を与えれば)。将来、人々がより良いコードを書くのに役立つと思いますが、他の言語を学ぶより始めるのは難しいと思います。


0

アセンブリ言語は、次のようなことに焦点を合わせた場合にのみ意味があると思います。

  • メモリ管理技術
  • HW IO(特にタイミングとパフォーマンスに関連する課題)
  • CPU機能-特に、セキュリティ機能

この分野に焦点を当てなければ、それは単純な言語に過ぎず、悪い組織習慣を教える傾向があります。機械レベルのコーディングは、物事の仕組みを知るためにツールキットに含めるのが良いのですが、それは良い第一言語ではありません。

誰かがより高いレベルの言語に興味を持つようになるでしょう。次に、C ++を教えます。次に、C ++コンパイラがアセンブリコードを生成する方法に焦点を当てたアセンブリ。v-tableと他の高レベル言語機能を理解することは、開発者が「魔法」の下で情報をファイリングするだけでなく、言語が実際にどのように機能するかを考えるのに役立ちます。

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