Код как данные
В информатике выражение «код как данные» относится к идее, что исходным кодом, написанным на языке программирования, можно манипулировать как данными, такими как последовательность символов или абстрактное синтаксическое дерево (AST), и оно имеет семантику выполнения только в контекст данного компилятора или интерпретатора . [1] Это понятие часто используется в контексте Lisp -подобных языков, которые используют S-выражения в качестве основного синтаксиса, поскольку написание программ с использованием вложенных списков символов делает интерпретацию программы как AST достаточно прозрачной (свойство, известное как гомоиконичность ). [2] [3]
Эти идеи обычно используются в контексте так называемого метапрограммирования — написания программ, которые рассматривают другие программы как свои данные. [4] [5] Например, код как данные позволяет сериализовать первоклассные функции переносимым способом. [6] Другой вариант использования — сохранение программы в строке, которая затем обрабатывается компилятором для создания исполняемого файла. [4] Чаще всего существует API-интерфейс отражения , который представляет структуру программы как объект внутри языка, уменьшая возможность создания неправильной программы. [7]
В вычислений теории вторая теорема Клини о рекурсии обеспечивает форму «код-данные», доказывая, что программа может иметь доступ к своему собственному исходному коду. [8]
Код как данные также является принципом архитектуры фон Неймана , поскольку хранимые программы и данные представлены в виде битов в одном и том же устройстве памяти. [4] Эта архитектура предлагает возможность писать самомодифицирующийся код . [ нужна ссылка ] Это также создает угрозу безопасности, связанную с маскировкой вредоносной программы под пользовательские данные и последующим использованием эксплойта для прямого выполнения вредоносной программы. [9]
Данные как код
[ редактировать ]В декларативном программировании принцип « Данные как код» (DaC) относится к идее, что произвольная структура данных может быть представлена с использованием семантики специализированного языка или API. Например, список целых чисел или строка — это данные, но в таких языках, как Lisp и Perl, их можно напрямую вводить и оценивать как код. [1] Сценарии конфигурации , предметно-ориентированные языки и языки разметки — это случаи, когда выполнение программы контролируется элементами данных, которые не являются явно последовательностями команд. [10] [11]
Ссылки
[ редактировать ]- ^ Jump up to: а б Полетто, Массимилиано А. (сентябрь 1999 г.). Поддержка языка и компилятора для динамической генерации кода (PDF) (доктор философии). Массачусетский технологический институт. п. 20.
Пока он не скомпилирован динамически, динамический код является данными. Точно так же списки в Lisp и строки в Perl являются данными, но их можно оценивать как код.
- ^ Плюш, Майк (февраль 2004 г.). «ConsizedXML опирается на важные качества XML и S-выражений» . XML-журнал . 5 (2). Гейл Академический OneFile: 20+ . Проверено 14 января 2023 г.
S-выражения, или символические выражения, — это синтаксис, лежащий в основе Lisp-подобных языков, включая Scheme. По сути, S-выражения представляют собой вложенные списки символов. S-выражения используются в языках, поддерживающих представление о том, что код — это данные.
- ^ Рил, Джонатан (22 октября 2006 г.). «Ассимиляция MetaBorg:: Встраивание языковых инструментов в языки». Материалы 5-й международной конференции по генеративному программированию и компонентной инженерии . стр. 21–28. дои : 10.1145/1173706.1173710 . ISBN 1595932372 . S2CID 11111101 .
Сообщества Lisp и Scheme являются исключением, поскольку они, как правило, твердо придерживаются идеи, что код — это данные, и реализуют большую часть своего языка на меньшем базовом языке.
- ^ Jump up to: а б с Клёкнер, Андреас; Пинто, Николас; Ли, Юнсуп; Катандзаро, Брайан; Иванов Павел; Фасих, Ахмед (март 2012 г.). «PyCUDA и PyOpenCL: подход к генерации кода во время выполнения графического процессора на основе сценариев». Параллельные вычисления . 38 (3): 157–174. arXiv : 0911.3456 . дои : 10.1016/j.parco.2011.09.001 . S2CID 18928397 .
- ^ Ву, Чаур (2010). «Метапрограммирование». Про DLR в .NET 4 . стр. 185–210. дои : 10.1007/978-1-4302-3067-0_8 . ISBN 978-1-4302-3066-3 .
- ^ Так, Гвидо; Корнштадт, Лейф; Смолка, Герт (март 2006 г.). «Общее травление и минимизация» . Электронные заметки по теоретической информатике . 148 (2): 79–103. дои : 10.1016/j.entcs.2005.11.041 .
- ^ ВандерХарт, Люк; Сьерра, Стюарт (2010). «Макросы и метапрограммирование». Практический Clojure . стр. 167–178. дои : 10.1007/978-1-4302-7230-4_12 . ISBN 978-1-4302-7231-1 .
- ^ Панангаден, Пракаш. «Заметки о теореме рекурсии» (PDF) . COMP 330 Теория вычислений . Университет Макгилла . Проверено 15 января 2023 г.
- ^ Бёме, Райнер; Мур, Тайлер (26 августа 2013 г.). «Краткое введение в информационную безопасность» (PDF) .
- ^ https://arxiv.org/abs/2401.10603
- ^ https://github.com/shuttle-hq/synth