Articulo de referencia

Esqueleto (programación informática)

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

La programación esqueleto es un estilo de programación informática basado en estructuras de programas simples de alto nivel y en el llamado código ficticio . Los esqueletos de programas se parecen al pseudocódigo , pero permiten el análisis , la compilación y la prueba del 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 implicar 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 de esqueletos facilita un enfoque de diseño de arriba hacia abajo , en el que se diseña y codifica un sistema parcialmente funcional con estructuras completas de alto nivel, y luego 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 se puede utilizar como una plantilla que refleja la sintaxis y las estructuras que se usan comúnmente en una amplia clase de problemas.

Los programas esqueleto se utilizan en el patrón de diseño de métodos 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 fragmento de método o un objeto simulado . En la nomenclatura de invocación de método remoto de Java (Java RMI), un fragmento se comunica en el lado del cliente con un esqueleto en el lado del servidor. [1]

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

Fondo

El software moderno [2] suele ser complicado por diversas razones. Esto puede significar que no puede ser desarrollado por un solo programador o que otros módulos o partes deben importarse por separado. Los programas también pueden ser demasiado complejos por sí solos, algunos con múltiples métodos que acceden a una sola variable al mismo tiempo o incluso generan píxeles para las 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 utilizar para permitir que una pequeña función dentro de un programa más grande funcione sin la funcionalidad completa temporalmente. Este método de programación es más fácil que escribir una función completa, ya que estas funciones esqueleto no tienen que incluir funcionalidades principales y, en cambio, se pueden codificar para usar durante el desarrollo. Por lo general, implican 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 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 grande, o incluso puede ser una representación de un programa completo. El pseudocódigo es similar a la programación esqueleto, sin embargo se diferencia en el hecho de que el pseudocódigo es principalmente un método informal de programación. [3] 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 informáticos dependen en gran medida del pseudocódigo, hasta el punto de que este tiene un impacto mensurable en su psiquis . [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 mensurable en lo bien que puede escribir su implementación final. Esto se ha encontrado en varias 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 esqueleto imita esto, pero se diferencia 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 esqueleto 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, tienen un código básico 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. [4] Los lenguajes orientados a objetos se centran en una estructura basada en jerarquía para sus implementaciones, en lugar de un enfoque simple 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 así como 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 continuación, se incluye una explicación detallada del funcionamiento del método, con errores a continuación.

Python tiene un enfoque similar para documentar sus métodos integrados, pero imita la falta de fijación del lenguaje en el alcance y los tipos de datos. [5] 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 quienes son nuevos en la biblioteca sobre cómo funcionan las funciones y los métodos. P5.Js usa este formato en su página de documentación para explicar el uso previsto de ciertas funciones incluidas. [6] Sin embargo, esto es diferente a la documentación del lenguaje de programación, ya que se usa código esqueleto para mostrar parámetros en lugar de todos los usos posibles del método.

Las interfaces de lenguaje natural (NLI) se encuentran más comúnmente 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 la utilizan para crear un programa o un método. Una implementación de esto utiliza un pequeño conjunto de código esqueleto para implicar la función que se ejecuta en segundo plano. [7]

Otras formas de NLI utilizan diferentes formas de entrada, que van desde otros usuarios que hablan otros idiomas hasta la entrada basada en gestos para producir un resultado muy similar. Como 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. Los NLI se han utilizado en algunos estudios [8] 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ó utilizando un conjunto básico de código esqueleto.

Definiciones basadas en polimorfismo

El polimorfismo es una ideología que sigue el paradigma de la programación orientada a objetos , donde los métodos pueden ser anulados o sobrecargados (métodos con el mismo nombre en una clase hija que tendrán prioridad sobre un método escrito en una clase padre). La definición de métodos se basa en un marco de trabajo esqueleto 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 que los lenguajes orientados a objetos estrictos (como Java ) utilicen 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 utilice los métodos o implemente la clase para sus necesidades personales.

esqueleto públicoExample();

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

esqueleto abstracto públicoExample();

Estos ejemplos utilizan la sintaxis Java.

Programación paralela

La programación paralela es la operación simultánea de múltiples funciones, que se utiliza con mayor frecuencia para aumentar la eficiencia. Estos suelen ser 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] sin embargo, los resultados han sido variados.

Los marcos de trabajo de esqueleto algorítmico se utilizan en la programación paralela para describir de forma abstracta los métodos en cuestión para su posterior desarrollo. Los marcos de trabajo no se limitan a un único 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: paralelo a datos , paralelo a tareas y resolución. [10]

Datos paralelos

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

  • Los "mapas" son los algoritmos de datos en paralelo más utilizados y, por lo general, implican una única operación realizada sobre un conjunto grande 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 determinados tipos de datos. Esto se conoce como paralelismo de datos múltiples . [10]
  • Los métodos "reduce" o "scan" se utilizan para aplicar prefijos a un conjunto de datos, antes de aplicar una operación sobre los datos. Son diferentes a los "maps" ya que tienen un conjunto de resultados parciales durante el tiempo de ejecución del método en sí.

Tareas paralelas

Estas operaciones, como su nombre lo indica, funcionan sobre tareas. Cada tipo de algoritmo es diferente debido a un cambio en el comportamiento entre tareas. Los algoritmos de tareas paralelas incluyen 'sequentials', 'farms', 'pipes', 'if', 'for' y 'while'.

  • 'Secuencial' cierra y finaliza un conjunto anidado de algoritmos de esqueleto. Los métodos y programas que forman parte de los esqueletos se incluyen como aspectos de finalización del programa, antes del cierre.
  • Las "granjas" se conocen como un grupo de tareas, un trabajador o como un maestro o esclavo de otra función. Completan las tareas asignadas al replicarlas en varios subprocesos y ejecutarlas simultáneamente. Esto divide la carga para un subproceso específico, creando efectivamente una relación maestro/esclavo entre los subprocesos.
  • Los algoritmos de tuberías son las formas más tradicionales de algoritmos, en las que cada método o función se ejecuta en una secuencia que sigue el orden en el que el programador ha escrito su código. Esto se hace en paralelo al calcular varias tareas en un conjunto de datos, normalmente de entrada, de manera simultánea para mejorar el rendimiento y la velocidad. Cada cálculo simultáneo se conoce como etapa. El algoritmo de tuberías puede estar anidado, de manera que uno se encuentre dentro de otro y cada uno se divida las responsabilidades para aumentar la velocidad y también el número de etapas.
  • "If" le otorga al programa una división condicional de tareas, en la que un conjunto de código esqueleto se divide en dos secciones principales. Se le da una declaración condicional al programa, lo que le otorga un algoritmo específico a seguir.
  • 'For' ejecuta una tarea una cantidad de veces, ambas especificadas por el programador, lo que permite un conjunto de código más eficiente. La cantidad de veces que se ejecuta el código es un valor preestablecido, lo que indica que en tiempo de ejecución , este no se puede cambiar. Debe completar la tarea la cantidad de veces indicada.
  • 'While' es un algoritmo muy similar al funcionamiento de un algoritmo 'for', en el que 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 una cantidad diferente de veces 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". [10] Hay dos tipos principales de estos esqueletos, "dividir y vencer" o "marcar y acotar".

  • "Divide and conquistar" utiliza un esqueleto de mapa como base, combinándolo con un esqueleto while para resolver el problema. En los algoritmos de mapa, las funciones sobre los datos se aplican simultáneamente. En "Divide and conquistar", el conjunto de datos proporcionado tiene una función aplicada mediante el esqueleto de mapa, sin embargo, esta se puede aplicar de forma recursiva mediante el algoritmo "while". El "while" solo se interrumpe cuando se resuelve todo el problema.
  • "Branch and bound" es un algoritmo que también utiliza algoritmos de mapas, pero 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

  1. ^ Freeman, Eric; Freeman, Elisabeth; Kathy, Sierra; Bert, Bates (2004). Hendrickson, Mike; Loukides, Mike (eds.). Patrones de diseño Head First (libro de bolsillo) . Vol. 1. O'REILLY. pág. 440. ISBN 978-0-596-00712-6. Recuperado 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. ^ ab Bellamy, Rachel KE (1 de junio de 1994). "¿Qué hace el pseudocódigo? Un análisis psicológico del uso del pseudocódigo por parte de programadores experimentados". Interacción persona-ordenador . 9 (2): 225–246. doi :10.1207/s15327051hci0902_3. ISSN  0737-0024.
  4. ^ "Objeto (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 un esqueleto de clase Java mediante una interfaz de lenguaje natural". Actas del 1.er taller internacional sobre comprensión del lenguaje natural y ciencia cognitiva . 1. SciTePress - Publicaciones científicas y tecnológicas: 126–134. doi : 10.5220/0002683301260134 . ISBN . 972-8865-05-8.
  9. ^ Benaya, Tamar; Zur, Ela (2008), "Comprensión de los conceptos de programación orientada a objetos en un curso de programación avanzada", Informatics Education - Supporting Computational Thinking, Lecture Notes in Computer Science, vol. 5090, Berlín, Heidelberg: Springer Berlin Heidelberg, págs. 161–170, doi :10.1007/978-3-540-69924-8_15, ISBN 978-3-540-69923-1, consultado el 18 de noviembre de 2020
  10. ^ abcd González-Vélez, Horacio; Leyton, Mario (1 de noviembre de 2010). "Un estudio de los marcos de trabajo de esqueleto algorítmico: facilitadores de programación paralela estructurada de alto nivel". Software: práctica y experiencia . 40 (12): 1135–1160. doi :10.1002/spe.1026. ISSN  0038-0644. S2CID  16211075.
Obtenido de "https://es.wikipedia.org/w/index.php?title=Esqueleto_(programación_informática)&oldid=1218996565"