基本レベル:
最も単純で最も基本的なレベルで物事を見てみましょう。
数学の場合、
2 + 3 = 5
私は非常に若かったときにそれについて学びました。最も基本的な要素を見ることができます:2つのオブジェクトと3つのオブジェクト。すばらしいです。
コンピュータープログラミングでは、ほとんどの人が高級言語を使用する傾向があります。一部の高レベル言語は、Cのような下位の高レベル言語の1つに「コンパイル」することさえできます。その後、Cをアセンブリ言語に翻訳できます。その後、アセンブリ言語はマシンコードに変換されます。多くの人が複雑さはそこで終わると考えていますが、それは終わりではありません。現代のCPUはマシンコードを命令として受け取り、その後「マイクロコード」を実行してそれらの命令を実際に実行します。
これは、最も基本的なレベル(最も単純な構造を扱う)で、ハードウェアに埋め込まれ、ほとんどのプログラマーが直接使用も更新もしないマイクロコードを扱っていることを意味します。実際、ほとんどのプログラマーはマイクロコード(マイクロコードよりも0レベル高い)に触れないだけでなく、ほとんどのプログラマーはマシンコード(マイクロコードよりも1レベル高い)やアセンブリ(マイクロコードよりも2レベル高い)にも触れません(おそらく、大学時代の少しの正式なトレーニングを除く)。ほとんどのプログラマーは、3レベル以上だけ時間を費やします。
さらに、アセンブリ(通常、人々が受けるレベルと同じくらい低いレベル)を見ると、個々のステップは通常、訓練を受け、そのステップを解釈するためのリソースを持っている人々によって理解されます。この意味で、アセンブリは高レベルの言語よりもはるかに簡単です。ただし、アセンブリは非常に単純であるため、複雑なタスクや平凡なタスクを実行するのも非常に面倒です。上位言語はそれから私たちを解放します。
「リバースエンジニアリング」に関する法律では、裁判官は、コードを理論的に一度に1バイト処理できるとしても、現代のプログラムは数百万バイトを必要とすると宣言したため、実現可能な努力。(したがって、内部開発は、著作権法の一般化された「コピーを作成しない」規則の違反とは見なされませんでした。) )
近代化:
286向けのコードを実行していますか?または、64ビットコードを実行しますか?
数学は、数千年にわたってさかのぼる基礎を使用します。コンピュータでは、人々は通常、20年前の何かへの投資は無駄なリソースの無駄だと考えています。これは、数学をより徹底的にテストできることを意味します。
使用ツールの標準:
私は(自分よりも正式なコンピュータプログラミングトレーニングを受けた友人から)、C仕様を満たすバグのないCコンパイラなどはないと教えられました。これは、C言語が基本的にスタックの目的で無限のメモリを使用する可能性を想定しているためです。明らかに、そのような不可能な要件は、人々が本質的にもう少し有限な実際のマシンで動作する使用可能なコンパイラを作成しようとしたときから逸脱しなければなりませんでした。
実際には、Windows Script HostのJScriptを使用して、多くの優れたオブジェクトを使用できることがわかりました。(新しいコードを試すために必要なツールセットがMicrosoft Windowsの最新バージョンに組み込まれているため、この環境が気に入っています。)この環境を使用すると、オブジェクトの動作方法に関する簡単に見つけられるドキュメントがないことがあります。ただし、オブジェクトの使用は非常に有益であるため、とにかくそうします。だから私がやることは、スズメバチの巣のようにバグがあるかもしれないコードを書くことであり、効果を見ることができ、オブジェクトとやり取りしながらオブジェクトの動作を学ぶことができるサンドボックス化された環境でそうします。
他のケースでは、時々オブジェクトの動作を理解した後にだけ、オブジェクト(オペレーティングシステムにバンドルされている)がバグであり、Microsoftが修正しないと意図的に決定した既知の問題であることがわかりました。 。
このようなシナリオでは、10年以上にわたって「わずか2つのリモートホール」という有名なセキュリティレコードで、定期的に(1年に2回)定期的に新しいリリースを作成する優れたプログラマーによって作成されたOpenBSDに依存しますか?(それほど深刻でない問題に対するエラッタパッチもあります。)いいえ、決してありません。私は、Microsoft Windowsを使用するマシンを人々に提供するビジネスをサポートするビジネスに取り組んでいるので、このような高品質の製品には依存していません。
実用性/使いやすさは、人々が役に立つと思うプラットフォームで作業することを要求し、それは有名なセキュリティにとって悪いプラットフォームです(たとえ同じ会社の製品がはるかに悪かった千年紀の初期から大きな改善がなされたとしても) 。
概要
コンピュータープログラミングがエラーを起こしやすい理由は数多くあり、それはコンピューターユーザーのコミュニティに受け入れられています。実際、ほとんどのコードは、エラーのない作業を許容しない環境で作成されています。(セキュリティプロトコルの開発など、一部の例外は、この点でもう少し努力を要する場合があります。)企業がより多くのお金を投資したくない理由や、顧客を満足させるための人為的な期限を逃すという一般的な考えに加えて、テクノロジーの行進では、時間をかけすぎると、10年以内に物事が大きく変わるため、時代遅れのプラットフォームで作業することになります。
率直に言って、strlenとstrcpyのソースコードを見たとき、非常に便利で人気のある関数がどれほど短いかに驚いたことを思い出すことができます。たとえば、strlenは「int strlen(char * x){char y = x; while((y ++)); return(yx)-1;}」のようなものでした
ただし、典型的なコンピュータープログラムはそれよりもはるかに長くなります。また、多くの最新のプログラミングでは、十分にテストされていないか、バグがあることがわかっている他のコードを使用します。今日のシステムは、「下位レベルで処理される詳細」として多くの特徴点を手で振り払うことを除いて、簡単に考えられるものよりもはるかに複雑です。
この必須の複雑さ、および複雑で間違ったシステムで作業することの確実性により、コンピュータープログラミングは、物事がはるかに単純なレベルに煮詰められる傾向がある多くの数学よりも検証する多くのハードウェアになります。
数学で物事を分解すると、子どもたちが理解できる個々の部分に到達します。ほとんどの人は数学を信頼しています。少なくとも基本的な算術演算(または、少なくともカウント)。
実際にコンピュータープログラミングを分解して、内部で何が起こっているのかを確認すると、最終的に電子的に実行される壊れた標準とコードの壊れた実装になります。その物理的な実装は、ほとんどの大学で訓練されたコンピューター科学者が行うマイクロコードの1つ下のステップです触ってはいけません(彼らがそれに気づいていれば)。
大学にいるプログラマーや最近の卒業生と、バグのないコードを書くことができるという考えにまったく反対するプログラマーと話をしました。彼らは可能性を書き留めており、いくつかの印象的な例(私が示すことができた)はいくつかの説得力のある議論であることを認めていますが、彼らはそのようなサンプルを代表的ではないまれな吸虫と見なし、まだ数えることができる可能性を却下していますそのようなより高い基準を持つことに。(数学で見られるはるかに信頼できる基盤とはまったく異なる態度。)