OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 01 Июнь, 2023 12:37

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 17 ] 
Автор Сообщение
СообщениеДобавлено: Суббота, 07 Январь, 2023 19:39 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 833
и ещё предлагаю: добавить в компилятор и в репорт языка цикл Дейкстры. только немного расширеный вариант:
Код:
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 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3686
Совсем недавно понял...

1. При продвижении Оброна в образовании сформировался вполне чёткий тезис, что "Оберон - ядро императивных языков программирования", вы сможете потом на любом языке программировать как на Обероне. А как на другом языке запрограммировать "цикл Дейстры" — очень сложно, с помощью ELSIF конструкций внутри WHILE. В общем - такой красивый тезис рассыпается из-за этого цикла.

2. Ещё, как выяснилось, в Обероне вообще не совсем цикл Дейкстры, поэтому его даже неправильно так называть. Цикл Дейкстры имеет неопределённое поведение, неизвестно какая из TRUE ветвей будет выполнена следующей. А в Вирта в последнем Обероне именно какой-то свой предопределённый вариант получается.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 07 Январь, 2023 20:27 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 833
ну, технически на той же сишечке, например, я потом не смогу программировать как на CP, потому что там нет расширяемых записей. а нормальных модулей и вовсе почти нигде нет. так что тезис уже рассыпался: всё равно на других языках придётся эмулировать недостающее — так что и цикл Дейкстры просто добавляет ещё одну (полезную!) вещь к множеству «для эмуляции».

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

по пункту 2: тогда синтаксис с `ELSIF` лучше, потому что сразу ясно, что выполнися первая встреченая ветка. довольно логичное поведение, по-моему, и согласуется с обычным `IF/ELSIF`.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 07 Январь, 2023 21:24 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3686
arisu писал(а):
в конце-концов, есть же, кажется, консенсус, что цикл Дейкстры — хорошо. и омики уже вряд ли будут развивать Component Pascal — так почему бы нам не взять этот флаг и не понести дальше?

Мы как-то констатировали с некоторым рядом товарищей, что в стабильности языка видим определённую ценность. Вот скажем Антон работает над Гершелем. Язык зафиксирован и почти всё уже доделано. Остались некоторые детали по выделению новых объектов, по кодогенерации заголовков, по пятому десятому, тут Антон Дмитриев сам лучше меня расскажет, что ему осталось. А если начать менять язык, то это дополнительные препятствия и обстоятельства, откладывающие готовность. Также и сами сказали, что код потеряет совместимость. Но! Если у вас есть творческий импульс и интеллектуальная возможность, то предложите и опубликуйте свой расширенный вариант компилятора. Может быть народ попробует, попривыкнет, и как-то сформируется общественный запрос. Но вот сопрограммы были сделаны Центром, усложнили ядро, для Линукса не реализованы (у Дмитрия Викторовича в подсистеме одной есть, но это не было внедрено в ядро в итоге) и их нет в 2.0, не было ресурсов поддерживать эти нововведения во фреймворке в сообществе. Также, к сожалению и ядра для FreeBSD и OpenBSD пока также отстали от 2.0. Так что я могу сказать точно, что имеется некий естественный отбор, и действительно надо 10 раз подумать, чем вносить некую новую сложность в отлаженный инструмент, который ещё и на многих платформах надо поддерживать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 07 Январь, 2023 21:43 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 833
тут прелесть в том, что эта штука делается чисто на уровне фронтэнда, а дальше ничего трогать не надо (фронтэнд просто преобразует её в обычный LOOP с условиями и допишет в конец `ELSE EXIT`). так что тот же кодоген в Гершеле (и другие кодогены) вообще менять не придётся.

я сделаю, конечно, но сначала хочу услышать мнение коллег: может, кто-то синтаксис получше придумает, или другие какие ценные замечания, о которых я не подумал.

а совместимость со всем старым кодом останется ведь. ну, новая фича. можно не использовать, если совместимость с прошлыми версиями нужна. можно даже сделать экспортёр исходников для старых версий, изменение-то очень небольшое, его можно почти что простой текстовой заменой развернуть. в дальнейшей поддержке — после реализации — не нуждается, кодогены не меняются.

я тоже не фанат изменений просто для изменений. но похожую форму цикла даже сам Вирт благословил, поэтому я и думаю, что стоит взять себе полезное (и чуть-чуть доработать).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 08 Январь, 2023 10:28 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 514
Откуда: Украина, Днепропетровская обл.
Если Вам интересно моё мнение, то я тоже против изменения КП. LOOP/EXIT вполне хорош для разных причудливых видов цикла.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 08 Январь, 2023 18:08 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 833
мне интересны мнения, иначе я бы сделал не тему обсуждения, а тему: «вот, я новый компилятор прикатил!» ;-)

я же не предлагаю убирать `LOOP/EXIT`, оно никуда не денется. изменение недеструктивное. однако использование EXIT противоречит правилам структурного программирования, и зачастую EXIT приходится использовать именно для эмуляции конструкции цикла, которую я предложил. вот я и считаю, что дополнить язык такой конструкцией, чтобы не приходилось её эмулировать — вполне логично.

p.s.: я бы и RETURN сделал как Oberon-07, но увы, уже поздно…


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 08 Январь, 2023 23:19 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 563
Откуда: Москва
Дейкстра предложил свой цикл, чтобы можно было доказать его правильность.
Как вы будете доказывать, ладно не доказывать, а хотя бы убеждать кого-то (или себя), в том, что этот цикл правильный?

Предлагаю два варианта:
1. Я не занимаюсь такой хернёй.
2. "С помощью усиленной жестикуляции".

От такой конструкции Дейкстра перевернулся бы в гробу.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 09 Январь, 2023 00:21 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 833
Peter Almazov писал(а):
Как вы будете доказывать, ладно не доказывать, а хотя бы убеждать кого-то (или себя), в том, что этот цикл правильный?
путём простейшей копипасты он преобразуется в «классический». в чём проблема-то? в том, что я позволил копипасты меньше делать?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 09 Январь, 2023 12:34 

Зарегистрирован: Пятница, 07 Май, 2021 11:06
Сообщения: 24
Я бы поддержал добавление цикла Дейкстры (только не в том виде, как вы предлагаете), но при условии удаления цикла LOOP. Но удаление чего либо из существующей реализации, как уже писали, категорически не приемлемо. А без удаления цикла LOOP, добавление дублирующей конструкции, считаю бессмысленным. Делайте свою копию и развивайте, как вам нравится. Это лучшее решение.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 09 Январь, 2023 12:50 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 563
Откуда: Москва
arisu писал(а):
путём простейшей копипасты он преобразуется в «классический». в чём проблема-то? в том, что я позволил копипасты меньше делать?
Как все запущено. Вы хоть Дейкстру-то почитайте.
И не называйте это его именем. А хотя бы "Цикл arisu".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 09 Январь, 2023 15:55 
Аватара пользователя

Зарегистрирован: Воскресенье, 09 Декабрь, 2018 15:14
Сообщения: 100
Откуда: Equestria
Peter Almazov писал(а):
arisu писал(а):
путём простейшей копипасты он преобразуется в «классический». в чём проблема-то? в том, что я позволил копипасты меньше делать?
Как все запущено. Вы хоть Дейкстру-то почитайте.
И не называйте это его именем. А хотя бы "Цикл arisu".
лол. он имел в виду преобразование в классический цикл loop/while/repeat, в корректности которых вроде никто не сомневается. (а если и сомневается, то это в соседний раздел форума с адским матаном и прочими формальными доказательствами, мы тут обсуждаем вещи приземлённые)



Виртовский 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: не ощущаю необходимости в Вировских и Розово-Поняшный циклах, хотя иногда и сталкиваюсь с такими кейсами как в первом посте.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 09 Январь, 2023 19:52 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 833
Peter Almazov писал(а):
Как все запущено. Вы хоть Дейкстру-то почитайте.
И не называйте это его именем. А хотя бы "Цикл arisu".
ваша потрясающе глубокая и аргументированая аналитика очень важна для меня. но я боюсь, что больше одной мудрости в столетие не вынесу, так что можете больше не утруждаться написанием в эту тему, если адресатом имеете в виду меня: во имя сохранения остатков здравого смысла все ваши посты на форуме я буду локально вырезать при помощи небольшого userjs.


Последний раз редактировалось arisu Понедельник, 09 Январь, 2023 20:22, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 09 Январь, 2023 20:19 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 833
2SovietPony: оппонент, похоже, не понимает, как из семантически тождественных преобразований получается одно или другое, и почему я в обобщённом виде назвал «циклом Дейкстры» цикл, в котором несколько стражей (что, действительно, было не совсем корректно с моей стороны, если подходить строго формально). ну, бывает, чо.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 21 Март, 2023 23:50 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 833
докладаю, значить, по результатам практической проверки в 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 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3686
Я перенес эту тему в раздел по языку программирования Компонентный Паскаль. Однако я не уверен, что ей тут место. Но лучше что-то не придумал, может arisu как автор или Борис лучше место придумают. Но в обсуждении кросс-платформенной сборки 2.0 ей не место, ИМХО.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Март, 2023 01:50 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 833
я тоже место правильно не придумал сразу, поэтому запихал в 2.0 по логике «это тоже относится к развитию». в языке, пожалуй, оно правильней будет, спасибо. если придумается ещё более правильное место — ну, тем лучше.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ] 

Часовой пояс: UTC + 3 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2023, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB