Мутация на основе llvm для генетического программирования?

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

Я нашел llvm-mutate, что весьма полезно для выполнения точечных мутаций. Насколько я понял, инструкции получают счет/пронумерованы, тогда можно указать, например, удалите пронумерованную инструкцию.

Однако введение новых инструкций представляется возможным как одно из доступных в коде операторов. Однако настоящая мутация позволила бы вставить любую из разрешенных IR-инструкций, независимо от того, как она использовалась в коде, который должен быть мутирован. Кроме того, должно быть возможно вставить вызовы библиотечных функций связанных библиотек (не используемые в текущем коде, но возможно доступные, поскольку lib был связан в clang).

Я пропустил это в мутации llvm или пока это невозможно?

Существуют ли какие-либо проекты, пытающиеся/уже реализующие (ed) такие мутации для llvm?

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

Спасибо Alex

Ответ 1

Очень интересный вопрос. Меня заинтриговала возможность делать генетическое программирование на двоичном уровне некоторое время. Что касается того, что вы спрашиваете:

Из их документации видно, что LLVM-mutate не может делать то, что вы просите. Тем не менее, я думаю, что это разумно для этого не делать. Мое рассуждение состоит в том, что любая машинная математическая программа неизбежно столкнется с проблемой "Проблема с остановкой" . было бы невозможно узнать, будет ли случайная сгенерированная инструкция полностью разбивать весь компьютер (например, назначая значение OS-зарезервированному указателю), или он может запускаться вечно и принимать все ваши циклы процессора. Теорема Тьюринга говорит нам, что невозможно заранее знать, сможет ли данная программа сделать это. Имейте в виду, что LLVM-mutate может привести к тому, что совершенно безобидная программа все равно будет терпеть крах или работать навсегда, но я думаю, что их подход делает его менее вероятным, только принимая существующие инструкции.

Однако такая вещь, как "невозможность", только сдерживает ученых, а не инженеров: -)...

То, о чем я думал, таково: в природе настоящие мутации работают намного больше, как LLVM-mutate, которые, как и мы, в обычном генетическом программировании. Другими словами, они просто меняют буквы из очень ограниченного набора (A, T, C, G), и из этого вытекает все возможные варианты. У нас может быть программа или набор программ с исходным набором инструкций, а также набор "возможных функций", связанных или определенных в программе. Большинство из этих функций фактически не использовались бы, но они будут там, чтобы обеспечить "сырую ДНК" для мутаций, как в нашей ДНК. Этот набор функций будет иметь полный (или полузаполненный) набор возможных функций для проблемного пространства. Затем мы просто используем базовые операции, подобные тем, которые выполняются в LLVM-mutate.

Некоторые возможные проблемы:

  • Учитывая количество возможной изменчивости, единственный способ приемлемое время выполнения было бы иметь огромное количество вычислительная мощность. Вероятно достижимо в Облаке или с графическими процессорами.

  • Вам все равно придется бороться с проблемой г-на Тьюринга. Однако я думаю, что это можно было бы решить, выполнив решения в "Песочница", которая не подведет вас, если решение взорвется: Что-то вроде одноразовой виртуальной машины или Docker-like контейнер, с ограничением по времени (для выхода из бесконечных циклов). решение, которое приведет к сбоям или сбоям, станет наихудшим пригодности, чтобы программы имели тенденцию отклоняться от тех пути.

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

Я думаю, что здесь есть потенциальный проект с открытым исходным кодом. Это было бы безумным, опасным и зависящим от времени вихрем: просто мой проект. Зачислите меня, если кто-то это сделает.