7

構造化プログラミング言語には通常、、、、、、、などのいくつかの制御構造がありwhile、ソースifコードforで高レベルの構造を表現するために使用されます。doswitchbreakcontinue

ただし、何年にもわたって提案されてきた、現代のプログラミング言語に移行していない他の多くの制御構造があります。たとえば、Knuthの論文「GoToステートメントを使用した構造化プログラミング」(275ページ)では、例外処理の簡略版のように見える制御構造を参照しています。

loop until event1 or event2 or ... eventN
   /* ... */
   leave with event1;
   /* ... */
repeat;
then event1 -> /* ... code if event1 occurred ... */
     event2 -> /* ... code if event2 occurred ... */
     /* ... */
     eventN -> /* ... code if eventN occurred ... */
fi;

これは便利な構造のように見えますが、標準の例外処理の特殊なケースとして、実際にそれを実装している言語は見たことがありません。

同様に、Edsger Dijkstraは、多くのコードの1つが、真である可能性のある一連の条件に基づいて非決定的に実行される制御構造を使用することがよくありました。これは、smoothsortに関する彼の論文の10ページにあります。サンプルコードは次のようになります。

do
    /* Either of these may be chosen if x == 5 */
    if x <= 5 then y = 5;
    if x >= 5 then y = 137; 
od;

歴史的に、CはC ++、C#、Javaなどの多くの現代言語に影響を与え、今日使用している多くの制御構造はCが提供する小さなセットに基づいていることを理解しています。しかし、この他のSOの質問からも明らかなように、プログラマーは考えたいと思います。私たちが望んでいるが、多くのプログラミング言語でサポートされていない代替の制御構造について。

私の質問はこれです-私が上で述べたCスタイルの制御構造とは根本的に異なる制御構造をサポートする今日使用されている一般的な言語はありますか? このような制御構造は、標準のC構造を使用して表現できないものである必要はありません。ほとんどすべてをそのようにエンコードできますが、理想的には、特定のプログラミングタスクにアプローチできるものの例を示します。 Cモデルで許可されている方法とは根本的に異なります。

いいえ、「関数型プログラミング」は実際には制御構造ではありません。

4

4 に答える 4

2
  • Haskellは怠惰なので、すべての関数呼び出しは本質的に制御構造です。
  • MLから派生した言語でのパターンマッチングは、分岐、変数バインディング、および非構造化オブジェクトを単一の制御構造にマージします。
  • Common Lispの状態は、再起動可能な例外のようなものです。
  • スキームおよびその他の言語は継続をサポートしており、いつでもプログラムを一時停止、再開、または再開できます。
于 2011-08-02T01:16:58.380 に答える
1

おそらく「根本的に異なる」わけではありませんが、「非同期」の制御構造はかなり新しいものです。

非同期を使用すると、ノンブロッキングコードを並行して実行でき、完了すると制御がメインプログラムフローに戻ります。ネストされたコールバックでも同じことが達成できますが、このように重要なことを行うと、コードが非常に迅速になります。

たとえば、C#/ VBの今後のバージョンでは、Asyncを使用すると、コードを複数のメソッドやラムダ式に分割することなく、非同期APIを呼び出すことができます。つまり、これ以上のコールバックはありません。「await」および「async」キーワードを使用すると、スレッドを消費せずに実行を一時停止し、後で中断したところから再開できる非同期メソッドを作成できます。

// C#
async Task<int> SumPageSizesAsync(IList<Uri> uris)
{
    int total = 0;
    var statusText = new TextBox();

    foreach (var uri in uris)
    {
        statusText.Text = string.Format("Found {0} bytes ...", total);
        var data = await new WebClient().DownloadDataTaskAsync(uri);
        total += data.Length;
    }

    statusText.Text = string.Format("Found {0} bytes total", total);
    return total;
}

( http://blogs.msdn.com/b/visualstudio/archive/2011/04/13/async-ctp-refresh.aspxからピンチ)

Javascriptの場合、次のようなコードを記述できるhttp://tamejs.org/があります。

var res1, res2;
await {
    doOneThing(defer(res1));
    andAnother(defer(res2));
}
thenDoSomethingWith(res1, res2);
于 2011-07-31T03:34:54.507 に答える
1

C#/Pythonイテレータ/ジェネレータ

def integers():
    i = 0
    while True:
        yield i
        i += 1
于 2011-07-31T03:39:56.330 に答える
1

(私は主題についてあまり知らないので、これをwikiにマークしました)

Haskellのパターンマッチング

わかりやすい例:

sign x |  x >  0        =   1
       |  x == 0        =   0
       |  x <  0        =  -1

または、たとえば、数学の方程式とほぼ同じに見えるフィボナッチ:

fib x | x < 2       = 1
      | x >= 2      = fib (x - 1) + fib (x - 2)
于 2011-07-31T03:47:02.943 に答える