低レベルのプログラミング-私にとってそれは何ですか?[閉まっている]


32

何年もの間、「低レベル」言語と考えるものを掘り下げることを考えてきました。私にとって、これはCとアセンブリを意味します。しかし、私はまだこれをする時間がありませんでしたし、これまで必要だったこともありません。

必要性が生じていないので、主題を勉強する予定のある時点をスケジュールするか、永遠に計画を破棄する必要があると感じています。

私の位置

過去4年間、私は変化する可能性のある「Webテクノロジー」に注力してきました。また、私はアプリケーション開発者であり、変化することはほとんどありません。

アプリケーション開発では、ユーザビリティが最も重要だと思います。ユーザーが「消費」するアプリケーションを作成します。これらのアプリケーションが使いやすくなればなるほど、より多くの価値を生み出します。

使い勝手を良くするために、次のことが実行可能であると信じています

  • 優れた設計:よく考え抜かれたユーザーインターフェイスからアクセスできる、よく考えられた機能。
  • 正しさ:正しく実装されていなければ、最高のデザインは価値がありません。
  • 柔軟性:アプリケーションAは絶えず進化する必要があるため、ユーザーは、Aが実装できる新しい機能を備えた別のアプリケーションBに切り替える必要はありません。同じ問題に対処するアプリケーションは、機能ではなく哲学が異なるはずです。
  • パフォーマンス:パフォーマンスは、優れたユーザーエクスペリエンスに貢献します。アプリケーションは理想的には常に応答性が高く、(頻度に基づいて)合理的に高速にタスクを実行します。ユーザーが認識できる以上のパフォーマンス最適化の価値は疑問です。

パフォーマンスを除いて、低レベルのプログラミングはそれを助けてくれないと思います。しかし、パフォーマンスのために低レベル言語でアプリ全体を書くことは、私にとって時期尚早な最適化です。

私の質問

低レベルのプログラミングは何を教えてくれますか?他の言語は教えてくれませんか?アプリケーション開発にほとんど役に立たない何かが足りないのですか、それとも単なるスキルですか?私がCとアセンブリの価値に疑問を抱いていないことを理解してください。私の日常生活の中で、私はその世界の複雑さをすべて取り除いて、私のために管理していることを非常に嬉しく思っています(ほとんどがC / C ++で記述されたレイヤーとアセンブリ自体によって)。概念がまったく見当たらず、それは私にとっては新しいことかもしれませんが、頭に詰め込む必要のある詳細だけです。それで私にとっては何ですか?

私の結論

回答ありがとうございます。誰も私を驚かせた人はいませんが、少なくとも今は、この必要な領域が必要になるまでこの領域を削除することを確信しています。
私の理解では、最近のプロセッサーが今日のCPUで使用されているときにアセンブリーを記述することは、不必要に複雑であるだけでなく、Cのカウンターパートよりも実行時のパフォーマンスが低下するリスクがあります。手作業による最適化はOOEによりほぼ不可能ですが、コンパイラーが自動的に実行できるすべての種類の最適化は得られません。また、使用可能なコマンドの小さなサブセットを使用するため、または最適化されているため、コードは移植可能ですが、おそらく1つのアーキテクチャでのみ動作します。
Cを書くことは、以前ほど必要ではなくなった。Cでアプリケーションを作成する場合、テストおよび確立されたライブラリとフレームワークを同様に使用します。これにより、文字列コピールーチン、ソートアルゴリズム、および大学での演習として役立つその他の種類の実装が不要になります。私自身のコードは、タイプセーフを犠牲にして高速に実行されます。私は通常のアプリ開発の過程で車輪を再発明することにも、コアダンプを見てデバッグしようとすることにも熱心ではありません:D
私は現在言語とインタプリタで実験しているので、何か公開したいことがあるなら、私は思うC ++がうまく機能するかもしれませんが、実用的な概念をCに移植します。
繰り返しますが、皆さんの回答と洞察に感謝します。


6
@TheLQ:私の質問は、なぜそれを使うのかではなくそこから学べることです。
back2dos

1
例:基本に戻る
-rwong

回答:


9

低レベルプログラミングは、通常のデスクトップコンピューターにはすぐに存在しない要件があるコーナーケース用です。これは速度のボトルネック、メモリのボトルネック、または完全に異なるものである可能性があり、これらの要件を考慮して何ができるかを確認することは非常に頻繁に行われます。

それを制限することで興味深いのは、HaikusまたはLimericksと考えてください。

今日不可能と思われることで何が可能かを示すために、ここにこれまでで最高のハックの1つがあります。1 Kb RAMのチェス! http://users.ox.ac.uk/~uzdm0006/scans/1kchess/


1
私は本当に「制限が面白くする」ために行くつもりだと思います。ここで言及したすべてのことの中で、これはおそらく最高です。学校に戻って、32kBのメモリと8MhzのCPUを搭載した電卓でゲームをプログラミングしています。楽しかったのですが、今からは何も得られませんでした。
back2dos

Downvoter、その理由を教えてください?

29

私は最近これを考えていました。私は現在、自分をC#開発者と考えています。これは私のキャリアにとってはまったく問題ありません。

ただし、非常に低いレベルのものを逃すことがよくあります(Cでアセンブラーまたはデバイスドライバーを実行することにより、本質的に「手を汚す」)。プログラミングが恋しいです。それが私のキャリアにおいて大いに役立つとは思わない。デバイスドライバーまたは組み込みシステムがあなたのものであれば、それは大いに役立つでしょう。

抽象化された言語でプログラムを作成すればするほど、そもそもコンピューターに夢中になったものを見逃してしまいます。アセンブラーとCは、突くのに非常に適しています:)

古い言語を使用すると、ほとんどすべてを自分でやらざるを得なくなると思います。C#では、次のようなことができますmyArray.SortBy(x=>x.Name)。私はC言語でそれを行うことはできません。言語が私のために最高のソートを行うことを受け入れています。Cでそれを行う場合、大学のモジュールの時代に戻って、さまざまな並べ替えと検索アルゴリズムを修正することができます。

したがって、下位レベルの言語は、すべて抽象化されている長い間忘れられていた部分を修正するのに役立つと思います。キャリアの進歩よりも個人的な挑戦の多く。


15
ハードウェアで突っついて何がぴくぴく動くのかを見るのが好きだということで+1-本当のオタク
ゲイリーロウ

2
必要に応じて、C#でソート関数を自分で作成できます。必要に応じて、ライブラリ関数を使用してCでソートすることもできます:gnu.org/s/libc/manual/html_node/Array-Sort-Function.html 古い言語を使用すれば、自分でやらなければならないことも少なくないでしょう。ほとんどの問題はすでに解決されているためです。とにかく、人々がホイールを再設定することを妨げません:
back2dos

15

私の提案は、知的好奇心としてCをいじることです。価値がないため、多額の投資をしないでください。

推奨される目標:

  • 基本的なデータ構造とアルゴリズムに関する記憶をリフレッシュします
    • 代数や幾何学のように、知っておくと良いことです。
    • Cで大学の教科書の練習やプログラムパズルを試してみてください。
  • CPUキャッシュから大洋横断的なネットワーク遅延まで、メモリ(帯域幅)階層のより良い評価。これは、すべてのレベルでのアプリケーション開発スキルに役立ちます。
    • 最も重要なのは、どのシナリオについて学ぶために良いですが、小さなハイレベルコードの目立たない再配置が可能になり、劇的な速度向上
      • 理由は、メモリ階層のコンテキストでの低レベルの実装でのみ理解できる場合があります。
      • この可能性の自然な原因を理解しないと無知恐れ、そして最終的には拒否につながり、高レベルの開発者がこの種の最適化を利用することは間違っていると考えます。現実にはそれは何も悪いことではありません。
  • C / C ++ / Assemblyで開発された低レベルのコンポーネントを高レベルのシステムで使用できるようにするコンポーネントベースのソフトウェアシステム美学に感謝します。
    • 外観はソフトウェアの使いやすさとまったく同じです。
      • 優れたデザイン(強力で使いやすく、よく考えられている)
      • 正しさ
      • 柔軟性(それぞれ明確に定義された目的を持つ、既存のパーツの構成による拡張と新しい動作)
      • パフォーマンス(使いやすさを複雑にすることなく)
    • 独自の低レベルコンポーネントを設計しない場合もありますが、理解することは、高レベルプロジェクトで使用する適切なコンポーネントを評価および選択するのに役立ちます。
  • 最後に、低レベルのコンポーネントは、ほとんどの場合、実装がより複雑であり、インターフェイスを見るだけでは分かりにくいことを理解してください。
    • 低レベルは常に複雑です。優れたライブラリは、その力を損なうことなく複雑さを隠します。
    • コンポーネント開発者によって書かれた「テクニカルノート」を読むことを学びます。これは、コンポーネントを最大限に活用する方法について、より高いレベルのコンポーネントユーザーへの提案です。

8

高レベル言語が依存する仮想マシンだけでなく、マシンの動作を理解したい場合は、Assemblyがこれを教えます

気にする必要がなければ-ほとんどのプログラマーは最近気にしない-それについて心配しないでください。

基盤は改善されますが、おそらくウェブアプリは改善されません。


6
Cもほぼ同様に機能します。ほとんどのCの概念は、機械語に簡単に翻訳できます。Cを学び、アセンブラーをざっと見てみると、体調は良好です。
デビッドソーンリー

同様の回答を投稿しようとしていました。Cは、特にメモリの管理が関係している場合に、マシンがどのように動作するかを評価することもできます。また、抽象機械の複雑さはC.少なくともで書かれていることを多くの言語では、人は:)彼らは甘やかさかだけの本当の理解を得るでしょう
ティム・ポスト

1
@Jorg:おもしろい。また、Intel x86または6502と比較して、これらのCPUのうちどれだけが商業的に使用されていますか?
スティーブンA.ロウ

1
@Jörg、これらのCPUはどこにありますか?

1
@Thor:スピードはここでの問題ではなく、教育です。
スティーブンA.ロウ

8

プログラミング言語はすべて、プログラミング全般についての考え方を少し変えます。具体的な例として、私がhaskellを学び始めたとき、javascript、ruby、およびpythonの機能的なビットが突然、もっと意味をなしたようになりました。私は以前にコードでfoldlを使用したことはありませんでしたが、haskellの後は、配列が表示されているすべての場所でfoldlを使用しています。そのため、Cを学習すれば、お気に入りの言語のさまざまな構成要素の相対的なパフォーマンス特性をよりよく理解できる可能性が高くなります。数分前、私はスピーディで最適化されたjavascriptを書くことについての講演を聞いていました、そして、スピーカーは「Cでやるのが難しいなら、javascriptでは本当に遅いでしょう」と言いました。彼の意図は、javascriptがインタープリター言語であり、インタープリターがCまたはC ++で書かれていることです。


2
+1は、すべての言語があなたの考え方をどのように変えるかについての概念です。
ショーン

7

オタクはハードウェアを完全に制御するのが大好きなので、楽しみのためだけにやらないと、少なくともJavaの代わりにCで書かれたときにプログラムがどれほど速くなるかをより良く感じるかもしれません。また、ガベージコレクションなどの高レベル言語の機能を本当に理解することを学ぶかもしれません。


1
オタクの楽しみのために+1。言わなければならないが、私はあまりオタクではない。そして、私はハードウェアが嫌いです:)
back2dos

1
通常、速度の違いは関係ありません。これは特に、サーバー側の処理がボトルネックではないWebアプリに特に当てはまります。
デビッドソーンリー

David:平均的なブレッドアンドバターウェブアプリには完全に同意します。他のドメインでは、違いは非常に重要です。
user281377

1
@ back2dos、ハードウェアに近いプログラミングのアイデアがあなたにアピールしないなら、私はそれを気にしないと言うでしょう。ラテン語を学ぶことを後押しするようなものです。ラテン語が後のロマンス語の多くの基礎となったからです。
tcrosley

2
十分なメモリがある場合、JavaはCと同じかそれより高速です。

5

好奇心for盛!

複雑なシステムの最下位レベルで実際に何が行われているのかを理解しておくことは、たとえ日常の業務について論理的に知る必要がない場合でも、非常に良いことです。ビットレベルで物事を理解する最も良い方法は、独自のCPUを構築することです。機械語レベルのオペコードについて考え、直交命令セットが非常に優れている理由、割り込み処理の複雑さ、複雑な回路とマイクロコード(乗算ユニットなど)のトレードオフなどを理解する必要があります。

しかし、明らかに、エレクトロニクスのノウハウと時間がかかるため、次善の策はアンティークスタイルの8ビットCPUを使用することです。8051のようなマイクロコントローラーはまだ広く使用されており、愛好家が利用できます。それには、まだ電子機器を放流し、LEDを喫煙なしで発光させるためのいくつかのノウハウが必要です。電子機器をまだ装備していない場合は、$$かかります。

その後の次善策:CPUシミュレーター(エミュレーター?私はこれらの用語を混同します)をいじくりまわしてください-これらはZ80、6502、8086 ...すべての古い8ビターに存在します。それは、はんだごてのどちらの端を保持するのかわからないアプリケーションプログラマにとって最も教育的で楽しいかもしれません(ただし、非常に高速に学習しますが:)テキストがビデオメモリに書き込まれる方法、アセンブリコードのトリックがパフォーマンスにどのように役立つか。 ..このレベルで探検するための楽しいものがたくさんあります。

CPUの内部動作についての初期の理解なしに、Cを単なる別の言語として学習することについてあまり確信がありません。CPUレジスタ間でビットがどのように送信され、メモリがどのようにアクセスされたかを知ることは、ポインタやその他のC言語の概念を真に取得するのに非常に役立ちます。


+1これは、ポインターに言及した唯一の答えだったからです。私はそれが一番だと思い、答えを受け入れました。
エリック

4

一言で言えば、楽しい。(VBからC ++、Cなどにダウンアセンブルした)アセンブラーで遊んでいたとき、プロセッサのある部分から別の部分にデータを移動するのは本当に素晴らしいことでした。CPUの内部で何が起こっているのかを正確に知ることができたのは素晴らしい気持ちでした。加えて、素晴らしい自由感-あなたは何でもできます。高レベルの言語に見られるような組み込みの制限がないからです。

また、他の言語でプログラムを作成した人なら誰にでも回って、「ハードコアが足りないなら...」と言うのは幼稚で幼稚な楽しみでした。


4
実際には、アセンブラーからは見えないCPU内部で多くのことが行われています。順不同の実行、ハイパースレッディング、メモリキャッシュなどの処理は、CPUによって自動的に実行されます。物質の基本的な粒子に到達するまで、いつでも一歩下がって行くことができます。それとも物質だけがエネルギーですか?
ケビンパンコ

トランジスタやロジックチップから独自のCPUを構築することで、このような内部の謎を回避できます:D(私のお気に入りの技術ファンタジーの1つです!)とにかく+1は素晴らしい答えです。
DarenW

フェアポイント!私は最後の実際に使用アセンブラハイパースレッディングは、おそらくより一般的にはむしろ...のCPUよりも高速な縫製を参照としたが
ダンO

2

低レベルのプログラミングを学習/実践する正当な理由はありますか。状況に応じてさまざまな答えがあります。

まず、私はCプログラミング(OCamlとJavaも)を教えています。生徒にハードサイドからプログラミングを学ぶ意欲を与えることは、おそらくタスクの最も難しい部分です。私がこれまでに見つけた最良の議論は「理解」です:高レベルの言語は多くの基礎となるメカニズムを隠し、時には良くないこともあります。ほとんどの場合、パフォーマンスを向上させるために使用します。私の教育経験から、低レベルのプログラミング(およびユーザー指向ではないコンパイラなど)を学んだ学生はより適応性があり、より高速で新しい高レベルの概念やツールを学ぶことができます。

次に、あなたが述べているように、パフォーマンスはユーザーエクスペリエンスの一部です。ほとんどの場合、パフォーマンスは複雑でマシンコードに近いものを書くことと見なされます。これは常に当てはまるわけではありません。パフォーマンスは、アルゴリズムとデータ構造だけでなく、アルゴリズムとデータ間の相互作用の問題でもあります。私はこのテーマに特別なプロジェクトを使用します。基本的には単純なパス検索ですが、実際の問題はデータのサイズです。グラフは無限です。降下パフォーマンスを達成し、メモリに収まる唯一の方法は、専用のメモリアロケータ(実際には2つのプールアロケータとリサイクルアロケータ)を記述することです。これは、ほとんどの高レベル言語では実行できません。実際、ほとんどのガベージコレクション言語には、パフォーマンスとメモリの問題があります。

「誇大な」言語に対する下位レベルの言語の安定性(歴史と寿命の意味)など、おそらくもっと多くの議論があります(プログラミングの将来の参照と見なされる言語が数年で消えることができるという事実は長いです)物語、新しいものの寿命を予測することはできませんが、この議論は古い言語にも当てはまります...)、もちろん好みの問題、またはほとんどの高レベル言語でできることもできるという事実もあります低レベルの言語で行われますが、その逆ではありません(ただし、それを考慮すると、すべてのコードはアセンブリ内でのみ行う必要があります...)

私は両方の世界に閉じ込められています(まったく異なります)、理論的なプログラミングの概念、型システムの設計と証明に数年間取り組んでいます。そうすることで、非常に高レベルの言語(主に機能的な言語だけでなく、純粋なオブジェクト指向です。)最近、私は反対側(主にシステムとカーネルのプログラミング)に戻り、この分野で非常に安心していることに気付きました。私にとって、次のステップは、ジョイントポイントを見つけることです。低レベルのプログラミングのための高レベルの言語機能です。そのため、その言語は存在しません(おそらく、Googleはユーザーランドシステムプログラミングに向いています)。私は自分の言語を構築するというアイデアを検討していますが、これは別の話です。


1

ドメインにはそれほど多くの理由はありませんが、高性能コンピューティング(ゲーム、科学など)を行う場合は正当化されます。


1
多くの高性能領域が残っているかどうかはわかりません。ゲームは確かに低レベルの言語を必要としません。ゲームでは、通常エンジンを使用するか、少なくともOpenGLなどから始めます。そして科学にとって並列化は非常に重要であり、正確さです。OCamlか何かのほうがいいと思う。パフォーマンスが重要な領域は、もはや多くの数を処理する領域ではなく、カーネル、ドライバ、ストレージエンジンなど、非常に頻繁に使用される領域です。実際にこれに触れる開発者は全体の1%未満だと思います。
back2dos

4
@ back2dos、ゲームエンジンはどこからともなく現れてはいけません-誰かがそれらを書かなければなりません。OpenGLは何で書かれていると思いますか?C#ではありません。最近のほとんどのアプリケーションで低レベル言語を使用する必要はありません...しかし、多くの人々はそれを必要とする他の分野で働いています。
グランドマスターB

1

今日、低レベルと高レベルのプログラミングはかなり分離できると思います。基本的にこれは、Cとアセンブラーをまったく知らなくても、プロとしての生活を送ることができることを意味します。つまり、Cプログラミング言語ではプログラミングや設計の観点から多くを教えることはできません。

好奇心から、より低いレベルで物事がどのように機能するかを学ぶことができます。たとえば、大学にいたときは、gccを使用してC ++からアセンブラコードを生成することを楽しんでいました。ポリモーフィズムと例外がどのように実装されているかを理解することは役に立ちました。しかし、それ以外に、最近Cから学べることは次のとおりです。

1)ダーティメモリトリック。Cは、プログラマの狂気にボトムダウンがないことを理解するための最良の方法です:)

2)GOTOは実際にエラーをロールバックするために使用されます

3)メモリ割り当てがどのように機能するかをよりよく学びます(ヒープとスタックの違いは?)。

だから基本的に私の論文は次のとおりです。すでに大学を卒業していて、まだCを必要としないなら、それを学ばないことよりも:)


2
低レベルで物事がどのように機能するかを知るためにCを知ることは、漏れやすい抽象化があるときに物事がうまくいかない理由を理解するのに役立ちます。
マイケルショー

1

低レベル言語を理解する必要はありませんが、選択した高レベル言語のカバーの下で何が起こっているかを理解する必要があります。低レベルの言語を使用するとこれがわかりますが、それが唯一の方法ではありません。

高レベルの言語に影響を与える可能性のある低レベルの概念の例を次に示します。

ポインター:

List<object> listOne = new List<object>();
List<object> listTwo = listOne;

listTwo.Add(new object());

Debug.WriteLine(listOne.Count); //do you know what this will be?

文字列:

string initial = "initial";
string another = initial;

another = "changed!";
Debug.WriteLine(initial); //what about this?

リスト:

いつリストとリンクリストを使用しますか?(リストがどのように機能するかについてかなり低いレベルで理解することなくこれを知ることはほとんど不可能です)

-

これらすべてを知る必要がありますか?いいえ、しかし、それは影響を与える可能性があり、高レベル言語のマスターになりたい場合は、内部の仕組みについてかなり良い考えを持つ必要があります。


1

低レベルのプログラミングは何を教えてくれますか?他の言語は教えてくれませんか?

最も顕著なのは、コンピューターが実際にどのように機能するかを教えてくれることです。これを学ぶ方法は、低レベルのプログラミング以外にはありません。プログラムするアプリケーションの種類に関係なく、これは常に役立ちます。あなたは実際に、そのすべてのWebアイテムの下で何が起こっているのかを理解するでしょう。また、Windowsを使用している場合、API全体がCで記述されているため、現在の言語とそのライブラリにない機能を使用する必要があるときはいつでも、その言語を知っているとOSと直接通信できます。

もちろん、低レベルのプログラミングでは、asm / C / C ++が必須の組み込みプログラミングやリアルタイムプログラミングなど、まったく異なるものを扱うことができます。この種のアプリケーションに興味がない場合は、asm / C / C ++を習得する必要はほとんどありません。

また、ビットとバイトを学習します。ビット操作、16進数など。これらは、Web /デスクトッププログラミングを行っているときにも発生することがあります。暗号化アルゴリズムは、そのような使用例の1つです。

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