それで、ここにジョン・カーマックからの投稿を思い起こさせます。 最近、#AltDevBlog に関する彼の記事にアクセスできなくなったことを知りました。 そのため、それらを公開してアーカイブするために、ここに再投稿します。 これらの記事は間違いなく素晴らしい読み物であり、保存する価値があります.
これを発見したすべての人は、「意図的なプログラミング」が楽器の製造に利点をもたらすと推測されていること、または特効薬として宣伝されていることを聞いたことがあるでしょう。 ただし、ウィキペディア にアクセスして追加のファイルを探すことは、ラムダ計算 と フォーマルテクニック 。 それがより良い楽器を書くことで何を実行しなければならないかは、すぐには明らかではありません.私の実用的な要約: 計測器の構築における失敗の大きな部分は、現在、プログラマーがコードを実行できる可能性のある最終的な状態を完全に把握していないことに起因しています。結果として生じる問題は非常に増幅され、実際にはパニックに陥る可能性があり、注意を払っている可能性があります。 意図的なモデルでプログラミングすると、コードに提示された想定が明確になり、それによって原因を突き止めるのが比類のないほど簡単になります。また、完全に純粋なマシンでは、スレッドのトラッジの前提条件が非常にうまくいかなくなります.私は、意図的なプログラミングを追求するのに適切な切符があることを認めますが、反対に、すべての人に C++ コンパイラを捨てて Snarl
でコーディングを開始するように勧めるのは無責任です。 、Haskell、または率直に言って、他のすべての周辺言語です。 言語設計者の永遠の悔しさには、言語の利点を圧倒する可能性のある外部性がたくさんあり、スポーツの構築はほとんどの分野よりも大きい. 罪深いプラットフォーム ポイント、独自のマシン チェーン、認証ゲート、ライセンス テクノロジ、およびすべての個人が直面する従来のコードベースと人員の可用性を備えたポイントの高い点での厳しい効率要件があります 。可能性はあるかもしれませんが、おそらくあなたは、非主流の言語で主要な建設作業を行う可能性が高い状況にいる可能性があります。進歩の名の下に。 その他のすべての個人の場合: 雇用されている言語に関係なく、 目的のあるモデルでのプログラミングには利点があります。 都合の良い時はいつでも実行し、都合の悪い時は解決に疲れる事を覚悟すべきです. ラムダ、モナド、カリー化、無限集合での遅延評価機能の構成、および明示的な関数指向言語の最後のその他のポイントについて、まあまあまあまあまあ発見することが不可欠です。あなたが置く。C++ は意図的なプログラミングをサポートしていませんが、その一方で、それを行うことからあなたを締め出すことはありません。また、転がり落ちて意識するための活力を保持していますあなたがその必要性を垣間見る核心的な良さ.ピュアチョイス純粋なエイムは、渡されたパラメータで最も簡単に表示され、パラメータに合わせて 1 つまたは追加の計算値を返すだけです。 論理的な 側面の結果はありません。 これは間違いなく抽象化です。 すべての目的には、CPU 段階で、ほとんどがヒープ段階でアスペクト結果がありますが、抽象化は大切に構成されています 。グローバルな想定で見たり交換したりしません。 それは内部の仮定を保持しません。 それは何のIOも信じていません。 入力パラメーターのいずれも変更しません。 理想的には、余分なデータが渡されない – allMyGlobals ポインターが渡される原因の比類のない敗北.純粋な機能には、優れた特性の分岐があります。スレッドのセキュリティ。 チケット パラメータを持つ純粋な目的は、完全にスレッド保護されています。 参照またはポインターパラメーターを使用すると、それらが const であることが証明されているにもかかわらず、非純粋な操作を行う他のすべてのスレッドがデータを変更または解放する可能性があるという不幸に常に注意を払う必要があります。保護されたマルチスレッド コードを記述するための多くの強力なツールの 1 つを構成します 。それらを並列実装に簡単に交換するか、1つ以上の実装をボルトで調べて、含意。 これにより、実験と進化が比類のないほど安全になります.再利用性。 純粋な目的を真新しい雰囲気に移植することは、比類のないほど簡単です。 フォーム定義と純粋な機能として知られているものを常に変更する必要がありますが、現在は雪だるま式の実行はありません。 他のすべてのマシンで必要なことを実行するコードに変更されたことを何回知っていますか?しかし、環境に関するすべての仮定からそれを解放し、穏やかに書き直すよりも余分な作業に変更されていますか?テスト容易性。 純粋なエイムには 参照透過性 があります。つまり、パラメータの状況に関係なく、一貫して同じ結果が得られることがあります。として知られているため、他の技術と織り交ぜられたものよりも、啓発するのが比類のないほど複雑ではありません。 私はコードを書くことについてあまり責任を負っていません。 コードの分枝は十分な技術と相互作用し、それを明らかにするためにおそらくハーネスの説明が必要になる可能性があり、私はそれが苦しみの支払いではないと自分自身に(おそらく間違って)説得することができます. 純粋な機能を検証するのは簡単です。 テストは、教科書から素晴らしいものを見つけます。そこでは、いくつかの入力を行い、出力で署名します。 少しコードを調べている気難しい人に出くわすたびに、私はそれを別の純粋な目的に分割し、そのためのテストを作成します。 恐ろしいことに、私はこれらのケースで汚染されたものを継続的に調達しています。分かりやすさと保守性。 入力と出力の両方を制限することで、必要に応じて純粋な機能を簡単に再学習できるようになり、マスクに対する外部想定の場合に文書化されていない要件の場所がはるかに少なくなります 。正式なテクニックとツールに関する自動的な推論は、今後ますます重要になるようです。 現時点では静的コード予測が必要であり、コードを正しく改造して特別な目的を持ったモデルにすると、予測ツールに役立ちます。または、少なくとも、ローカル ツールがより遅く、親しみやすいグローバル ツールと同じフロアをマスクできるようにします。 私たちは「Earn ‘er Performed」形式の商取引であり、私は現在、プログラム全体の「正しさ」の正式な証明を関連する目的に変更するのではなく、明らかなクラスの欠陥が現在、コードベースの明らかな側面で最も人気がありませんが、非常に大切にされています。 私たちの仕事に科学と数学を追加で啓発しましょう.プログラミングの入門クラスを受講している個人は、頭を悩ませているかもしれません。 現実には、現在よりも余分な目的が 巨大な泥の玉 であるということです。 成熟した重要なプログラミング言語は、スケダドルハッチを思い付き、最後に使用されます。 可能性が高いのは、使い捨てのコードを穏やかに書いて、最も便利であるかどうかに関係なく実行することであり、これには常にグローバルな仮定が伴います。 可能性としては、1 年後に理解する必要があるコードを書いている可能性があります。 現在、ほとんどのビルダーは、組み込みの変更がもたらす長時間のボルト時間の予測が不可能ではありません.Purity In Alter toもはやすべての小さなものが純粋であるとは限りません。 ただし、この設計はソース コード自体で操作するのが最も便利ですが、すぐに誕生した空気の世界と対話する必要があります。 純粋さを長引かせるために検証するのは、パズルのような形で楽しいかもしれませんが、実用的なブレークポイントは、ある時点ですぐにアスペクトの結果が必要であることを認識し、それらを効果的に管理します.特定の目的において常に全か無かである必要はありません。 目的がどれほど純粋であるかには連続したチケットが存在する可能性があり、実質的に純粋な状態から完全に純粋な状態へのチケットのステップは、スパゲッティの仮定から主に純粋な状態へのチケットのステップよりも小さい. 純度に目標を移すと、コードは改善されますが、それが分厚い純度を達成していないという証明された現実があります。 グローバル カウンターをバンプしたり、グローバル デバッグ フラグをテストしたりする目的は、現在では純粋ではありませんが、それが最も簡単な欠点である場合は、ほとんどの利点を享受するように構成されています.一般に、より広い文脈で最悪の事態を回避することは、限定されたケースで完璧を達成することよりも重要です。 あなたがマンションで持っていた最も有毒な能力や技術を回想する必要があるかもしれません.そして、それらの動作が依存する仮定であり、それらのパラメーターに限定されません。 これらの領域で自己規律を課すこと、または少なくとも余分なコードが同じ混乱にならないように戦うことは、低段階の数学機能を強化するよりも大きな影響を与えます.一般に、純粋性に向けたリファクタリングの戦略には、それが動作する環境から計算を解きほぐすことが必要であり、これには実質的に常に追加のパラメーターの受け渡しが伴います。 これは奇妙なことのように思えます。プログラミング言語の冗長性が高いことは広く非難されており、意図的なプログラミングは常にコード サイズの削減と関連付けられています。 目的を持った言語の目的を重要な実装よりも簡潔にすることをまれに可能にする要素は、純粋な機能の啓蒙とは正反対の穏やかで比類のないものです — ガベージ シーケンス、組み込みのグランド ソート、サンプル マッチング、リスト内包表記、目的の構成、多数の構文糖衣。など。ほとんどの場合、これらのサイズ削減機能は目的を持って実行するのに比類のないものではなく、いくつかの重要な言語で表示することもできます.あなたは落ち着くべきです、1ダースのパラメーターを目的に正しく渡す必要がある場合、悪化します。 おそらく、パラメータの複雑さを軽減する手法でコードをリファクタリングするために渋滞に巻き込まれる可能性があります.純粋性を宣言するために C++ で強化された言語の不足は、今や理想的ではありません。 誰かが、広く使われている基本的な目標を粗雑な式で非純粋なものに変更すると、その目標を啓発するすべての小さなことはさらにその純粋性を失います。 これは、ギャプの適切なテクニックの観点からは悲惨に聞こえますが、繰り返しますが、主な罪で恵みから落ちるオールオアナッシングの命題ではありません. 残念ながら、拡張スケールの機器の構築は統計的なものです。将来の C/C++ 要件では、pure キーワードの正当なケースがあるようです。 const との密接な類似点があります。これは、プログラマー マップのコンパイル時のチェックを可能にする必須ではなくなった修飾子であり、おそらく今まで問題にならず、コード生成を継続的に待機することができます。 D プログラミング言語は純粋なキーワードを提供します: http://www.d-programming-language.org/aim.html 古代と堅実な純粋さの区別を称賛するように教えてください。さらに、強く純粋であるためには、const に参照とポインターを入力する必要があります。多くの点で、言語のキーワードは過度に制限的です — 側面の結果が外部の目的を邪魔しない限り、不純な能力と呼ばれるという証明された現実にもかかわらず、目的を構成することができます。 全体的な目的は、純粋な目的について考えることができるかもしれませんfu l アイテムが最も手近な場合は、ライン パラメータをランダム ファイル マシンに通知する必要があるとします。オブジェクト指向プログラミング マイケル・フェザーズ @ mfeathers OO は、トランスファー アスペクトをカプセル化することによって、コードを理解しやすくします。 FP は、トランスファー アスペクトを最小限に抑えることで、コードを理解しやすくします。 「移行する側面」とは、変化する状態です。 オブジェクトに自分自身をスワップするように指示することは、よくあるオブジェクト指向プログラミングの電子書籍のレッスン 1 であり、ほとんどのプログラマーに深く根付いています。 明らかに、主な OOP の考え方の中に、機能が動作するデータ ビルディングをグループ化するというチケットがありますが、コードの側面で意図的なプログラミングの利点を常に享受しなければならないことに気付いている必要があります。これらの領域でのいくつかのオブジェクト指向の動作からの方法 おそらく const ではない可能性のあるクラス ソリューションは、オブジェクト内のおそらく大きな状況の一部またはすべてを変更するため、定義上純粋ではなくなりました。 彼らは現在、スレッド保護されていないようであり、オブジェクトを段階的にローミングして驚くべき状態にする機能は、確かにバグの主な原因です. Const オブジェクト ソリューションは、技術的に純粋である必要があります。暗黙の const this ポインターに依存しないでください。しかし、多くのオブジェクトは、純粋な機能の明快さの利点の一部を鈍らせ、すべての価値があると仮定して、世界の分枝を構成するのに十分な大きさです。 コンストラクターはおそらく純粋な機能である可能性があり、一般的にはそうであるように努力する必要があります-それらは引数を持ち、オブジェクトを返します.戦術的なプログラミングの段階では、オブジェクトをより目的のある公式で継続的に操作する可能性がありますが、その一方で、インターフェースを少し変更する必要があるだけかもしれません。 ID では、自己変異 void Normalize() 来ますが、対応する idVec3 Normalized() const は来ません。 多くの文字列ソリューションは、実行された操作で真新しい複製を返すのではなく、自分自身で作業するように概説された同じ設計内にありました – ToLowerCase(), StripFileExtension()、など効率への影響事実上すべての場合において、メモリのブロックを即座に変更することが光速度の最適なケースであり、ここで回避することはいくらかの効率を消費することです. これまで以上に頻繁に、理論的な好奇心の最も手近な場所はここではありません。 最終的には生産性のために効率を商売します.純粋な機能を使用してプログラミングすると、ファイルの余分なコピーが信頼されます。場合によっては、効率の問題に起因する誤った実装アプローチになることは明らかです。 誤った例として、純粋な DrawTriangle() を書く確率は フレームバッファをパラメータとして取り、結果として三角形が描画された完全に新しいフレームバッファを返すエイム。 そんなことはしないでくださいあらゆる小さなものをチケットで返すことは、自然な目的のあるプログラミング モデルですが、一貫して信念を持っているコンパイラに依存しています リターン チケットの最適化 効率を損なう可能性があるため、高度なデータ ビルディングの出力に参照パラメーターを渡すことは継続的に正当化できますが、一方で、返されたチケットを const として宣言することから、 単一代入.を実装する多くの場合、チケットを複製して修正したモデルを返却するのではなく、渡された精巧な構造でチケットを静かに交換したいという確固たる衝動があるようですが、そうすることでスレッドのセキュリティ保証が破棄され、今すぐ作成する必要があります均等に実行されません。 リストの生成は、常に正当化されるケースです。 リストに何かを追加するための純粋に意図的な式は、リストの完全に新しい複製を返し、先端に新しい要素を追加し、固有のリストを変更しないことです。 有効な目的のある言語は、これを構築する方法で利用されていますが、今ではそう聞こえるほど悲惨ではありませんが、標準の C++ コンテナーでこれを実行する必要があります。主な緩和要素は、現時点での効率が並列プログラミングになることです。これは、最適な効率のケース内であっても、単一スレッド環境よりも余分なコピーとミキシングを継続的に必要とするため、複雑さの削減と正確性の利点はそれに応じて小さくなります。より大きい。 スポーツの世界で最終的なキャラクターを並行して操作、問題、最終的なキャラクターに興奮させることができますが、オブジェクト指向の更新オブジェクトが並行環境でいくつかの深刻な問題を抱えていることに沈み始めます。 おそらく、すべてのオブジェクト serene が領域内で最も読みやすいモデルを参照し、更新されたモデルをフレームの先端にコピーしたとします… おいおい、ちょっと待って…アクションアイテムコードベースのいくつかの重要な機能について説明し、それらが達成できる可能性のある外部の仮定と、それらが構築できるすべての可能な変更をすべて書き留めます。 これにより、大きなドキュメントがコメント ブロックにとどまるようになります。 目的がレンダリング マシンの設計によるカバー交換をトリガー、発行、可能性がある場合、可能性として、穏やかに両手を空中に投げ出し、以前の人間のワークアウトのすべての結果の状況を公開する可能性があります。あなたが引き受ける次の仕事は、最初から続く正しい計算のフレーズでそれを負担するよう努めてください。 入力を取得し、それを純粋な目的に渡し、それから意味を持ち、それで1つのことを実行します.コードをデバッグしている可能性が高いので、何が起こっているのかを分かりにくくするために割り当て変更の仮定と隠しパラメーターのプレイに特に注意を払うようにしてください。ユーティリティ オブジェクト コードの一部を変更して、新しいコピーを返すようにし、実際にすべての非イテレータ変数の前に const をスローして、啓蒙することを検討してください。追加の参照: http://www.haskell.org/haskellwiki/はじめにhttp://lisperati.com/http://www.johndcook.com/blog/sign/purposeful-programming/http://www.cs.kent.ac.uk/of us/workers/dat /miranda/whyfp90.pdfhttp://channel9.msdn.com/Shows/Going+Deep/Lecture-Sequence -Erik-Meijer-Purposeful-Programming-Fundamentals-Chapter-1http://www.cs.utah.edu/~hal/clinical doctor/ daume02yaht.pdfhttp://www.cs.cmu.edu/~cry/819- f09/Backus78.pdfhttp://fpcomplete.com/the-downfall-of-crucial-プログラミング/