Articulo de referencia

Código como datos

En informática, la expresión «código como datos» se refiere a la idea de que el código fuente escrito en un lenguaje de programación puede manipularse como datos, como una secue...

En informática, la expresión «código como datos» se refiere a la idea de que el código fuente escrito en un lenguaje de programación puede manipularse como datos, como una secuencia de caracteres o un árbol de sintaxis abstracta (AST), y que solo tiene una semántica de ejecución en el contexto de un compilador o intérprete determinado . [ 1 ] Esta noción se usa a menudo en el contexto de lenguajes tipo Lisp que utilizan expresiones S como su sintaxis principal, ya que escribir programas usando listas anidadas de símbolos hace que la interpretación del programa como un AST sea bastante transparente (una propiedad conocida como homoiconicidad ). [ 2 ] [ 3 ]

Estas ideas se utilizan generalmente en el contexto de lo que se denomina metaprogramación , que consiste en escribir programas que tratan a otros programas como si fueran sus datos. [ 4 ] [ 5 ] Por ejemplo, el código como datos permite la serialización de funciones de primera clase de forma portable. [ 6 ] Otro caso de uso es almacenar un programa en una cadena, que luego es procesada por un compilador para producir un ejecutable. [ 4 ] Con mayor frecuencia, existe una API de reflexión que expone la estructura de un programa como un objeto dentro del lenguaje, reduciendo la posibilidad de crear un programa mal formado. [ 7 ]

En teoría computacional , el segundo teorema de recursión de Kleene proporciona una forma de código-es-datos, al demostrar que un programa puede tener acceso a su propio código fuente. [ 8 ]

El concepto de código como datos es también un principio de la arquitectura de Von Neumann , ya que tanto los programas como los datos almacenados se representan como bits en el mismo dispositivo de memoria. [ 4 ] Esta arquitectura ofrece la posibilidad de escribir código automodificable . Sin embargo, también conlleva el riesgo de seguridad de disfrazar un programa malicioso como datos de usuario y, posteriormente, utilizar una vulnerabilidad para dirigir la ejecución hacia dicho programa. [ 9 ]

Datos como código

En la programación declarativa , el principio de datos como código (DaC) se refiere a la idea de que una estructura de datos arbitraria puede exponerse utilizando una semántica de lenguaje especializada o una API. Por ejemplo, una lista de enteros o una cadena son datos, pero en lenguajes como Lisp y Perl, pueden ingresarse y evaluarse directamente como código. [ 1 ] Los scripts de configuración , los lenguajes específicos de dominio y los lenguajes de marcado son casos en los que la ejecución del programa se controla mediante elementos de datos que no son claramente secuencias de comandos. [ 10 ] [ 11 ]

Referencias

  1. 1 2 Poletto, Massimiliano A. (septiembre de 1999). Soporte de lenguaje y compilador para la generación dinámica de código (PDF) (PhD). MIT. pág.  20. Hasta que se compila dinámicamente, el código dinámico son datos. De manera similar, las listas en Lisp y las cadenas en Perl son datos, pero pueden evaluarse como código.
  2. Plusch, Mike (febrero de 2004). "ConciseXML se basa en las cualidades importantes de XML y las expresiones S" . XML Journal . 5 (2). Gale Academic OneFile: 20+ . Recuperado el 14 de enero de 2023. Las expresiones S, o expresiones simbólicas, son la sintaxis de los lenguajes tipo Lisp, incluido Scheme. Básicamente, las expresiones S son listas anidadas de símbolos. Las expresiones S se utilizan con lenguajes que admiten la noción de que el código es datos.
  3. Riehl, Jonathan (22 de octubre de 2006). «Asimilación de MetaBorg: Integración de herramientas de lenguaje en lenguajes». Actas de la 5.ª conferencia internacional sobre programación generativa e ingeniería de componentes . págs. 21-28 . doi : 10.1145/1173706.1173710 . ISBN  1595932372. S2CID 11111101 . Las comunidades de Lisp y Scheme son una excepción, ya que tienden a aferrarse a la idea de que el código son datos e implementan una gran parte de su lenguaje en un lenguaje central más pequeño. 
  4. 1 2 3 Klockner, Andreas; Pinto, Nicolás; Lee, Yunsup; Catanzaro, Bryan; Ivanov, Pablo; Fasih, Ahmed (marzo de 2012). "PyCUDA y PyOpenCL: un enfoque basado en secuencias de comandos para la generación de código en tiempo de ejecución de GPU". Computación Paralela . 38 (3): 157– 174. arXiv : 0911.3456 . doi : 10.1016/j.parco.2011.09.001 . S2CID 18928397 . 
  5. ^ Wu, Chaur (2010). "Metaprogramación". Pro DLR en .NET 4 . págs. 185-210 . doi : 10.1007/978-1-4302-3067-0_8 . ISBN  978-1-4302-3066-3.
  6. Tack, Guido; Kornstaedt, Leif; Smolka, Gert (marzo de 2006). "Generic Pickling and Minimization" . Electronic Notes in Theoretical Computer Science . 148 (2): 79– 103. doi : 10.1016/j.entcs.2005.11.041 .
  7. VanderHart, Luke; Sierra, Stuart (2010). "Macros y metaprogramación". Practical Clojure . pp. 167–178 . doi : 10.1007/978-1-4302-7230-4_12 . ISBN  978-1-4302-7231-1.
  8. Panangaden, Prakash. "Notas sobre el teorema de recursión" (PDF) . COMP 330 Teoría de la Computación . Universidad McGill . Consultado el 15 de enero de 2023 .
  9. Bohme, Rainer; Moore, Tyler (26 de agosto de 2013). "Una breve introducción a la seguridad de la información" (PDF) .
  10. ^ Zills, Fabián; Schäfer, Moritz; Tovey, Samuel; Kästner, Johannes; Holm, cristiano (2024). "ZnTrack: datos como código". arXiv : 2401.10603 [ cs.SE ].
  11. "Shuttle-hq/Synth" . GitHub .