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

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

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

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

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

30 ответов

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта