Можно ли создать пользовательский тип данных на языке, подобном C / C ++ (или, может быть, любой) из строки в качестве пользовательского ввода или из файла

Ну, это может быть очень странный вопрос, но мое любопытство сильно ударило по этому вопросу. Так что вот так …

НОТА: Давайте рассмотрим язык C здесь.

Как программисты мы обычно определяем определяемый пользователем тип данных (скажем, struct) в исходном коде с соответствующим именем.
Предположим, у меня есть программа, в которой у меня есть структура, определенная как:

struct Animal {
char *name;
int lifeSpan;
};

А также я приступил к выполнению этой программы.
Теперь мой вопрос здесь;
Что если я захочу определить новую структуру под названием «Plant» так же, как «Animal», упомянутую выше в моей программе, без записи ее определения в самом исходном коде (что в настоящее время, очевидно, невозможно), а скорее из строки ввода пользователя (или ввод файла) во время выполнения.

Допустим, моя программа берет входную строку из текстового файла с именем file1.txt чье содержание:

struct Plant {
char *name;
int lifeSpan;
};

Теперь я хочу, чтобы в моей программе была новая структура «Завод», которая уже выполняется. Программа должна прочитать содержимое файла и создать структуру, как написано в файле, и прикрепить ее к себе на ходу.

Я проверил решение для C ++ в обсуждении Объявление типа данных динамически в C ++ но, похоже, нет очень убедительного решения.

Решение, которое я ищу, находится на уровне компилятора-компоновщика-загрузчика, а не на самом языке.
Я был бы очень рад и благодарен, если кто-то с нетерпением ждет возможности поделиться своими идеями по этому вопросу.

0

Решение

То, о чем вы спрашиваете, это в основном «можем ли мы реализовать C как язык сценариев?», Поскольку это единственный способ, которым код может быть выполнен после компиляции.

Я знаю, что люди писали (в основном в комментариях), что это возможно на других языках, но не возможно в C, поскольку C — это скомпилированный язык (следовательно, типы данных должны быть определены во время компиляции).

Тем не менее, насколько мне известно, это действительно возможно (и может быть не так сложно, как можно было бы представить).

Существует много возможных подходов (эмуляция машинного кода (VM), JIT-компиляция и т. Д.).

Один подход будет использовать компилятор C для компиляции скрипта C в качестве внешней динамической библиотеки (.dll на окнах, .so в Linux и т. д.), а затем «загрузить» скомпилированную библиотеку и выполнить код (это в значительной степени подход JIT-компиляции для ленивых людей).


РЕДАКТИРОВАТЬ:

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

Исходный код не будет знать об этом новом типе, только новый код (или библиотека) будет «знать» об этом новом типе и сможет правильно его использовать.

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

Сам язык (язык Си) может управлять этой задачей динамически (во время выполнения).

Рассмотрим МРТ Руби, например. Язык Ruby поддерживает динамические типы, которые могут быть определены во время выполнения …

…Однако это реализовано в C, и можно использовать код из C для определения новых модулей и классов. Это не статические типы, которые можно тестировать во время компиляции (создание и идентификация типов выполняется во время выполнения).

Это прекрасный пример, показывающий, что C (как язык) может динамически определять «типы».

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]