# data[].attributes.attachment_caption
Las líneas de código verdes constituyen comentarios para la documentación interna. Obtenido de https://geekflare.com/how-to-add-comments/

# data[].attributes.attachment_caption
Diagrama UML. Describe la composición de clases del programa, usado en el paradigma orientado a objetos. Obtenido de https://moqups.com/es/templates/diagrams-fl

# data[].attributes.body
La documentación de un problema "consta de las descripciones de los pasos a dar en el proceso de resolución de dicho problema. [...] Programas pobremente documentados son difíciles de leer, más difíciles de depurar y casi imposibles de mantener y modificar." (Joyanes Aguilar, 2008)

Existen dos tipos de documentación.

La documentación interna es visible en el código fuente, describe los algoritmos,  las estructuras de datos usadas, las entradas, las salidas, autorías, entre otros detalles.

La documentación externa es todo tipo de documentos físicos que sirvan para demostrar la funcionalidad del producto, "incluye análisis, diagramas de flujo y/o pseudocódigos, manuales de usuario con instrucciones para ejecutar el programa y para interpretar lo resultados. "

La documentación es muy importante cuando se tiene que utilizar el programa, pero también lo es cuando es necesario corregirlo y mejorarlo. A el proceso de corrección y mejora de características del programa se le conoce como mantenimiento.

# data[].attributes.headline
Verificación y depuración de un programa

# data[].attributes.subject
Verificación y depuración de un programa

# data[].attributes.body
En esta fase de la resolución de un problema, se prueba el programa compilado con una gran variedad de datos de entrada, llamados datos test o prueba, que determinarán si el programa tiene errores, conocidos como bugs. Aquí se utilizan valores comunes para probar la funcionalidad del programa, se usan valores extremos para probar los límites del programa, y valores especiales que correspondan con funciones especiales del programa. Esto se llama verificación.

La depuración es el proceso de encontrar errores en el programa y eliminarlos o corregirlos. En este contexto se pueden encontrar tres tipos de errores:

Errores de compilación, normalmente cuando el programa está codificado incorrectamente.

Errores de ejecución, cuando hay instrucciones que la computadora entiende pero no puede ejecutar.

Errores lógicos, cuando el programa tiene comportamientos indebidos.  Son los más difíciles de detectar.

# data[].attributes.body
En esta fase el código fuente tiene que servir de entrada para otro programa, el compilador, para traducirse a un lenguaje que la computadora pueda entender y ejecutar las instrucciones.
El compilador es, pues, un programa que toma el texto escrito en un lenguaje de programación y lo traduce a lenguajes de nivel más bajo.
Después, un programa llamado enlazador, que genera vínculos entre el programa y las bibliotecas que utiliza, generando un ejecutable compatible con el sistema operativo.

# data[].attributes.attachment_caption
Fragmento del código de un programa escrito en lenguaje Python 2.x. Obtenido de https://lenguajesdeprogramacion.net/python/

# data[].attributes.body
Es la tercera fase en la resolución de problemas. En esta fase se traducen los algoritmos desarrollados durante la fase de diseño de algoritmos a un lenguaje de programación. El texto en lenguaje de programación que representa los algoritmos de esta fase se llama código fuente.

En esta fase se tiene que realizar un tipo de documentación llamada documentación interna que se ubica dentro del código fuente del programa y describe los procedimientos, las variables, las constantes y las estructuras que se utilizan para que el programa pueda ser utilizado y modificado correctamente después.

# data[].attributes.attachment_caption
Descomposición TOP-DOWN, obtenido de Torres Soler (s.f.).

# data[].attributes.body
Es la segunda etapa de la resolución de problemas. En esta etapa se define qué hace el programa y cómo lo hace.

"El proceso que convierte los resultados del análisis del problema en diseño modular con refinamientos sucesivos ... se denomina diseño del algoritmo" (Joyanes Aguilar, 2008)

El diseño modular se refiere a que el problema principal se divide en varios subproblemas, donde cada subproblema se resuelve a través de un procedimiento con un solo punto de entrada y un solo punto de salida. Los refinamientos sucesivos implican que cada problema se trata de resolver de forma más sencilla dividiéndolo en problemas más pequeños hasta que pueda ser implementada en una computadora.

# data[].attributes.attachment_caption
Proceso de solución de un problema. Obtenido de Villalobos S. y Casallas G. (s.f.)

# data[].attributes.body
Joyanes Aguilar (2008) menciona que en el análisis "El problema se analiza teniendo presente la especificación de requisitos dados por el cliente de la empresa o por la persona que encarga el programa". Es la primera fase en la resolución de un problema, y tiene que contemplar exactamente lo que tiene que hacer el programa y el resultado o solución deseada.
Se precisan las entradas y salidas, y es conveniente responder a una serie de preguntas para ello:

¿Qué entradas se requieren (Tipos de datos de la entrada y cantidad)

¿Cuál es la salida deseada (Tipo de datos del resultado y cantidad)

¿Qué método produce la salida deseada

Requisitos o requerimientos adicionales y restricciones a la solución.

# data[].attributes.headline
Fases de la metodología de la programación

# data[].attributes.subject
Fases de la metodología de la programación

# data[].attributes.body
Joyanes Aguilar (2008) menciona que la metodología de resolución de problemas tiene 8 fases:

Análisis del problema

Diseño del algoritmo

Codificación

Compilación y ejecución

Verificación

Depuración

Mantenimiento

Documentación

# data[].attributes.attachment_caption
Descripción del funcionamiento del paradigma orientado a eventos. Obtenido de Sy Corvo(2020)

# data[].attributes.body
García Morales (s.f.) añade otros paradigmas a la lista: el paradigma lógico, el paradigma orientado a aspectos, el paradigma orientado a eventos.

Paradigma lógico

En este paradigma, se deben considerar axiomas, es decir, enunciados que se toman como verdaderos sin necesidad de ser demostrados; estos axiomas constituyen el programa lógico. Los enunciados derivados pueden ser vistos como entradas que desencadenan cálculos a partir de estos axiomas, dando lugar a las metas (el resultado). Este paradigma también se aplica en inteligencia artificial (García Morales, s.f.), procesamiento de lenguaje natural, y sistemas expertos.

Paradigma orientado a aspectos

Este paradigma tiene como objetivo "lograr la separación entre los requerimientos funcionales de los no funcionales" (García Morales, s.f.), esto para que la implementación de los programas sea más reusable, compacta y comprensible.

Paradigma orientado a eventos

Sy Corbo(2020) indica que es un modelo de programación en el que "se utilizan los eventos que suceden para la determinación del flujo de control de un programa". La programación orientada a eventos tiene una aplicación muy común en la implementación de interfaces gráficas, pues existen eventos como pulsar una tecla, un clic del ratón, colocar el ratón dentro de cierta área, entre otros, que pueden desencadenar acciones.

# data[].attributes.attachment_caption
Comparativa entre la función matemática y las funciones en el lenguaje funcional Haskell. Obtenido de Vaggalis (2021).

# data[].attributes.attachment_caption
Características principales del paradigma orientado a objetos. Obtenido de Kanagusico Hernández (2012).

# data[].attributes.headline
Paradigmas de programación y sus características

# data[].attributes.subject
Paradigmas de programación y sus características

# data[].attributes.body
De acuerdo con Kanagusico Hernández (2012), hay 3 paradigmas importantes: el imperativo, el orientado a objetos y el funcional.

Paradigma imperativo:

Escribe programas secuenciales. El programa tiene diseño modular, donde cada módulo se diseña de forma que problemas complejos se dividen en problemas más pequeños, y usa solamente instrucciones secuenciales, de selección, y de repetición.

Paradigma orientado a objetos

Presenta la abstracción como una parte fundamental del diseño. En este paradigma se pueden diseñar plantillas de objetos, donde cada objeto puede tener sus propias características y comportamientos. Tiene base en los siguientes principios: Abstracción, encapsulamiento, polimorfismo y herencia.

Paradigma funcional

Tiene como objetivo "imitar las funciones matemáticas lo más posible" (Kanagusico Hernández, 2012). En este paradigma, cada expresión siempre vale lo mismo, y cuando se deben calcular subexpresiones, el orden en que se calculan no afecta el resultado final. Aquí, cada función tiene un dominio, un rango y una regla de correspondencia, tal como en la matemática. La regla de correspondencia se aplica a un elemento el dominio, y esto debe corresponderse con uno y solo un elemento del rango.
Tiene aplicaciones en inteligencia artificial, procesamiento de lenguaje natural, reconocimiento de voz, desarrollo rápido de prototipos, programación de sistemas de telecomunicaciones y telefonía, asignaciones de tripulaciones a vuelos y bases de datos de e-commerce (García Morales, s.f.).

# data[].attributes.attachment_caption
Algunos paradigmas de programación dispuestos en un diagrama jerárquico. Obtenido de Laureano Castro (2018).

# data[].attributes.attachment_caption
Lenguajes de programación destacados, en orden de aparición. Obtenido de Delgado Quintero (2020).

# data[].attributes.headline
Cronología de los lenguajes de programación

# data[].attributes.subject
Cronología de los lenguajes de programación

# data[].attributes.headline
Evolución de los lenguajes de programación y sus características

# data[].attributes.subject
Evolución de los lenguajes de programación y sus características

# data[].attributes.body
De acuerdo con UNAM (2017), los lenguajes de programación evolucionaron de manera casi conjunta con las computadoras, habiendo varias generaciones de lenguajes:

1. Primera generación: Lenguaje máquina y ensambladores

2. Segunda generación: Primeros lenguajes imperativos de alto nivel (Fortran y Cobol).

3. Tercera generación: Lenguajes imperativos de alto nivel. Son los más usados en la actualidad. Algunos ejemplos son Algol, PL/I, Pascal y Modula.

4. Cuarta generación: Son orientados al manejo y gestión de bases de datos (Natural, SQL)

5. Quinta generación: Orientados a la inteligencia artificial y al procesamiento de los lenguajes naturales (LISP, Prolog).

# data[].attributes.attachment_caption
Comparativa entre una instrucción en lenguaje máquina y su equivalente en lenguaje de bajo nivel. Obtenido de Wikipedia (2022)

# data[].attributes.attachment_caption
Pruebas unitarias en lenguaje Python. Obtenido de parzibyte(2019).

# data[].attributes.attachment_caption
Fragmento de un programa escrito en lenguaje ensamblador. Obtenido de tuxotron(2017).

# data[].attributes.headline
Clasificación de los lenguajes de programación y sus características

# data[].attributes.subject
Clasificación de los lenguajes de programación y sus características

# data[].attributes.body
Dependiendo del nivel de abstracción que tenga un lenguaje de programación, se clasifican en lenguaje máquina, lenguaje de bajo nivel, y lenguaje de alto nivel.

Lenguaje máquina: Es el "sistema de códigos interpretable directamente por un circuito microprogramable, como el microprocesador de una computadora" (Universidad Nacional Autónoma de México[UNAM], 2022).

Lenguaje de bajo nivel: Se refiere al lenguaje ensamblador, que ya no trabaja con códigos de operación, sino con mnemotécnicos que permiten acceder a estas operaciones.

Lenguaje de alto nivel: Se refiere a lenguajes que " se caracterizan porque su estructura semántica es muy similar a la forma como escriben los humanos" (UNAM, 2022).

# data[].attributes.body
Calderón, I. (2021). "Hello World" en 10 lenguajes. Recuperado de https://medium.com/streamelopers/hello-world-en-10-lenguajes-a30f73d771c4 el 01/08/2022

Universidad Nacional Autónoma de México [UNAM] (2017). Lenguajes de programación. Unidad de Apoyo para el Aprendizaje. Recuperado de https://programas.cuaed.unam.mx/repositorio/moodle/pluginfile.php/1023/mod_resource/content/1/contenido/index.html el 01/08/2022.

tuxotron. (2017). Tutorial sobre ensamblador para ARM. Recuperado de https://www.cyberhades.com/2017/05/27/tutorial-sobre-ensamblador-para-arm/ el 01/08/2022.

Instruction Set Architecture. (17 de Julio de 2022). En Wikipedia. https://en.wikipedia.org/w/index.php?title=Instruction_set_architecture&oldid=1098858653

Delgado Quintero, S. (2020). Algo de historia. Recuperado de https://aprendepython.es/core/introduction/history/ el 01/08/2022

Laureano Castro, A.I. (2018). Fundamentos de Programación: Paradigmas de Programación. Recuperado de https://studentplace98.blogspot.com/2018/12/fundamentos-de-programacion-paradigmas.html el 01/08/2022

Kanagusico Hernández, E. D. (2012). Introducción a la programación. Plan 2012. Recuperado de http://fcasua.contad.unam.mx/apuntes/interiores/docs/2012/informatica/2/1167.pdf

Vaggalis, N. (2021). Free Course On Functional Programming in Haskell. Recuperado de https://www.i-programmer.info/news/150-training-a-education/14437-free-course-on-functional-programming-in-haskell-.html el 01/08/2022

García Morales, K. (s.f.) Paradigmas de programación. Obtenido de http://profesores.fi-b.unam.mx/karinagm/ParadigmasFP.pdf el 02/08/2022.

Sy Corvo, Helmut. (2020). Programación orientada a eventos: características, ejemplos, ventajas, aplicaciones. Lifeder. Recuperado de https://www.lifeder.com/programacion-orientada-a-eventos/

Villalobos, S. y Casallas, G. (s.f.) Fundamentos de programación. Obtenido de https://universidad-de-los-andes.gitbooks.io/fundamentos-de-programacion/content/Nivel1/3_ProblemasYSoluciones.html

Joyanes Aguilar, L. (2008). Fundamentos de programación. Algoritmos, estructura de datos y objetos (cuarta edición). McGRAW-HILL.

Torres Soler, L. C. (s.f.) 1. Principios básicos de programación. Obtenido de https://disi.unal.edu.co/~lctorress/estructuras/pdf/EInf22.pdf

# data[].attributes.attachment_caption
Programa básico escrito en lenguaje C. Obtenido de Calderón(2021).

# data[].attributes.headline
Elementos que conforman un lenguaje de programación

# data[].attributes.subject
Elementos que conforman un lenguaje de programación

# data[].attributes.body
Un lenguaje programación se compone de tres elementos básicos:

Alfabeto, que es el conjunto de caracteres con los que trabaja el lenguaje.

Sintaxis, que es la forma en que se puede usar el alfabeto para representar instrucciones.

Semántica, que es el significado que tienen las instrucciones que se pueden formar en el lenguaje.

Por ejemplo, en la imagen anexa se observa un programa básico en C, donde el alfabeto son las letras del idioma inglés. La sintaxis se refiere a cada instrucción que se puede observar, y la semántica se refiere a las acciones que lleva a cabo cada una de esas instrucciones.