Code as data explained
In computer science, the expression code as data refers to the idea that source code written in a programming language can be manipulated as data, such as a sequence of characters or an abstract syntax tree (AST), and it has an execution semantics only in the context of a given compiler or interpreter.[1] The notion is often used in the context of Lisp-like languages that use S-expressions as their main syntax, as writing programs using nested lists of symbols makes the interpretation of the program as an AST quite transparent (a property known as homoiconicity).[2] [3]
These ideas are generally used in the context of what is called metaprogramming, writing programs that treat other programs as their data.[4] [5] For example, code-as-data allows the serialization of first-class functions in a portable manner.[6] Another use case is storing a program in a string, which is then processed by a compiler to produce an executable.[4] More often there is a reflection API that exposes the structure of a program as an object within the language, reducing the possibility of creating a malformed program.[7]
In computational theory, Kleene's second recursion theorem provides a form of code-is-data, by proving that a program can have access to its own source code.[8]
Code-as-data is also a principle of the Von Neumann architecture, since stored programs and data are both represented as bits in the same memory device.[4] This architecture offers the ability to write self-modifying code. It also opens the security risk of disguising a malicious program as user data and then using an exploit to direct execution to the malicious program.[9]
Data as Code
In declarative programming, the Data as Code (DaC) principle refers to the idea that an arbitrary data structure can be exposed using a specialized language semantics or API. For example, a list of integers or a string is data, but in languages such as Lisp and Perl, they can be directly entered and evaluated as code.[1] Configuration scripts, domain-specific languages and markup languages are cases where program execution is controlled by data elements that are not clearly sequences of commands.[10] [11]
Notes and References
- PhD . Poletto . Massimiliano A. . Language and compiler support for dynamic code generation . September 1999 . 20 . MIT. EN . until it is dynamically compiled, dynamic code is data. Similarly, lists in Lisp and strings in Perl are data, but they can be evaluated as code.
- Plusch. Mike. ConciseXML builds upon the important qualities of XML and S-Expressions. XML Journal. 5. 2. February 2004. 20+. Gale Academic OneFile. 14 January 2023. S-Expressions, or symbolic expressions, is the syntax behind Lisp-like languages, including Scheme. Basically, S-Expressions are nested lists of symbols. S-Expressions are used with languages that support the notion that code is data..
- Book: Riehl . Jonathan . Proceedings of the 5th international conference on Generative programming and component engineering . Assimilating MetaBorg:: Embedding language tools in languages . 22 October 2006 . 21–28 . 10.1145/1173706.1173710 . 1595932372 . 11111101 . The Lisp and Scheme communities are an exception, since they tend to hold closely to the idea that code is data, and implement a large portion of their language in a smaller core language..
- Klöckner . Andreas . Pinto . Nicolas . Lee . Yunsup . Catanzaro . Bryan . Ivanov . Paul . Fasih . Ahmed . PyCUDA and PyOpenCL: A Scripting-Based Approach to GPU Run-Time Code Generation . Parallel Computing . March 2012 . 38 . 3 . 157–174 . 10.1016/j.parco.2011.09.001 . 0911.3456 . 18928397 .
- Book: Wu . Chaur . Pro DLR in .NET 4 . Metaprogramming . 2010 . 185–210 . 10.1007/978-1-4302-3067-0_8. 978-1-4302-3066-3 .
- Tack . Guido . Kornstaedt . Leif . Smolka . Gert . Generic Pickling and Minimization . Electronic Notes in Theoretical Computer Science . March 2006 . 148 . 2 . 79–103 . 10.1016/j.entcs.2005.11.041. free .
- Book: VanderHart . Luke . Sierra . Stuart . Macros and Metaprogramming . Practical Clojure . 2010 . 167–178 . 10.1007/978-1-4302-7230-4_12. 978-1-4302-7231-1 .
- Web site: Panangaden . Prakash . Notes on the recursion theorem . COMP 330 Theory of Computation . McGill University . 15 January 2023.
- Web site: Bohme . Rainer . Moore . Tyler . A Brief Introduction to Information Security . 26 August 2013.
- https://arxiv.org/abs/2401.10603
- https://github.com/shuttle-hq/synth