Как стать автором
Обновить

Комментарии 5

ещё есть tinycc в виде библиотеки, с компиляцией выражения в нативный код.

Можно ссылку на репозиторий или статью?

https://bellard.org/tcc/

examples/libtcc_test.c

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

    TCCState *s = tcc_new();
    tcc_set_output_type(s, TCC_OUTPUT_MEMORY);
    tcc_compile_string(s, "int x = (20+1)*2;");
    tcc_relocate(s, TCC_RELOCATE_AUTO);
    int answer = *(int*)tcc_get_symbol(s,"x");
    tcc_delete(s);

    printf("%d", answer);

если целиком с99 кажется несколько избыточным для "калькулятора", есть ещё Lua, интерпретатор целиком вместе со всей, хоть и немногочисленной её стандартной библиотекой, в единственный 64кБ .exe вроде ещё недавно помещался (правда возможно не без помощи какого-нибудь upx).

ну или вот ещё похожее упражнение в минимализме,

https://github.com/rswier/c4

Как по памяти или инъекции кода? И ещё по собственным функциям? Насколько понимаю это выражения с++?

По памяти скорее всего так себе, с инъекцией кода всё хорошо, ну то есть очень плохо, это ведь тупо компилятор С99, хоть и в какой-то степени огороженный, если ему функций не давать, но вот скомпилировать *(int *) 0 = 1/0;, и потом выполнить со всеми вытекающими последствиями, пожалуй, помешать ему нельзя.

Чтобы совсем огородить надо засунуть выполнение собственно вычисления в какую-нибудь виртуальную машину типа той же Lua или с4, что на быстродействии не самым положительным образом скажется.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории