Почему в учебниках используются псевдокоды, а не реальные языки?

В колледжах и в учебниках алгоритмов для преподавателя и автора довольно часто объясняется поток управления в псевдокоде. С появлением более выразительных языков, таких как Python и Haskell среди других, разумно ли, что колледжи переключаются на объяснение алгоритмов через один из этих языков?

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

4 голоса | спросил Asterisk 21 FebruaryEurope/MoscowbSun, 21 Feb 2016 17:18:38 +0300000000pmSun, 21 Feb 2016 17:18:38 +030016 2016, 17:18:38

2 ответа


13

Нет. Пункт псевдокода заключается в том, что его не нужно компилировать. Я могу быстро замаскировать ненужные детали. Напротив, даже языки, которые выглядят как псевдокод с первого взгляда, могут иметь очень неинтуитивные детали, которые просто отвлекали бы от алгоритма. Возьмем, к примеру, Quicksort в Haskell:

 qs :: Ord a => [a] -> [a]
qs [] = []
qs (pivot:xs) = (qs smaller) ++ pivot:(qs larger)
  where smaller = [x | x <- xs, x <= pivot]
        larger  = [x | x <- xs, x > pivot]

или то же самое в Python:

 def qs(array):
  if not array:
    return []
  pivot = array[0]
  xs = array[1:]
  smaller = [x for x in xs if x <= pivot]
  larger  = [x for x in xs if x > pivot]
  return qs(smaller) + [pivot] + qs(larger)

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

algorithm QUICKSORT(array)
  return [] if array is empty
  pivot ← array[0]
  xs ← array[1, ...] -- the rest of the array without the pivot
  smaller ← [x | x ∈ xs, x <= pivot] -- all smaller or equal elements
  larger ← [x | x ∈ xs, x  > pivot] -- all larger elements
  return [QUICKSORT(smaller)..., pivot, QUICKSORT(larger)...]

Заметные отличия:

  • Я могу просто составить синтаксис понимания списка, который выглядит как математика, а не объяснять, почему у Python есть for и if здесь.

  • Мне не нужно объяснять синтаксис языка для конкатенации списков. Почему Python использует дополнение +? Что такое : в Haskell? Я могу просто выбрать синтаксис, который станет более понятным.

  • подпись типа Ord a => [a] -> [a] - это просто деталь реализации. Хотя возможно полезно в этом случае, сигнатуры типов, иногда требуемые Haskell, могут стать абсурдными.

  • Мне не нужно объяснять, почему Python считает пустые коллекции ложными, а что означает array[1:] .

  • Я избегаю умных учеников, указывающих, что я действительно должен использовать yield в примере на Python.

  • Haskell сосет для объяснения изменяемых структур данных, таких как таблицы Hash, деревья RB, ....

  • Вещи начинают очень специфично для языка, когда нам нужны сложные записи, чтобы выразить наши алгоритмы. Например. Объектная система Python имеет несколько сюрпризов, которые просто отвлекают.

Тем не менее, может быть очень полезно использовать один из этих языков в дополнение к псевдокоду, просто тщательно маркируйте то, что есть.

ответил amon 21 FebruaryEurope/MoscowbSun, 21 Feb 2016 17:58:11 +0300000000pmSun, 21 Feb 2016 17:58:11 +030016 2016, 17:58:11
6

Нет.

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

ответил Lightness Races in Orbit 21 FebruaryEurope/MoscowbSun, 21 Feb 2016 17:24:49 +0300000000pmSun, 21 Feb 2016 17:24:49 +030016 2016, 17:24:49

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

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

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