タグ付けされた質問 「imperative-programming」

4
命令型プログラミング、手続き型プログラミング、構造化プログラミングの違いは何ですか?
(書籍、ウィキペディア、SEに関する同様の質問など)を調査することで、命令型プログラミングは主要なプログラミングパラダイムの1つであり、コンピューターが実行する一連のコマンド(またはステートメント)を記述する(つまり、特定のアクションを実行するように多くの順序を指定するため、「命令型」という名前が付けられます)。ここまでは順調ですね。 一方、手続き型プログラミングは、命令型プログラミングの特定のタイプ(またはサブセット)であり、プロシージャ(関数)を使用してコンピューターが実行するコマンドを記述します。 最初の質問:手続き型ではない命令型プログラミング言語はありますか?言い換えると、プロシージャなしで命令型プログラミングを使用できますか? 更新:この最初の質問には答えられているようです。言語は、手続き的または構造化されていなくても不可欠です。例は、純粋なアセンブリ言語です。 次に、構造化プログラミングもあります。これは、命令型プログラミングの別のタイプ(またはサブセット)と思われ、GOTOステートメントへの依存を取り除くために登場しました。 2番目の質問:手続き型プログラミングと構造化プログラミングの違いは何ですか?あなたは一方を他方なしで持つことができますか?画像のように、手続き型プログラミングは構造化プログラミングのサブセットであると言えますか?

4
Apollo 11ミッションのコードに使用される開発プロセスは?
アポロの任務には、電卓ほど複雑な技術はなかった。 こちらのリンクから、Apollo Guidance Computer(AGC)に関する情報があります。 オンボードのApollo Guidance Computer(AGC)は約1立方フィートで、2Kの16ビットRAMと36Kのハードコアコアロープメモリで、銅線は小さな磁気コアに通されているか、通されていません。16ビットワードは通常、14ビットのデータ(または2つのオペコード)、1符号ビット、1パリティビットでした。サイクルタイムは11.7マイクロ秒でした。プログラミングはアセンブリ言語と逆ポーランド語の解釈言語で行われました。 そのため、そこにあるものを調査したときにいくつかのソースコードに出くわし、素晴らしいコメントに気付きました(たとえば、TEMPORARY、I HOPE HOPE HOPE) VRTSTART TS WCHVERT # Page 801 CAF TWO # WCHPHASE = 2 ---> VERTICAL: P65,P66,P67 TS WCHPHOLD TS WCHPHASE TC BANKCALL # TEMPORARY, I HOPE HOPE HOPE CADR STOPRATE # TEMPORARY, I HOPE HOPE HOPE TC DOWNFLAG # PERMIT …

3
参照の透明性とは何ですか?
命令型パラダイムでそれを見てきました f(x)+ f(x) 次と同じではない可能性があります。 2 * f(x) しかし、機能的なパラダイムでは同じでなければなりません。私はPythonとSchemeの両方のケースを実装しようとしましたが、私にとっては同じように見えます。 特定の関数との違いを指摘できる例は何でしょうか?

5
関数型プログラミング言語を命令型ではなく宣言型にするのはなぜですか?
関数型プログラミングの利点を説明する多くの記事で、C / C ++ / C#/ Javaなどの命令型言語とは異なる「宣言型言語」と呼ばれるHaskell、ML、Scala、Clojureなどの関数型プログラミング言語を見てきました。私の質問は、関数型プログラミング言語を命令型ではなく宣言型にするものです。 宣言型プログラミングと命令型プログラミングの違いを説明するよくある説明は、命令型プログラミングでは、宣言型言語の「何をすべきか」ではなく「何をするか」をコンピューターに伝えるというものです。この説明に関して私が抱えている問題は、すべてのプログラミング言語で常に両方を実行しているということです。最下位レベルのアセンブリに移動しても、コンピューターに「何をすべきか」と伝え、CPUに2つの数字を追加するように指示します。追加の実行方法については指示しません。Haskellのような高レベルの純粋な関数型言語であるスペクトルのもう一方の端に行くと、実際には特定のタスクを達成する方法をコンピューターに伝えていることになります。それはあなたのプログラムがコンピューターが単独で達成する方法を知らない特定のタスクを達成するための一連の命令です。Haskell、Clojureなどの言語はC / C ++ / C#/ Javaより明らかに高いレベルであり、遅延評価、不変データ構造、匿名関数、カリー化、永続データ構造などの機能を提供することを理解しています関数型プログラミングは可能かつ効率的ですが、宣言型言語として分類しません。 私にとって純粋な宣言型言語は、宣言のみで構成される言語であり、そのような言語の例はCSSです(はい、CSSは技術的にはプログラミング言語ではないことを知っています)。CSSには、ページのHTMLおよびJavascriptで使用されるスタイル宣言が含まれています。CSSは宣言以外に何もできません。クラス関数、つまり、パラメーターに基づいて表示するスタイルを決定する関数、CSSスクリプトを実行できない関数などは作成できません。プログラミング言語)。 更新: 私は最近Prologをいじくり回してきましたが、完全に宣言的なプログラミング言語だけではない場合、Prologは完全に宣言的な言語(少なくとも私の意見では)に最も近いプログラミング言語です。Prologでプログラミングを精緻化するには、ファクト(特定の入力に対してtrueを返す述語関数)またはルール(入力に基づいて特定の条件/パターンに対してtrueを返す述語関数)のいずれかを宣言することによって行われます。パターンマッチング手法を使用して定義されます。プロローグで何かを行うには、述語の1つ以上の入力を変数に置き換えてナレッジベースを照会し、プロローグが述語が成功する変数の値を見つけようとします。 私のポイントは、プロローグには命令的な指示はなく、基本的にはコンピューターに知っていることを伝え(宣言)、知識について尋ねる(問い合わせる)ことです。関数型プログラミング言語では、メモリの場所を直接操作したり、段階的に計算を書き込んだりしていなくても、値の取得、関数Xの呼び出し、それに1の追加などの指示を与えています。私は間違っているかもしれませんが、Haskell、ML、Scala、Clojureでのプログラミングがこの意味で宣言的であるとは言いません。上で説明した意味で、適切で、真で、純粋な関数型プログラミング宣言です。

1
なぜ関数型プログラミングより命令型プログラミングが好ましいのですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 6年前に閉鎖されました。 背景:私は、一般的なメンタルモデルが不可欠なプログラミングであるVB.NETショップで働く関数型プログラミングを提唱しています。システムの基盤はWinFormsであるため、命令型プログラミングから完全に逃れることはできないと理解できますが、そのメリットを信じているため、可能な限りFP(主にLinq経由)を使用しようとしています。 FPに対する議論と反論 流fluentなLinqは、このスタイルがシーケンスを別のシーケンスまで処理し、それを繰り返すという点で、命令型の対応するものよりも効率が低いことに気付くかもしれません。一般に、シーケンス上の繰り返しパスを避けるために最適化できる命令型アプローチよりも数パス多くかかります。このため、リードは、明らかに「効率が悪い」機能的アプローチを選択する理由を理解できませんでした。 反論:CPUサイクルの観点からは効率が悪い場合がありますが、各行はシーケンスを通過するときに1つのことだけを行うため、人間が理解しやすく、追跡しやすいと感じました。私にとって、これは、自分のステーションの各人がやるべき仕事が1つしかない組立ラインがあるような気がします。効率の無視できるトレードオフは、懸念がきちんと分離されたコードによって補償されると感じています。 私の店で聞くFPに対する次の議論は、デバッグするのが難しいということです-それは本当です。Linqコードをステップオーバーするのは簡単ではありません。そして、すぐに見つけられない問題をよりよく追跡して分析するために、メソッドチェーンを解く必要がある場合があります。 _Counter-argument:ほとんどの場合、機能スタイルは読み方がより宣言的であり、エラーが機能チェーン内でスローされると、私は通常、問題をすぐに見つけることができるため、これには問題はありません。 私の質問 私は店で機能的なスタイルを宣伝しようとしてきましたが、私は前進しているとは感じません。私は両方のスタイルのプログラミングを行ってきましたが、最近Haskellに手を出したばかりです。長年の命令的な経験にもかかわらず、私はJavaScriptでFPを日常的に使用しているので、それは私に成長しました。命令型のスタイルにこだわった場合に行ったことと比較すると、コアの正当性のメモが鳴ります。私は脳を機能的思考、機能的構成に向けて再訓練しました。 私が理解できないのは、FPのメリットを他の人に納得させるのがどれほど難しいかです。 たとえば、私のショップの開発者はLinqを使用していますが、通常はドメインデータを処理するコンテキストで使用しています。私はより一般的な意味でそれを使用し、シーケンス/リストまたは永続的なデータ構造を扱うときはいつでもそれを好みます。チームメイトにLinqの使用を拡大するよう説得することができませんでした。 私が理解しようとしているのは、開発者がFPを好まない原因です。 FPの経験が豊富であるが、命令型を支持することに決めた人からの回答を期待したい。機能を使用するのではなく、命令にとどまるという決定を下した理由は何ですか? 命令型プログラミングと関数型プログラミングの違いを強調する追加の例を次に示します。 SelectedRowsLinqでグリッドのメソッドを次のように書きました。 Public Property SelectedRows() As DataRow() Implements IDataSourceControl.SelectedRows Get Return Me.ugrBase.Selected.Rows. OfType(Of Infragistics.Win.UltraWinGrid.UltraGridRow)(). Select(Function(ugr) ugr.ListObject). OfType(Of DataRowView)(). Select(Function(drv) drv.Row). ToArray End Get ただし、このスタイルのコードは一部の開発者を不快にさせるため、当社のリードはそれをより馴染みのあるものに書き換えました。 Public Property SelectedRows() As DataRow() Implements IDataSourceControl.SelectedRows Get Dim plstRows As …

5
この問題の純粋に機能的な解決策は、命令と同じくらいクリーンであることができますか?
私はPythonで次のような練習をしています。 多項式は、指数によって指数が決定されるような係数のタプルとして与えられます。例:(9,7,5)は、9 + 7 * x + 5 * x ^ 2を意味します 与えられたxの値を計算する関数を書く 最近関数型プログラミングに夢中になっているので、私は書きました def evaluate1(poly, x): coeff = 0 power = 1 return reduce(lambda accu,pair : accu + pair[coeff] * x**pair[power], map(lambda x,y:(x,y), poly, range(len(poly))), 0) 私はそれを読めないと思うので、私は書きました def evaluate2(poly, x): power = 0 result = 1 return reduce(lambda accu,coeff …

2
関数型プログラミング言語は副作用を許可しませんか?
ウィキペディアによると、宣言型である関数型プログラミング言語は、副作用を許可していません。一般に宣言型プログラミングでは、副作用を最小限に抑えたり、排除したりします。 また、ウィキペディアによると、副作用は状態変化に関連しています。したがって、関数型プログラミング言語は、その意味では、状態を保存しないため、実際には副作用を排除します。 しかし、それに加えて、副作用には別の定義があります。副作用 値を返す以外に、呼び出し側の関数または外界との観測可能な相互作用があります。たとえば、特定の関数は、グローバル変数または静的変数の変更、その引数の1つの変更、例外の発生、ディスプレイまたはファイルへのデータの書き込み、データの読み取り、または他の副作用のある関数の呼び出しを行う場合があります。 その意味で、関数型プログラミング言語は実際には副作用を許容します。外部の世界に影響を及ぼし、他の関数を呼び出し、例外を発生させ、ファイルに書き込むなどの無数の例があるからです。 それで、最後に、関数型プログラミング言語は副作用を許可するかどうか? または、何が「副作用」とみなされるか理解していないため、命令型言語では許可され、宣言型言語では許可されません。上記と私が得た結果によると、副作用を排除する言語はないため、副作用について何か見落としているか、ウィキペディアの定義が誤っています。

3
関数型プログラミングで代入演算子またはループの使用が推奨されないのはなぜですか?
私の関数が2つの要件を満たしている場合、Sum リスト内の項目の合計を返す関数は、特定の条件に対して項目がtrueと評価され、純粋な関数と呼ばれる資格があると思いますか? 1)特定のi / pのセットに対して、関数が呼び出された時間に関係なく、同じo / pが返されます 2)副作用はありません public int Sum(Func<int,bool> predicate, IEnumerable<int> numbers){ int result = 0; foreach(var item in numbers) if(predicate(item)) result += item; return result; } 例: Sum(x=>x%2==0, new List<int> {1,2,3,4,5...100}); 私がこの質問をしている理由は、必須のプログラミングスタイルであるため、代入演算子とループを回避するようアドバイスしている人がほとんどいるためです。では、関数プログラミングのコンテキストでループと代入演算子を使用する上記の例で何が問題になるのでしょうか?

5
成功するまで繰り返し、失敗を処理するループを構築する方法
私は独学のプログラマーです。私は約1.5年前にプログラミングを始めました。今、私は学校でプログラミングクラスを始めました。プログラミングクラスは1/2年間ありましたが、今はもう半分あります。 クラスでは、C ++でプログラミングする方法を学びます(これは、始める前に、私がすでにかなりよく使用することを知っていた言語です)。 このクラスでは何の問題もありませんでしたが、明確な解決策を見つけることができなかった問題が繰り返し発生しています。 問題は次のようになります(疑似コード): do something if something failed: handle the error try something (line 1) again else: we are done! これはC ++の例です このコードはユーザーに数値の入力を求め、入力が有効になるまで入力を続けます。cin.fail()入力が無効かどうかを確認するために使用します。ときcin.fail()であるtrue私が呼び出す必要がありますcin.clear()し、cin.ignore()ストリームからの入力を取得し続けることができるように。 このコードはをチェックしないことを知っていますEOF。私たちが書いたプログラムは、そうすることを期待されていません。 これが私が学校での課題の1つでコードを書いた方法です。 for (;;) { cout << ": "; cin >> input; if (cin.fail()) { cin.clear(); cin.ignore(512, '\n'); continue; } break; } 私の先生は、私はこれを使うべきではないbreakとcontinue言っていました。彼は代わりにレギュラーwhileかdo ... whileループを使うべきだと提案しました。 …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.