OberonCore https://forum.oberoncore.ru/ |
|
расширение компилятора циклом Дейкстры https://forum.oberoncore.ru/viewtopic.php?f=29&t=6884 |
Страница 1 из 1 |
Автор: | arisu [ Суббота, 07 Январь, 2023 19:39 ] |
Заголовок сообщения: | расширение компилятора циклом Дейкстры |
и ещё предлагаю: добавить в компилятор и в репорт языка цикл Дейкстры. только немного расширеный вариант: Код: LOOP <this executes at each iteration> DO IF cond0 THEN … DO IF cond1 THEN … END синтаксис немного уродливый, но я не хочу вводить новые ключевые слова. часть, которая исполняется на каждом шаге — опциональна. или такой вариант синтаксиса: Код: LOOP <this executes at each iteration> | IF cond0 DO … | ELSIF cond1 DO … END почему не классика с WHILE? чтобы было удобно реализовывать штуки типа sequence shift без копипасты: Код: LOOP file.ReadCh(ch) DO IF ~file.eof THEN … END в конце-концов, есть же, кажется, консенсус, что цикл Дейкстры — хорошо. и омики уже вряд ли будут развивать Component Pascal — так почему бы нам не взять этот флаг и не понести дальше? синтаксис кривоватый, но зато в таком виде все старые исходники будут компилироваться как и раньше. почему именно IF там? потому что `DO WHILE …` можно прочитать как «исполняй только эту ветку пока страж цикла истина», а с `IF`, мне кажется, более понятно, что ветка исполнится. сеточку `DO IF` удобно выравнивать, и парзеру легче замечать ошибки, поэтому `DO IF … DO IF…`, а не `DO ELSIF` или подобное. хотя `DO ELSIF` тоже можно, конечно. но мне так не очень нравится. прошу уважаемых коллег высказываться. если у вас есть идеи по более красивому синтаксису — тоже, пожалуйста, не стесняйтесь. я, конечно, буду защищать свой вариант, но меня возможно переубедить хорошими аргументами. ;-) реализацию финального варианта в компиляторе я беру на себя. я понимаю и опасность ломания компилятора, и потерю совместимости с другими реализациями — но это конкретное изменение того стоит, мне кажется. если мы утрясём синтаксис и реализуем у себя — остальные подтянутся; изменение несложное, а пользу явную вижу я. |
Автор: | Иван Денисов [ Суббота, 07 Январь, 2023 20:05 ] |
Заголовок сообщения: | Re: расширение компилятора циклом Дейкстры |
Совсем недавно понял... 1. При продвижении Оброна в образовании сформировался вполне чёткий тезис, что "Оберон - ядро императивных языков программирования", вы сможете потом на любом языке программировать как на Обероне. А как на другом языке запрограммировать "цикл Дейстры" — очень сложно, с помощью ELSIF конструкций внутри WHILE. В общем - такой красивый тезис рассыпается из-за этого цикла. 2. Ещё, как выяснилось, в Обероне вообще не совсем цикл Дейкстры, поэтому его даже неправильно так называть. Цикл Дейкстры имеет неопределённое поведение, неизвестно какая из TRUE ветвей будет выполнена следующей. А в Вирта в последнем Обероне именно какой-то свой предопределённый вариант получается. |
Автор: | arisu [ Суббота, 07 Январь, 2023 20:27 ] |
Заголовок сообщения: | Re: расширение компилятора циклом Дейкстры |
ну, технически на той же сишечке, например, я потом не смогу программировать как на CP, потому что там нет расширяемых записей. а нормальных модулей и вовсе почти нигде нет. так что тезис уже рассыпался: всё равно на других языках придётся эмулировать недостающее — так что и цикл Дейкстры просто добавляет ещё одну (полезную!) вещь к множеству «для эмуляции». зато наличие этого цикла позволяет применять более структурный подход без — в свою очередь — эмуляции такого цикла уже средствами CP. по пункту 2: тогда синтаксис с `ELSIF` лучше, потому что сразу ясно, что выполнися первая встреченая ветка. довольно логичное поведение, по-моему, и согласуется с обычным `IF/ELSIF`. |
Автор: | Иван Денисов [ Суббота, 07 Январь, 2023 21:24 ] |
Заголовок сообщения: | Re: расширение компилятора циклом Дейкстры |
arisu писал(а): в конце-концов, есть же, кажется, консенсус, что цикл Дейкстры — хорошо. и омики уже вряд ли будут развивать Component Pascal — так почему бы нам не взять этот флаг и не понести дальше? Мы как-то констатировали с некоторым рядом товарищей, что в стабильности языка видим определённую ценность. Вот скажем Антон работает над Гершелем. Язык зафиксирован и почти всё уже доделано. Остались некоторые детали по выделению новых объектов, по кодогенерации заголовков, по пятому десятому, тут Антон Дмитриев сам лучше меня расскажет, что ему осталось. А если начать менять язык, то это дополнительные препятствия и обстоятельства, откладывающие готовность. Также и сами сказали, что код потеряет совместимость. Но! Если у вас есть творческий импульс и интеллектуальная возможность, то предложите и опубликуйте свой расширенный вариант компилятора. Может быть народ попробует, попривыкнет, и как-то сформируется общественный запрос. Но вот сопрограммы были сделаны Центром, усложнили ядро, для Линукса не реализованы (у Дмитрия Викторовича в подсистеме одной есть, но это не было внедрено в ядро в итоге) и их нет в 2.0, не было ресурсов поддерживать эти нововведения во фреймворке в сообществе. Также, к сожалению и ядра для FreeBSD и OpenBSD пока также отстали от 2.0. Так что я могу сказать точно, что имеется некий естественный отбор, и действительно надо 10 раз подумать, чем вносить некую новую сложность в отлаженный инструмент, который ещё и на многих платформах надо поддерживать. |
Автор: | arisu [ Суббота, 07 Январь, 2023 21:43 ] |
Заголовок сообщения: | Re: расширение компилятора циклом Дейкстры |
тут прелесть в том, что эта штука делается чисто на уровне фронтэнда, а дальше ничего трогать не надо (фронтэнд просто преобразует её в обычный LOOP с условиями и допишет в конец `ELSE EXIT`). так что тот же кодоген в Гершеле (и другие кодогены) вообще менять не придётся. я сделаю, конечно, но сначала хочу услышать мнение коллег: может, кто-то синтаксис получше придумает, или другие какие ценные замечания, о которых я не подумал. а совместимость со всем старым кодом останется ведь. ну, новая фича. можно не использовать, если совместимость с прошлыми версиями нужна. можно даже сделать экспортёр исходников для старых версий, изменение-то очень небольшое, его можно почти что простой текстовой заменой развернуть. в дальнейшей поддержке — после реализации — не нуждается, кодогены не меняются. я тоже не фанат изменений просто для изменений. но похожую форму цикла даже сам Вирт благословил, поэтому я и думаю, что стоит взять себе полезное (и чуть-чуть доработать). |
Автор: | Oleg N. Cher [ Воскресенье, 08 Январь, 2023 10:28 ] |
Заголовок сообщения: | Re: расширение компилятора циклом Дейкстры |
Если Вам интересно моё мнение, то я тоже против изменения КП. LOOP/EXIT вполне хорош для разных причудливых видов цикла. |
Автор: | arisu [ Воскресенье, 08 Январь, 2023 18:08 ] |
Заголовок сообщения: | Re: расширение компилятора циклом Дейкстры |
мне интересны мнения, иначе я бы сделал не тему обсуждения, а тему: «вот, я новый компилятор прикатил!» ;-) я же не предлагаю убирать `LOOP/EXIT`, оно никуда не денется. изменение недеструктивное. однако использование EXIT противоречит правилам структурного программирования, и зачастую EXIT приходится использовать именно для эмуляции конструкции цикла, которую я предложил. вот я и считаю, что дополнить язык такой конструкцией, чтобы не приходилось её эмулировать — вполне логично. p.s.: я бы и RETURN сделал как Oberon-07, но увы, уже поздно… |
Автор: | Peter Almazov [ Воскресенье, 08 Январь, 2023 23:19 ] |
Заголовок сообщения: | Re: расширение компилятора циклом Дейкстры |
Дейкстра предложил свой цикл, чтобы можно было доказать его правильность. Как вы будете доказывать, ладно не доказывать, а хотя бы убеждать кого-то (или себя), в том, что этот цикл правильный? Предлагаю два варианта: 1. Я не занимаюсь такой хернёй. 2. "С помощью усиленной жестикуляции". От такой конструкции Дейкстра перевернулся бы в гробу. |
Автор: | arisu [ Понедельник, 09 Январь, 2023 00:21 ] |
Заголовок сообщения: | Re: расширение компилятора циклом Дейкстры |
Peter Almazov писал(а): Как вы будете доказывать, ладно не доказывать, а хотя бы убеждать кого-то (или себя), в том, что этот цикл правильный? путём простейшей копипасты он преобразуется в «классический». в чём проблема-то? в том, что я позволил копипасты меньше делать?
|
Автор: | JackKatch [ Понедельник, 09 Январь, 2023 12:34 ] |
Заголовок сообщения: | Re: расширение компилятора циклом Дейкстры |
Я бы поддержал добавление цикла Дейкстры (только не в том виде, как вы предлагаете), но при условии удаления цикла LOOP. Но удаление чего либо из существующей реализации, как уже писали, категорически не приемлемо. А без удаления цикла LOOP, добавление дублирующей конструкции, считаю бессмысленным. Делайте свою копию и развивайте, как вам нравится. Это лучшее решение. |
Автор: | Peter Almazov [ Понедельник, 09 Январь, 2023 12:50 ] |
Заголовок сообщения: | Re: расширение компилятора циклом Дейкстры |
arisu писал(а): путём простейшей копипасты он преобразуется в «классический». в чём проблема-то? в том, что я позволил копипасты меньше делать? Как все запущено. Вы хоть Дейкстру-то почитайте.И не называйте это его именем. А хотя бы "Цикл arisu". |
Автор: | SovietPony [ Понедельник, 09 Январь, 2023 15:55 ] |
Заголовок сообщения: | Re: расширение компилятора циклом Дейкстры |
Peter Almazov писал(а): arisu писал(а): путём простейшей копипасты он преобразуется в «классический». в чём проблема-то? в том, что я позволил копипасты меньше делать? Как все запущено. Вы хоть Дейкстру-то почитайте.И не называйте это его именем. А хотя бы "Цикл arisu". Виртовский while-цикл Дейкстры: Код: WhileStatement = "WHILE" expression "DO" StatementSequence {"ELSIF" expression "DO" StatementSequence} "END". по аналогии можно сделать Розово-Поняшный™ repeat-цикл Дейкстры® (на всякий случай пометил, а то щас и на меня набросятся за неуважение к Дейкстре):Код: RepeatStatement = "REPEAT" StatementSequence {"ELSIF" expression "DO" StatementSequence} ("END" | "UNTIL" expression). разрешать end только когда есть elsif-do ветки, а until запрещать при наличии elsif-do...Код: LoopStatement = "LOOP" StatementSequence {"ELSIF" expression "DO" StatementSequence} "END". или таки loop лучше с запретом exit приналичии elsif-do веток?но лучше бы было вообще с отдельными кейводами ps: не ощущаю необходимости в Вировских и Розово-Поняшный циклах, хотя иногда и сталкиваюсь с такими кейсами как в первом посте. |
Автор: | arisu [ Понедельник, 09 Январь, 2023 19:52 ] |
Заголовок сообщения: | Re: расширение компилятора циклом Дейкстры |
Peter Almazov писал(а): Как все запущено. Вы хоть Дейкстру-то почитайте. ваша потрясающе глубокая и аргументированая аналитика очень важна для меня. но я боюсь, что больше одной мудрости в столетие не вынесу, так что можете больше не утруждаться написанием в эту тему, если адресатом имеете в виду меня: во имя сохранения остатков здравого смысла все ваши посты на форуме я буду локально вырезать при помощи небольшого userjs.
И не называйте это его именем. А хотя бы "Цикл arisu". |
Автор: | arisu [ Понедельник, 09 Январь, 2023 20:19 ] |
Заголовок сообщения: | Re: расширение компилятора циклом Дейкстры |
2SovietPony: оппонент, похоже, не понимает, как из семантически тождественных преобразований получается одно или другое, и почему я в обобщённом виде назвал «циклом Дейкстры» цикл, в котором несколько стражей (что, действительно, было не совсем корректно с моей стороны, если подходить строго формально). ну, бывает, чо. |
Автор: | arisu [ Вторник, 21 Март, 2023 23:50 ] |
Заголовок сообщения: | Re: расширение компилятора циклом Дейкстры |
докладаю, значить, по результатам практической проверки в Lament Configuration. 1. добавлены были обе формы: виртовская WHILE/ELSIF из Oberon-07, и моя LOOP/IF/ELSIF. виртовская добавилась тривиально (только цикл пришлось преобразовывать в REPEAT/UNTIL), для моей понадобился небольшой хак в StatSeq. в принципе, это причина не иметь моей формы в минималистичном компиляторе, но CP уже один фиг не совсем минималистичный. синтаксис был выбран без труб и ты пы: Код: WHILE guard DO … ELSIF guard DO … END; LOOP seq IF guard DO … ELSIF guard DO … END; 2. WHILE/ELSIF появляется в коде совершенно органично, «сам по себе». LOOP/IF/ELSIF оказался нужен реже, чем я думал; точнее, я про него реже вспоминаю, как и про FOR, например. он (LOOP/IF/ELSIF) таки удобен для реализации «loop with a sequence shift». семантически LOOP/IF/ELSIF точно то же самое, что и «классический» ЦД с копипастой операции сдвига в каждую ветку, так что на доказательства и инварианты форма не влияет. 3. подпиливать кодоген не пришлось, достаточно было просто создавать AST нужного вида в парзере. то есть, подпилить можно, конечно, чтобы избавиться от скрытой булевой переменной в реализации WHILE/ELSIF, но как по мне — оно совершенно некритично. замечу, что преобразовывать WHILE/ELSIF в LOOP нельзя, потому что тогда сломается семантика EXIT; поэтому пришлось сделать REPEAT/UNTIL со скрытым условием выхода. итог: добавление считаю полезным, в Ultra Pascal оно останется. репорт о языке подпилил. |
Автор: | Иван Денисов [ Четверг, 23 Март, 2023 22:19 ] |
Заголовок сообщения: | Re: расширение компилятора циклом Дейкстры |
Я перенес эту тему в раздел по языку программирования Компонентный Паскаль. Однако я не уверен, что ей тут место. Но лучше что-то не придумал, может arisu как автор или Борис лучше место придумают. Но в обсуждении кросс-платформенной сборки 2.0 ей не место, ИМХО. |
Автор: | arisu [ Пятница, 24 Март, 2023 01:50 ] |
Заголовок сообщения: | Re: расширение компилятора циклом Дейкстры |
я тоже место правильно не придумал сразу, поэтому запихал в 2.0 по логике «это тоже относится к развитию». в языке, пожалуй, оно правильней будет, спасибо. если придумается ещё более правильное место — ну, тем лучше. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |