Мне нужно иметь возможность загружать файлы в строку во время компиляции с C ++? - PullRequest
0 голосов
/ 12 марта 2020

Мне нужен портативный кроссплатформенный способ загрузки текстовых файлов во время компиляции. Мое приложение представляет собой виртуальную машину для домена, специфицированного для c языка, который я написал, поэтому мне нужно внедрить файлы базового класса. Они не должны быть загружены во время выполнения. Возможно ли это с C / C ++ без необходимости использования сторонней библиотеки или инструмента.

Предположим, файл main.cpp выглядит следующим образом.

// load some core script
static constexpr std::string coreScript = LOAD_FILE("/path/to/lib/com/example/Person.mylang");

// main()
int main()
{
    // some setup function that returns an instance of the FFI
    MyLangEnv *env = mlvm_setup(); // some setup function that returns an instance of the FFI

    // register native Person type
    env->native()->type("com/example/Person", &Person::construct)
    ->property("firstName", &Person::firstName)
    ->property("lastName", &Person::lastName)
    ->property("age", &Person::age)
    ->method("speak", &Person::speak);
    ;

    // run script so that the class is exposed to runtime
    env->run()->mylangScript(coreScript);

    // now person can be instantiated
    Person *person = env->make()->object("com/example/Person", "Jane", "Doe", 22);
    assert(person);

    // set global
    env->set()->global("person", person);

    // eval
    env->eval("print(person.firstName)"); // outputs "Jane"

    // call speak()
    env->call()->property(person, "speak");


    // run gc() and destroy environment
    env->kill();
    return 0;
}

Я бы хотел, чтобы скрипт работал в сюда. Возможно ли это в C ++ таким образом, который также будет работать с Objective-C ++?

1 Ответ

0 голосов
/ 07 апреля 2020

Я последовал совету @TedLyngmo для решения этой проблемы.

В итоге я написал сценарий Python, который прошел через каталог для загрузки всех исходных файлов моего языка и сгенерировал большой файл C ++. содержит все данные, необходимые для использования в виртуальной машине во время выполнения. Я нашел ресурсы в Интернете, чтобы помочь мне с API, и у меня было некоторое знакомство с Python. Я использовал модуль os для получения всех файлов в каталоге и строковый метод endswith для проверки правильности расширения файла. Наконец, я сгенерировал новый файл через open ('путь / к / создан. cpp', 'w +'), если файл не существовал и открылся ('путь / к / создан. cpp', 'w') если бы он действительно существовал.

Я не понял, как заставить Xcode запускать скрипт python во время сборки, но я заставил его запустить bash. Я должен буду внести коррективы позже. Пока это работает отлично.

...