В информатике выражение код как данные относится к идее, что исходный код, написанный на языке программирования, может обрабатываться как данные, такие как последовательность символов или абстрактное синтаксическое дерево (AST), и он имеет семантику выполнения только в контексте данного компилятора или интерпретатора . [1] Это понятие часто используется в контексте Lisp -подобных языков, которые используют S-выражения в качестве своего основного синтаксиса, поскольку написание программ с использованием вложенных списков символов делает интерпретацию программы как AST довольно прозрачной (свойство, известное как гомоиконичность ). [2] [3]
Эти идеи обычно используются в контексте того, что называется метапрограммированием , написанием программ, которые рассматривают другие программы как свои данные. [4] [5] Например, код как данные позволяет сериализовать функции первого класса переносимым образом. [6] Другой вариант использования — сохранение программы в строке, которая затем обрабатывается компилятором для создания исполняемого файла. [4] Чаще всего существует API рефлексии , который раскрывает структуру программы как объект внутри языка, уменьшая вероятность создания некорректной программы. [7]
В вычислительной теории вторая рекурсивная теорема Клини обеспечивает форму кода-есть-данные, доказывая, что программа может иметь доступ к своему собственному исходному коду. [8]
Код-как-данные также является принципом архитектуры фон Неймана , поскольку хранимые программы и данные представлены в виде битов в одном и том же устройстве памяти. [4] Эта архитектура предоставляет возможность писать самомодифицирующийся код . [ требуется цитирование ] Она также открывает риск безопасности, связанный с маскировкой вредоносной программы под пользовательские данные и последующим использованием эксплойта для прямого выполнения вредоносной программы. [9]
В декларативном программировании принцип « Данные как код» (DaC) относится к идее, что произвольная структура данных может быть представлена с использованием специализированной языковой семантики или API. Например, список целых чисел или строка — это данные, но в таких языках, как Lisp и Perl, их можно напрямую вводить и оценивать как код. [1] Скрипты конфигурации , предметно-ориентированные языки и языки разметки — это случаи, когда выполнение программы контролируется элементами данных, которые явно не являются последовательностями команд. [10] [11]
пока он не будет динамически скомпилирован, динамический код является данными. Аналогично, списки в Lisp и строки в Perl являются данными, но их можно оценить как код
-выражения, или символические выражения, — это синтаксис языков типа Lisp, включая Scheme. По сути, S-выражения представляют собой вложенные списки символов. S-выражения используются с языками, которые поддерживают представление о том, что код — это данные.
Сообщества Lisp и Scheme являются исключением, поскольку они, как правило, придерживаются идеи, что код — это данные, и реализуют большую часть своего языка на меньшем базовом языке.