Здравствуйте, Sinclair, Вы писали:
V>>RTFM чего именно?
S>Истории Паскаля.
Да плевать конкретно на Паскаль, серьёзно.
Ни первый в плане P-кода, ни наиболее широко в реальных применениях его использовавший.
V>>Сам же привёл пример конкретной системы gemstone, т.е. имелась ввиду соответствующая инфраструктура в этой системе.
S>Инфраструктура построена на каких-то основах.
Я перечислял необходимые и достаточные св-ва такой системы в посте, на который ты отвечаешь (ниже по тексту).
Приводил примеры на различных технологиях — нейтивных, джава, .Net и смешанных.
S>>>Ну, так как мне воспользоваться этим кодом изнутри VB?
V>>Языками более низкого уровня.
V>>Или расписать некий фреймворк оперирования памятью в некоей библиотеке и сделать импорт функций в VB (есть такая возможность), чтобы иметь требуемый инструментарий.
V>>Например, можно взять готовую либу CRT.
S>Давайте пример кода на VB, который при помощи готовой либы CRT отправляет пользовательский предикат на сервер для исполнения.
Тут ты потерял контекст, речь шла об произвольном управлении памятью, в т.ч. многопоточной (в VB можно задать тип аппартамента для компонент).
Показать как в VB делать импорт ф-ий из DLL?
Напомнить, что в VB есть модификатор ByRef, т.е. даже можно пользовать даже такие "железячные" примитивы как InterlockedIncrement и прочие из этой оперы.
Насчёт отправить код куда-то для исполнения — примеры приводил ниже: ActiveX компоненты в браузере.
Сколько их было написано именно на VB — одному богу известно. ))
Еще на VB легко запустить удалённую прогу (COM+) и общаться с ней, делая удалённые вызовы.
V>>Потому что в объектных файлах содержится код и данные со всей сопутствующей метаинформацией.
S>Это совершенно никак не связано с возможностями по манипуляции кодом как данными изнутри языка программирования.
Очень смелое или очень странное утверждение, на выбор. ))
Вот есть открытый проект llvm, в состав проекта входит ВСЯ функциональность оперирования над кодом виртуальной машинки, включая эмулятор этой машинки и JIT.
Есть фронтенды с разных языков, включая С++.
Народ подключает это в свои проекты и балуется:
https://habr.com/ru/company/timeweb/blog/572878/
Ну или можно взять открытый код WASM, ядро которого к браузеру нифига не привязано.
S>Я не понимаю, почему эта очевидная вещь до вас не доходит.
До меня не доходит, где ты видишь технические проблемы.
S>Компиляция в .obj была принята для практически 100% языков программирования; при этом возможностей мета-манипуляций в рантайме не было практически нигде.
В смысле? ))
Оперирование над obj-файлми — это свободно доступная библиотечная функциональность.
Я уверен, что поставь тебе такую задачу (отправлять код для исполнения на сервер) ты бы сегодня справился, пусть даже не с полутыка, бо в нейтиве не трудишься, но в итоге справился бы. И ответил бы сам себе на все эти вопросы по ходу решения задачи.
Лично я бы взял за основу для нейтива llvm или wasm, т.к. степень готовности к таким задачам там 100%.
V>>Если требуется посылать код другому устройству, то требуется переносимость кода.
S>В первую очередь требуется возможность этот код описать в посылаемом виде.
Опиши ф-ии, оформи их в бинарный модуль, передай модуль на противоположную сторону (это может быть и сервером, и клиентом) с идентификатором вызываемой ф-ии или без идентификатора, если есть некие соглашения об именовании "Предиката" в модуле.
Ну и некая обвязка для кеширования модулей, их идентификации и версионности.
В древних COM+/ActiveX всё это есть.
Сейчас то же самое пилят на wasm.
Разумеется, по мере набора оборотов этой технологией, её будут использовать не только в браузере, но круг решенных в рамках этой технологии задач покрывает достаточно широкий круг задач.
V>>Я уже начинаю подозревать, что ты видишь возможность переносимости кода только в виде его AST-представления.
S>Вы перескакиваете через ступеньку, пытаясь рассуждать об исполнении, как будто возможность породить такой код у вас есть.
Конечно, такая возможность есть.
В чём проблема скомпилять бинарный модуль под llvm или wasm на С++ или Rust?
S>Во-вторых, для систем типа GemStone возможность получить код в виде AST, а не байт-кода, является необходимостью.
Это частности.
Под JS-Нодой можно прям исходники гонять туда-сюда.
(и всеми другими динамическими языками, в которых присутствует eval или его аналог)
Под джавой, дотнетом, llvm и wasm можно гонять скомпилённые бинарники абстрактной машинки.
Во времена засилья Windows в и-нете гоняли бинарники под архитектуру i386 в виде ActiveX.
S>Потому, что предикат не исполняется напрямую. СУБД на основе предиката строит план исполнения запроса, в котором одна часть предиката будет ключом поиска в индексе, другая будет фильтром по этому индексу, а третья будет вычисляться по связанной с индексом таблице. Это вам ликбез на пальцах.
Пфф, это не ликбез, это опущенное тобой условие конкретно этой задачи. ))
Я думал речь о чём-то навроде хранимок на .Net.
Достаточно было правильно сформулировать задачу: "Требуется именно AST выражения".
Это в разы более простая задача.
На том же Форт это решается через макросы — перехватывается вход и далее слова можно "записывать" в некую свою структуру.
На плюсах аналогичные решения есть в библиотеке Boost.Proto в связке с Boost.Mpl, Boost.Fusion и прочих библиотек для метапрограммирования.
В чём суть:
— есть некие плейсхолдеры (_, _1, _2 и т.д.) которые представляют из себя "начальные" типы с переопределёнными всеми операторами.
Каждый оператор порождает очередной узел AST, у которого так же переопределены все допустимые для данного типа узла операторы.
Выглядит это примерно так:
auto avg = (_1 + _2) / 2;
assert(avg(1, 3) == 2);
bool is_equal(double x, double y) {
return std::fabs(x - y) < std::numeric_limits<double>::epsilon();
}
assert(is_equal(avg(5.0, 6.0), 5.5));
Получившееся значение (здесь переменная avg) — это аналог expression tree в дотнете.
Выражение может состоять из вложенных вызовов подобных ф-ий.
Есть биндинг, разумеется, в том числе частичный, т.е. весь аппарат функций высших порядков.
Это выражение может исполняться через operator(), т.е. просто вызываться как ф-ия с аргументами.
Выражение можно инспектировать с целью узнать структуру.
Останется вопрос сериализации и десериализации такого AST для передачи другой стороне.
S>Предикат, записанный в виде императивного байт-кода, таким преобразованиям поддаётся плохо либо никак.
Учись спрашивать.
Хотя, т.к. было несколько пинг-понгов и мы рассуждали более одного раза про P-код и абстрактные машинки, думаю, ты сознательно не уточнял задачу, примериваясь к путям отступления, т.е. смотря куда нелегкая в споре занесёт.
Но у тебя их нет, путей отступления.
Их нет намного раньше, чем в дотнете появились expression tree, не знал? ))
Понятно, что ты был не в курсе, т.к. за другими технологиями особо не следишь...
Мог бы просто спросить "а как получить AST выражения в С++?", потому что "отправить удалённо" — это ненужный информационный шум к такой задаче.
Boost.Proto is a framework for building Embedded Domain-Specific Languages in C++.
It provides tools for constructing, type-checking, transforming and executing expression templates.
More specifically, Proto provides:
— An expression tree data structure.
— A mechanism for giving expressions additional behaviors and members.
— Operator overloads for building the tree from an expression.
— Utilities for defining the grammar to which an expression must conform.
— An extensible mechanism for immediately executing an expression template.
— An extensible set of tree transformations to apply to expression trees.