Управление потоком программы через адресатов памяти в c/c++

Извините, если название немного неясно, я не носитель языка, и у меня возникли проблемы с формулировкой моей идеи...

Предполагая, что у меня есть все необходимые функции и объекты для набора процедур, которые должны быть выполнены, скомпилированы и созданы в памяти, и что я знаю их адреса и размеры, как я могу управлять потоком программы с помощью псевдо «двоичного» файла, который в основном скрипт, который говорит: «вставьте эти данные в адрес этой функции, вызовите этот адрес функции, вставьте возвращаемое значение в этот адрес функции» и так далее...

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

Спасибо!

РЕДАКТИРОВАТЬ: пожалуйста, опубликуйте несколько фрагментов кода, прежде чем закрыть мой вопрос как дубликат вопроса, который на самом деле не предоставляет конкретной информации, которая мне нужна.

EDIT2: добавлено из комментария ниже, возможно, это внесет больше ясности в мой вопрос:

Вместо компиляции целых программ я стараюсь использовать предварительно скомпилированные компоненты для создания динамических объектов на ходу. Деревья объектов могут сериализоваться на диск и мгновенно воссоздаваться (размещая все дерево в пуле, а не объект за объектом), поэтому у меня есть способ создать динамическую программу, сохранить ее на диск и реконструировать в памяти с помощью все идентификаторы времени разработки заменены их адресами. ТЕПЕРЬ все, что мне нужно, это способ заставить работать всю эту структуру программы.


person dtech    schedule 17.01.2012    source источник
comment
возможный дубликат Как написать интерпретатор?   -  person parapura rajkumar    schedule 17.01.2012
comment
Моя первая реакция заключается в том, что вы должны либо писать здесь машинный код, либо использовать интерпретируемый язык и полностью забыть о байт-кодах.   -  person Mark B    schedule 17.01.2012
comment
@Mark B - Машинный код будет специфичным для машины и не переносимым, я хочу, чтобы код был родным для моих компонентов, поэтому, если компоненты скомпилированы на другом компьютере, можно использовать один и тот же переносимый управляющий код.   -  person dtech    schedule 17.01.2012
comment
Так вы знаете их адреса и размеры? Если вы также знаете их типы, вы можете просто привести адреса к функциям и вызвать их.   -  person PeterT    schedule 17.01.2012
comment
К OP: вы, кажется, зациклились на некоторых деталях реализации (адреса, размеры) для чего-то, что вы еще не реализовали. Возможно, перестаньте беспокоиться об этих мелких деталях и сначала объясните реальные требования. Вы говорите о том, что звучит как граф объектов, который вы хотите (де) сериализовать, а затем приравниваете его к исполняемой программе. Что это обозначает? Какое отношение эти структуры данных имеют к вашему коду и потоку управления?   -  person Useless    schedule 17.01.2012
comment
Размер не имеет значения, моя система передает только указатели, и они приводятся на место, это устраняет безопасность типов, но это то, чем управляют на этапе проектирования, а не во время выполнения. Я думаю, что я должен реализовать функцию function, чтобы я мог инициировать выполнение программы.   -  person dtech    schedule 17.01.2012
comment
@ddriver, не могли бы вы опубликовать схему расположения этих двоичных объектов в памяти или добавить описание того, как вы сериализуете эти объекты, чтобы мы действительно знали, с чем имеем дело, потому что ваши описания очень общие, поэтому мы можем дать вам только общее совет.   -  person PeterT    schedule 17.01.2012


Ответы (2)


Похоже, вам нужно написать эмулятор для машины, язык которой вы хотите интерпретировать. Вот ссылка, объясняющая, как это сделать.

person user1118321    schedule 17.01.2012
comment
Я не хочу эмулировать какую-либо другую машину, я просто хочу получить доступ к скомпилированным функциям моих программных объектов. Как вставлять данные в указатели на функции и вызывать указатели на функции... - person dtech; 17.01.2012
comment
Возможно, я просто не понимаю, что вы пытаетесь сделать, но когда вы говорите: «В основном мне нужно обрабатывать псевдо-«машинный» код для доступа и динамического управления набором взаимосвязанных объектов и статической логики через их адреса памяти, это похоже, вам нужно эмулировать машину. Можете ли вы описать более подробно, что вы пытаетесь сделать, если это не так? Например, вы можете вызывать функции, которые написали сами, с помощью указателей на функции, но я не знаю, достаточно ли этого для того, что вы пытаетесь сделать, или нет, поскольку я не совсем понимаю, что вы пытаетесь сделать. - person user1118321; 17.01.2012
comment
Ну, это действительно сложно объяснить. Вместо компиляции целых программ я стараюсь использовать предварительно скомпилированные компоненты для создания динамических объектов на ходу. Деревья объектов могут сериализоваться на диск и мгновенно воссоздаваться (размещая все дерево в пуле, а не объект за объектом), поэтому у меня есть способ создать динамическую программу, сохранить ее на диск и реконструировать в памяти с помощью все идентификаторы времени разработки заменены их адресами. ТЕПЕРЬ все, что мне нужно, это способ заставить работать всю эту структуру программы. - person dtech; 17.01.2012
comment
@ddriver, вы всегда можете записать его на место и преобразовать в свой тип, но если это не одна вложенная структура, вам придется иметь дело с указателями/ссылками, которые больше недействительны, если вы не сохраните их как смещения и не прочитаете их в их новый корень памяти. Кроме того, почему бы вам не использовать dll в качестве предварительно скомпилированных компонентов? - person PeterT; 17.01.2012
comment
@PeterT - я уже выполнил расчет размера + выравнивание для объектов, идея в основном состоит в том, чтобы сделать то же самое, что и компилятор, чтобы сложить объекты, сжать их и выделить / освободить память для всей процедуры. Я могу построить программу в памяти, но у меня проблемы с доступом к ней, так как логика доступа не должна быть жестко запрограммирована, в качестве метафоры я уже установил все плитки домино, чтобы они выпадали правильно, но теперь мне нужно инициировать процесс... Жаль, что я не могу объяснить это лучше... - person dtech; 17.01.2012

По сути, это то, что делает виртуальная машина Java, которую, как мне кажется, другие называют машиной. Это интерпретатор, который, вероятно, вам нужно построить.

Предполагая, что я понимаю, что вы сказали - ответ нет, не так. Вам нужно будет что-то сделать, чтобы создать состояние программы и управлять логическим потоком, что и делают интерпретаторы и «машины».

Вам понадобится внешний интерфейс, который читает ваш файл кода, файл, который сообщает программе, как работать. Ваш внешний интерфейс читает «логический файл», затем выполняет логику, которую ваш внешний интерфейс только что научился вызывать для каждого из ваших объектов. Вы можете создать это, связав смарт-плагины, которые делают то же самое, т.е. построить состояние программы из ваших объектов. Но тогда вам понадобится куча разных плагинов, по одному на каждый экземпляр.

В любом случае невозможно связать ваши объекты, а затем ожидать, что они будут знать, кто в каком порядке работает, а кто нет. Вы должны как-то перевести «умство» вашего файла в действие. Одно только связывание не поможет, потому что вы хотите, чтобы смарт-объекты были внешними по отношению к вашей библиотеке объектов.

person jim mcnamara    schedule 17.01.2012
comment
Вы, кажется, в целом поняли мою мысль. Я еще не реализовал связывание, но это не должно быть так сложно, любое дерево программ, которое # включает модуль, проверит банк модулей для этого модуля, и если объект уже существует как реализация, существующие адреса возвращаются для использования по связанному экземпляру. Если нет, то вставляется реализация объекта, а затем связывается с его экземпляром. По крайней мере, таково общее представление... - person dtech; 17.01.2012