051.1 Lección 1
Certificación: |
Open Source Essentials |
Versión: |
1.0 |
Tema: |
051 Fundamentos del software |
Objectivo: |
051.1 Componentes del software |
Lección: |
1 de 1 |
Introducción
El software libre y el código abierto (a menudo conocido como FOSS) se ha convertido en una parte integral de nuestra vida cotidiana, sin que nos demos cuenta. FOSS por ejemplo, se puede encontrar detrás de todas nuestras actividades en Internet en alguna forma: En la computadora donde vemos páginas web en el navegador, o en servidores que almacenan estas páginas web y las entregan tan pronto como las invocamos.
¿Qué es el software?
Sin embargo, antes de analizar todos los detalles del software libre y de código abierto, debemos aclarar qué es realmente el software. Comencemos con una descripción muy general: el software es la parte no física e inmaterial de las computadoras en cualquier forma. El software garantiza que las partes físicas (el hardware) de la computadora interactúen y que la computadora pueda aceptar comandos y ejecutar tareas.
Un teléfono inteligente, un ordenador portátil o un servidor en un centro de datos no es más que una máquina hecha de metal y plástico cuando está apagada. Tan pronto como se enciende, el software se inicia, y se forman secuencias de comandos codificadas que controlan los componentes individuales de esta máquina, permitiendo al usuario interactuar con la computadora y realizando tareas muy específicas llamando a aplicaciones individuales.
Es trabajo de los desarrolladores de software analizar las tareas que se supone que debe realizar la computadora y especificarlas de una manera que le permita implementarlas. Las herramientas utilizadas por los desarrolladores son tan numerosas y diversas como las tareas realizadas por el software.
Algunas tareas de software están estrechamente relacionadas con el hardware y la arquitectura de la computadora, por ejemplo, el direccionamiento y gestión de la memoria o el manejo de diferentes procesos. Por lo tanto, los programadores de sistemas trabajan cerca del hardware.
Los desarrolladores de aplicaciones, por otro lado, se centran más en el usuario y en las aplicaciones de programa que permiten a los usuarios realizar sus tareas de forma eficiente e intuitiva. Un ejemplo de una aplicación compleja es un programa de procesamiento de textos que proporciona todas las funciones para formatear texto en menús o botones y también muestra el texto tal como finalmente se imprimirá.
En general, un algoritmo es una forma de resolver un problema. Por ejemplo, para calcular un promedio, el algoritmo normal consiste en sumar una colección de valores y dividir la suma por el número total de valores. Aunque tradicionalmente los algoritmos son diseñados y ejecutados por programadores, hoy en día también los generan la inteligencia artificial.
Los conceptos de este capítulo pueden ayudarle a comprender las fortalezas y los riesgos del FOSS, tomar decisiones informadas e incluso decidir si desea ser desarrollador de software..
Lenguajes de programación
Los lenguajes de programación son lenguajes artificiales altamente estructurados que le dicen a una computadora qué hacerla estructura de control que inicia una. Los programas suelen estar escritos en texto, pero algunos idiomas están escritos en forma gráfica. Los desarrolladores de software escriben instrucciones (llamadas código) en la computadora en este lenguaje artificial. Sin embargo, el hardware de la computadora no ejecuta directamente este código. El hardware puede ejecutar directamente sólo una serie de patrones de bits almacenados en la memoria, llamados código de máquina o lenguaje de máquina. Todos los lenguajes de programación son convertidos a código de máquina por un compilador o interpretados por otro programa de código de máquina llamado intérprete para hacer que el hardware ejecute estas instrucciones.
Algunos de los lenguajes de programación más utilizados actualmente son Python, JavaScript, C, C++, Java, C#, Swift y PHP. Cada uno de estos lenguajes de programación tiene sus propias fortalezas y debilidades, y la elección del lenguaje depende del proyecto y las necesidades del desarrollador. Por ejemplo, Java es una opción popular para desarrollar aplicaciones empresariales a gran escala, mientras que Python se utiliza a menudo para informática científica y análisis de datos.
Los desarrolladores han demostrado una creatividad impresionante en el diseño de lenguajes de programación. Originalmente eran lenguajes de bajo nivel que se parecían a las instrucciones de la computadora. Los lenguajes se han vuelto cada vez más de alto nivel, lo que significa que intentan representar poderosas combinaciones de instrucciones en términos breves. Algunos lenguajes reflejan la forma natural de pensar de las personas, conservando al mismo tiempo el rigor necesario para ejecutarse correctamente.
Actualmente se reconocen alrededor de 400 lenguajes de programación, aunque muchos se utilizan sólo en aplicaciones muy específicas o entornos heredados. Cada uno fue desarrollado con el fin de resolver determinadas tareas.
Características, sintaxis y estructura de los lenguajes de programación.
La elección del lenguaje de programación puede tener un impacto significativo en el rendimiento, la escalabilidad y la facilidad de desarrollo de un proyecto de software. Estas secciones exponen elementos importantes de los idiomas.
Características de los lenguajes de programación
Algunas de las características y cualidades comunes de los lenguajes de programación incluyen:
- Concurrencia
-
La concurrencia denota el manejo de múltiples tareas simultáneamente, ya sea ejecutándolas en diferentes procesadores de hardware o alternando el uso de las tareas de un solo procesador. El grado de concurrencia admitido por un lenguaje de programación puede afectar en gran medida su rendimiento y escalabilidad, especialmente para aplicaciones que requieren procesamiento en tiempo real o grandes cantidades de datos. Cada trabajo por separado podría denominarse proceso, tarea o hilo.
- Gestión de memoria
-
La gestión de memoria es la asignación y liberación de memoria en un programa. Dependiendo del lenguaje de programación o del entorno de ejecución, la gestión de la memoria la puede realizar el programador manualmente o de forma automática. La gestión adecuada de la memoria es crucial para garantizar que un programa la utilice de forma eficaz y que no se quede sin esta ni cause otros problemas. Si un programa no logra liberar la memoria no utilizada, el programa provoca una pérdida de memoria que aumenta gradualmente el uso de esta hasta que el programa falla o se notan efectos negativos en el rendimiento.
- Memoria compartida
-
La memoria compartida es un tipo de mecanismo de comunicación entre procesos que permite que múltiples procesos lean y manipulen una región común de la memoria. La memoria compartida es común en hardware como las unidades de disco y también puede ser una forma eficiente de compartir datos entre procesos. Pero el mecanismo requiere una sincronización y gestión cuidadosa para evitar la corrupción de datos. Un error conocido como condición de carrera se produce si un proceso realiza un cambio inesperado en los datos mientras otro proceso los está utilizando.
- Paso de mensajes
-
El paso de mensajes es un mecanismo de comunicación entre procesos que les permite intercambiar datos y coordinar sus actividades. Esto se usa comúnmente en programación concurrente para lograr la comunicación entre procesos y se puede implementar a través de varios mecanismos, como sockets, canalizaciones o colas de mensajes.
- Recolección de basura
-
La recolección de basura es una técnica de administración automática de memoria utilizada por algunos lenguajes de programación para recuperar memoria que ya no se usa mientras se ejecuta un proceso. Esto puede ayudar a prevenir pérdidas de memoria y facilitar que los desarrolladores escriban código correcto y eficiente, pero también puede introducir una sobrecarga de rendimiento y dificultar el control sobre el comportamiento preciso del programa.
- Tipos de datos
-
Los tipos de datos determinan qué tipo de información se puede representar en el programa. Los tipos de datos pueden estar predefinidos en el lenguaje o definidos por el usuario, y pueden incluir números enteros, números de punto flotante (es decir, aproximaciones de números reales), cadenas de texto, arreglos y otros.
- Entrada y salida (I/O - Input/Output)
-
La entrada y la salida son mecanismos para leer y escribir datos hacia y desde un programa. La entrada puede provenir de una variedad de fuentes, como clics del usuario y entradas del teclado, un archivo o una conexión de red, mientras que la salida se puede enviar a una variedad de destinos, como una pantalla, un archivo o una conexión de red. La I/O permite que los programas interactúen con el mundo exterior e intercambien información con otros sistemas.
- Manejo de errores
-
El manejo de errores detecta y responde a los errores que ocurren durante la ejecución de un programa. Esto incluye errores como división por cero o un archivo solicitado que no se encuentra. El manejo de errores permite que los programas continúen ejecutándose incluso cuando ocurren errores, mejorando su confiabilidad y solidez.
Los conceptos que acabamos de enumerar son fundamentales para comprender cómo funcionan los lenguajes de programación y cómo escribir código eficiente y mantenible.
Sintaxis de los lenguajes de programación
La sintaxis de un lenguaje de programación se refiere a reglas para escribir declaraciones y expresiones de programas. Es importante que la sintaxis esté bien definida y consistente, para que el programador pueda escribir y comprender su código de manera efectiva. Los siguientes son los componentes básicos de la mayoría de los lenguajes de programación:
- Procedimientos y funciones
-
Los procedimientos y funciones se utilizan para definir bloques de código reutilizables que se pueden llamar varias veces.
- Variables
-
Las variables representan partes de la memoria y almacenan datos que pueden manipularse y pasarse entre procedimientos y funciones.
- Operadores
-
Los operadores son palabras clave o símbolos (como
+
y-
) que asignan valores a variables y realizan operaciones aritméticas.
Estructura de control: Generalmente, el código del programa se ejecuta en el orden en que se escribe, pero las declaraciones condicionales cambian el flujo de ejecución. El código que se ejecuta a continuación depende de diversas condiciones, como el contenido de la memoria, el estado del teclado, los paquetes que llegan de la red, etc. La declaración de bucle, una forma especial de declaración condicional, es útil para realizar las mismas operaciones en una serie de conjuntos de datos. Una excepción, que invoca un código especial cuando ocurre un error, es otra estructura de control.
La sintaxis y el comportamiento de estas construcciones pueden variar entre lenguajes de programación y la elección del lenguaje puede tener un gran impacto en la legibilidad y mantenibilidad del código.
Librerías
Un buen lenguaje de programación debería facilitar el desarrollo de programas y la reutilización del código existente. Muchos lenguajes de programación tienen un mecanismo para organizar procedimientos y funciones en partes que pueden reutilizarse en otros programas.
Una librería es una colección de procedimientos y funciones que respaldan una característica u objetivo particular, combinados en un solo archivo. La disponibilidad de muchas librerías sencillas de usar, es otro requisito importante de un buen lenguaje de programación. Por ejemplo, Python es ampliamente reconocido como un buen lenguaje para desarrollar programas relacionados con la IA porque tiene varias librerías adecuadas para el procesamiento de la IA. Con el tamaño y la complejidad de los programas, las librerías como componentes básicos prefabricados, son cada vez más importantes. Esto es especialmente cierto en el mundo del código abierto, donde los desarrolladores se sienten cómodos reutilizándo código que otros han creado. Como resultado, se ha desarrollado un ecosistema de librerías para cada lenguaje de programación, y administradores de paquetes como "composer" para PHP, "pip" para Python y "gems" para Ruby facilitan la instalación de librerías.
Las bibliotecas también son importantes en los lenguajes compilados. La combinación de múltiples archivos binarios y bibliotecas precompiladas para obtener un único archivo ejecutable se denomina enlace, y la herramienta que realiza esta operación se denomina enlazador. Existen dos tipos de enlace: enlazado estático, en el que solo se incluye el código de la biblioteca necesaria en el archivo ejecutable de la aplicación final, y enlazado dinámico, en el que una biblioteca instalada en el sistema es compartida por todas las aplicaciones que utilizan esa biblioteca. Actualmente, el enlace dinámico es el enfoque preferido y se caracteriza por ejecutables de aplicación más pequeños y un menor uso de memoria en tiempo de ejecución.
Hay que tomar en cuenta que, dado que varios programas pueden utilizar las mismas librerías, las diferencias entre las versiones de una biblioteca pueden ser un problema aún mayor que las aplicaciones. Hagamos un análises por un momento y recordemos cómo mirar los números de versión. Comúnmente se utiliza el control de versiones semántico, que indica las versiones mediante tres números separados por puntos. Una versión típica podría ser 2.39.16
, que indica una versión principal - 2 (un número que probablemente cambie sólo una vez cada pocos años), una versión menor - 39 dentro de la versión principal (que puede actualizarse cada pocos meses a contienen importantes cambios de características) y una revisión de rápido movimiento - 16 (que puede cambiar debido a una única corrección de error). Las versiones y revisiones posteriores tienen números más altos.
Un ejemplo muy simple
Veamos un ejemplo muy simple de un programa de computadora en el lenguaje Python para tener una idea aproximada de algunos de los elementos mencionados.
En lenguaje natural, se supone que el programa debe hacer lo siguiente: “Solicite al usuario que ingrese un número y verifique si este número es par o impar. Finalmente, genere el resultado.”
Y aquí está el código que podemos guardar en el archivo simpleprogram.py
:
num = int(input("Enter a number: "))
if (num % 2) == 0:
print("The given number is EVEN.")
else:
print("The given number is ODD.")
Incluso en estas pocas líneas de código podemos encontrar muchas de las características y elementos de sintaxis mencionados anteriormente:
-
En la línea 1 configuramos la variable
num
y le asignamos un valor con el operador=
. -
El valor asignado corresponde a la entrada del usuario (a través de la función
input()
). Además, la funciónint()
garantiza que esta entrada se convierta al tipo de dato entero, si es posible. La expresión que se pasa a una función entre paréntesis se llama parámetro o argumento. -
Si el usuario ingresa una cadena de texto, Python imprimiría un error como parte de su manejo de errores. Si se ingresa un número decimal, la función
int()
lo convierte al número base, ejemplo:5,73
a5
. -
En las siguientes líneas, la estructura de control que inicia una condición, con las palabras clave
if
yelse
, controla lo que sucede en cada uno de los dos casos posibles (el número es par o impar).
En primer lugar, el operador de módulo %
comprueba si (if
) al dividir el número ingresado por 2 se obtiene el valor 0 (es decir, sin resto); en este caso, el número es par. El ==
duplicado es el operador de comparación “es igual a”, que es diferente del operador de asignación =
en la línea 1.
-
En el otro caso (
else
), es decir, cuando la división entre 2 produce un resultado distinto de 0, el número ingresado debe ser impar. -
En ambos casos, la función
print()
devuelve el resultado como salida en forma de texto.
Y así es como se ve cuando ejecutamos el programa en la línea de comandos:
$ python simpleprogram.py Enter a number: 5 The given number is ODD.
Cuando considera cuánta lógica del lenguaje ya está involucrada en este pequeño ejemplo, se hace una idea de lo que es capaz de hacer un software complejo distribuido en miles de archivos; por ejemplo, sistemas operativos como Microsoft Windows, macOS o Linux, que ponen a disposición todo el hardware de una computadora y al mismo tiempo garantizan que los usuarios puedan instalar todas las demás aplicaciones deseadas y usarlas para trabajar o divertirse.
Código de máquina, lenguaje ensamblador y ensambladores
Como se mencionó anteriormente, el hardware puede ejecutar directamente solo una serie de patrones de bits llamados código de máquina. La CPU lee un patrón de bits de la memoria en unidades de una palabra (8 a 64 bits) y ejecuta la instrucción correlacionada. Las instrucciones individuales son bastante simples, por ejemplo, “copiar el contenido de la ubicación de memoria A en la ubicación de memoria B”, “multiplicar el contenido de la ubicación de memoria C por el contenido de la ubicación de memoria D” o “leer los datos que ha llegado al dispositivo en la dirección X.” En la era de las CPU de 8 bits, algunas personas podían memorizar todos los patrones de bits utilizados en el código de máquina y escribir programas directamente. Hoy en día, el número de patrones de instrucción ha aumentado y tratar de recordar todos estos patrones no es práctico.
El código de máquina es una secuencia de patrones de bits, 0 y 1, que no es nada intuitiva para los humanos. Para hacer la programación más intuitiva, se creó el lenguaje ensamblador, en el que las instrucciones recibían nombres y podían especificarse mediante cadenas. En lenguaje ensamblador, las instrucciones que corresponden uno a uno al código de máquina son escritas una sola vez. Las instrucciones podrían verse así:
move [B], [A] Copiar contenido de la memoria A a la memoria B multi R1, [C], [D] Multiplicar el contenido de la memoria C por el contenido de la memoria D input R1, [X] Leer los datos que han llegado al dispositivo en la dirección X
Una instrucción en lenguaje ensamblador corresponde a una instrucción en código de máquina, que corresponde a la instrucción exacta que el hardware puede entender y ejecutar. Las ventajas del lenguaje ensamblador sobre el lenguaje máquina incluyen:
- Legibilidad y mantenibilidad mejoradas
-
el lenguaje ensamblador es mucho más fácil de leer y escribir que el código de máquina. Esto facilita que los programadores comprendan, depuren y mantengan su código.
- Automatización del cálculo de direcciones
-
La programación de código de máquina también puede utilizar el concepto de variables y funciones, pero todo debe expresarse en términos de direcciones de memoria. El lenguaje ensamblador también asigna nombres a las direcciones de memoria, lo que facilita la expresión de la lógica de un programa.
Debido a que el lenguaje ensamblador tiene acceso a todas las funciones del hardware, se usa comúnmente en las siguientes situaciones:
- Parte dependiente de la arquitectura del sistema operativo
-
el uso de instrucciones dedicadas que son específicas de una arquitectura de CPU, para acceder a las funciones de inicialización y seguridad, solo se puede realizar en lenguaje ensamblador.
- Desarrollo de componentes del sistema de bajo nivel
-
El lenguaje ensamblador se utiliza para desarrollar componentes del sistema que necesitan interactuar directamente con el hardware de la computadora, como controladores de dispositivos, firmware y el sistema básico de entrada/salida (BIOS). En particular, los dispositivos de alta velocidad que requieren llevar el rendimiento del hardware al límite a menudo necesitan controladores y firmware programados en lenguaje ensamblador.
- Programación de microcontroladores
-
El lenguaje ensamblador también se utiliza para programar microcontroladores, que son computadoras pequeñas y de baja potencia que se utilizan en una amplia gama de sistemas integrados, desde juguetes hasta control industrial. Algunos microcontroladores tienen capacidades de memoria de sólo varios cientos de bytes y normalmente se programan en lenguaje ensamblador.
El código del lenguaje ensamblador se convierte a código de máquina antes de ser ejecutado por una aplicación llamada ensamblador. El ensamblador es la herramienta de programación más antigua y ha aportado una serie de ventajas impensables en la programación en código máquina. Para confundir las cosas, a veces la gente se refiere al lenguaje ensamblador como ensamblador.
El código de máquina y el lenguaje ensamblador difieren de un procesador de hardware a otro. Ellos se denominan "lenguajes de bajo nivel" porque operan directamente en el hardware. Sin embargo, los conceptos de computación y entrada/salida son los mismos en todos los procesadores. Si los conceptos comunes se pueden expresar de una manera que sea más fácil de entender para los humanos, la eficiencia de la programación se puede mejorar drásticamente. Aquí es donde entran los "lenguajes de alto nivel".
Lenguajes Compilados
Los lenguajes compilados son lenguajes de programación que se traducen a código de máquina o a un formato intermedio llamado código de bytes. El código de bytes se ejecuta en la computadora destino mediante una máquina virtual conocida como runtime virtual machine. La máquina virtual traduce el código de bytes al código de máquina adecuado para cada computadora. El Bytecode permite que los programas sean independientes de la plataforma y se ejecuten en cualquier sistema con una máquina virtual compatible.
La traducción del código fuente escrito en un lenguaje de programación de alto nivel a código de máquina o código de bytes la realiza un compilador. Ejemplos de algunos lenguajes compilados que producen código de máquina directamente son: C y C++. Los lenguajes que producen código de bytes incluyen Java y C#.
La elección entre código de máquina y código de bytes depende de los requisitos del proyecto, como el rendimiento, el agnosticismo de la plataforma y la facilidad de desarrollo.
Lenguaje interpretado
Los lenguajes interpretados son lenguajes de programación que son ejecutados por un intérprete, en lugar de compilarse en código de máquina. El intérprete lee el código fuente y ejecuta las declaraciones contenidas en este. Un intérprete es capaz de procesar directamente el código fuente, sin transformarlo a otro formato de archivo. Así, a diferencia de un compilador, que traduce todo el programa a código de máquina antes de ejecutarlo, un intérprete lee cada línea de código y lo ejecuta inmediatamente, lo que permite al programador ver los resultados de cada línea a medida que se ejecuta.
Los lenguajes interpretados se utilizan habitualmente para la creación de scripts (programas cortos que automatizan tareas), para interfaces de línea de comandos y para el control de lotes y trabajos. Los scripts escritos en lenguajes interpretados se pueden modificar y ejecutar fácilmente sin necesidad de volver a compilarlos, lo que los hace muy adecuados para tareas que requieren una rápida creación de prototipos o una iteración flexible y rápida. Sin embargo, esta comodidad conlleva algunas posibles desventajas. Por ejemplo, un programa interpretado se ejecuta más lentamente que su programa compilado equivalente.
Ejemplos de lenguajes interpretados incluyen Python, Ruby y JavaScript. Python se usa ampliamente en informática científica, análisis de datos y aprendizaje automático, mientras que Ruby se usa a menudo en desarrollo web y para crear scripts de automatización. JavaScript es un lenguaje de programación del lado del cliente integrado en los navegadores web para crear páginas web dinámicas e interactivas.
Lenguajes orientados a datos
Los lenguajes orientados a datos son lenguajes de programación optimizados para procesar y manipular grandes cantidades de datos. Están diseñados para manejar de manera eficiente grandes conjuntos de datos estructurados o no estructurados y proporcionar un conjunto de herramientas para trabajar con bases de datos, estructuras de datos y algoritmos para el procesamiento y análisis de datos.
Los lenguajes orientados a datos se utilizan en una variedad de aplicaciones, incluida la ciencia de datos, el análisis de big data, el aprendizaje automático y la programación de bases de datos. Son muy adecuados para tareas que implican procesar y analizar grandes cantidades de información, como limpieza y transformación de datos, visualización y modelado estadístico.
Ejemplos de lenguajes orientados a datos incluyen SQL (abreviatura de Structured Query Language), R y MATLAB. SQL es un lenguaje estándar utilizado para gestionar bases de datos relacionales y se utiliza ampliamente en los negocios y la industria. R es un lenguaje de programación y un entorno para gráficos y computación estadística. Se usa ampliamente en ciencia de datos y aprendizaje automático. MATLAB es un entorno informático numérico y un lenguaje de programación que se utiliza en una amplia gama de aplicaciones, incluido el procesamiento de señales, el procesamiento de imágenes y las finanzas computacionales.
Paradigmas de programación
Además de las características específicas de los lenguajes de programación, los paradigmas de programación determinan el enfoque de una solución particular. Podemos pensar en un paradigma como una estrategia básica con la que abordamos una tarea, dependiendo de los requisitos y condiciones específicas.
Un ejemplo comparable es la construcción de una casa: si los albañiles levantan las paredes ladrillo a ladrillo o si los componentes de hormigón prefabricados se ensamblan en el sitio, es una decisión fundamental que depende de las necesidades y circunstancias. ¿Qué características quieres que tenga la casa? ¿Donde está localizada? ¿Está conectada con otras casas?
De manera similar, los paradigmas marcan la dirección de la programación: si por ejemplo, un proyecto de software se divide en partes más pequeñas y separadas; y en como lo harían. Cada lenguaje de programación se adapta mejor a algún paradigma particular. Por tanto, la elección del paradigma está estrechamente relacionada con la elección del lenguaje de programación.
Los siguientes paradigmas son comunes en la programación:
Programación orientada a objetos (POO): La POO se basa en el concepto de objetos, que son instancias de clases que encapsulan datos y comportamiento. Por ejemplo, un lenguaje podría ofrecer un rectángulo como clase para ayudar al programador a mostrar un cuadro en la pantalla.
+ La programación orientada a objetos se centra en la manipulación de datos a nivel de objeto. La programación orientada a objetos facilita la escritura de código que sea mantenible, reutilizable y extensible, y se usa ampliamente en software de escritorio, videojuegos y aplicaciones web. Ejemplos de lenguajes de programación orientados a objetos incluyen Java, C# y Python.
- Programación de procedimientos
-
La programación de procedimientos realiza tareas a través de procedimientos, o bloques de código que se pueden ejecutar en un orden específico. Esto facilita la escritura de código estructurado que sea fácil de seguir, pero puede generar un código menos flexible y más difícil de mantener a medida que crece de tamaño y la complejidad del proyecto. Ejemplos de lenguajes de programación procedimentales incluyen C, Pascal y Fortran.
Hoy en día se utilizan otros enfoques para el desarrollo de software, para los cuales algunos lenguajes son más adecuados que otros. Además, las interfaces de arrastrar y soltar permiten a los no programadores escribir programas, y muchos servicios en línea han comenzado recientemente a generar código a través de inteligencia artificial cuando se les dan instrucciones en lenguaje sencillo.
En conclusión, cada paradigma de programación tiene sus propias fortalezas y debilidades; la elección del paradigma a menudo depende de las necesidades del proyecto, la experiencia y preferencias del desarrollador, así como las limitaciones de la plataforma y el entorno de desarrollo. Comprender los diferentes tipos de paradigmas puede ayudarle a elegir el paradigma adecuado para sus necesidades y también puede ayudarle a escribir código mejor y más eficiente.
Ejercicios guiados
-
¿Cuál es el propósito de las funciones?
-
¿Cuál es la ventaja del código de bytes sobre un archivo de código de máquina?
-
¿Cuál es la ventaja de un archivo de código de máquina sobre el código de bytes?
Ejercicios de exploración
-
¿Cuáles son algunas de las desventajas de dividir un programa en una gran cantidad de procesos o tareas?
-
Ha encontrado varios paquetes de código abierto, ofrecidos en diferentes versiones, que brindan las funciones que necesita para su programa. ¿Cuáles son algunos criterios para elegir un paquete?
-
Además de la POO y los paradigmas de desarrollo de procedimientos, ¿qué otros enfoques de desarrollo de software existen y cuál es el lenguaje de programación que mejor soporta cada enfoque?
Resumen
En esta lección has aprendido qué es el software y cómo se desarrolla con la ayuda de lenguajes de programación. Los numerosos lenguajes de programación se diferencian no sólo en su sintaxis, sino también, por ejemplo, en la gestión de recursos de hardware o en el manejo de estructuras de datos.
Los lenguajes de programación también difieren en cómo un intérprete o compilador convierte el código fuente, legible por humanos, al código de máquina final que será procesado por la computadora.
Los paradigmas de programación determinan la estrategia de los proyectos de software y, con ello, también la elección de los lenguajes de programación adecuados, en función de las necesidades y el tamaño del proyecto respectivo.
Respuestas a ejercicios guiados
-
¿Cuál es el propósito de las funciones?
Las funciones encapsulan ciertas actividades comunes, como generar una cadena de texto. Al crear una función, puede permitir que su programa y otros programas realicen la función de manera conveniente y repetida sin tener que escribir su propio código.
-
¿Cuál es la ventaja del código de bytes sobre un archivo de código de máquina?
El archivo de código de bytes se puede ejecutar en muchas computadoras diferentes, donde una máquina virtual convierte el programa en código de máquina. Por ejemplo, JavaScript se ejecuta en muchos navegadores y en muchos tipos de computadoras.
-
¿Cuál es la ventaja de un archivo de código de máquina sobre el código de bytes?
El código de máquina se ejecuta lo más rápido posible. El código de bytes se ejecuta más lentamente porque la máquina virtual debe convertirlo en código de máquina mientras ejecuta el código de bytes.
Respuestas a los ejercicios de exploración
-
¿Cuáles son algunas de las desventajas de dividir un programa en una gran cantidad de procesos o tareas?
Cuando un programa se divide en procesos, estos deben comunicarse entre sí. Si trabajan con una gran cantidad de datos en común, los procesos podrían generar una gran sobrecarga en el intercambio de datos y en protegerlos de cambios múltiples y simultáneos (condiciones de carrera). Los procesos también incurren en gastos generales cuando se inician y finalizan. Mientras más procesos tenga, más complejo se volverá el programa y sus interacciones, por lo que los errores pueden ser más difíciles de encontrar.
El paradigma funcional tiende a facilitar la división de programas en muchos procesos debido a la inmutabilidad. Los datos inmutables no sufren condiciones de carrera.
-
Ha encontrado varios paquetes de código abierto, ofrecidos en diferentes versiones, que brindan las funciones que necesita para su programa. ¿Cuáles son algunos criterios para elegir un paquete?
Consulte los informes de errores y los avisos de seguridad de los paquetes, porque algunos tienen muchos errores e incluso son inseguros. A veces la última versión no es la mejor, porque es posible que se haya introducido un fallo de seguridad en la misma.
Examine el foro donde los desarrolladores hablan sobre el paquete para ver si se mantiene activamente. Su programa probablemente estará en uso durante mucho tiempo y usted desea que el paquete también esté disponible y sea sólido con el tiempo.
Pruebe diferentes paquetes para comprobar su rendimiento, así como su corrección.
La mayoría de los paquetes dependen de funciones que se encuentran en otros paquetes (dependencias), por lo que una debilidad en una de las dependencias puede afectar su programa.
-
Además de la POO y los paradigmas de desarrollo de procedimientos, ¿qué otros enfoques de desarrollo de software existen y cuál es el lenguaje de programación que mejor soporta cada enfoque?
Además de los paradigmas de desarrollo de procedimientos y POO, otros tipos incluyen:
La programación funcional enfatiza el uso de funciones y conceptos matemáticos, como lambdas y cierres, para escribir código que se base en la evaluación de expresiones en lugar de la ejecución de declaraciones. La programación funcional trata las funciones como ciudadanos de primera clase, de modo que puedan ser manipuladas por el programa, y enfatiza la inmutabilidad, o trabajar con variables que no pueden cambiar después de haber sido configuradas inicialmente. Esto hace que sea más fácil razonar y probar el código, así como escribir aplicaciones simultáneas y paralelas. Ejemplos de lenguajes de programación funcionales incluyen Erlang, Haskell, Lisp y Scheme.
Los lenguajes imperativos se centran en las declaraciones necesarias para controlar el flujo de las transiciones del programa desde y hacia varios estados.
Los lenguajes declarativos describen qué acciones tomar y la lógica detrás de las instrucciones. No se especifica el orden en que se llevan a cabo las instrucciones. Los compiladores pueden reordenar y optimizar estas instrucciones, llamadas a funciones y otras declaraciones, siempre que se mantenga la lógica subyacente.
La programación natural es un paradigma de programación que utiliza lenguaje natural u otras representaciones amigables para los humanos, y así describir el comportamiento deseado de un programa. La idea es hacer que la programación sea accesible para personas que quizás no tengan una formación formal en informática. Ejemplos de lenguajes de programación naturales incluyen Scratch y Alice.