stringtranslate.com

Код как данные

В информатике выражение код как данные относится к идее, что исходный код, написанный на языке программирования, может обрабатываться как данные, такие как последовательность символов или абстрактное синтаксическое дерево (AST), и он имеет семантику выполнения только в контексте данного компилятора или интерпретатора . [1] Это понятие часто используется в контексте Lisp -подобных языков, которые используют S-выражения в качестве своего основного синтаксиса, поскольку написание программ с использованием вложенных списков символов делает интерпретацию программы как AST довольно прозрачной (свойство, известное как гомоиконичность ). [2] [3]

Эти идеи обычно используются в контексте того, что называется метапрограммированием , написанием программ, которые рассматривают другие программы как свои данные. [4] [5] Например, код как данные позволяет сериализовать функции первого класса переносимым образом. [6] Другой вариант использования — сохранение программы в строке, которая затем обрабатывается компилятором для создания исполняемого файла. [4] Чаще всего существует API рефлексии , который раскрывает структуру программы как объект внутри языка, уменьшая вероятность создания некорректной программы. [7]

В вычислительной теории вторая рекурсивная теорема Клини обеспечивает форму кода-есть-данные, доказывая, что программа может иметь доступ к своему собственному исходному коду. [8]

Код-как-данные также является принципом архитектуры фон Неймана , поскольку хранимые программы и данные представлены в виде битов в одном и том же устройстве памяти. [4] Эта архитектура предоставляет возможность писать самомодифицирующийся код . [ требуется цитирование ] Она также открывает риск безопасности, связанный с маскировкой вредоносной программы под пользовательские данные и последующим использованием эксплойта для прямого выполнения вредоносной программы. [9]

Данные как код

В декларативном программировании принцип « Данные как код» (DaC) относится к идее, что произвольная структура данных может быть представлена ​​с использованием специализированной языковой семантики или API. Например, список целых чисел или строка — это данные, но в таких языках, как Lisp и Perl, их можно напрямую вводить и оценивать как код. [1] Скрипты конфигурации , предметно-ориентированные языки и языки разметки — это случаи, когда выполнение программы контролируется элементами данных, которые явно не являются последовательностями команд. [10] [11]

Ссылки

  1. ^ ab Poletto, Massimiliano A. (сентябрь 1999 г.). Язык и поддержка компилятора для динамической генерации кода (PDF) (PhD). MIT. стр. 20. пока он не будет динамически скомпилирован, динамический код является данными. Аналогично, списки в Lisp и строки в Perl являются данными, но их можно оценить как код
  2. ^ Plusch, Mike (февраль 2004 г.). "ConciseXML строится на важных качествах XML и S-выражений". XML Journal . 5 (2). Gale Academic OneFile: 20+ . Получено 14 января 2023 г. S -выражения, или символические выражения, — это синтаксис языков типа Lisp, включая Scheme. По сути, S-выражения представляют собой вложенные списки символов. S-выражения используются с языками, которые поддерживают представление о том, что код — это данные.
  3. ^ Риль, Джонатан (22 октября 2006 г.). «Усваивание MetaBorg:: Встраивание языковых инструментов в языки». Труды 5-й международной конференции по генеративному программированию и компонентной инженерии . стр. 21–28. doi :10.1145/1173706.1173710. ISBN 1595932372. S2CID  11111101. Сообщества Lisp и Scheme являются исключением, поскольку они, как правило, придерживаются идеи, что код — это данные, и реализуют большую часть своего языка на меньшем базовом языке.
  4. ^ abc Клёкнер, Андреас; Пинто, Николас; Ли, Юнсуп; Катандзаро, Брайан; Иванов Павел; Фасих, Ахмед (март 2012 г.). «PyCUDA и PyOpenCL: подход к генерации кода во время выполнения графического процессора на основе сценариев». Параллельные вычисления . 38 (3): 157–174. arXiv : 0911.3456 . doi :10.1016/j.parco.2011.09.001. S2CID  18928397.
  5. ^ Ву, Чаур (2010). «Метапрограммирование». Про DLR в .NET 4 . стр. 185–210. дои : 10.1007/978-1-4302-3067-0_8. ISBN 978-1-4302-3066-3.
  6. ^ Tack, Guido; Kornstaedt, Leif; Smolka, Gert (март 2006 г.). «Generic Pickling and Minimization» (Общее травление и минимизация). Electronic Notes in Theoretical Computer Science (Электронные заметки по теоретической информатике) . 148 (2): 79–103. doi : 10.1016/j.entcs.2005.11.041 .
  7. ^ Вандерхарт, Люк; Сьерра, Стюарт (2010). «Макросы и метапрограммирование». Practical Clojure . С. 167–178. doi :10.1007/978-1-4302-7230-4_12. ISBN 978-1-4302-7231-1.
  8. ^ Панангаден, Пракаш. «Заметки о теореме рекурсии» (PDF) . COMP 330 Теория вычислений . Университет Макгилла . Получено 15 января 2023 г. .
  9. ^ Бёме, Райнер; Мур, Тайлер (26 августа 2013 г.). «Краткое введение в информационную безопасность» (PDF) .
  10. ^ https://arxiv.org/abs/2401.10603
  11. ^ https://github.com/shuttle-hq/synth