Язык, на котором все компилируется - PullRequest
1 голос
/ 05 августа 2011

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

По сути, мне нужен случайный код для максимально возможной компиляции (или интерпретации). Это означает, что некомпилируемые части будут игнорироваться, и только скомпилированные части будут создавать объекты (которые могут быть запущены).

Объектно-ориентированное не является обязательным, но является очень сильным преимуществом.

Я думал о ASM, но он очень грязный, и мне, вероятно, понадобится более читаемый код

Спасибо!

Ответы [ 5 ]

3 голосов
/ 05 августа 2011

Похоже, вы делаете что-то очень похожее на генетическое программирование ;даже если вы этого не сделаете, GP должен решить некоторые из тех же проблем, используя случайность для создания правильных программ.Подход к этому, который обычно используется, заключается в работе с синтаксическим деревом: вместо хранения x + y * 3 - 2 вы сохраняете что-то вроде следующего:

A sample syntax tree.

Затем вместо случайногоизменяя синтаксис, вместо этого можно произвольно менять узлы в дереве.И если x случайным образом изменится, скажем, на +, вы можете статически знать, что это означает, что вам нужно вставить двух дочерних элементов (или нет, в зависимости от того, как вы определяете +).

Aхорошим выбором для языка, с которым можно работать, был бы любой диалект Lisp.В Лиспе вышеприведенная программа будет иметь вид (- (+ x (* y 3)) 2), который представляет собой просто линеаризацию синтаксического дерева с использованием скобок для отображения глубины.И на самом деле, Lisps предоставляет эту функцию: вы можете так же легко работать с объектом '(- (+ x (* y 3)) 2) (обратите внимание на начальную цитату).Это список из трех элементов, первый элемент которого - -, второй элемент - другой список, а третий элемент - 2.И, хотя вы можете или не захотите этого для своего конкретного приложения, есть функция eval, такая, что (eval '(- (+ x (* y 3)) 2)) будет принимать в указанном списке, обрабатывать его как дерево / программу синтаксиса Lisp и оценивать его.Это то, что делает Лиспс таким привлекательным для такой работы;Синтаксис Lisp - это, по сути, повторение синтаксического дерева, и если вы работаете на уровне синтаксического дерева, вы можете работать с кодом, как если бы это было значение.Lisp не поможет вам читать /dev/random как программу напрямую, но с небольшой интерпретацией, расположенной сверху, вы сможете получить то, что хотите.

Я должен также упомянуть, хотя я незнаю что-нибудь об этом (не то, что я знаю много об обычном генетическом программировании) о существовании линейного генетического программирования .Это что-то вроде упомянутой вами модели сборки - линейный поток очень, очень простых инструкций.Преимущество здесь может заключаться в том, что если вы работаете с /dev/random или чем-то подобным, объем необходимой интерпретации очень мал;как вы упомянули, недостатком будет низкоуровневая природа кода.

2 голосов
/ 05 августа 2011

Я не уверен, что это то, что вы ищете, но любой язык программирования можно заставить работать таким образом.Для любого языка программирования P определите язык P всегда следующим образом:

  • Если p является допустимой программой на P, то p является действительной программой на P всегда, значение которого совпадает со значением в P.
  • Если p не допустимая программа в P, то p является допустимой программой в P всегда значение которого совпадает со значением программы, которая немедленно завершает работу.

Например, я мог бы сделать язык C ++ всегда , чтобы эта программа:

#include <iostream>
using namespace std;

int main() {
    cout << "Hello, world!" << endl;
}

скомпилируется как «Hello, world!», А эта программа:

Hahaha!  This isn't legal C++ code!

будет легальной программой, которая просто ничего не делает.

Чтобы решить исходную проблему, просто возьмителюбой язык ООП, такой как Java, Smalltalk и т. д., и создайте из него соответствующий язык Java всегда , Smalltalk всегда и т. д.Опять же, я не уверен, что это вообще то, что вы ищете, но это можно сделать очень легко.

В качестве альтернативы, попробуйте найти грамматику для любого языка ООП и затем использовать эту грамматику для полученияслучайные синтаксически допустимые программы.Затем вы можете отфильтровать эти программы, используя язык программирования P всегда для этого языка, чтобы исключить синтаксически, но не семантически допустимые программы.

0 голосов
/ 05 августа 2011

Текстовые редакторы

Вы можете попробовать передать произвольные строки символов в редактор, такой как Emacs или VI. Многие (большинство?) Персонажей будут выполнять действия по редактированию, но некоторые ничего не будут делать (кроме звукового сигнала, возможно). Вы должны убедиться, что мутатор случайного кода никогда не генерирует последовательность символов, которая выходит из редактора. Однако этот опыт очень похож на программирование машины Тьюринга - код не слишком читабелен.

Mathematica

В Mathematica неопределенные символы и другие выражения оцениваются без ошибок. Таким образом, этот язык может быть жизнеспособным выбором, если вы можете сделать так, чтобы мутатор случайного кода всегда генерировал правильно сформированные выражения. Это было бы легко достижимо, так как основной синтаксис Mathematica тривиален, что облегчает работу с синтаксическими единицами, а не на уровне символов. Было бы еще проще, если бы мутатор был написан в самой Mathematica, поскольку выражение выражения - сильная сторона Mathematica. Вы можете определить мини-язык допустимых операций в пакете Mathematica, который не импортирует системные символы. Это позволит вам генерировать правильно сформированные выражения для вашего сердца, не опасаясь генерировать опасные выражения, такие как DeleteFile[FileNames["*.*", "/", Infinity]].

0 голосов
/ 05 августа 2011

Разделите значения байтов ASCII на 9 классов (деление по модулю 9 поможет). Затем назначьте кодовые слова Brainfuck (см. http://en.wikipedia.org/wiki/Brainfuck).. Затем интерпретируйте как Brainfuck.

Итак, любая последовательность символов ASCII - это программа. Не то чтобы он делал что-то разумное ... Этот подход имеет гораздо больше шансов, по сравнению с ответом templatetypedef, получить нетривиальную программу из случайной последовательности байтов.

0 голосов
/ 05 августа 2011

Я считаю, Common Lisp должен соответствовать вашим потребностям. У меня всегда есть какой-то код в моей сессии SLIME / Emacs, который не компилируется. Вы всегда можете настроить вещи, переопределить функции во время выполнения. На самом деле это очень хорошо для прототипирования.

Несколько лет назад мне потребовалось много времени, чтобы учиться. Но сейчас у нас есть быстрый список, и все стало намного проще.

Здесь я опишу свою среду разработки: Установить lisp на мою машину с Linux

PS: Я хочу привести пример, в котором мне был полезен Common Lisp: Вплоть до 2004 года я писал небольшие программы на C (простой способ Unix).

Последние 3 года мне приходилось запускать много разного оборудования. Моторизованные сцены, научные камеры, IO карты.

Камеры оказались довольно раздражающими. Обычно их приходится охлаждать до -50 градусов по Цельсию или около того, и (в некоторых SDK) им не нравится, когда вы их закрываете. Но это именно так работал мой цикл разработки на C: запись (30 с), компиляция (1 с), запуск (0,1 с), повтор.

В конце концов я решил просто использовать Common Lisp. Часто довольно просто определить интерфейсы внешних функций для взаимодействия с SDK, и я могу сделать это, даже не выходя из запущенного образа Lisp. Утром я запускаю редактор, определяю функцию «открыть устройство», разговариваю с устройством, и через 3 часа у меня достаточно реализованных функций для настройки усиления, температуры, области интереса и получения видео.

Тогда я часто могу убрать руководство по SDK и просто использовать камеру.

Я использовал тот же подход интерактивного программирования, когда мне нужно проанализировать какую-то веб-страницу или какой-то странный XML.

...