Я готов признать, что мои знания Лиспа крайне минимальны. Однако я очень интересуюсь языком и планирую серьезно заняться им в ближайшем будущем. Мое понимание этих вопросов, без сомнения, ошибочно, поэтому, если я скажу что-то явно неправильное, прокомментируйте и исправьте меня, а не голосуйте против.
Истинно гомоиконические и самомодифицируемые языки
Я ищу примеры языков программирования, которые поддерживают как гомоиконность (код имеет то же представление, что и данные), так и неограниченную самомодификацию (неограниченная означает, что вы может изменить каждый аспект вашего работающего кода, а не просто испустить новый код или изменить указатели / делегаты функций.)
Я нашел только три примера, которые соответствуют этим критериям:
Почему Лиспа нет в этом списке
Лиспа нет в этом списке, потому что мне кажется, что Лисп только почти гомоиконный и поддерживает только ограниченную самомодификацию. Вы можете сделать что-то вроде
(+ 1 2 3)
, которое будет делать то же самое, что и
(eval '(+ 1 2 3))
. В первой версии (+ 1 2 3)
- это необработанный код, тогда как во второй версии это данные. Допуская истинность этого утверждения, можно утверждать, что Lisp даже не гомиконичен. Код имеет то же представление, что и данные, в том смысле, что они оба являются списками / деревьями / S-выражениями. Но тот факт, что вы должны явно указать, какие из этих списков / деревьев / S-выражений являются кодом, а какие - данными, мне кажется, говорит о том, что Lisp в конце концов не гомиконичен. Представления очень похожи, но они отличаются крошечными деталями, которые вы должны сказать, имеете ли вы дело с кодом или данными. Это ни в коем случае не плохо (на самом деле все остальное было бы безумием), но подчеркивает разницу между Лиспом и машинным кодом. В машинном коде вам не нужно явно указывать, какие числа являются инструкциями, какие - указателями, а какие - данными.Все является просто числом до тех пор, пока на самом деле не потребуется интерпретация, и тогда это может быть любая из этих вещей.
Это еще более веский довод против неограниченной самомодификации. Конечно, вы можете взять список, представляющий некоторый код, и манипулировать им. Например, изменение
'(+ 1 2 3)
на
'(+ 1 4 3)
И затем вы запускаете его через eval
. Но когда вы это делаете, вы просто компилируете код и запускаете его. Вы не изменяете существующий код, вы просто создаете и запускаете новый код. C # может делать то же самое, используя деревья выражений, даже в менее удобном формате (что возникает из-за того, что код C # имеет другое представление по сравнению с его AST, в отличие от Lisp, который является собственным AST) . Можете ли вы взять весь исходный файл и начать изменять весь исходный файл по мере его выполнения, при этом изменения, внесенные в исходный файл, будут влиять на поведение программы в реальном времени?
Если нет какого-либо способа сделать это, Lisp является ни гомиконный, ни самомодифицирующийся. (Чтобы отложить спор по поводу определений, Лисп не гомоиконичен или самомодифицируется в той же степени, что и машинный код. )
Способы сделать Лисп гомоиконным / неограниченно самомодифицируемым
Я могу увидеть 3 возможных способа сделать Лисп таким же гомиконным / самомодифицируемым, как машинный код.
Пункт 1. в сочетании с 2. приведет к полностью самомодифицирующемуся Лиспу. При условии, что описанная волшебная машина на Лиспе может быть произведена. 2. сам по себе может создать самомодифицирующийся Лисп, однако реализация на архитектуре фон Неймана может быть крайне неэффективной.
Вопросы
Приложение
Языки с неограниченной самомодификацией, но без гомиконности
Другие концепции и языки, которые могут быть в той или иной степени актуальными / интересными: Lisp, Ruby, Snobol, Forth и его метапрограммирование во время компиляции, Smalltalk и его отражение, нетипизированное лямбда-исчисление со свойством, что все является функцией (что подразумевает, что если предположить, что мы могли бы изобрести машину, которая непосредственно выполняет лямбда-исчисление, лямбда-исчисление будет гомоиконным, и машинный код фон Неймана не будет работать на указанной машине. [И теорема Годельса будет выполнима. Ха-ха, страшная мысль: P])