長年、私は「低レベル」言語と考えるものを掘り下げることを検討してきました。私にとって、これはCとアセンブリを意味します。しかし、私にはこれのための時間はまだありませんでしたし、それが必要だったこともありません。
今は必要が生じていないので、いつ勉強するかスケジュールを立てるか、いつまでも計画を落とすべきだと思います。
過去4年間、私は変化する可能性のある「Webテクノロジー」に焦点を当ててきました。私は、変化する可能性の低いアプリケーション開発者です。
アプリケーション開発では、使いやすさが一番大事だと思います。ユーザーが「消費」するアプリケーションを作成します。それらのアプリケーションが使いやすくなればなるほど、より多くの価値が生み出されます。
使い勝手を良くするために、以下のことが実行可能だと思います
低レベルのプログラミングは、パフォーマンスを除いて、私にはそれを助けにはならないと思います。しかし、パフォーマンスのためにアプリ全体を低水準言語で書くことは、私にとって時期尚早な最適化です。
低レベルのプログラミングは私に何を教えることができますか、他の言語は私に教えないでしょうか?アプリケーション開発にほとんど役立たない何かが足りないのか、それとも単なるスキルなのか? CとAssemblyの価値については質問していないことをご理解ください。それは私の日常生活の中で、その世界のすべての複雑さが抽象化されて管理されていることを非常に嬉しく思います(主にC/C++およびアセンブリ自体で記述されたレイヤーによって)。私には新しい概念はありません。頭に詰める必要がある詳細だけです。それで私にとっては何ですか?
回答ありがとうございます。誰も本当に私を驚かせたわけではありませんが、少なくとも今では、この関心領域は、必要が生じるまで削除することを確信しています。
私が理解しているように、今日のCPUで使用されているプロセッサ向けに最近アセンブリを記述することは、不必要に複雑であるだけでなく、Cの対応よりも実行時のパフォーマンスが低下するリスクがあります。手動で最適化することは、OOEが原因でほぼ不可能ですが、コンパイラーが自動的に実行できるすべての種類の最適化は得られません。また、コードは使用可能なコマンドの小さなサブセットを使用するため移植可能であるか、最適化されていますが、おそらく1つのアーキテクチャでのみ機能します。
Cを書くことは、以前ほど必要ではなくなっています。アプリケーションをCで作成する場合、テストおよび確立されたライブラリとフレームワークを使用するだけで、大学での演習として機能する文字列コピールーチン、並べ替えアルゴリズム、その他の種類の実装は不要になります。私のコードは、タイプセーフティを犠牲にしてより速く実行されます。私は通常のアプリ開発の過程でホイールを再発明することに熱心でもなく、コアダンプを見てデバッグしようとすることもしていません:D
現在、言語とインタープリターの実験を行っているので、公開したいことがあれば、Cに移植したいと思いますが、C++でも同じことができるでしょう。
また、皆さんの回答と洞察に感謝します。
低レベルのプログラミングは、通常のデスクトップコンピューターにすぐには存在しない要件があるような、まれなケース向けです。これは、速度のボトルネック、メモリのボトルネック、またはまったく異なるものである可能性があり、これらの要件を前提として何ができるかを確認することは非常に興味深いものです。
それをハイクスまたはリメリックと考えてください。制限により興味深いものです。
今日では不可能と思われることで何が可能かを理解するために、これが史上最大のハックの1つです。 1のチェスKb RAM! http://users.ox.ac.uk/~uzdm0006/scans/1kchess/
私は最近これを考えていました。私は現在、自分をC#開発者と見なしています。これは、私のキャリアにとっては申し分ないことです。
ただし、非常に低いレベルのことを見落としがちです(本質的に、Cでアセンブラーまたはデバイスドライバーを実行することにより、「手を汚す」ことになります)。プログラミングが恋しいです。それが私のキャリアで大いに役立つとは思わない。デバイスドライバーや組み込みシステムが重要な場合、それは非常に役立ちます。
抽象化された言語でプログラミングすればするほど、そもそもコンピューターに夢中になってしまったこと、つまりコンピューターをざっと見て、何がひっくり返るのかを見逃すことになります。アセンブラーとCは、ポーキングに非常に適しています。
古い言語を使用すると、ほとんどすべて自分でやらなければならなくなると思います。 C#ではmyArray.SortBy(x=>x.Name)
のようなことができます。 Cでそれを行うことはできません。言語が私にとって最善の並べ替えを行うことを受け入れます。 Cで行うとしたら、大学のモジュールの時代に戻って、さまざまなソートおよび検索アルゴリズムを修正することができます。
したがって、下位レベルの言語は、すべてが抽象化されている、長い間忘れられていたビットを修正するのに役立つと思います。キャリアアップよりも個人的な挑戦の方が多い。
私の提案は、知的好奇心としてCをいじることです。それはそれの価値がないので、重い時間の投資をしないでください。
推奨される目標:
machineがどのように機能するかを理解したい場合は、高水準言語が依存する仮想マシンだけでなく、Assemblyが教えてくれます
あなたが気にする理由がないなら-そして、ほとんどのプログラマは最近本当にそうしない-それなら心配しないでください。
それはあなたの基礎を改善しますが、おそらくあなたのウェブアプリを改善しません
すべてのプログラミング言語は、一般的なプログラミングについての考え方が少し異なります。私があなたに与えることができる具体的な例は、私がhaskellを学び始めたときであり、突然、javascript、Ruby、およびpythonの機能ビットがまったくずっと意味をなしただけでした。 haskellの前後のコードでfoldlを実行すると、配列が表示されるすべての場所でそれが見られます。そのため、いくつかのCを学ぶと、お気に入りの言語でのさまざまな構成の相対的なパフォーマンス特性にさらに気づく可能性が高くなります。A数分前にスピーディーで最適化されたJavaScriptを書く話を聞いていて、スピーカーは「Cで行うのが難しいと、JavaScriptで本当に遅くなるだろう」と言った。JavaScriptはインタプリタ言語であり、インタプリタであるという彼の意図はCかC++のどちらかで書かれています。Cの経験がほとんどなく、Cで何が難しいか簡単かわからないので、これは頭の中でうまくいきました。
楽しみのためだけにそれを行わない場合、マニアはハードウェアを完全に制御するのが大好きなので、少なくともJavaなどではなく、Cでプログラムを書くと、プログラムがどれほど速くなるかをよく理解できるでしょう。また、ガベージコレクションなどの高水準言語の機能を本当に理解する方法を学ぶこともできます。
好奇心をかき立てる!
日常の職務について論理的に知る必要がない場合でも、複雑なシステムの最低レベルで実際に何が起こっているのかを理解することは非常に良いことです。ビットレベルで物事を理解するための最善の方法は、独自のCPUを構築することです。機械語レベルのオペコードについて考え、直交命令セットが非常に優れている理由、割り込み処理の複雑さ、複雑な回路とマイクロコードのトレードオフ(乗算ユニットなど)など、他にもたくさんの楽しみがあります。
しかし、それは明らかに、電子機器のノウハウを必要とし、時間がかかるため、次善の策は、アンティークスタイルの8ビットCPUで遊ぶことです。 8051のようなマイクロコントローラーはまだ広く使用されており、愛好家が利用できます。それでも、電子機器を設置し、喫煙せずにLEDを点灯させるにはいくつかのノウハウが必要であり、電子機器をまだ装備していない場合は、$$かかります。
その後の次善の策:CPUシミュレーター(エミュレーター?これらの用語が混同されています)をいじくり回します-これらはZ80、6502、8086に存在します...すべての古い8ビッターです。これは、はんだごてのどちらの側を保持すればよいかわからないアプリケーションプログラマにとって、最も教育的で楽しいかもしれません(ただし、テキストメモリがどのようにビデオメモリに書き込まれるか、アセンブリコードのトリックがパフォーマンスにどのように役立つかを学びます)。 ..このレベルで探求する楽しいことがたくさんあります。
CPUの内部の仕組みを最初に理解していなければ、Cを別の言語として学習することについてはあまり確信が持てません。 CPUレジスタ間でビットがどのように送信されるか、メモリがどのようにアクセスされるかを知ることで、ポインタやその他のC言語の概念を本当に手に入れることができます。
一言で言えば、楽しい。私がアセンブラーをいじって使用していたとき(VBからC++、Cなどにダウンした))、プロセッサーのある部分から別の部分にデータを移動するのは素晴らしいことでした。知っている感じ正確に CPUの内部で何が起こっていたか、あなたが知らなかったその下で何が起こっていたのかについての心配はありません。高水準言語で見られるような組み込みの制限はありません。
また、他の言語でプログラミングした人なら誰にでも向きを変えることができ、「ハードコアが足りなければ...」というのは、子供じみた子供っぽい楽しみでした。
低レベルのプログラミングを学び、実践する正当な理由はありますか?状況次第で色々な答えがあります。
最初に、私はCプログラミング(OCamlとJavaも含む)を教えています。学生にハード面からプログラミングを学ぶ動機づけは、おそらくタスクの最も難しい部分です。私がこれまでに見つけた最良の議論は「理解」です。高レベルの言語は多くの基本的なメカニズムを隠し、時には役に立たないこともあります。低レベルのトリックが本当に役立つ場合でも、より高いレベルに留まるようにプッシュします(ほとんどの場合、パフォーマンスのために。)使用しているものを理解することは、それをよりよく使用するのに役立ちます。私の指導経験から、低レベルのプログラミング(および他のユーザー指向ではないコンパイラなど)を習得した学生はより適応性が高く、新しい高レベルの概念やツールをより速く学習できることがわかりました。
第二に、あなたが述べるように、パフォーマンスはユーザーエクスペリエンスの一部です。ほとんどの場合、パフォーマンスは複雑でマシンコードに近いものを書くことの問題と見なされます。これは常に当てはまるとは限りません。パフォーマンスは、アルゴリズムとデータ構造の問題だけでなく、アルゴとデータ間の相互作用の問題でもあります。私はこのテーマについて特別なプロジェクトを使用します。基本的には単純なパス検索ですが、実際の問題はデータのサイズです。グラフは無限です。ディセントパフォーマンスを達成してメモリに収まる唯一の方法は、専用のメモリアロケータ(実際には、プールアロケータとリサイクルアロケータの2つ)を記述することです。これは、ほとんどの高レベル言語では実行できないことです。実際、ほとんどのガベージコレクション言語には、パフォーマンスとメモリの問題があります。
低水準言語の「誇大広告」に対する安定性(歴史と長寿の意味で)など、より多くの議論があります(プログラミングの将来の参照と見なされる言語が数年で消えることがあるという事実は長いです)ストーリー、新しいものの寿命を予測することはできませんが、この議論は古い言語にも当てはまります...)もちろん、好みの問題もあります。または、ほとんどの高水準言語で実行できることは、下位レベルの言語で行われますが、その逆は行われません(ただし、それを考慮すると、すべてのコードをアセンブリのみで行う必要があります...)
私は両方の世界のトラップです(まったく異なります)、私は数年かけて理論プログラミングの概念、型システムの設計と証明に取り組んでいます。そのため、非常に高水準の言語(ほとんどが機能的な言語だけでなく、オブジェクト指向。)最近、私は反対側(主にシステムとカーネルプログラミング)に戻り、この領域でとても楽になり、とても楽しんでいます!私にとっての次のステップは、共通点を見つけることです:低レベルのプログラミングのための高レベルの言語機能!だから、今のところ、そのための言語はありません(おそらくGoogleがユーザーランドシステムプログラミングに取り掛かっています)。私は自分の言語を構築するという考えを検討していますが、これは別の話です。
あなたのドメインには多くの理由はないと思いますが、もしあなたがハイパフォーマンスコンピューティング(例えば、ゲーム、科学など)をするなら、それは正当化されるでしょう。
今日、低レベルと高レベルのプログラミングはかなり分離できると思います。基本的にこれは、Cやアセンブラーをまったく知らなくても、すべての職業生活をまったく問題なく行えることを意味します。とはいえ、Cプログラミング言語では、プログラミングや設計の観点から多くのことを学ぶことはできません。
好奇心から、あなたは物事がより低いレベルでどのように機能するかを学ぶことができました。たとえば、私が大学にいたとき、gccを使用してC++からアセンブラコードを生成することを楽しんでいました。ポリモーフィズムと例外がどのように実装されているかを理解することは役に立ちました。しかし、それとは別に、現在Cから学べる唯一のことは次のとおりです。
1)ダーティメモリトリック。 Cは、プログラマーの狂気にボトムダウンがないことを理解するための最良の方法です:)
2)エラーをロールバックするためにGOTOが実際に使用されている(そして有用である)
3)メモリ割り当ての仕組みをよりよく学ぶ(ヒープとスタックの違いは誰か?).
だから基本的に私の論文は:あなたがすでに大学を卒業し、それでもCを必要としないなら、それを学ばないことだ:)
低水準言語を理解する必要はありませんが、選択した高水準言語の裏で何が起こっているのかを理解する必要があります。低レベルの言語を使用すると、これがわかりますが、それが唯一の方法ではありません。
高水準言語に影響を与える可能性のある低水準の概念の例を以下に示します。
ポインタ:
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?
リスト:
いつリストとリンクリストを使用しますか? (リストがどのように機能するかをかなり低いレベルで理解せずにこれを知ることはほとんど不可能です)
-
このすべてを知る必要がありますか?いいえ、しかし、それは影響を与える可能性があり、高級言語のマスターになりたい場合は、内部の仕組みについてかなり良い考えを持つ必要があります。
低レベルのプログラミングは私に何を教えることができますか、他の言語は私に教えないでしょうか?
最も注目に値するのは、コンピューターが実際にどのように機能するかを教えてくれるでしょう。これを学ぶには、低レベルのプログラミング以外に方法はありません。プログラムするアプリケーションの種類に関係なく、これは常に役立ちます。あなたは実際にそれらすべてのウェブものの真下で何が起こっているかを理解するでしょう。また、Windowsを使用している場合、API全体がCで記述されているため、現在の言語やライブラリにない機能を使用する必要がある場合はいつでも、その言語を知ることでOSと直接通信することができます。
もちろん、低レベルのプログラミングでは、組み込みプログラミングや、asm/C/C++が必須のリアルタイムプログラミングなど、まったく異なるものを扱うことができます。これらの種類のアプリケーションに興味がない場合は、実際にasm/C/C++を学ぶ必要はほとんどありません。
また、ビットとバイトを学習します。ビット操作、16進数など。Web/デスクトッププログラミングを実行している場合でも、これらの問題に時々遭遇する可能性があります。暗号化アルゴリズムは、その使用例の1つです。