Articulo de referencia

Esqueleto (programación informática)

La programación esqueleto es un estilo de programación informática basado en estructuras de programa sencillas de alto nivel y el llamado código ficticio . Los esqueletos de pro...

La programación esqueleto es un estilo de programación informática basado en estructuras de programa sencillas de alto nivel y el llamado código ficticio . Los esqueletos de programa se asemejan al pseudocódigo , pero permiten analizar , compilar y probar el código. El código ficticio se inserta en un esqueleto de programa para simular el procesamiento y evitar mensajes de error de compilación . Puede incluir declaraciones de funciones vacías o funciones que devuelven un resultado correcto solo para un caso de prueba simple donde se conoce la respuesta esperada del código.

La programación esquemática facilita un enfoque de diseño descendente , donde se diseña y codifica un sistema parcialmente funcional con estructuras de alto nivel completas, y este sistema se expande progresivamente para cumplir con los requisitos del proyecto. Los esqueletos de programas también se utilizan a veces para descripciones de alto nivel de algoritmos . Un esqueleto de programa también puede utilizarse como plantilla que refleja la sintaxis y las estructuras comúnmente empleadas en una amplia gama de problemas.

Los programas esqueleto se utilizan en el patrón de diseño de método plantilla empleado en la programación orientada a objetos . En la programación orientada a objetos , el código ficticio corresponde a un método abstracto , un stub de método o un objeto simulado . En la nomenclatura de invocación remota de métodos de Java (Java RMI), un stub se comunica en el lado del cliente con un esqueleto en el lado del servidor . [ 1 ]

Un esqueleto de clase es un esquema que se utiliza en ingeniería de software . Contiene una descripción de las funciones de la clase y describe la finalidad de las variables y los métodos , pero no los implementa. La clase se implementa posteriormente a partir del esqueleto. En lenguajes que siguen un paradigma polimórfico, el esqueleto también puede denominarse interfaz o clase abstracta .

Fondo

El software moderno [ 2 ] suele ser complejo por diversas razones. Esto puede implicar que no un solo programador pueda desarrollarlo, o que otros módulos o partes deban importarse por separado. Los programas también pueden ser demasiado complejos por sí mismos, algunos con múltiples métodos que acceden a una sola variable simultáneamente o incluso que generan píxeles para pantallas. El código esqueleto se utiliza para ayudar a los programadores a desarrollar su código con la menor cantidad de errores durante la compilación .

El código esqueleto se encuentra con mayor frecuencia en la programación paralela , pero también se aplica en otras situaciones, como la documentación en lenguajes de programación . Esto ayuda a simplificar la funcionalidad principal de un método que podría resultar confuso. También se puede usar para permitir que una función pequeña dentro de un programa más grande opere temporalmente sin su funcionalidad completa. Este método de programación es más sencillo que escribir una función completa, ya que estas funciones esqueleto no tienen que incluir funcionalidades principales y, en cambio, se pueden codificar directamente para su uso durante el desarrollo. Generalmente, incluyen código sintácticamente correcto para introducir el método, así como comentarios para indicar el funcionamiento del programa. Esto no siempre es necesario para llamar a un fragmento de código esqueleto.

Relación con el pseudocódigo

Un ejemplo genérico de pseudocódigo

El pseudocódigo se encuentra con mayor frecuencia al desarrollar la estructura de un nuevo software . Es una representación en lenguaje sencillo de una función particular dentro de un sistema más amplio, o incluso puede ser una representación de un programa completo. El pseudocódigo es similar a la programación esqueleto, pero se diferencia en que es principalmente un método de programación informal. [ 3 ] El código ficticio también es muy similar, donde el código se usa simplemente como marcador de posición o para indicar la existencia prevista de un método en una clase o interfaz.

Los programadores informáticos dependen en gran medida del pseudocódigo, hasta el punto de que tiene un impacto medible en su psique . [ 3 ] Un programador típico está tan condicionado con la idea de escribir código simplificado de alguna manera, ya sea escribiendo pseudocódigo o código esqueleto, o incluso simplemente dibujando un diagrama, que esto tiene un impacto medible en la calidad de su implementación final. Esto se ha comprobado en diversas aplicaciones, con diferentes programadores que trabajan en distintos lenguajes y con diversos paradigmas de programación .

Este método de diseño de programas también se suele realizar con lápiz y papel, lo que aleja aún más el texto de lo que realmente se va a implementar. La programación esquelética imita este método, pero se diferencia en que se escribe habitualmente en un entorno de desarrollo integrado o en editores de texto . Esto facilita el desarrollo posterior del programa tras la fase de diseño inicial . Los programas esqueléticos también permiten que se ejecuten funciones sencillas.

Implementación

La programación básica se puede implementar en una variedad de aplicaciones de programación diferentes.

Documentación del lenguaje de programación

La mayoría de los lenguajes de programación, si no todos, cuentan con código base que facilita la definición de todas las funciones y métodos integrados . Esto proporciona una manera sencilla para que los programadores principiantes comprendan la sintaxis y la implementación prevista de los métodos escritos.

Java , un lenguaje orientado a objetos , se centra en gran medida en una página de documentación estructurada con métodos completamente separados para cada objeto que forma parte de los paquetes de Java. [ 4 ] Los lenguajes orientados a objetos se centran en una estructura jerárquica para sus implementaciones, en lugar del enfoque simple de arriba hacia abajo que se encuentra en otros lenguajes. Los "objetos" almacenan datos y variables, lo que permite escribir un programa generalmente más eficiente. Estos objetos tienen funciones individuales que pueden acceder a variables internas, conocidas como métodos.

Cada método se define con el mismo formato, mostrando claramente en la parte superior del bloque tanto el nombre del método como la sintaxis que se utilizará en un entorno de desarrollo integrado . Gracias al énfasis de Java en el ámbito , los tipos de datos y la herencia , esta sintaxis resulta extremadamente útil para programadores principiantes, e incluso para todos. A continuación, se ofrece una explicación detallada del funcionamiento del método, con los errores correspondientes.

Python utiliza un enfoque similar para documentar sus métodos integrados, aunque imita la falta de fijación del lenguaje en el ámbito y los tipos de datos. [ 5 ] Esta documentación incluye la sintaxis de cada método, junto con una breve descripción y un ejemplo de su uso típico. El código base proporcionado en el ejemplo permite a los programadores comprender la función rápidamente.

Definición de clase

Las clases escritas por desarrolladores externos, principalmente como parte de bibliotecas, también muestran su programación en forma de código esquemático. Esto ayuda a informar a quienes son nuevos en la biblioteca sobre cómo operan las funciones y los métodos. P5.Js utiliza este formato en su página de documentación para explicar el uso previsto de ciertas funciones incluidas. [ 6 ] Sin embargo , esto difiere de la documentación del lenguaje de programación , ya que utiliza código esquemático para mostrar parámetros en lugar de todos los usos posibles del método.

Las interfaces de lenguaje natural (ILN) se encuentran con mayor frecuencia en situaciones donde los programadores intentan tomar una entrada , generalmente denominada coloquialmente (sin usar jerga específica del lenguaje de programación ), y usarla para crear un programa o un método. Una implementación de esto utiliza un pequeño conjunto de código base para implicar la función que se ejecuta en segundo plano. [ 7 ]

Otras formas de NLI utilizan diferentes formas de entrada, desde usuarios que hablan distintos idiomas hasta entrada basada en gestos, para producir un resultado muy similar. Dado que los lenguajes de programación se desarrollan y escriben principalmente en inglés, a las personas que hablan otros idiomas les resulta difícil desarrollar software nuevo. En algunos estudios [ 8 ] se han utilizado NLI para ayudar a las personas en estas situaciones. El estudio mostró clases escritas en Java mediante el uso de NLI. Esto eliminó la necesidad de aprender reglas sintácticas, pero significó que la clase se escribió utilizando un conjunto básico de código base.

Definiciones basadas en polimorfismos

El polimorfismo es una ideología que sigue al paradigma de programación orientada a objetos , donde los métodos pueden ser sobrescritos o sobrecargados (métodos con el mismo nombre en una clase hija tendrán prioridad sobre un método escrito en una clase padre). La definición de métodos se basa en un marco esquelético definido por la sintaxis del lenguaje. [ 9 ]

De forma muy similar a la implementación de clases, el código esqueleto se puede utilizar para definir los métodos que forman parte de una interfaz . Una interfaz es esencialmente un plano de una clase, lo que permite a los lenguajes orientados a objetos estrictos (como Java ) utilizar clases de diferentes paquetes sin necesidad de comprender completamente las funciones internas. Las interfaces simplemente definen los métodos que deben estar presentes dentro de la clase, lo que permite a cualquier otra persona utilizar los métodos o implementar la clase para sus necesidades personales.

public skeletonExample ();

Una clase abstracta es prácticamente idéntica a una implementación de clase; sin embargo, dependiendo del lenguaje, al menos un método se define como abstracto. Esto implica que cualquier clase hija (que la herede o la implemente) debe tener un método definido para dicho método. Las clases abstractas tienen un estilo de definición muy similar al de las interfaces; no obstante, la palabra clave "abstract" se utiliza habitualmente para indicar que debe implementarse en las clases hijas.

public abstract skeletonExample ();

Estos ejemplos utilizan la sintaxis de Java .

Programación paralela

La programación paralela consiste en la ejecución simultánea de múltiples funciones, y se utiliza principalmente para aumentar la eficiencia. Estos son, por lo general, los tipos de programas más difíciles de desarrollar, debido a su complejidad y a su interconexión con el hardware en cuestión. Muchos desarrolladores han intentado escribir programas con esta funcionalidad básica, [ 10 ] pero los resultados han sido variados.

Los marcos de trabajo de esqueletos algorítmicos se utilizan en la programación paralela para describir de forma abstracta los métodos en cuestión para su posterior desarrollo. Estos marcos no se limitan a un solo tipo, y cada uno de ellos tiene diferentes propósitos para aumentar la eficiencia del programa del desarrollador. Se pueden clasificar en tres tipos principales: paralelismo de datos , paralelismo de tareas y resolución. [ 10 ]

Paralelismo de datos

Estos algoritmos básicos se utilizan para desarrollar programas que funcionan con software basado en grandes conjuntos de datos, generalmente identificando las conexiones entre los datos para su uso posterior. Los algoritmos de procesamiento paralelo de datos incluyen "mapeos", "bifurcaciones" y "reducciones" o "escaneos".

  • Los "mapas" son los algoritmos de paralelismo de datos más utilizados y, por lo general, implican una única operación aplicada a un gran conjunto de datos. Para aumentar la eficiencia, esta operación se aplica simultáneamente a varios conjuntos de datos antes de que estos se vuelvan a estructurar al final.
  • Las bifurcaciones son similares a los mapas, pero utilizan una operación diferente para ciertos tipos de datos. Esto se conoce como paralelismo de datos múltiples . [ 10 ]
  • Las operaciones de "reducción" o "escaneo" se utilizan para aplicar prefijos a un conjunto de datos antes de realizar cualquier operación sobre ellos. Se diferencian de las operaciones de "mapeo" en que generan resultados parciales durante la ejecución del método.

Paralelo de tareas

Estas operaciones, como su nombre indica, trabajan con tareas. Cada tipo de algoritmo es diferente debido a la variación en el comportamiento entre tareas. Los algoritmos de paralelismo de tareas incluyen secuenciales, encadenamientos, encadenamientos, condicionales (if), bucles (for) y bucles continuos (while).

  • 'Sequential' cierra y finaliza un conjunto anidado de algoritmos básicos. Los métodos y programas que forman parte de estos algoritmos básicos se incluyen como aspectos de finalización del programa, antes de su cierre.
  • Las "granjas" se conocen como grupos de tareas, trabajadores o como nodos maestro o esclavo de otra función. Completan las tareas asignadas replicándolas en múltiples hilos y ejecutándolos simultáneamente. Esto divide la carga de trabajo de cada hilo, creando así una relación maestro/esclavo entre ellos.
  • Los algoritmos en paralelo, conocidos como "pipes", se caracterizan por ejecutar cada método o función en una secuencia, siguiendo el orden en que el programador escribió su código. Paralelizan este proceso calculando simultáneamente diversas tareas sobre un conjunto de datos, generalmente de entrada, para mejorar el rendimiento y la velocidad. Cada cálculo simultáneo se denomina etapa. El algoritmo en paralelo puede anidarse, de modo que una etapa se encuentra dentro de otra, dividiendo así sus responsabilidades para aumentar la velocidad y el número de etapas.
  • La instrucción 'If' divide las tareas del programa de forma condicional, dividiendo un conjunto de código base en dos secciones principales. Se le proporciona una instrucción condicional al programa, definiendo así un algoritmo específico a seguir.
  • La instrucción 'for' ejecuta una tarea varias veces, según lo especifique el programador, lo que permite un código más eficiente. El número de veces que se ejecuta el código es un valor preestablecido, lo que significa que no se puede modificar durante la ejecución . La tarea debe completarse el número de veces indicado.
  • El bucle `while` es muy similar al bucle `for`, donde una tarea se completa varias veces. Sin embargo, en los algoritmos `while`, el programa realiza la tarea varias veces antes de que se cumpla una condición. Esto significa que el algoritmo `while` puede realizar su tarea un número diferente de veces en cada ejecución.

esqueletos de resolución

Estos esqueletos son muy diferentes a los esqueletos típicos que se encuentran arriba. Los algoritmos de "resolución" utilizan una combinación de métodos para resolver un problema específico. El problema dado al algoritmo puede ser una "familia de problemas". [ 10 ] Hay dos tipos principales de estos esqueletos: "divide y vencerás" o "marca y ata".

  • El algoritmo «divide y vencerás» se basa en un mapa y lo combina con un bucle while para resolver el problema. En los algoritmos de mapas, las funciones se aplican a los datos simultáneamente. En «divide y vencerás», se aplica una función al conjunto de datos proporcionado mediante el mapa; sin embargo, esta función puede aplicarse recursivamente con el bucle while. El bucle while solo se interrumpe cuando se resuelve el problema por completo.
  • El algoritmo de ramificación y acotación también utiliza algoritmos de mapeo; sin embargo, en lugar de aplicar el bucle `while` para ejecutar las tareas simultáneamente, las divide en ramas. Cada rama tiene un propósito específico, o límite, que determina su finalización.

Referencias

  1. Freeman, Eric; Freeman, Elisabeth; Kathy, Sierra; Bert, Bates (2004). Hendrickson, Mike; Loukides, Mike (eds.). Head First Design Patterns (edición de bolsillo) . Vol.  1. O'REILLY. pág.  440. ISBN 978-0-596-00712-6Consultado el 28 de agosto de 2012 .
  2. Lowery, Jeff (2 de noviembre de 2019). "¿Por qué es difícil el desarrollo de software?" . Medium . Consultado el 15 de noviembre de 2020 .
  3. 1 2 Bellamy, Rachel KE (1 de junio de 1994). "¿Qué hace el pseudocódigo? Un análisis psicológico del uso del pseudocódigo por programadores experimentados" . Interacción humano-computadora . 9 (2): 225–246 . doi : 10.1207/s15327051hci0902_3 . ISSN 0737-0024 . 
  4. "Object (Java Platform SE 8)" . docs.oracle.com . Consultado el 2 de octubre de 2020 .
  5. "Funciones integradas — Documentación de Python v3.0.1" . docs.python.org . 14 de febrero de 2009. Consultado el 3 de octubre de 2020 .
  6. "referencia | p5.js" . p5js.org . Consultado el 15 de noviembre de 2020 .
  7. Granger, Chris (18 de noviembre de 2020). "Un primer vistazo a algo nuevo en lo que estamos trabajando" . Twitter . Consultado el 19 de noviembre de 2020 .
  8. Özcan, E. (2004). "Generación de esqueletos de clases Java mediante una interfaz de lenguaje natural". Actas del 1er Taller Internacional sobre Comprensión del Lenguaje Natural y Ciencia Cognitiva . Vol. 1. SciTePress - Publicaciones de Ciencia y Tecnología. pp. 126–134 . doi : 10.5220/0002683301260134 . ISBN   972-8865-05-8.
  9. Benaya, Tamar; Zur, Ela (2008), "Understanding Object Oriented Programming Concepts in an Advanced Programming Course", Informatics Education - Supporting Computational Thinking , Lecture Notes in Computer Science, vol. 5090, Berlín, Heidelberg: Springer Berlin Heidelberg, pp. 161–170 , doi : 10.1007/978-3-540-69924-8_15 , ISBN   978-3-540-69923-1Consultado el 18 de noviembre de 2020.
  10. 1 2 3 4 González-Vélez, Horacio; Leyton, Mario (1 de noviembre de 2010). "Un estudio de los marcos de esqueletos algorítmicos: facilitadores de programación paralela estructurada de alto nivel" . Software: Practice and Experience . 40 (12): 1135– 1160. doi : 10.1002/spe.1026 . ISSN 0038-0644 . S2CID 16211075 .