Изящный и понятный синтаксис псевдокода
От: Shizuka-kun Украина  
Дата: 02.10.08 14:18
Оценка: 1 (1)
Привет всем.

Недавно начал употреблять псевдокод при описании алгоритмов, которые собираюсь закодить, а затем построчно заменять инструкции на псевдокоде на инструкции на языке программирования (как у МакКоннелла, если не ошибаюсь).

Если кто чего видел, посоветуйте плз нормальный (не перегруженный, понятный и легко модифицируемый) синтаксис псевдокода, возможно на базе какого-нибудь интерпретируемого языка.

Интересно также услышать ваше мнение по поводу использования псевдокода (желательно, с примерами).
Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination, but because their imagination reveals worlds that others cannot see.
псевдокод программирование
Re: Изящный и понятный синтаксис псевдокода
От: jazzer Россия Skype: enerjazzer
Дата: 02.10.08 14:47
Оценка: +2
Здравствуйте, Shizuka-kun, Вы писали:

SK>Привет всем.


SK>Недавно начал употреблять псевдокод при описании алгоритмов, которые собираюсь закодить, а затем построчно заменять инструкции на псевдокоде на инструкции на языке программирования (как у МакКоннелла, если не ошибаюсь).


SK>Если кто чего видел, посоветуйте плз нормальный (не перегруженный, понятный и легко модифицируемый) синтаксис псевдокода, возможно на базе какого-нибудь интерпретируемого языка.


SK>Интересно также услышать ваше мнение по поводу использования псевдокода (желательно, с примерами).


Python?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Изящный и понятный синтаксис псевдокода
От: minorlogic Украина  
Дата: 02.10.08 15:44
Оценка: 1 (1) +2
Попробуй самый просой вариант. Пиши псевдокод на том языке который будешь использовать. Просто не вдавайся в дедали реализации.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[2]: Изящный и понятный синтаксис псевдокода
От: Shizuka-kun Украина  
Дата: 03.10.08 06:17
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, Shizuka-kun, Вы писали:


SK>>Привет всем.


SK>>Недавно начал употреблять псевдокод при описании алгоритмов, которые собираюсь закодить, а затем построчно заменять инструкции на псевдокоде на инструкции на языке программирования (как у МакКоннелла, если не ошибаюсь).


SK>>Если кто чего видел, посоветуйте плз нормальный (не перегруженный, понятный и легко модифицируемый) синтаксис псевдокода, возможно на базе какого-нибудь интерпретируемого языка.


SK>>Интересно также услышать ваше мнение по поводу использования псевдокода (желательно, с примерами).


J>Python?


я здесь уже читал об использовании Питона в качестве псевдокода. Сложность в том, что я сейчас пользуюсь
псевдокодом вида
1.1 список = ВыбратьЭлементыИзБД()
1.2 пусто(список)?
  1.2.1 вернуть управление
  1.2.2 перейти к 1.3


Как только чтото меняется, номера пунктов естественно летят к черту и местами их приходится переписывать.
С др. стороны, когда алгоритм представлен в виде такой "текстовой блок-схемы", проще (возможно, лично мне) видеть
и убирать лишние ветви, представлять себе дерево переходов по условиям и т.п.

Что вы думаете по этому поводу? Я загоняюсь? Может, надо тренировать умение мысленно представлять себе ход алгоритма и выбрать чтото а-ля Питон? Или я прав, но мне нужен другой синтаксис?
Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination, but because their imagination reveals worlds that others cannot see.
Re[3]: Изящный и понятный синтаксис псевдокода
От: dmz Россия  
Дата: 03.10.08 06:43
Оценка: +1
SK>я здесь уже читал об использовании Питона в качестве псевдокода. Сложность в том, что я сейчас пользуюсь
SK>псевдокодом вида
SK>
SK>1.1 список = ВыбратьЭлементыИзБД()
SK>1.2 пусто(список)?
SK>  1.2.1 вернуть управление
SK>  1.2.2 перейти к 1.3
SK>


В чем вообще смыл этого по сравнению с записью на том языке, на котором пишете?

aList = selectItemFromDB()
if empty(aList):
   return


List aList = selectItemFromDB();
if( empty(aList) ) {
    return;
}



SK>Что вы думаете по этому поводу? Я загоняюсь? Может, надо тренировать умение мысленно представлять себе ход алгоритма и выбрать чтото а-ля Питон? Или я прав, SK>но мне нужен другой синтаксис?


Для простых случаев — писать на том языке который знаете, сверху вниз. Для сложных — использовать DSL. Псевдокод — лишняя работа. Вы можете четко сказать, зачем он нужен?
Re[4]: Изящный и понятный синтаксис псевдокода
От: LaptevVV Россия  
Дата: 03.10.08 09:53
Оценка:
Здравствуйте, dmz, Вы писали:

dmz>Для простых случаев — писать на том языке который знаете, сверху вниз. Для сложных — использовать DSL. Псевдокод — лишняя работа. Вы можете четко сказать, зачем он нужен?

Псевдокод — это и есть DSL
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[5]: Изящный и понятный синтаксис псевдокода
От: dmz Россия  
Дата: 03.10.08 09:57
Оценка: +1
dmz>>Для простых случаев — писать на том языке который знаете, сверху вниз. Для сложных — использовать DSL. Псевдокод — лишняя работа. Вы можете четко сказать, зачем он нужен?
LVV>Псевдокод — это и есть DSL

Если псевдокод разбирается, исполняется и что-то делает — то да. А если это просто строчки на псевдопонятном псевдоязыке — то нет.
Я к тому, что при аккуратном программировании вполне можно выразить мысль на языке, на котором программируем, скрыв несущественные детали
(и реализовав из позднее).
Re[4]: Изящный и понятный синтаксис псевдокода
От: Shizuka-kun Украина  
Дата: 03.10.08 10:18
Оценка:
Здравствуйте, dmz, Вы писали:

dmz>Для простых случаев — писать на том языке который знаете, сверху вниз. Для сложных — использовать DSL. Псевдокод — лишняя работа. Вы можете четко сказать, зачем он нужен?


Он нужен для создания четкого и краткого представления алгоритма. Модифицировать и улучшать такое представление легче, поскольку оно не засорено конструкциями конкретного языка, т.к. абстрагировано от языка.
Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination, but because their imagination reveals worlds that others cannot see.
Re[5]: Изящный и понятный синтаксис псевдокода
От: Курилка Россия http://kirya.narod.ru/
Дата: 03.10.08 10:21
Оценка:
Здравствуйте, Shizuka-kun, Вы писали:

SK>Здравствуйте, dmz, Вы писали:


dmz>>Для простых случаев — писать на том языке который знаете, сверху вниз. Для сложных — использовать DSL. Псевдокод — лишняя работа. Вы можете четко сказать, зачем он нужен?


SK>Он нужен для создания четкого и краткого представления алгоритма. Модифицировать и улучшать такое представление легче, поскольку оно не засорено конструкциями конкретного языка, т.к. абстрагировано от языка.


Если так проблемно представлять алгоритм на языке, то может проблема в языке, или в понимании этого языка?
Или лезть как "ёжик на кактус" предпочтительней?
Re[3]: Изящный и понятный синтаксис псевдокода
От: Sinclair Россия https://github.com/evilguest/
Дата: 03.10.08 10:23
Оценка:
Здравствуйте, Shizuka-kun, Вы писали:

SK>я здесь уже читал об использовании Питона в качестве псевдокода. Сложность в том, что я сейчас пользуюсь

SK>псевдокодом вида
SK>
SK>1.1 список = ВыбратьЭлементыИзБД()
SK>1.2 пусто(список)?
SK>  1.2.1 вернуть управление
SK>  1.2.2 перейти к 1.3
SK>


SK>Как только чтото меняется, номера пунктов естественно летят к черту и местами их приходится переписывать.

Формат явно намекает на то, что описание алгоритма пишется в текстовом процессоре.
Если это Microsoft Word, то используй Insert Reference to Numbered Item, и всё будет обновляться само (по F9).
Если это не Microsoft Word, то я крайне рекомендую
1. обходиться без GOTO. Лучше вводите циклы и ветвление
2. если не получается, то используйте именованные метки и только там, где нужно
3. попробуйте рисовать блочные диаграммы — для таких алгоритмов они намного нагляднее, чем списки с goto.
SK>С др. стороны, когда алгоритм представлен в виде такой "текстовой блок-схемы", проще (возможно, лично мне) видеть
SK>и убирать лишние ветви, представлять себе дерево переходов по условиям и т.п.
По сравнению с чем легче?
Не очень понятно, почему это читается лучше, чем
var list = GetFromDatabase(...) // 1.1

if (list == null) // 1.2
  return; // 1.2.1
// 1.2.2 не нужен, т.к. мы неявно провалимся в 1.3
...  // 1.3
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: Изящный и понятный синтаксис псевдокода
От: Shizuka-kun Украина  
Дата: 03.10.08 10:32
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Если так проблемно представлять алгоритм на языке, то может проблема в языке, или в понимании этого языка?

К>Или лезть как "ёжик на кактус" предпочтительней?

Ммм, да нет, просто если алгоритм достаточно длинный, например у меня метод работы с БД, там много взаимосвязанных шагов, если писать код сразу, можно некоторое потом потерять или впоследствии перемещать большие блоки кода. Я не противник идеи писать на упрощенном варианте того языка, который использую. Просто не понимаю, почему тут так много
противников работы с псевдокодом. Или вы (вы лично и dmz) приравниваете к проблемам с памятью или логическим мышлением?
Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination, but because their imagination reveals worlds that others cannot see.
Re[5]: Изящный и понятный синтаксис псевдокода
От: dmz Россия  
Дата: 03.10.08 10:38
Оценка: +1
dmz>>Для простых случаев — писать на том языке который знаете, сверху вниз. Для сложных — использовать DSL. Псевдокод — лишняя работа. Вы можете четко сказать, зачем он нужен?

SK>Он нужен для создания четкого и краткого представления алгоритма. Модифицировать и улучшать такое представление легче, поскольку оно не засорено конструкциями конкретного языка, т.к. абстрагировано от языка.


Если смысл этого в том, что бы получать тот же самый алгоритм на разных языках (в чем сомневаюсь) — то нужен не псевдокод, а DSL + кодогенератор, который из описания алгоритма на мета-языке сгенерирует реализацию на разных языках. Как бы — don't repeat yourself, так что ли принцип звучит.

Если нет, то если алгоритм на конкретном языке выражен непонятно — то надо переписать, что бы было понятно. Если на языке невозможно писать понятно — то надо сменить язык. Как-то так.

В общем, если со стороны понятности, то я бы предложил описание простым человеческим языком идеи + реализация в стиле сверху вниз на целевом языке. В особо клинических случаях можно применить прототип на скриптовом языке + тестовые данные — что бы можно было запустить и понять как он работает и что делает из входных данных.
Re[7]: Изящный и понятный синтаксис псевдокода
От: Курилка Россия http://kirya.narod.ru/
Дата: 03.10.08 10:41
Оценка: 1 (1) +2
Здравствуйте, Shizuka-kun, Вы писали:

SK>Здравствуйте, Курилка, Вы писали:


К>>Если так проблемно представлять алгоритм на языке, то может проблема в языке, или в понимании этого языка?

К>>Или лезть как "ёжик на кактус" предпочтительней?

SK>Ммм, да нет, просто если алгоритм достаточно длинный, например у меня метод работы с БД, там много взаимосвязанных шагов, если писать код сразу, можно некоторое потом потерять или впоследствии перемещать большие блоки кода. Я не противник идеи писать на упрощенном варианте того языка, который использую. Просто не понимаю, почему тут так много

SK>противников работы с псевдокодом. Или вы (вы лично и dmz) приравниваете к проблемам с памятью или логическим мышлением?

Ну не знай, может конечно и часть психологических особенностей, но всёж по-моему твои слова скорей говорят о том, что возникают проблемы с хорошей декомпозицией алгоритма, в результате чего рождаются "многостраничные" функции, ну и если правила оформления кода не используются, то естественно выйдет, что псевдокод легче.
Re[7]: Изящный и понятный синтаксис псевдокода
От: Sinclair Россия https://github.com/evilguest/
Дата: 03.10.08 10:42
Оценка: +4
Здравствуйте, Shizuka-kun, Вы писали:


SK>Ммм, да нет, просто если алгоритм достаточно длинный, например у меня метод работы с БД, там много взаимосвязанных шагов, если писать код сразу, можно некоторое потом потерять или впоследствии перемещать большие блоки кода.

Непонятно, откуда возьмутся "большие блоки кода".
SK> Я не противник идеи писать на упрощенном варианте того языка, который использую.
SK>Просто не понимаю, почему тут так много противников работы с псевдокодом.
Ну вот я как бы не против псевдокода: в том смысле, что мне регулярно приходится его применять для документов. В них сишарп не напишешь.
А вот когда пишешь для себя, непонятно почему код получается менее понятным, чем псевдокод.
Ну то есть я понимаю, что есть языки, в которых просто копец как не продохнуть от лишних подробностей. А иначе компилятор не заработает.
Тогда надо просто пойти одним из двух способов:
а) отказаться от использования компилятора, и писать на языке, похожем на целевой. Например, представить, что в С++ есть псевдотип var с семантикой как в шарпе, что в шарпе можно вместо параметров вызова написать ..., подразумевая что они пока несущественны, и т.д.
б) всё же выбрать такой язык, на котором программы можно читать без перевода.

Второе, конечно же, лучше. Например потому, что для настоящего кода есть средства рефакторинга и компилятор проводит контроль корректности.
Или потому, что нет риска рассинхронизовать описание и реализацию. В целом, если псевдокод слишком далек от настоящего кода, значит язык реализации выбран неудачно. Ну то есть вот пример, который был приведен, один-в-один переписывается на бейсик. Если реальный код непонятен потому, что он пишется на эрланге, то имеем одно из двух:
а) эрланг — неудачный язык для написания требуемой программы
б) программист думает на бейсике, а пишет на эрланге, вместо того, чтобы думать сразу на эрланге.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[7]: Изящный и понятный синтаксис псевдокода
От: dmz Россия  
Дата: 03.10.08 12:09
Оценка: +3
SK>Ммм, да нет, просто если алгоритм достаточно длинный, например у меня метод работы с БД, там много взаимосвязанных шагов, если писать код сразу, можно некоторое потом потерять или впоследствии перемещать большие блоки кода. Я не противник идеи писать на упрощенном варианте того языка, который использую. Просто не понимаю, почему тут так много
SK>противников работы с псевдокодом.

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


data1  = stepOne()
data2 =  stepTwo(data1)

# ...


и т.д. Если кусок кода делает что-то осмысленное — его можно инкапсулировать в методе, а сам алгоритм будет совокупностью таких шагов. Или наоборот, разбить алгоритм на шаги, шаги назвать, выразить этот алгоритм в виде шагов, шаги (потом) реализовать. И где тут перемещение больших частей кода?

Т.е. при таком подходе у вас алгоритм изложен в одном месте — и модификации тоже будут в одном месте; причем если используется контроль версий — то можно всю предысторию увидеть.

В случае псевдокода — надо вносить изменения в двух местах — возникают проблемы синхронизации, да и как показывает практика — обновлять документы и всяческие "псевдокоды" в перспективе просто забивают.
Re[4]: Изящный и понятный синтаксис псевдокода
От: Shizuka-kun Украина  
Дата: 03.10.08 13:32
Оценка:
Исходя из всего вышесказанного, делаю следующие выводы:

1) Когда возникает необходимость менять формат изложения алгоритма с синтаксиса текущего языка на что-либо другое — это случай DSL и использования кодогенерации и только их, ибо конструкции текущего языка с некоторыми упрощениями и так
в состоянии с достаточной полнотой описать происходящее.
2) Похоже, я написал этот псевдокод "под себя", т.к. лично для меня конструкции языка разработки выглядят менее выразительно.
3) Я завис между 2-мя крайними случаями (DSL и псевдокод на языке разработки). Надо выбрать то, что обосновано
конкретной ситуацией.

Так?
Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination, but because their imagination reveals worlds that others cannot see.
Re[6]: Изящный и понятный синтаксис псевдокода
От: LaptevVV Россия  
Дата: 03.10.08 13:55
Оценка:
Здравствуйте, dmz, Вы писали:

LVV>>Псевдокод — это и есть DSL

dmz>Если псевдокод разбирается, исполняется и что-то делает — то да. А если это просто строчки на псевдопонятном псевдоязыке — то нет.
Если такой псевдокод придумать для задачи, то и реализовать будет понятно как.
У нас был такой вариант. Написали сначала PL|1+Lisp. Потом придумали язык программирования и реализовали интерпретатор на этом конгломерате. А потом уж на новом языке написали систему.
Язык новый был, естественно, заточен под задачу — как раз псевдокод и DSL одновременно.
dmz>Я к тому, что при аккуратном программировании вполне можно выразить мысль на языке, на котором программируем, скрыв несущественные детали
Если язык позволяет создавать абстракции...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[5]: Изящный и понятный синтаксис псевдокода
От: dmz Россия  
Дата: 03.10.08 13:59
Оценка:
SK>1) Когда возникает необходимость менять формат изложения алгоритма с синтаксиса текущего языка на что-либо другое — это случай DSL и использования кодогенерации и только их, ибо конструкции текущего языка с некоторыми упрощениями и так
SK>в состоянии с достаточной полнотой описать происходящее.
SK>2) Похоже, я написал этот псевдокод "под себя", т.к. лично для меня конструкции языка разработки выглядят менее выразительно.
SK>3) Я завис между 2-мя крайними случаями (DSL и псевдокод на языке разработки). Надо выбрать то, что обосновано
SK>конкретной ситуацией.

Дело в том, что вы задали вопрос, не сформулировав проблему и целей. Какую задачу вы решаете? Чего хотите добиться?

Относительно пункта (2) — озвучьте уже язык, который выглядит "недостаточно выразительно", желательно с примерами, когда
несуществующий язык выглядит понятнее применяющегося.

Т.е. в моей практике похожие вопросы возникали, когда шло исследование, и надо было как-то фиксировать промежуточные результаты, и в общем, целевой
язык слабо подходил для предметной области.
Re[7]: Изящный и понятный синтаксис псевдокода
От: jazzer Россия Skype: enerjazzer
Дата: 05.10.08 00:40
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, dmz, Вы писали:


LVV>>>Псевдокод — это и есть DSL

dmz>>Если псевдокод разбирается, исполняется и что-то делает — то да. А если это просто строчки на псевдопонятном псевдоязыке — то нет.
LVV>Если такой псевдокод придумать для задачи, то и реализовать будет понятно как.
LVV>У нас был такой вариант. Написали сначала PL|1+Lisp. Потом придумали язык программирования и реализовали интерпретатор на этом конгломерате. А потом уж на новом языке написали систему.
LVV>Язык новый был, естественно, заточен под задачу — как раз псевдокод и DSL одновременно.

Не понял, а почему это псевдокод? Вроде, DSL в чистом виде
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Изящный и понятный синтаксис псевдокода
От: FDSC Россия consp11.github.io блог
Дата: 06.10.08 15:46
Оценка:
Здравствуйте, Shizuka-kun, Вы писали:

SK>Недавно начал употреблять псевдокод при описании алгоритмов, которые собираюсь закодить, а затем построчно заменять инструкции на псевдокоде на инструкции на языке программирования (как у МакКоннелла, если не ошибаюсь).


Построчно — не стоит.

SK>Если кто чего видел, посоветуйте плз нормальный (не перегруженный, понятный и легко модифицируемый) синтаксис псевдокода, возможно на базе какого-нибудь интерпретируемого языка.


У псевдокода нет синтаксиса

SK>Интересно также услышать ваше мнение по поводу использования псевдокода (желательно, с примерами).


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

Вот пример псевдокода, списанного с реального проекта (в отдельном файле был написан, по нему сразу писался код)

1. Считать параметры
2. Создать директорию
    (директория: создана, не создана)
    Если директория создана, запросить у пользователя разрешение удалить директорию
      если разрешение получено
        удалить директорию вместе со всеми лежащими там файлами
      иначе
        закончить работу программы
    Если директорию создать не удалось - выйти из программы
    
  Проверить, что свободного места на диске достаточно
  Если нет - завершить работу    
3. Создать иерархию (её нет, так как уже всё удаляли)
  Если нужно создавать директории
    создать директории и заполнить их файлами
  Если нужно создавать много файлов
    создать много файлов
  Если нужно создать один файл
    создать один файл



Процедура создания одного файла
  Проверить, что файла не существует. Если существует, закончить с ошибкой.
  Открыть файл для записи. Установить указатель на значение (длинна файла - 1).
  Записать один байт (если под Linux, лучше записывать все байты
    [оптимизация работы файловой системы приведёт к некорректным результатам теста]).
  Закрыть файл.

Процедура создания строк, начиная с 1 и далее по порядку
  В цикле создать список строк

Процедура создания директории
  Создать директорию, если директория уже создана - выйти с ошибкой

Процедура заполнения директории
  Заполнить директорию, создавая множество файлов

Процедура выполнения операций над файловыми объектами, согласно списку
  Выполнить функцию run соотв. объекта для каждой строки из списка

Создать множество файлов
  Подготовить список файлов и функцию создания файла
Аналогично с созданием и заполнением директорий
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.