1563
Обсуждение дизайна языков программирования (как новых, так и существующих). Литература: https://github.com/true-grue/Compiler-Development Создание и устройство компиляторов: @CompilerDev Для новичков: @pld_beginners
Вы хотели бы участвовать в группе по моему языку?
Читать полностью…
Больше того, если посмотреть на статьи про АОП, то можно заметить, что оно и придумано _для_того_, чтобы менять свойства частей программы.
Читать полностью…
Disable кнопки — это только с целью UX/usability, в том случае, если повторные нажатия не имеют смысла в течении некоторого таймаута.
Читать полностью…
С одной стороны, cross-cutting concerns, наверное, лучше документировать в одном месте, а не в каждой функции. С другой стороны, эффект на файловую систему порождает не эта функция, а другой модуль, среда выполнения, или программа в целом.
Читать полностью…
Это работает до тех пор, пока обработчики — чистые функции (по бОльшей части). Но такие обработчики редко нужны. А когда обработчики начинают производить эффекты/трогать разделяемые ресурсы — всё начинает разваливаться феерическим образом.
Читать полностью…
Так мы докидываем ещё больше сложности и хрупкости, чтобы обойти проблему некомпозиционности обработчиков, с которой начали.
Читать полностью…
Тут проблемка же возникает из-за асинхронности, а не событий/обработчиков как таковых.
Должно быть const curValue = await globalStack.pop() (и асинхронный pop, и, быть может, перевод кнопки в состояние disable, пока данные не появятся).
А в примере был простой синхронный код. И обработчики событий там — простые функции. Если одна мешает другой — значит, их реализация нарушается какой-то контракт/соглашение/API.
в формальном смысле (речь же про формализацию?) у елфа таки есть аст, т.к. над ним вполне конкретно определена модель данных (система термов и отношений между ними), в виде экземпляра которой можно содержащуюся в нём информацию материализовать, и которая описывает "грамматику" этого аст; то что _на практике_ под аст "обычно понимаются" именно деревья разбора (как результаты работы "парсеров текста"), с формальной точки зрения не значительно
Читать полностью…
Кстати, я тут на досуге подумал, и осознал, что Constant Propagation/Folding только тем и занимаются, что подменяют Small-Step Semantics, особенно вкупе с Dead Parameter Elimination.
Например. Исходная функция:
λ x, (λ y, x + y*(2 - 2)) 42
λ x, x
Не. Речь идёт о том, что вот пусть у нас есть elf файл. Мы его в хекс редакторе создали, никакого аст никогда не было. В нём есть символ...
Читать полностью…
Или трассировка и сбор статистики по времени выполнения функции. В родственных АОР декораторах и PPX на это особо указывают — что нужно следить, чтобы разные декораторы/PPX не мешали друг другу.
https://ocaml-ppx.github.io/ppxlib/ppxlib/quick_intro.html
фраза
«Ambiguity when using several preprocessors due to lacking clear composition semantics»
Почему? Вот вызов. Ну syscall, конечно, скрыт в недрах стандартной библиотеки, но если мы уж доковыряли до неё, то там это будет вершина AST.
Читать полностью…
Ну, аспекты — это кмк вообще скорее философская штука. А придумывать им формальные определения — дело неблагодарное
Читать полностью…
Я последнее время думаю, что не надо давать формальное чёткое определение — уж больно разная практика.
Читать полностью…
Нет, но у меня есть класс специальных значений, которые я называю тегами - вот как раз для таких случаев.
let f * (i : Int) * #i-want-int : Int := ...;Читать полностью…
let f * (i : Int) * #i-want-string : String := ...;
Что-то у меня не получилось найти, с чего тема про аспекты началась, но хотелось бы заметить, что АОП это по сути частный случай метапрограммирования.
Навешивание логирующего аспекта на фрагмент программы ни по смысловой нагрузке ни по семантике ничем не отличается от ручного раскидывания вызова логирующей функции по коду.
В зависимости от способа реализации АОПшные аспекты могут функционировать как угодно - встраиваться в цепочку вызовов статически или динамически, переписывать код как макросы на котором-то уровне абстракции, и т.д.
В конечном счёте они являются просто ещё одним способом абстракции и обобщения элементов поведения программы. Поэтому они по определению должны и будут влиять на семантику программы - в общем случае. Поэтому мне глубоко непонятны все эти рассуждения о "правильности"/"неправильности"/"корректности"/"некорректности" аспектов.
Написали реализацию, зависящую от нелокального состояния - получили внезапные эффекты при нарушении ожидаемого порядка выполнения. Не важно, каким способом мы это в программу принесли. Это прямое логическое следствие, вытекающее из природы сущности.
Так и я об этом: порядок вызовов не определен из-за асинхронности (обработчики вызываются в ответ на события, и порядок этих событий определен весьма частично).
Читать полностью…
тем временем "ватчпоинты", ставящиеся внешней тулой над кодом и пишущие что-то в лог - просто существуют, не трогая семантику программы
Читать полностью…
если про функцию в её контракте не сказано, что она порождает побочные эффекты на файловую систему, не должно ли нас в таком случае начать беспокоить то, что навешивание логирования методами АОП на что угодно будет контракты таких функций нарушать? "иногда" даже косвенно
Читать полностью…
Тут проблемка же возникает из-за асинхронности, а не событий/обработчиков как таковых.
Должно быть const curValue = await globalStack.pop()
pop тут самый обычный JS'овский синхронный. С ним никаких проблем нет. С push тоже. Проблемы возникают с порядком их вызовов.
Читать полностью…
Давайте забъём. По-моему, это предложение лучше.
Читать полностью…
Ок. Давайте с другой стороны. Spring security?
Читать полностью…
Ох. Ну это пограничное состояние. Тут дальше мы вваливаемся в терминологический спор об «исходном языке». Что это — машинный или ЯВУ? И дальше ещё relocations, расстановка которых тоже, в общем, АОР.
Читать полностью…
Дам несколько мыслей:
1. Иногда время исполнения хочется зашивать в семантику (условно, для симд)
2. Достаточно часто, операционная семантика слишком точная — нам нужно грубее. Ваш любимый пример с ostream.
3. В обратную сторону, не все желаемые свойства включены в операционную семантику (оптимизация не должна ломать внешние вызовы, например; или не должна ломать асм вставки)
Поэтому это вопрос сложный
Подумал, и осознал, что даже один обработчик может не композиться с самим собой. 😁 Ну, почти один...
Пусть мы написали обработчик, скажем, кнопки, который что-то берёт из контейнера, отправляет на сервер, и кладёт обратно результат:
function clickHandler() {
const curValue = globalStack.pop();
sendToTheServer(curValue, (response) => { globalStack.push(response.value); });
}
Это какая-то сильно сова на глобус натянута. Понятие аст здесь, кажется, слишком сложное и не нужно
Читать полностью…
Ну это и есть «часть вершин AST».
Читать полностью…
Кажется, хорошим примером здесь будет dprint. Там pointcut-ом является вызов любой функции (символа в бинарнике), или вызов сискола.
Читать полностью…