Esqueleto (programación de computadoras) - Skeleton (computer programming)

La programación esquelética es un estilo de programación de computadoras basado en estructuras de programa simples de alto nivel y el llamado código ficticio . Los esqueletos del programa se asemejan al pseudocódigo , pero permiten analizar , compilar y probar el código. El código ficticio se inserta en el esqueleto de un programa para simular el procesamiento y evitar mensajes de error de compilación . Puede involucrar 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 esquelética facilita un enfoque de diseño de arriba hacia abajo , donde se diseña y codifica un sistema parcialmente funcional con estructuras completas de alto nivel, 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 algoritmos de alto nivel . También se puede utilizar un esqueleto de programa como plantilla que refleje la sintaxis y las estructuras comúnmente utilizadas en una amplia clase de problemas.

Los programas esqueléticos se utilizan en el patrón de diseño del método de plantilla utilizado 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 código auxiliar de método o un objeto simulado . En la nomenclatura de invocación de método remoto de Java (Java RMI), un stub se comunica en el lado del cliente con un esqueleto en el lado del servidor.

Un esqueleto de clase es un esquema de una clase que se utiliza en ingeniería de software . Contiene una descripción de los roles de la clase y describe los propósitos de las variables y métodos , pero no los implementa. La clase se implementa posteriormente desde el esqueleto. El esqueleto también se puede conocer como una interfaz o una clase abstracta , con lenguajes que siguen un paradigma polimórfico.

Fondo

Código que normalmente se encuentra en Python, siguiendo una estructura basada en esqueleto

El software que se usa en las computadoras hoy en día suele ser complicado debido a una serie de razones. Esto puede significar que no solo un programador puede desarrollarlo, o que otros módulos o partes deben importarse por separado. Los programas también pueden ser demasiado complejos por sí mismos, algunos con múltiples métodos para acceder a una sola variable al mismo tiempo o incluso generar 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 el tiempo de compilación .

El código esqueleto se encuentra más comúnmente 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 potencialmente confuso. También se puede usar para permitir que una función pequeña dentro de un programa más grande opere sin funcionalidad completa temporalmente. Este método de programación es más fácil que escribir una función completa, ya que estas funciones de esqueleto no tienen que incluir funcionalidades principales y, en cambio, pueden codificarse para su uso durante el desarrollo. Por lo general, involucran 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 de texto.


Relación con el pseudocódigo

Un ejemplo genérico de pseudocódigo

El pseudocódigo se encuentra más comúnmente al desarrollar la estructura de una nueva pieza de software . Es una representación en inglés simple de una función particular dentro de un sistema más grande, o incluso puede ser una representación de un programa completo. El pseudocódigo es similar a la programación esquelética, sin embargo se desvía en el hecho de que el pseudocódigo es principalmente un método informal de programación. El código ficticio también es muy similar a esto, donde el código se usa simplemente como un marcador de posición, o para indicar la existencia prevista de un método en una clase o interfaz.

Los programadores de computadoras son extremadamente dependientes del pseudocódigo, tanto que tiene un impacto medible en su psique . 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 qué tan bien pueden escribir su implementación final. Esto se ha encontrado en una serie de aplicaciones, con diferentes programadores trabajando en diferentes lenguajes y variados paradigmas de programación .

Este método de diseño de programas también se realiza con mayor frecuencia en 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 esto, pero difiere en la forma en que se escribe comúnmente en un entorno de desarrollo integrado o editores de texto . Esto ayuda al desarrollo posterior del programa después de la etapa de diseño inicial . Los programas esqueleto también permiten que funcionen funciones simplistas, si se ejecutan.

Implementación

La programación esquelética se puede implementar en una variedad de aplicaciones de programación diferentes.

Documentación del lenguaje de programación

Todos, si no la mayoría de los lenguajes de programación, tienen un código esqueleto que se utiliza para ayudar en la definición de todas las funciones y métodos integrados . Esto proporciona un medio simple para que los programadores más nuevos 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 parte del objeto de los paquetes de Java. Los lenguajes orientados a objetos se centran en una estructura basada en jerarquía para sus implementaciones, en lugar de un simple enfoque de arriba hacia abajo que se encuentra en otros lenguajes. Los 'objetos' almacenan datos y variables en ellos, lo que permite escribir un programa típicamente más eficiente. Estos objetos tienen funciones individuales que pueden acceder a variables internas, conocidas como métodos.

Cada método se define en el mismo formato, con el nombre del método y la sintaxis que se utilizará en un entorno de desarrollo integrado claramente visible en la parte superior de un bloque. Con el enfoque de Java en el alcance , los tipos de datos y la herencia , esta sintaxis es extremadamente útil para los programadores nuevos, si no para todos. A esto le sigue una explicación detallada del funcionamiento del método, con los errores a continuación.

Python tiene un enfoque similar para documentar sus métodos incorporados, sin embargo, imita la falta de fijación del lenguaje en el alcance y los tipos de datos. Esta documentación tiene la sintaxis de cada método, junto con una breve descripción y un ejemplo del uso típico del método o función. El código esqueleto proporcionado en el ejemplo brinda a los programadores una buena comprensión de la función de un vistazo rápido.

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 esqueleto. Esto ayuda a informar a cualquiera que sea nuevo en la biblioteca sobre cómo operan las funciones y métodos. P5.Js usa este formato en su página de documentación para explicar el uso previsto de ciertas funciones incluidas. Sin embargo, esto es diferente a la documentación del lenguaje de programación, ya que utiliza código esqueleto para mostrar los parámetros en lugar de todos los usos posibles del método.

Las interfaces de lenguaje natural (NLI) se encuentran normalmente en situaciones en las que los programadores intentan tomar una entrada , generalmente denominada coloquialmente (sin el uso de la jerga específica del lenguaje de programación ) y usarla para crear un programa o un método. Una implementación de esto usa un pequeño conjunto de código esqueleto para implicar que la función se ejecuta en segundo plano.

Otras formas de NLI utilizan diferentes formas de entrada, que van desde otros usuarios que hablan diferentes idiomas, hasta entradas basadas en gestos para producir un resultado muy similar. Dado que los lenguajes de programación se desarrollan y escriben principalmente en inglés, las personas que hablan otros idiomas tienen dificultades para desarrollar software nuevo. Los NLI se han utilizado en algunos estudios 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, sin embargo, significó que la clase se escribió usando un conjunto básico de código esqueleto.

Definiciones basadas en polimorfismo

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

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, que permite que los lenguajes estrictos orientados a objetos (como Java ) usen clases de diferentes paquetes sin la 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 que cualquier otra persona use los métodos o implemente la clase para sus necesidades personales.

public skeletonExample();

Una clase abstracta es casi lo mismo que una implementación de clase, sin embargo, dependiendo del idioma, al menos un método se define como abstracto. Esto implica que cualquier hijo de esta clase (cualquier clase que se extienda o implemente) necesita tener un método definido para esto. Las clases abstractas tienen un estilo de definición muy similar a las interfaces, sin embargo, la palabra clave 'resumen' se usa típicamente para identificar el hecho de que debe implementarse en las clases secundarias.

public abstract skeletonExample();

Estos ejemplos utilizan la sintaxis de Java.

Programación paralela

La programación paralela es la operación de múltiples funciones simultáneamente más comúnmente utilizada para aumentar la eficiencia. Estos suelen ser los tipos de programas más difíciles de desarrollar, debido a su complejidad e interconexión también con el hardware en cuestión. Muchos desarrolladores han intentado escribir programas con esta funcionalidad principal, sin embargo, esto se ha logrado con resultados variados.

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

Paralelo de datos

Estos algoritmos de esqueleto se utilizan para desarrollar programas que funcionan en software basado en datos grandes, generalmente identificando las conexiones entre los datos para su uso posterior. Los algoritmos de datos paralelos incluyen 'mapas', 'bifurcaciones' y 'reduce' o 'escanea'.

  • Los 'mapas' son los algoritmos paralelos de datos más utilizados y, por lo general, implican una sola operación completada en un gran conjunto de datos. Para aumentar la eficiencia, se aplica esta operación a varios conjuntos de datos simultáneamente, antes de que los datos se vuelvan a estructurar juntos 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 .
  • Las 'reducciones' o 'escaneos' se utilizan para aplicar prefijos a un conjunto de datos, antes de aplicar una operación sobre los datos. Estos son diferentes a los 'mapas' ya que tienen un conjunto de resultados parciales durante el tiempo de ejecución del método en sí.

Paralelo de tareas

Estas operaciones, como su nombre indica, funcionan en tareas. Cada tipo de algoritmo bajo este es diferente debido a un cambio en el comportamiento entre tareas. Los algoritmos paralelos de tareas incluyen 'secuenciales', 'granjas', 'tuberías', 'si', 'para' y 'mientras'.

  • 'Sequential' cierra y termina un conjunto anidado de algoritmos de esqueleto. Los métodos y programas que forman parte de los esqueletos se incluyen como aspectos finales del programa, antes de cerrar.
  • Las 'granjas' se conocen como un grupo de tareas, un trabajador o como un maestro o esclavo de otra función. Completa las tareas dadas replicando las tareas en varios subprocesos y ejecutándolas al mismo tiempo. Esto divide la carga para un subproceso específico, creando efectivamente una relación maestro / esclavo entre los subprocesos.
  • Las 'tuberías' son las formas más tradicionales de algoritmos, donde cada método o función se ejecuta en una secuencia. Esto sigue el orden en el que el programador ha escrito su código. Esto se hace en paralelo calculando diversas tareas en un conjunto de datos, normalmente de entrada, simultáneamente para mejorar el rendimiento y la velocidad. Cada cálculo simultáneo se conoce como etapa. El algoritmo de tubería se puede anidar, donde uno está dentro de otro, cada uno dividiendo las responsabilidades para aumentar la velocidad y también el número de etapas.
  • 'Si' le da al programa una división condicional de tareas, donde un conjunto de código esqueleto se divide en dos secciones principales. Se le da una declaración condicional al programa, por lo que se le da un algoritmo específico a seguir.
  • 'For' opera una tarea varias veces, ambas especificadas por el programador, lo que permite un conjunto de código más eficiente. El número de veces que se ejecuta el código es un valor preestablecido, lo que indica que en tiempo de ejecución , esto no se puede cambiar. Debe completar la tarea el número de veces dado.
  • 'Mientras' es un algoritmo muy similar a la operación de un algoritmo 'para', donde una tarea se completa varias veces. Sin embargo, en los algoritmos 'while', el programa calcula la tarea varias veces antes de que se cumpla una declaración condicional. Esto significa que el algoritmo 'while' puede realizar su tarea un número diferente de veces por cada vez que se ejecuta.

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 por el algoritmo puede ser una "familia de problemas". Hay dos tipos principales de estos esqueletos, 'divide y vencerás' o 'marca y ata'.

  • 'Dividir y conquistar' utiliza un esqueleto de mapa como base, combinándolo con un esqueleto while para resolver el problema. En los algoritmos de mapas, las funciones sobre los datos se aplican simultáneamente. En "divide y vencerás", el conjunto de datos proporcionados tiene una función aplicada utilizando el esqueleto del mapa, sin embargo, esto se puede aplicar de forma recursiva utilizando el algoritmo "while". El 'mientras' solo se rompe cuando se resuelve todo el problema.
  • 'Branch and bound' es un algoritmo que también usa algoritmos de mapa, sin embargo, en lugar de aplicar el algoritmo 'while' para ejecutar las tareas simultáneamente, este algoritmo divide las tareas en ramas. Cada rama tiene un propósito específico, o 'límite', donde la declaración condicional hará que se detenga.

Referencias