OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 14 Ноябрь, 2019 23:04

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




Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Использование функций в ЯП
СообщениеДобавлено: Понедельник, 15 Апрель, 2019 06:24 

Зарегистрирован: Среда, 31 Октябрь, 2007 18:58
Сообщения: 214
Откуда: Austria, Bruck
А что если ввести в ЯП (например КП, Оберон) функции с исключительно локальными переменными?
Т.е. внутри функции можно использовать только внутренние переменные и аргументы.
Мне кажется, что такие функции очень легко можно использовать в константных выражениях, и их же легко компилировать.

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

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

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

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


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

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


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

Зарегистрирован: Среда, 31 Октябрь, 2007 18:58
Сообщения: 214
Откуда: Austria, Bruck
SovietPony писал(а):
На уровне языка вводить не оязательно, такое просто детектируется автоматически.
Нет. Технически возможно, но программист теряет контроль.

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

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


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

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


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8196
Откуда: Троицк, Москва
SovietPony писал(а):
Ну ок, компилятор будет падать на переполнении стека или компилировать вечно. Это именно то, чего мы и ожидаем от компилятора! <_<
...
Оно не стоит того.
Подписуюсь.


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

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
Что-то вроде чистых функций?


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

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
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 КБ | Просмотров: 592 ]


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8196
Откуда: Троицк, Москва
Kemet писал(а):
... не гарантирует наличие там RETURN.
Что-бы гарантировать - нужен анализатор, а так как его нет ни к каких реализациях оберона ...
RETURN в конце процедуры зашит в синтаксис последних версий Оберона от Вирта.


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

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
очень смешно)) вы текст топикстартера читали?)))
Ни и это... пользуйтесь сами тем последним обероном


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

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


Последний раз редактировалось hothing Четверг, 18 Апрель, 2019 11:31, всего редактировалось 1 раз.

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование функций в ЯП
СообщениеДобавлено: Четверг, 18 Апрель, 2019 14:51 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9154
Откуда: Россия, Орёл
В принципе, те модификации, которые ограничивают язык, а не расширяют (как у Дмитрия Дагаева отключение циклов, NEW и т.п. для высших профилей надёжности), можно делать чем-то типа аннотаций.


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

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

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

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


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

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 79
Откуда: Russia
2all
Чистые функции, несомненно, были бы полезны.

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


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

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


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

Зарегистрирован: Среда, 31 Октябрь, 2007 18:58
Сообщения: 214
Откуда: Austria, Bruck
SovietPony писал(а):
...а пограмист и так будет понимать что...
Ладно, это уже философия. Мне чужда такая вера в сознательность и безошибочность программиста (и человеков в целом).

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

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

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

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


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

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
Так ведь чистые функции могут обращаться к другим чистым функциям, поэтому только локальным контекстом обойтись нельзя и придётся, всё же править компилятор и сканер и семантический анализатор. И ещё, как быть с формальными параметрами? Их можно изменять, если они по значению передаются?


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8196
Откуда: Троицк, Москва
hothing писал(а):
SovietPony писал(а):
...а пограмист и так будет понимать что...
Ладно, это уже философия. Мне чужда такая вера в сознательность и безошибочность программиста (и человеков в целом).
Такую веру можно смело записывать по разряду "преступное мракобесие".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Использование функций в ЯП
СообщениеДобавлено: Пятница, 19 Апрель, 2019 09:35 

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


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

Зарегистрирован: Среда, 31 Октябрь, 2007 18:58
Сообщения: 214
Откуда: Austria, Bruck
Kemet писал(а):
Так ведь чистые функции могут обращаться к другим чистым функциям

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

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

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.

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


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

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


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

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