Структуры управления выходят за рамки стандартных условных выражений и циклов?

Языки структурированного программирования обычно имеют несколько управляющих структур, таких как while, if, for, do, switch, break и continue, которые используются для выражения высокоуровневых структур в исходном коде.

Тем не менее, за эти годы было предложено много других управляющих структур, не попавших в современные языки программирования. Например, в статье Кнута " Структурированное программирование с переходом к операторам , стр. 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;

Это кажется полезной структурой, но я не видел ни одного языка, который бы на самом деле реализовывал ее как особый случай стандартной обработки исключений.

Точно так же Эдсгер Дейкстра часто использовал управляющую структуру, в которой один из множества фрагментов кода выполняется недетерминированным образом на основе набора условий, которые могут быть истинными. Это вы можете увидеть на странице 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.

И нет, «функциональное программирование» на самом деле не является структурой управления.

7 голосов | спросил templatetypedef 31 J000000Sunday11 2011, 07:04:44

4 ответа


0
  • Поскольку Haskell ленивый , каждый вызов функции по сути является структурой управления.
  • сопоставление с образцом в языках, производных от ML, объединяет ветвление, связывание переменных и деструктурирование объектов в единая структура управления.
  • условия Common Lisp похожи на исключения это можно перезапустить.
  • Схема и другие языки поддерживают продолжения , которые позволяют приостановить и возобновить или перезапустить программу в любой момент. пункт.
ответил munificent 2 AM00000050000005831 2011, 05:16:58
0

Возможно, не "радикально отличающиеся", а "асинхронные" структуры управления являются довольно новыми.

Асинхронная синхронизация позволяет неблокирующему коду выполняться параллельно с возвратом управления в основной поток программы. Хотя этого можно достичь с помощью вложенных обратных вызовов, выполнение чего-либо нетривиального в этом случае очень быстро приводит к ошибочному коду.

Например, в следующих версиях 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);
ответил munificent 2 AM00000050000005831 2011, 05:16:58
0

C # /Python итераторы /генераторы

def integers():
    i = 0
    while True:
        yield i
        i += 1
ответил Mehrdad 31 J000000Sunday11 2011, 07:39:56
0

(я не знаю много о предмете, поэтому я отметил это вики)

Сопоставление шаблонов в 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)
ответил Mehrdad 31 J000000Sunday11 2011, 07:39:56

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132