185 похожих чатов

Вопрос по GOTO: это известно, что есть теоремы о полноте

структурного программирования по отношению к GOTO (прыжки только внутри функции).

a) Кто-нибудь делал ли преобразование лапши из GOTO в структурное программирование автоматически?

б) Не можете ли напомнить литературу по этим теоремам? У меня была одна статья, я её потерял.

30 ответов

34 просмотра
Konstantin-Romanov Автор вопроса

Соответственно, правильно ли я понимаю, что есть оптимальный алгоритм?

Konstantin Romanov
Соответственно, правильно ли я понимаю, что есть о...

Нет. Есть алгоритм, которым доказывали возможность такого преобразования, но он генерит очень неэффективный код. Там по сути превращают код в стейтмашину, где каждый стейт — это кусок кода, начинающийся с определённой метки, а находится всё это в большом свиче в цикле. Тогда goto заменяется на изменение идентификатора стейта на нужный, и прыжок в начало цикла. В эмскриптере это улучшали эвристиками, алгоритм назвали relooper, он есть в пейпере по эмскриптену. В ллвм в бэкенде васма используется чуть улучшенный алгоритм, stackifier. Он вообще для reducible графа потока исполнения генерит код без диспатча свичами, но тоже полностью без них не справляется

Konstantin-Romanov Автор вопроса

Странно. Мне казалось, что эффективность кода как раз должна быть абсолютно одинакова, что в случае циклов, что в случае goto. В этом же теорема об эквивалентности и заключается.

Konstantin Romanov
Странно. Мне казалось, что эффективность кода как ...

Совсем не в этом же. Она про то, что существует структурная программа, которая вычисляет то же самое. Про эффективность ни слова

Что-то мне вспоминается, что лапша goto иногда приводит к несводимым циклам, которые стандартными средствами языка в виде циклов, if-else и break-continue никак не получить. Точно ли задача преобразования goto в структурное программирование всегда решаема?

Konstantin-Romanov Автор вопроса
Andrey
Совсем не в этом же. Она про то, что существует ст...

Я просто даже не понимаю, где там потерять эффективность. У вас есть ссылки на теорему об эквивалентности? Кроме того, у wasm нет break/continue/return. А они вроде бы как очень важны.

Viktor Shamparov
Что-то мне вспоминается, что лапша goto иногда при...

Да, причём тривиально: while (!exit) {switch(state) { … }}

suhr
Да, причём тривиально: while (!exit) {switch(state...

А, видимо там реально много дублирования кода.

Konstantin Romanov
Я просто даже не понимаю, где там потерять эффекти...

Вместо простого прыжка сделать запись в переменную, прыжок, чтение из переменной, проверку значения, и ещё прыжок — это бесплатное изменение?

Konstantin-Romanov Автор вопроса
Andrey
Вместо простого прыжка сделать запись в переменную...

Ааа, спасибо. Ну для каких-то ситуаций бесплатное.

Наивная реализация ни для каких не бесплатная

Konstantin-Romanov Автор вопроса
Andrey
Наивная реализация ни для каких не бесплатная

Ну вот интересно, что же именно там небесплатно для нас, какие именно вещи небесплатны. Вот про перевычисление переменной, например, мне было совсем не очевидно.

Andrey
Два прыжка вместо одного хотя бы

Плюс ещё зависимость по данным между итерациями цикла, так как там постоянно read+write в одну переменную.

suhr
Оптимизации: существуют.

Зачем-то relooper, а затем и stackifier придумали же. У них вполне заметный эффект на производительность

Konstantin Romanov
Странно. Мне казалось, что эффективность кода как ...

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

Alexander Chichigin
Никакой теоремы об эквивалентности я лично не виде...

Экспоненциальное — это если именно эквивалентный код с точки зрения выполнения прыжков хочется получить

Konstantin-Romanov Автор вопроса
Alexander Chichigin
Никакой теоремы об эквивалентности я лично не виде...

Ну из совершенно простого соображения: пусть каждая строчка программы чего-то пишет на экран, получается, что если мы хотим заменить goto на структурное программирование с теми же вычислительными возможностями, мы можем раздувать код, несколько его замедлить, но и всё.

Konstantin Romanov
Ну из совершенно простого соображения: пусть кажда...

Как бы да, если не смотреть насколько раздувать и замедлять, то разницы нет. 🤷‍♀️

Konstantin-Romanov Автор вопроса
Alexander Chichigin
Как бы да, если не смотреть насколько раздувать и ...

И тут уже, замечу, зависит от ситуации: для нас раздувание недопустимо, а замедление без изменения сложности, вполне.

Konstantin-Romanov Автор вопроса
Alexander Chichigin
Никакой теоремы об эквивалентности я лично не виде...

"Имя, сестра, имя!" А вы не можете дать хотя бы на это ссылку? Кто писал, когда?

Konstantin-Romanov Автор вопроса
Alexander Chichigin
https://en.wikipedia.org/wiki/Structured_program_t...

Блин,а это не растет из древнего пранка от Вирта, который вольно интерпретировал слова Дейкстры и кликбейтнул сообщество заголовком "GoTo больше не нужен"?😅😅

Konstantin-Romanov Автор вопроса

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

Обсуждают сегодня

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
Всем доброго дня! Подскажите может кто использовал связку Pagebuilder + Clientsetting. Сами параметры с типом pagebuilder в модуле Clientsetting работают нормально, можно такж...
Александр Добриков
12
А почему в си некоторые вещи работают с двойными кавычками некоторые с одинарными? Нельзя было все сделать с одними или чтоб работало с разными? например чтоб выводить строки ...
.
15
Всем привет! Нужен совет от опытных. Переношу свой проект с Делфи 10.2 Токио на Лазарус 3.2 установленный через инсталлятор fpcupdeluxe-x86_64-win64. При импортировании проект...
Дмитрий Завгородний
7
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Всем привет! procedure TForm1.FormCreate(Sender: TObject); type TStartEnd = record S: Byte; E: Byte; end; var a, b: TStartEnd; begin {1} a.S := 1; {2} a.E := 2; ...
Руслан Михайлович
10
Всем привет!) я тут новенький и пытаюсь освоить evolution методом тыка. У меня при переходе между папками файлов выскакивают вот такие уведомления Можете подсказать как их от...
Диман Samoed
10
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Какого хера? /Sources/App/Modules/User/Models/UserLinkApple.swift:21:20: warning: stored property '_id' of 'Sendable'-conforming class 'UserLinkApple' is mutable @ID(...
Alexander Sherbakov
14
Карта сайта