OberonCore
https://forum.oberoncore.ru/

Использование функций в ЯП
https://forum.oberoncore.ru/viewtopic.php?f=61&t=6381
Страница 1 из 2

Автор:  hothing [ Понедельник, 15 Апрель, 2019 06:24 ]
Заголовок сообщения:  Использование функций в ЯП

А что если ввести в ЯП (например КП, Оберон) функции с исключительно локальными переменными?
Т.е. внутри функции можно использовать только внутренние переменные и аргументы.
Мне кажется, что такие функции очень легко можно использовать в константных выражениях, и их же легко компилировать.

Для константных выражений становится доступна рекурсия, выполнением которой занимается компилятор.

При компиляции можно сразу предполагать их разворачивание (inline), и более глубокую оптимизицаю кода, в том числе сведение в константное выражение.
Правда, в таких функциях нужно применять модифицированный синтаксис: предложения (statement) IF/CASE должны всегда иметь альетнативную ветку и стать выражениями (expression).

Интересно какие "ямы"/минусы и "горы"/плюсы появятся.

Просьба рассматривать это предложения как техническое, а не философское. Некторые участники форума начнут объяснять что это не нужно. Пожалуйста не тратьте время и нервы.

Автор:  SovietPony [ Понедельник, 15 Апрель, 2019 12:01 ]
Заголовок сообщения:  Re: Использование функций в ЯП

> А что если ввести в ЯП (например КП, Оберон) функции с исключительно локальными переменными?
На уровне языка вводить не оязательно, такое просто детектируется автоматически.
> Для константных выражений становится доступна рекурсия, выполнением которой занимается компилятор.
Циклы и рекурсия усложняют реализацию такой оптимизации. Надо как-то гарантировать отсутствие бесконечных циклов перед вычислением.
Сходу такие гарантии можно дать разве что для цикла for-each, с некоторыми ограничениями для for, а как быть с общим случаем - хз.
> Правда, в таких функциях нужно применять модифицированный синтаксис: предложения (statement) IF/CASE должны всегда иметь альетнативную ветку и стать выражениями (expression).
Ветвь else не надо делать обязательной. Для case можно как раз сделать проверки в компилтайме.
Expression-синтаксис для IF можно добавить разве что для удобства, так-то он не особо нужен.
Тернарный оператор вроде был уже в Oberon-V.

Автор:  hothing [ Среда, 17 Апрель, 2019 09:42 ]
Заголовок сообщения:  Re: Использование функций в ЯП

SovietPony писал(а):
На уровне языка вводить не оязательно, такое просто детектируется автоматически.
Нет. Технически возможно, но программист теряет контроль.

SovietPony писал(а):
Циклы и рекурсия усложняют реализацию такой оптимизации. Надо как-то гарантировать отсутствие бесконечных циклов перед вычислением...
Зачем гарантировать? В обычных программах разве есть гарантия отсутствия бесконечной рекурсии или цикла? Здесь же компилятор просто исполнитель "программы".

SovietPony писал(а):
Ветвь else не надо делать обязательной.
И как гарантировать возврат значения? Например FUNCTION(a,b) RETURN IF (a > 2) THEN b END; END что вернет при a <= 2?

Автор:  SovietPony [ Среда, 17 Апрель, 2019 18:35 ]
Заголовок сообщения:  Re: Использование функций в ЯП

hothing писал(а):
Нет. Технически возможно, но программист теряет контроль.
Пограмист не в состоянии самоограничиться использованием только локальных переменных? Ну получит код вычисляемый в рантайме, а не в компилтайме. Это не является ошибкой.
Зато не надо трогать фонтэнд, а всю эту оптимизацию можно сделать в виде плагина к ББ не трогая компилятор вообще.
hothing писал(а):
Зачем гарантировать? В обычных программах разве есть гарантия отсутствия бесконечной рекурсии или цикла? Здесь же компилятор просто исполнитель "программы".
Зачем? Ну ок, компилятор будет падать на переполнении стека или компилировать вечно. Это именно то, чего мы и ожидаем от компилятора! <_<
hothing писал(а):
И как гарантировать возврат значения? Например FUNCTION(a,b) RETURN IF (a > 2) THEN b END; END что вернет при a <= 2?
Это было про обычный if и case. Для expression варианта он конечно же нужен. Хотя зачем сам этот expression-вариант нужен - я не знаю. Ну и кроме фонтэнда ещё надо будет допиливать внутреннее представление и, соответственно, кодогенератор. Оно не стоит того.

Автор:  Info21 [ Среда, 17 Апрель, 2019 23:20 ]
Заголовок сообщения:  Re: Использование функций в ЯП

SovietPony писал(а):
Ну ок, компилятор будет падать на переполнении стека или компилировать вечно. Это именно то, чего мы и ожидаем от компилятора! <_<
...
Оно не стоит того.
Подписуюсь.

Автор:  Kemet [ Четверг, 18 Апрель, 2019 06:57 ]
Заголовок сообщения:  Re: Использование функций в ЯП

Что-то вроде чистых функций?

Автор:  Kemet [ Четверг, 18 Апрель, 2019 07:20 ]
Заголовок сообщения:  Re: Использование функций в ЯП

hothing писал(а):
SovietPony писал(а):
Ветвь else не надо делать обязательной.
И как гарантировать возврат значения? Например FUNCTION(a,b) RETURN IF (a > 2) THEN b END; END что вернет при a <= 2?
Наличие ветви ELSE никак не гарантирует наличие там RETURN.
Что-бы гарантировать - нужен анализатор, а так как его нет ни к каких реализациях оберона, то остаётся втыкать специальные команды в конце функции - если не вышли из нее с return, то в рантайме оно трапнется.
Вложение:
TrapF.png
TrapF.png [ 81.21 КБ | Просмотров: 6232 ]

Автор:  Info21 [ Четверг, 18 Апрель, 2019 08:50 ]
Заголовок сообщения:  Re: Использование функций в ЯП

Kemet писал(а):
... не гарантирует наличие там RETURN.
Что-бы гарантировать - нужен анализатор, а так как его нет ни к каких реализациях оберона ...
RETURN в конце процедуры зашит в синтаксис последних версий Оберона от Вирта.

Автор:  Kemet [ Четверг, 18 Апрель, 2019 09:05 ]
Заголовок сообщения:  Re: Использование функций в ЯП

очень смешно)) вы текст топикстартера читали?)))
Ни и это... пользуйтесь сами тем последним обероном

Автор:  hothing [ Четверг, 18 Апрель, 2019 11:24 ]
Заголовок сообщения:  Re: Использование функций в ЯП

SovietPony писал(а):
Пограмист не в состоянии самоограничиться использованием только локальных переменных? Ну получит код вычисляемый в рантайме, а не в компилтайме. Это не является ошибкой.
Самоограничения? Угу, конечно. Почему бы на ассемблер сразу не перейти: там и аскетизм, и созерцательность, и самоограничения проявят себя в полной мере.
SovietPony писал(а):
Зато не надо трогать фонтэнд, а всю эту оптимизацию можно сделать в виде плагина к ББ не трогая компилятор вообще.
Мда. Компилятор - инструмент, а не священные тексты.
SovietPony писал(а):
Ну ок, компилятор будет падать на переполнении стека или компилировать вечно. Это именно то, чего мы и ожидаем от компилятора! <_<
А от остальных программ?
SovietPony писал(а):
Хотя зачем сам этот expression-вариант нужен - я не знаю.
Функция всегда должна возвращать значение, поскольку в начальных условиях оговоривалось отсутствие глобального состояния. Есть другие решения когда внутри функции нужен выбор альтернативы?

Автор:  hothing [ Четверг, 18 Апрель, 2019 11:28 ]
Заголовок сообщения:  Re: Использование функций в ЯП

Kemet писал(а):
Что-то вроде чистых функций?
Да.
Kemet писал(а):
Наличие ветви ELSE никак не гарантирует наличие там RETURN.
Существует два варианта: с ключвыем словом которое вводится в синтаксис чистых функций; и без ключевого слова, когда возвращается результат последнего выражения.

Автор:  Илья Ермаков [ Четверг, 18 Апрель, 2019 14:51 ]
Заголовок сообщения:  Re: Использование функций в ЯП

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

Автор:  SovietPony [ Четверг, 18 Апрель, 2019 19:02 ]
Заголовок сообщения:  Re: Использование функций в ЯП

hothing писал(а):
Самоограничения? Угу, конечно. Почему бы на ассемблер сразу не перейти: там и аскетизм, и созерцательность, и самоограничения проявят себя в полной мере.
Причём тут ассемблер?
Явная пометка требует модификации языка, что приводит к непортабельному коду.
Модификация языка требует модификации компилятора. Кто будет этот компилятор сопровождать, синхронизировать с мейнстримной версией и гарантировать что нигде ничего не сломается? Тут полтора человека такими вещами занимается.
Модификация компилятора ещё больше усложнит его понимание (тот же ББ уже на грани своей толщины, а его и так мало кто понимает).
При явной пометке оптимизируются только помеченные процедуры, когда это можно делать для любых процедур (причём необязательно только процедур-функций).
Автоматическую проверку на использование глабальных переменных все равно придётся делать, но только для того что бы дать пограмисту по рукам на ровном месте - использование глобальных переменных не влияет корректность кода. Почему бы не использовать ту же проверку, но только для автоматического отключения оптимизации?
Код который будет оптимизироваться для вычисления в компилтайме скорее всего будет умещаться в несколько строк, а пограмист и так будет понимать что глобальные переменные использовать не следует.
Из этого всего следует, что введение явной пометки для оптимизации как минимум не стоит требуемых на то усилий, если вообще имеет смысл.
hothing писал(а):
Мда. Компилятор - инструмент, а не священные тексты.
Смотри выше про про компилятор. Трогать его стоит когда в этом действительно есть необходимость и имется большие профиты при минимальной сложности реализации. А всё что можно приделать сбоку - надо приделывать сбоку. Примером такого решения является DevCPH в ББ.
hothing писал(а):
А от остальных программ?
Тут разница в том, что если мы зависнем/трапнемся на собранной программе, то будем точно знать что проблема в именно в программе и легко можем получить стектрейс и содержимое переменных.
А если тоже самое произойдёт в компилтайме? Кто виноват? Глючит компилятор или это кривая программа? Что? Ещё и отладчик встраивать в компилятор?!
Довольно странно говорить о том что я скатываюсь до ассемблера с самоограничениями при минорной фиче, но при этом допускать трудноотлаживаемую ситуацию, которая решается ограничениями на код со стороны компилятора/оптимизатора.

Кстати, если исключть рекурсию, то ББ уже сейчас заоптимизирует такой код для рантайма, потому что он искарпки детектит leaf-процедуры (т.е. процедуры которые не вызают процедуры).

hothing писал(а):
Функция всегда должна возвращать значение, поскольку в начальных условиях оговоривалось отсутствие глобального состояния. Есть другие решения когда внутри функции нужен выбор альтернативы?
Как традиционный if коррелирует с глобальным состоянием? Щ_Щ
Ну а при отсутствии return выдвавть ошибку. Никто же не жалуется что ASSERT(FALSE) в ББ выдаёт ошибку. Я дже этим пользуюсью в ядре BMBB. Чем вычисляемые процедуры хуже?
К тому же анализ процедуры на наличие return будет ещё проще чем анализ на использование глобальных переменных и вызова импортированных процедур.

Автор:  Sergej Durmanov [ Четверг, 18 Апрель, 2019 23:57 ]
Заголовок сообщения:  Re: Использование функций в ЯП

2all
Чистые функции, несомненно, были бы полезны.

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

Автор:  hothing [ Пятница, 19 Апрель, 2019 08:12 ]
Заголовок сообщения:  Re: Использование функций в ЯП

Илья Ермаков писал(а):
В принципе, те модификации, которые ограничивают язык, а не расширяют (как у Дмитрия Дагаева отключение циклов, NEW и т.п. для высших профилей надёжности), можно делать чем-то типа аннотаций.
Илья, речь о профилях, как наборах ограничений? Отличная мысль. А базис - текущая реализация КП?

Автор:  hothing [ Пятница, 19 Апрель, 2019 08:55 ]
Заголовок сообщения:  Re: Использование функций в ЯП

SovietPony писал(а):
...а пограмист и так будет понимать что...
Ладно, это уже философия. Мне чужда такая вера в сознательность и безошибочность программиста (и человеков в целом).

SovietPony писал(а):
Тут разница в том, что если мы зависнем/трапнемся на собранной программе, то будем точно знать что проблема в именно в программе и легко можем получить стектрейс и содержимое переменных.
А если тоже самое произойдёт в компилтайме? Кто виноват? Глючит компилятор или это кривая программа? Что? Ещё и отладчик встраивать в компилятор?!
Да, это "яма".

SovietPony писал(а):
Ну а при отсутствии return выдвавть ошибку.
При остутсвии ELSE выдавать ошибку.

SovietPony писал(а):
К тому же анализ процедуры на наличие return будет ещё проще чем анализ на использование глобальных переменных и вызова импортированных процедур.
Ошибаетесь. В компиляторе есть цепочка областей видимости (topScope), которую для чистых функций можно не использовать (хорошо, для ЧФ нужна своя цепочка ОВ), а значит и потребность в анализе отпадает.

За указание на "яму" с рекурсией - спасибо. Остальное нет смысла обсуждать.

Автор:  Kemet [ Пятница, 19 Апрель, 2019 09:06 ]
Заголовок сообщения:  Re: Использование функций в ЯП

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

Автор:  Info21 [ Пятница, 19 Апрель, 2019 09:30 ]
Заголовок сообщения:  Re: Использование функций в ЯП

hothing писал(а):
SovietPony писал(а):
...а пограмист и так будет понимать что...
Ладно, это уже философия. Мне чужда такая вера в сознательность и безошибочность программиста (и человеков в целом).
Такую веру можно смело записывать по разряду "преступное мракобесие".

Автор:  Пётр Кушнир [ Пятница, 19 Апрель, 2019 09:35 ]
Заголовок сообщения:  Re: Использование функций в ЯП

Забудьте про функции, это математическое понятие, оно к императивному программированию слабо применимо, нет в компукере никаких функций, есть только инструкции (statement) и выражения (expression), а так же, опционально, блоки, для их объединения и именования, которые называют РЯОСЕДУЯЕ или МОДУЛЕ.
А если вам так интересны декларативные вычислительные конструкции, можете обратить внимание на то, как это сделано в LoLa у дедушки Вирта, там как раз никаких statement и эффектов, всё чисто на параметрах входа, выхода и локальных регистров. МапРедус, если вы понимаете, о чём я.

Автор:  hothing [ Пятница, 19 Апрель, 2019 10:53 ]
Заголовок сообщения:  Re: Использование функций в ЯП

Kemet писал(а):
Так ведь чистые функции могут обращаться к другим чистым функциям

Да, ЧФ могут обращаться к другим ЧФ, а для этого у них должна быть своя цепочка областей видимости. Общая цепочка видимости будет включать цепочку ЧФ, но не наоборот.

Kemet писал(а):
поэтому только локальным контекстом обойтись нельзя и придётся, всё же править компилятор и сканер и семантический анализатор.
Конечно. Есть другие варианты?

Kemet писал(а):
И ещё, как быть с формальными параметрами? Их можно изменять, если они по значению передаются?
Не знаю. Надо думать.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/