Достоинства и недостатки языков программирования

Место для обсуждения любых вопросов, которые интересны программистам и администраторам, преподавателям и студентам, абитуриентам и школьникам ...

Модератор: Vladislav_133

Re: Достоинства и недостатки языков программирования

Сообщение Vladislav_133 02 фев 2009, 21:00

Не совсем согласен. Если взять, например, С, то там break, continue, exit были изначально. Был и оператор goto.
Был также и оператор return. Все это операторы изменяющие ход выполнения программы. Добавим сюда также операторы цикла, условные операторы и вызов функций - они также изменяют ход выполнения программы. Все это разные операторы и говорить, что это все goto - не верно. У каждого своя функция. Ссылаться на то, на языке процессора многие из этих операторов реализуются с помощью команды jmp - также не корректно, поскольку для какого-то другого процессора это может быть и не так. Так что смешивать я бы не стал. Это первый мой тезис.

Второй тезис заключается в том, что если убрать оператор goto, то без него вполне можно обойтись. Примеры имеются. И нет такого примера, который бы нельзя было реализовать без goto (скажем на C).

Третий тезис - использование goto может затруднить анализ программы.

Четвертый тезис. Такой новый язык, как C# по каким-то непонятным причинам содержит оператор goto.

Так что трансформации в новые формы старого goto я не очень вижу.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Достоинства и недостатки языков программирования

Сообщение xdsl 03 фев 2009, 12:39

По первому тезису.
Давайте определимся, что такое goto. Это оператор безусловного перехода из текущей точки программы в другую. В википедии достаточно подробно разобраны его достоинства, недостатки и области применимости: http://ru.wikipedia.org/wiki/Goto. Обращаю внимание на следующую фразу:
Поскольку GOTO — «простейший», «атомарный» оператор перехода, а все остальные являются «составными», производными от него, то применение GOTO допустимо и оправданно, когда другие средства языка не реализуют или недостаточно эффективно реализуют нужную функциональность.
Атомарность goto проявляется еще том, что любой оператор безусловного перехода (break, continue и т.д.) можно заменить на goto. Обратное - неверно. Кроме этого, в спецификации классического паскаля (http://www.oberon2005.ru/doc/doc-iso1990-007185e.pdf) break и continue просто нет, а goto - есть. Поэтому некорректно говорить об одновременном появлении goto и всех его облагороженных замен. Для одних языков это так, для других - нет. Вывод: "атомарность" goto не устраивает многих, в том-числе и разработчиков языков программирования. В результате оператор безусловного перехода делают "составным", превращая в break и др., ограничивая тем самым область его применимости, но улучшая читабельность кода и уменьшая кол-во потенциальных ошибок.

По второму и третьему тезису возражений не имею. Еще лет 40 назад Дейкстра говорил об этом: http://khpi-iip.mipk.kharkiv.edu/library/extent/dijkstra/pp/ewd215.html (кстати, очень познавательный ресурс: http://khpi-iip.mipk.kharkiv.edu/library/extent/dijkstra/index.html)

По четвертому тезису могу только сослаться на спецификацию по C# (http://www.oberon2005.ru/doc/doc-ecma2005-000334e.pdf), где черным по белому написано, что использование goto - ограничено (напр. - раздел 14.5.15.2, 15.9.3). Кроме этого п.15.9, озаглавленный "Jump statement", включает в себя множество операторов, в том числе и goto, что косвенно подтверждает мою позицию по первому тезису.
xdsl
 
Сообщения: 1236
Зарегистрирован: 09 дек 2008, 05:16
Откуда: ВЦ ШГПИ
Полное имя: Слинкин Д.А.

Re: Достоинства и недостатки языков программирования

Сообщение Vladislav_133 04 фев 2009, 17:01

Понятно, на самом деле спора не было. Просто слова "составной" и "производный" абсолютно не точно выражают суть связи между goto и подобными операторами. Ведь здесь связь чисто методологическая. goto является базовым классом, а остальные производные от него. В этом смысле я соглашусь с термином "производный". Но только надо это пояснять. Потому что это начинают трактовать так, что, например, break как то "физически" связан с goto. Ну, то есть в коде реализации break, на самом деле прописан goto. В общем случае это не верно. Я уже об этом писал. Бесполезно для этой цели привлекать и ассемблер. В общем случае не поможет. Поэтому повторюсь, что речь может идти чисто о методологическом рассуждении. С термином же "составной" я абсолютно не согласен, так как в общем случае break никак нельзя рассматривать состоящим из goto ни в каких смыслах.
Я приведу еще один подобный пример. В С имеются две стандартные функции printf и puts. Ясно, что функция printf более общая, чем puts. Методологически можно сказать, что puts является частным случаем printf. Но не более того. Это ведь не означает, что на уровне кода puts обращается к printf (хотя это и возможно). Если же мы будем употреблять термин "производный", то тогда следует пояснить, что имеется в виду.
Так что, я думаю, спор по этим вопросам можно не продолжать.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Пред.

Вернуться в Обмен мнениями

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

cron