Разрешает ли какой-либо компилятор с таргетингом C встроенный C? - PullRequest
2 голосов
/ 14 марта 2020

Некоторые C компиляторы испускают язык ассемблера и позволяют фрагментам сборки быть встроенными в исходный код, чтобы дословно скопировать их в вывод, например, https://gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html

Некоторые компиляторы для языков более высокого уровня испускают C, начиная от Nim, который был в некоторой степени разработан для этого, до Scheme, который совершенно точно не был и требует герои c усилий для компиляции в эффективный код таким способом.

Допускают ли какие-либо такие компиляторы аналогичным образом помещать фрагменты C в строку в исходном коде, чтобы дословно скопировать их в вывод?

1 Ответ

1 голос
/ 15 марта 2020

Я не уверен, что понимаю, что вы подразумеваете под «быть скопированными дословно», но все C компиляторы (msv c, g cc, clang, et c ...) иметь директивы препроцессора, которые по существу позволяют добавлять фрагменты кода в исходные файлы для компиляции. Например, директива #include извлечет содержимое указанного файла для включения в компиляцию. «Эффектом» этого является то, что вы можете делать странные вещи, такие как:

printf("My code: \n%s\n",
#include "/tmp/somefile.c"
);

В качестве альтернативы, создание макросов с помощью директивы #define позволяет заменять фрагменты кода путем вызова имени макроса. Все это происходит на этапе препроцессора перед переходом в «выходные данные компиляции».

Другие языки, такие как c# с roslyn, позволяют компилировать код во время выполнения. Конечно, вы также можете реализовать то же самое в c, вызвав ваш компилятор, например, через system(), а затем загрузив полученную библиотеку с помощью dlopen.

Редактировать: Теперь что я возвращаюсь и думаю об этом вопросе, я должен также отметить, что python является одним из тех C -целевых «компиляторов» (я думаю, технически интерпретатор поверх python среды выполнения). Python давайте использовать собственный скомпилированный код C с некоторыми кодами py API для экспорта функций или напрямую с некоторыми помощниками типа dlopen. Взгляните на inline c module , который делает то, что я описал выше (вызовите компилятор, а затем загрузите скомпилированный код). Я полагаю, у вас должна быть возможность выполнять аналогичные функции с любым языком, который может вызывать c скомпилированный код (c#, java, et c ...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...