Code_as_data
Code as data
Principle of interchangeability of data and code
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.[citation needed] 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]