Есть ли что то вроде api, который позволял бы компилировать программу из под исполняемого файла?
Я гуглил, но не смог найти ничего дельного. Правильно ли я понимаю, что никакого простого способа нет, и надо либо связывать программу с опенсорс кодом (типа https://github.com/gcc-mirror/gcc), вызывая функции оттуда (Придется очень долго разбираться), либо довольствоваться вызовами system() ?
Евгений Шатунов, Pet-проект. Пишу инструмент командной строки, который по плану нужен для создания программ под UEFI. Парсинг конфига уже есть, инциализация проекта тоже, а вот со сборкой проблемы
Василий Васильков, ты сейчас описал то, что ты вообще делаешь. Но саму задачу, для решения которой тебе хочется встроить транслятор кода в свой код, ты еще не описал.
С момента постановки вопроса и твоего комментария я пока могу точно сказать что тебе не нужно то, что ты спрашиваешь. Дело в том, что практически все начинающие программисты довольно быстро приходят к описанному у тебя в вопросе желанию, но даже получив эту функциональность они все равно и всегда не могут решить свою задачу.
Поэтому важно понять именно саму задачу, которую ты хочешь решить через интеграцию в свой код транслятора.
В качестве подкрепления своих слов я могу сказать что уже делал JIT-транслятор из скриптового языка в машинные команды прямо на лету для своего проекта. Я знаю о чем спрашиваю и могу помочь.
Мне нужно скомпилировать каждый из файлов с определенными параметрами в объектный файл, и слинковать это все вместе с несколькими дополнительными файлами. (https://wiki.osdev.org/GNU-EFI, если интересно). Это не интерпретатор, а именно сборщик. Я бы мог сделать что то вроде system(fileForBuild), но это будет "неприлично" по отношению к производительности, тк файлов может быть огромное количество, и в цикле таким образом собирать будет очень странно.
Василий Васильков, это значит что ты хочешь решить задачу, которую уже решили.
Такие инструменты называются системами сборки. Конфигурация для таких систем называется сценариями сборки.
Дело твое, конечно. make или msbuild уже решили эту задачу за тебя. Если тебе так сильно нужно самому все это сделать, то хоть почитай как это сделано у них.
Василий Васильков, ну обычно любой бинарник (артифакт) имеет рукотворную природу. Человек его создал. Упаковал в пакет для дистрибуции в Windows/Linux репозитариях. Подписал своими подписями. И положил в правильное место где все могут загрузить и проверить сертификаты на достоверность. После этого бинарь попадает в антивирусные базы. Проверяется и получает хеши где написано что бинарь чистый. И ему можно доверять.
Вот. А если вы создали технологию которая позволяет 100500 раз в сутки фабриковать бинарники. То надо подумать как эту технологию защитить от хакерских атак. Ведь не очень сложно подать ей на вход скрипт который будет собран и выполнен на доверенном сервере. С браузерами вот - такая же история. Их пристально изучают с каждой новой версией и злоумышленники и безопасники. И смысл этого изучения - просто предотвратить запуск бинарника любой ценой. Вот. Как только кто-то получит возможность исполнять произвольные бинарники в браузере - все! Капец вашим деньгам! Скопируют все из Моих Документов а остаток диска зашифруют. Вобщем веселые праздники после нового года будут обеспечены.
Но это я так. Ворчу. Вобщем если скажите что предусмотрели защиту - то хорошо.
mayton2019, Защита никакая, собственно, и не нужна. У моей штуковины только один итоговый формат (прочитайте в самом первом ответе на комментарий) - EFI файл, у которого как минимум нет main-функции в обычном представлении (Поправьте, если я не прав). Т.е. _start у него есть, но он тупо не пройдет верификацию системы как "исполняемый файл", соответственно, запуска не будет, а тестируется он через эмулятор без системы.
Если я не прав, то это нужно фиксить, правда, каким образом - идей у меня пока нет.
так же для работы с исходниками существуют библиотеки, позволяющие проанализировать код и работать с его структурой, например для поиска и рефакторинга (на их основе делают ide)