stringtranslate.com

Programación intencional

En programación informática , la programación intencional es un paradigma de programación desarrollado por Charles Simonyi que codifica en el código fuente del software la intención precisa que los programadores (o usuarios) tienen en mente al concebir su trabajo. Al utilizar el nivel apropiado de abstracción en el que piensa el programador, la creación y el mantenimiento de programas de computadora se vuelven más fáciles. Al separar las preocupaciones por las intenciones y cómo se operan, el software se vuelve más modular y permite un código de software más reutilizable.

La programación intencional fue desarrollada por el ex arquitecto jefe de Microsoft, Charles Simonyi , quien dirigió un equipo en Microsoft Research , que desarrolló el paradigma y construyó un entorno de desarrollo integrado (IDE) llamado IP (para programación intencional) que demostró el paradigma. Microsoft decidió no producir el paradigma de programación intencional, ya que a principios de la década de 2000 Microsoft estaba implementando C# y .NET para contrarrestar la adopción de Java. [1] Charles Simonyi decidió, con la aprobación de Microsoft, sacar su idea de Microsoft y comercializarla él mismo. Para ello fundó la empresa Intentional Software . Microsoft concedió la licencia de las patentes de Intentional Programming que Simonyi había adquirido mientras estaba en Microsoft, pero ningún código fuente, a Intentional Software.

En el capítulo 11 del libro Programación generativa: métodos, herramientas y aplicaciones se ofrece una descripción general de la programación intencional tal como se desarrolló en Microsoft Research . [2]

Ciclo de desarrollo

Según lo previsto por Simonyi, el desarrollo de una nueva aplicación a través del paradigma de programación intencional se realiza de la siguiente manera. Un programador construye un entorno similar a WYSIWYG que respalda el esquema y la notación del conocimiento empresarial para un dominio de problema determinado (como aplicaciones de productividad o seguros de vida). Luego, los usuarios utilizan este entorno para capturar sus intenciones, que se registran con un alto nivel de abstracción. El entorno puede operar según estas intenciones y ayudar al usuario a crear documentos semánticamente más ricos que pueden procesarse y ejecutarse, de forma similar a una hoja de cálculo . Los conocimientos registrados son ejecutados por un evaluador o se compilan para generar el programa final. Los cambios sucesivos se realizan únicamente al nivel WYSIWYG. A diferencia de los procesadores de texto, hojas de cálculo o software de presentación, un entorno intencional tiene más soporte para la estructura y la semántica de las intenciones que se expresarán y puede crear documentos interactivos que capturen con mayor riqueza lo que el usuario intenta lograr. Un caso especial es cuando el contenido es código de programa y el entorno se convierte en un IDE inteligente. [3]

Separar el almacenamiento y la presentación del código fuente

La clave de los beneficios de la programación intencional es que el código de dominio que captura las intenciones no se almacena en archivos de texto de código fuente , sino en un almacenamiento basado en árbol (puede ser binario o XML). La estrecha integración del entorno con el formato de almacenamiento aporta algunas de las mejores características de la normalización de bases de datos al código fuente . La redundancia se elimina dando a cada definición una identidad única y almacenando el nombre de las variables y operadores exactamente en un lugar. Esto hace que sea más fácil distinguir intrínsecamente declaraciones de referencias , y el entorno puede mostrarlas de manera diferente.

Los espacios en blanco en un programa tampoco se almacenan como parte del código fuente , y cada programador que trabaja en un proyecto puede elegir una visualización de sangría del código fuente. Las visualizaciones más radicales incluyen mostrar listas de declaraciones como cuadros anidados, editar expresiones condicionales como puertas lógicas o volver a representar nombres en chino.

El sistema utiliza un lenguaje normalizado para lenguajes populares como C++ y Java , al tiempo que permite a los usuarios del entorno mezclarlos y combinarlos con ideas de Eiffel y otros lenguajes. A menudo mencionada en el mismo contexto que la programación orientada a lenguajes a través de lenguajes de dominio específico y la programación orientada a aspectos , IP pretende proporcionar algunos avances en la programación generativa . Estas técnicas permiten a los desarrolladores ampliar el entorno del lenguaje para capturar construcciones de dominios específicos sin invertir en escribir un compilador y editor completo para ningún lenguaje nuevo.

Ejemplo de programación

Un programa Java que escribe los números del 1 al 10, usando una sintaxis de llaves , podría verse así:

 for ( int i = 1 ; i <= 10 ; i ++ ) { System . afuera . println ( "el numero es" + i ); }             

El código anterior contiene una construcción común de la mayoría de los lenguajes de programación , el bucle acotado, en este caso representado por la forconstrucción. El código, cuando se compila, vincula y ejecuta, se repetirá 10 veces, incrementando el valor de i cada vez después de imprimirlo.

Pero este código no capta las intenciones del programador, es decir, "imprimir los números del 1 al 10". En este caso simple, un programador al que se le pidiera mantener el código probablemente podría descubrir qué debe hacer, pero no siempre es tan fácil. Los bucles que se extienden a lo largo de muchas líneas o páginas pueden resultar muy difíciles de entender, especialmente si el programador original utiliza etiquetas poco claras. Tradicionalmente, la única forma de indicar la intención del código era agregar comentarios al código fuente , pero a menudo los comentarios no se agregan, no son claros o no están sincronizados con el código fuente que describieron originalmente.

En los sistemas de programación intencional, el bucle anterior podría representarse, en algún nivel, como algo tan obvio como " print the numbers 1 to 10". Luego, el sistema usaría las intenciones para generar código fuente, probablemente algo muy similar al código anterior. La diferencia clave es que los sistemas de programación intencional mantienen el nivel semántico del que carece el código fuente y que puede facilitar drásticamente la legibilidad en programas más grandes.

Aunque la mayoría de los lenguajes contienen mecanismos para capturar ciertos tipos de abstracción , IP, al igual que la familia de lenguajes Lisp, permite agregar mecanismos completamente nuevos. Por lo tanto, si un desarrollador comenzó con un lenguaje como C , podría ampliar el lenguaje con características como las de C++ sin esperar a que los desarrolladores del compilador las agreguen. Por analogía, los programadores podrían utilizar muchos mecanismos de expresión más potentes que meras clases y procedimientos .

Identidad

La propiedad intelectual se centra en el concepto de identidad . Dado que la mayoría de los lenguajes de programación representan el código fuente como texto sin formato , los objetos se definen por nombres y el compilador debe inferir su unicidad . Por ejemplo, se puede utilizar el mismo nombre simbólico para nombrar diferentes variables, procedimientos o incluso tipos. En un código que abarca varias páginas (o, para nombres globalmente visibles, varios archivos), puede resultar muy difícil saber qué símbolo se refiere a qué objeto real. Si se cambia un nombre, se debe examinar cuidadosamente el código donde se utiliza.

Por el contrario, en un sistema de propiedad intelectual, todas las definiciones no sólo asignan nombres simbólicos, sino también identificadores privados únicos a los objetos. Esto significa que en el entorno de desarrollo de IP, cada referencia a una variable o procedimiento no es sólo un nombre, es un vínculo a la entidad original.

La principal ventaja de esto es que si se cambia el nombre de una entidad, todas las referencias a ella en el programa siguen siendo válidas (lo que se conoce como integridad referencial ). Esto también significa que si se usa el mismo nombre para definiciones únicas en diferentes espacios de nombres (como " .to_string()"), las referencias con el mismo nombre pero con identidad diferente no serán renombradas, como sucede a veces con la búsqueda/reemplazo en los editores actuales. Esta característica también facilita tener versiones del programa en varios idiomas; puede tener un conjunto de nombres en inglés para todas las definiciones, así como un conjunto de nombres en japonés que se pueden intercambiar a voluntad.

Tener una identidad única para cada objeto definido en el programa también facilita la realización de tareas de refactorización automatizadas , además de simplificar los registros de código en los sistemas de control de versiones . Por ejemplo, en muchos sistemas de colaboración de código actuales (por ejemplo, Git ), cuando dos programadores realizan cambios que entran en conflicto (es decir, si un programador cambia el nombre de una función mientras otro cambia una de las líneas de esa función), el sistema de versiones pensará que un programador creó una nueva función mientras que otro modificaba una función antigua. En un sistema de control de versiones de IP, sabrá que un programador simplemente cambió un nombre mientras que otro cambió el código.

Niveles de detalle

Los sistemas IP también ofrecen varios niveles de detalle, lo que permite al programador "acercar" o alejar. En el ejemplo anterior, el programador podría alejarse para obtener un nivel que diría algo como:

<<imprime los números del 1 al 10>>

Por lo tanto, los sistemas IP se autodocumentan en gran medida, lo que permite al programador mantener una buena imagen de alto nivel del programa en su conjunto.

Trabajos similares

Hay proyectos que explotan ideas similares para crear código con mayor nivel de abstracción. Entre ellos están:

Ver también

Referencias

  1. ^ "Simonyi explica: 'No era práctico, cuando Microsoft estaba logrando enormes avances con .Net en el corto plazo, enviar de alguna manera a alguien de la misma organización que dijera: "No es así como debes hacer las cosas, ¿y si ¿Hiciste las cosas de esta otra manera, más disruptiva?'" (Cita de "Anything You Can Do, I Can Do Meta", martes 9 de enero de 2007, Scott Rosenberg , Technology Review . Archivado el 20 de septiembre de 2020 en archive.today )
  2. ^ Programación generativa: métodos, herramientas y aplicaciones , por Krzysztof Czarnecki y Ulrich Eisenecker, Addison-Wesley , Reading, MA , EE. UU., junio de 2000.
  3. ^ Scott Rosenberg: "Todo lo que puedas hacer, yo puedo hacerlo Meta". Technology Review , 8 de enero de 2007. Archivado el 20 de septiembre de 2020 en archive.today

enlaces externos