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

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

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

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

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

30 ответов

75 просмотров
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 Автор вопроса

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

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

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта