Информация об изменениях

Сообщение Re[12]: понимание ООП Алана Кея от 24.03.2023 12:02

Изменено 24.03.2023 14:14 vdimas

Re[12]: понимание ООП Алана Кея
Здравствуйте, Ночной Смотрящий, Вы писали:

S>>>В раннем дотнете рефлексия была, а кода-как-данных не было.

V>>И как же Reflector работал? ))
НС>Фигово. Делать на основе этого решения, не связанные с реверс-инжинирингом было невозможно.

Фиговость проистекает из очевидного — CLI-машинка разрабатывалась не как привязанная конкретно к языку C#.
Если бы привязанность была, было бы меньше допущений, меньше инструкций (часть из них были бы более высокоуровневые), существовало бы однозначное отображение байт-кода на C#.
А так-то, разумеется, можно породить такой байт-код, который не маппится на валидный C#.
Это был просто пример, который показывает суть — не всегда требуется хранить граф AST в явном виде.


V>>А всякие AOP-ориентированные расширения?

НС>А это вообще не про код как данные.

Однако, они работали уже над бинарным кодом когда-то до Рослина. ))


V>>При наличии взаимно-однозначного отображения кода на AST

НС>Не было такого. Очень похоже — да, но 100% точности не было.

Мы тут о Смолтолке рассуждали и вообще о стековых машинках.
Просто стековые машинки дотнета и джавы не являются функционально-чистыми стековыми машинками — в них выделение ячеек стека может происходить без инициализации ячеек, то бишь, в стек кладутся не результаты вычислений, а просто может быть зарезервировано место. Такие операции относятся к "служебным", явно в код не отображаются, могли бы обыгрываться уже на уровне JIT... Просто тогда JIT вынужден был бы отжирать больше ресурсов, в общем, сплошные компромисс на компромиссе. ))

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

И еще момент, походу, Синклер упустил важное — для передачи графа-AST "куда-то" (именно графа) его надо сериализовать и затем десериализовать.

В случае стековой машинки код уже хранится как сериализованный, т.е. это его естественное представление.
Соответственно, ни стадии сериализации (как разрушение "объемной структуры"), ни стадии десериализации (как восстановления этой структуры) не требовалось.

Т.е., в случае стековой машинки трасформацию графа AST можно выполнять прямо над сериализованным представлением.
Собсно, именно так и работает бета-редукция в функциональных языках.
Re[12]: понимание ООП Алана Кея
Здравствуйте, Ночной Смотрящий, Вы писали:

S>>>В раннем дотнете рефлексия была, а кода-как-данных не было.

V>>И как же Reflector работал? ))
НС>Фигово. Делать на основе этого решения, не связанные с реверс-инжинирингом было невозможно.

Фиговость проистекает из очевидного — CLI-машинка разрабатывалась не как привязанная конкретно к языку C#.
Если бы привязанность была, было бы меньше допущений, меньше инструкций (часть из них были бы более высокоуровневые), существовало бы однозначное отображение байт-кода на C#.
А так-то, разумеется, можно породить такой байт-код, который не маппится на валидный C#.
Это был просто пример, который показывает суть — не всегда требуется хранить граф AST в явном виде.


V>>А всякие AOP-ориентированные расширения?

НС>А это вообще не про код как данные.

Однако, они работали уже над бинарным кодом когда-то до Рослина. ))


V>>При наличии взаимно-однозначного отображения кода на AST

НС>Не было такого. Очень похоже — да, но 100% точности не было.

Мы тут о Смолтолке рассуждали и вообще о стековых машинках.
Просто стековые машинки дотнета и джавы не являются функционально-чистыми стековыми машинками — в них выделение ячеек стека может происходить без инициализации ячеек, то бишь, в стек кладутся не результаты вычислений, а просто может быть зарезервировано место. Такие операции относятся к "служебным", явно в код не отображаются, могли бы обыгрываться уже на уровне JIT... Просто тогда JIT вынужден был бы отжирать больше ресурсов, в общем, сплошные компромисс на компромиссе. ))

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

И еще момент, походу, Синклер упустил важное — для передачи графа-AST "куда-то" (именно графа) его надо сериализовать и затем десериализовать.

В случае стековой машинки код уже хранится как сериализованный, т.е. это его естественное представление.
Соответственно, ни стадии сериализации (как разрушения "объемной структуры"), ни стадии десериализации (как восстановления этой структуры) не требовалось.

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