Document Details

FamedHydrogen

Uploaded by FamedHydrogen

Universidad de La Laguna

Tags

programming paradigms programming languages compilers computer science

Summary

This document contains possible exam questions about programming languages and paradigms. It covers topics like declarative programming (functional and logical), imperative programming, object-oriented programming, and more.

Full Transcript

Posibles preguntas de LPP 1. ¿Cuáles son los paradigmas de programación más importantes? Enumérelos y descríbalos Programación Declarativa: En este paradigma, el foco está en qué se desea lograr, dejando al sistema decidir cómo hacerlo. Los lenguajes declarativos, evitan estados mutables y estructur...

Posibles preguntas de LPP 1. ¿Cuáles son los paradigmas de programación más importantes? Enumérelos y descríbalos Programación Declarativa: En este paradigma, el foco está en qué se desea lograr, dejando al sistema decidir cómo hacerlo. Los lenguajes declarativos, evitan estados mutables y estructuras de control explícitas, priorizando expresiones y reglas. - Funcional: Basado en funciones matemáticas, donde la evaluación de expresiones y el uso de funciones puras es fundamental (ej. Haskell). - Lógico: Basado en reglas y hechos, donde el programa determina la solución mediante inferencia lógica (ej. Prolog). Programación Imperativa: Este paradigma se centra en cómo se debe realizar una tarea, especificando una secuencia de comandos o instrucciones que modifican el estado del programa. Los lenguajes imperativos, como C y Python, suelen estructurar el código en funciones o procedimientos que manipulan variables mediante asignaciones, bucles y estructuras de control. Es el enfoque más cercano al funcionamiento de las computadoras, ya que se basa en órdenes secuenciales y cambios de estado. Programación Orientada a Objetos (POO): Este paradigma organiza el programa en objetos que encapsulan datos (atributos) y comportamientos (métodos). Los objetos interactúan entre sí mediante mensajes para realizar tareas, fomentando la reutilización de código y el diseño modular. Lenguajes como Java y C++ implementan este paradigma, que se basa en principios como herencia, polimorfismo y encapsulación para modelar sistemas complejos de forma intuitiva. Lenguaje ensamblador: Se usa para escribir instrucciones específicas del hardware, traducidas a código máquina por ensambladores. Es de bajo nivel y se acerca a la arquitectura del procesador. Lenguaje máquina: El nivel más bajo, es el código binario que la CPU puede ejecutar directamente. Está compuesto solo por ceros y unos y es específico para cada tipo de procesador. 2. ¿Cual es la diferencia entre el lenguaje máquina y el lenguaje ensamblador? - Lenguaje Máquina: Es el código binario directo de la computadora, difícil de leer y específico para una arquitectura. - Lenguaje Ensamblador: Usa mnemónicos legibles para humanos para representar instrucciones de la CPU, más legible y adaptable a diferentes arquitecturas. 3. ¿En qué sentido son los lenguajes de programación de alto nivel mejores que el lenguaje ensamblador? Los lenguajes de programación de alto nivel son mejores que el lenguaje ensamblador en términos de abstracción y facilidad de programación. Ofrecen una sintaxis más legible, mayor portabilidad entre sistemas y permiten a los programadores concentrarse en la lógica del problema en lugar de preocuparse por detalles de bajo nivel. 8. ¿Qué distingue a los lenguajes declarativos de los lenguajes imperativos? Los lenguajes declarativos se centran en "qué hacer" y describen el resultado deseado, mientras que los lenguajes imperativos se centran en "cómo hacerlo" y especifican los pasos detallados para lograr un resultado. 12. ¿Por qué los lenguajes concurrentes no se consideran una categoría aparte en la clasificación de los lenguajes dada? Los lenguajes concurrentes no se consideran una categoría aparte porque pueden pertenecer a diferentes paradigmas (imperativo, funcional, orientado a objetos) y se enfocan en la ejecución simultánea de tareas, no en una estructura de programación fundamental. 21. ¿Qué es un compilador? - Un compilador es un programa que traduce el código fuente escrito en un lenguaje de programación a un lenguaje de máquina o a otro lenguaje intermedio. El resultado de esta traducción es un archivo ejecutable que puede ser ejecutado directamente por la computadora. 22. ¿Qué es un intérprete? - Un intérprete es un programa que ejecuta directamente el código fuente de un programa, línea por línea, sin la necesidad de compilarlo previamente. Interpreta y ejecuta las instrucciones del programa en tiempo real, lo que permite una mayor flexibilidad, pero generalmente es más lento que la ejecución de código compilado. 18. ¿Cuáles son las ventajas y desventajas de la compilación frente a la interpretación? - Compilación: Ventajas: Mayor velocidad de ejecución, optimización de código. Desventajas: Requiere tiempo de compilación previo, menos flexibilidad. - Interpretación: Ventajas: Mayor flexibilidad, no necesita paso de compilación. Desventajas: Menor velocidad de ejecución, posibles errores en tiempo de ejecución. 17. Explique por qué se distingue entre compilación e interpretación. La distinción entre compilación e interpretación radica en cómo se traduce y ejecuta el código fuente de un programa: - Compilación: En la compilación, el código fuente se traduce por completo a código de máquina (o un código intermedio en algunos casos) antes de la ejecución. El resultado de la compilación es un archivo ejecutable independiente que se puede ejecutar sin necesidad de acceder al código fuente original. Esto mejora el rendimiento, pero hace que el proceso de desarrollo sea más lento debido a la fase de compilación. - Interpretación: En la interpretación, el código fuente se traduce y ejecuta línea por línea o instrucción por instrucción mientras se ejecuta el programa. No se crea un archivo ejecutable independiente. Esto permite una mayor flexibilidad y facilita la depuración, pero a menudo resulta en un rendimiento más lento en comparación con la compilación. 29. ¿Qué es Git? - Git es un sistema de control de versiones distribuido ampliamente utilizado para el seguimiento de cambios en archivos y proyectos de desarrollo de software. 31. ¿Qué es un repositorio? - Un repositorio es un espacio donde se almacenan los archivos y la historia de cambios de un proyecto gestionado por un sistema de control de versiones como Git. 32. ¿Qué es una confirmación (commit)? - Una confirmación o commit es un registro de un conjunto de cambios en un repositorio Git. Representa una versión específica del proyecto con un mensaje descriptivo de los cambios realizados. 35. ¿Qué es una rama? - Una rama en Git es una línea de desarrollo independiente que permite trabajar en cambios separados sin afectar la rama principal (generalmente llamada "master" o "main"). Las ramas se utilizan para desarrollar nuevas características, solucionar errores o realizar experimentos de manera aislada. 1. ¿Qué se entiende por abstracción? - La abstracción se refiere a simplificar un concepto o proceso, centrándose en los aspectos más importantes y omitiendo los detalles innecesarios. 2. ¿Qué estructura dan los traductores de lenguajes de programación de alto nivel a la memoria de ejecución? Los traductores de lenguajes de programación de alto nivel proporcionan una estructura a la memoria de ejecución que consta de: (donde se almacena el código) 1. Stack (Pila) para gestionar las llamadas a funciones y las variables locales. 2. Heap (Montón) para el almacenamiento dinámico de datos. 3. Segmento de Código para las instrucciones de máquina. 4. Segmento de Datos para variables globales y estáticas. 3. ¿Qué es un procedimiento (subprograma)? - Un procedimiento, o subprograma, es una porción de código reutilizable que realiza una tarea específica en un programa. 4. ¿Qué es un Registro de Activación (Stack Frame)?¿Cuál es la estructura estándar? - Un Registro de Activación, o Stack Frame, es una estructura de datos utilizada para gestionar la información de una llamada a una función, incluyendo el ámbito de esta. - La estructura estándar de un registro de activación incluye elementos como Valor de retorno Parámetros Zona de Control → **desde donde se llama** Variables locales Variables temporales 6. ¿Dibuje el flujo de ejecución de un programa principal en el que se hace una llamada a un subprograma para sumar los dos números que recibe como parámetros? - [Programa Principal] -> [Llamada a Subprograma Suma] -> [Ejecución de Suma] -> [Retorno a Programa Principal] 7. ¿Qué se entiende por programación procedural? - La programación procedural es un enfoque de programación que se basa en la organización de un programa en funciones o procedimientos, donde cada función realiza una tarea específica y se llama secuencialmente para lograr una ejecución controlada. 11. ¿Qué se entiende por programación estructurada o modular? - La programación estructurada o modular es un enfoque de programación que se basa en la creación de programas organizados en módulos o funciones que realizan tareas específicas. Se enfatiza la claridad, la simplicidad y el uso de estructuras de control controladas para mejorar la legibilidad y mantenibilidad del código. - Las principales características de la programación estructurada son la organización del código en módulos o funciones, el uso de estructuras de control controladas (secuencia, selección, repetición), y la ausencia de sentencias "go to". El objetivo es crear programas más legibles, mantenibles y menos propensos a errores. 10. ¿Qué establece el Teorema Fundamental de la Estructura? - El Teorema Fundamental de la Estructura establece que cualquier programa puede expresarse utilizando únicamente tres estructuras de control fundamentales: secuencia, selección (if/else), y repetición (bucles). Esto demuestra que los "go to" no son necesarios para expresar la lógica de cualquier programa. 13. ¿Qué se entiende por encapsulación? - La encapsulación es el concepto en programación orientada a objetos que implica el ocultamiento de los detalles internos de un objeto y el acceso controlado a sus datos y métodos. Se logra definiendo atributos y métodos como públicos, privados o protegidos. 14. ¿Cuáles son las principales características de la programación orientada a objetos? - Las principales características de la programación orientada a objetos incluyen encapsulación, herencia, polimorfismo y abstracción. Los objetos son instancias de clases que contienen datos y métodos que operan en esos datos. 15. ¿Qué es Ruby? - Ruby es un lenguaje de programación interpretado y de alto nivel conocido por su simplicidad y flexibilidad. Es utilizado en desarrollo web y aplicaciones diversas, y es apreciado por su enfoque en la productividad del programador. - La principal característica de Ruby es su énfasis en la elegancia del código y la facilidad de lectura. Es un lenguaje que se asemeja al lenguaje natural. Está completamente orientado a objetos. 22. ¿Qué indican los siguientes prefijos en la declaración de una variable? - $: Indica una variable global. - @: Indica una variable de instancia de clase. - @@: Indica una variable de clase. 38. ¿Qué es Pry? - Pry es una poderosa herramienta de depuración e inspección interactiva para Ruby. Proporciona una consola interactiva avanzada que permite explorar y depurar código Ruby de manera más efectiva. 45. ¿Qué es la “Programación en Pareja” (Pair Programming)? - La programación en pareja es una técnica de desarrollo de software en la que dos programadores trabajan juntos en un mismo equipo o computadora para escribir código. Uno es el "conductor" que escribe el código, y el otro es el "observador" que revisa y sugiere mejoras, lo que mejora la calidad y la colaboración. 46. ¿En qué consiste la gestión de dependencias en el desarrollo de software? - La gestión de dependencias implica administrar las bibliotecas y módulos externos necesarios para que un proyecto de software funcione. Se trata de garantizar que las dependencias se descarguen, se instalen y se gestionen de manera eficiente. 47. ¿Qué es rake? - Gema para la gestión y automatización de tareas en proyectos Ruby. 51. ¿Para qué se utiliza la descripción de una tarea en rake? - La descripción de una tarea en Rake se utiliza para proporcionar información sobre lo que hace la tarea. Esta descripción es útil para documentar y comunicar el propósito de la tarea a otros desarrolladores. - El objetivo de una tarea en Rake se utiliza para especificar qué parte del código se debe ejecutar cuando se llama a la tarea. Es el bloque de código que define la funcionalidad de la tarea. 56. ¿Qué es la comprobación de unidades de código (Unit Testing)? - La comprobación de unidades de código, o unit testing, es una práctica en desarrollo de software que consiste en probar individualmente las unidades de código, como funciones o métodos, para asegurarse de que funcionan correctamente de manera aislada. - Las pruebas unitarias suelen implementarse en un directorio específico llamado "test" Estas pruebas se organizan en archivos separados que verifican el comportamiento de las unidades de código. Una afirmación, o "assertion", es una expresión que verifica si una condición es verdadera durante la ejecución de una prueba. Se utiliza para validar el comportamiento esperado del código bajo prueba. 33. ¿En qu´ e consiste el desarrollo dirigido por pruebas (Test Driven Development)? El desarrollo dirigido por pruebas (Test Driven Development, TDD) es una metodología de programación en la que se escriben primero las pruebas unitarias que describen el comportamiento esperado de una funcionalidad antes de implementar el código. Se basa en un ciclo iterativo: escribir una prueba que inicialmente falla, implementar el código necesario para pasar la prueba, y finalmente refactorizar el código manteniendo las pruebas exitosas. Se ponen en el Directorio SPEC/ 1. ¿Qué es la concurrencia? La concurrencia se refiere a la ejecución simultánea de múltiples tareas en un programa, permitiendo que varias operaciones progresen de manera aparentemente simultánea. 2. ¿Cuáles son las principales características de la programación concurrente? a. División de tareas: Descomposición de un problema en tareas independientes. b. Interleaving: Ejecución intercalada de tareas para lograr apariencia de simultaneidad. c. Comunicación: Mecanismos para que las tareas compartan información. 3. ¿Qué es el paralelismo? El paralelismo implica la ejecución simultánea real de múltiples tareas en hardware multinúcleo o sistemas distribuidos, mejorando el rendimiento al realizar tareas simultáneas. 4. ¿Cuáles son las principales características de la programación paralela? - a. División de Tareas: Descomposición de un problema en subtareas que se ejecutan simultáneamente. - b. Coordinación: Necesidad de sincronización entre las tareas para evitar conflictos. - c. Hardware específico: Aprovechamiento de arquitecturas con múltiples núcleos o procesadores. 5. ¿Cuáles son las principales características de la programación distribuida? - a. Independencia geográfica: Procesos ejecutándose en diferentes ubicaciones físicas. - b. Comunicación entre procesos: Intercambio de datos entre procesos remotos. - c. Tolerancia a fallos: Capacidad para manejar fallas en nodos del sistema distribuido. 6. ¿Cuáles son las diferencias entre programación concurrente, programación paralela y programación distribuida? - a. Concurrencia: Se refiere a la ejecución simultánea aparente de tareas, pero no necesariamente en el mismo instante de tiempo. Las tareas pueden intercalarse. - b. Paralelismo: Involucra la ejecución simultánea real de tareas, generalmente aprovechando hardware multinúcleo para mejorar el rendimiento. - c. Distribución: Implica la ejecución de tareas en ubicaciones geográficas diferentes, con comunicación entre procesos remotos. Puede o no incluir paralelismo. 7. ¿Qué es un proceso? - Un proceso es una instancia en ejecución de un programa, con su propio espacio de memoria y recursos, que realiza operaciones de manera independiente. 8. ¿Cuáles son los estados del ciclo de vida de un proceso? - a. Listo: El proceso está preparado para ejecutarse, pero aún no se le ha asignado el tiempo de CPU. - b. Ejecución: El proceso está siendo ejecutado por la CPU. - c. Bloqueado: El proceso está temporalmente detenido, por ejemplo, esperando entrada/salida. - d. Terminado: El proceso ha completado su ejecución. 9. ¿Qué es un proceso ligero (Thread)? - Un proceso ligero, o hilo, es una unidad más pequeña de ejecución dentro de un proceso. Comparten recursos, como el espacio de memoria, pero tienen su propio contador de programa y pila. Los hilos permiten la ejecución concurrente dentro de un proceso. 10. ¿Para qué se utilizan las condiciones de Bernstein? Las condiciones de Bernstein se utilizan para determinar si dos procesos pueden ejecutarse en paralelo sin interferir entre sí. Esto se logra verificando que los conjuntos de variables leídas y escritas por ambos procesos sean independientes, es decir, que no haya solapamiento entre las variables que un proceso escribe y las que el otro lee o escribe. Estas reglas son clave para garantizar la seguridad en la programación concurrente y optimizar el rendimiento. 11. ¿Cómo se definen las condiciones de Bernstein? 1. R(Si): Conjunto de variables cuyo valor es accedido durante la ejecución de la instrucción Si. 2. W(Si): Conjunto de variables cuyo valor cambia durante la ejecución de la instrucción Si. Condiciones de Bernstein: Dos procesos, S1 y S2, pueden ejecutarse de forma concurrente si se cumplen las siguientes condiciones: Estas condiciones garantizan que no hay conflictos entre las lecturas y escrituras de variables de los dos procesos, lo que permite su ejecución simultánea sin generar inconsistencias en los datos. 13. ¿Cómo puede ser el orden de ejecución de un conjunto de instrucciones? El orden de ejecución de un conjunto de instrucciones puede ser determinado por la arquitectura del sistema, el compilador, el planificador de tareas del sistema operativo o, en el caso de programas concurrentes, por la naturaleza de la concurrencia y la planificación de ejecución. Este orden puede ser secuencial, paralelo o concurrente, dependiendo de cómo se organizan y ejecutan las instrucciones. 14. ¿Qué significa que los programas concurrentes puedan tener un comportamiento no determinista? Que los programas concurrentes puedan tener un comportamiento no determinista significa que su ejecución puede variar entre diferentes ejecuciones, incluso si se proporcionan las mismas entradas y condiciones iniciales. Esto se debe a la naturaleza de la concurrencia, donde múltiples hilos o procesos pueden ejecutarse de manera independiente y en paralelo, lo que puede llevar a diferentes órdenes de ejecución y resultados. El no determinismo en programas concurrentes puede surgir debido a la sincronización no explícita, la planificación del sistema operativo, la competencia por recursos compartidos y otros factores. La falta de determinismo puede hacer que sea más difícil predecir el resultado exacto de la ejecución de un programa concurrente en cada ejecución. 15. ¿Cuáles son los dos problemas principales inherentes a la programación paralela? 1. Condición de carrera(Race Condition): Una condición de carrera ocurre cuando dos o más hilos o procesos acceden simultáneamente a un recurso compartido y al menos uno de ellos realiza una operación de escritura, lo que puede llevar a resultados inesperados debido a la ejecución no determinista. - Problema: Puede resultar en un comportamiento no determinista, ya que el resultado depende del orden en que se ejecuten los hilos o procesos. - Solución: Se puede utilizar la sincronización, como mutex o semáforos, para asegurar el acceso exclusivo a los datos compartidos. 2. Condición de competencia, interbloqueo (Deadlock): Un interbloqueo o deadlock se produce cuando dos o más hilos o procesos quedan atrapados esperando indefinidamente a que se liberen recursos que cada uno posee, impidiendo que cualquier hilo o proceso avance. Es una situación donde el sistema se paraliza debido a la competencia por recursos. - Descripción: Ocurre cuando dos o más hilos o procesos están bloqueados indefinidamente, ya que cada uno está esperando que el otro libere un recurso que necesita. - Problema: Puede provocar la parálisis del sistema, ya que los hilos o procesos quedan atrapados y no pueden continuar su ejecución. 17. ¿Qué es la exclusión mutua (mutual exclusion)? La exclusión mutua se refiere a la técnica de garantizar que solo un hilo o proceso pueda ejecutar una sección crítica de código a la vez. Esto se logra utilizando mecanismos como mutex o semáforos para evitar condiciones de carrera y asegurar el acceso exclusivo a recursos compartidos. 18. ¿Qué es una sección crítica (critical section)? Una sección crítica es una porción de código que accede y modifica datos compartidos. Para evitar condiciones de carrera, es necesario garantizar la exclusión mutua, permitiendo que solo un hilo o proceso acceda a la sección crítica en un momento dado. 19. ¿En qué consiste la serialización o condición de sincronización? La serialización o condición de sincronización implica organizar la ejecución de varios hilos o procesos de manera que se eviten las condiciones de carrera. Se busca garantizar la consistencia de los datos mediante la sincronización para que no se produzcan resultados inesperados debido a la concurrencia. 21. ¿En qué consiste la inanición (starvation)? La inanición ocurre cuando un hilo o proceso no puede acceder a un recurso o a la sección crítica de manera continua debido a la prioridad dada a otros hilos o procesos. Esto puede llevar a que un hilo o proceso quede permanentemente excluido o experimente retrasos significativos en su ejecución. 1. ¿Qué es una clase? Conjunto de métodos y datos que actúa como una plantilla para la creación de objetos. Define atributos y métodos que los objetos creados a partir de ella heredarán. 2. ¿Qué es un objeto? En Ruby, un objeto es una instancia de una clase. Representa una entidad y puede tener atributos y métodos definidos por su clase. 15. ¿Qué es el polimorfismo? El polimorfismo en programación orientada a objetos es la capacidad de un objeto de comportarse de diferentes maneras dependiendo del contexto en el que se utiliza o de que un código funcione para distintos tipos de datos. 16. ¿Cuál es la diferencia entre tipo y clase? La CLASE de un objeto → la plantilla que se usa (llama a new) Un objeto tiene una CLASE bien definida en Ruby Esa CLASE nunca CAMBIARÁ durante el tiempo de vida del objeto El TIPO de un objeto es el CONJUNTO de MÉTODOS a los que puede responder El tipo de un objeto puede variar, está relacionado con la clase, pero la clase es sólo parte del tipo de un objeto. 27. ¿Qué se entiende por herencia? La herencia en programación orientada a objetos es un concepto que permite a una clase heredar propiedades y comportamientos de otra clase. La clase que hereda se llama subclase, y la clase de la cual hereda se llama superclase. La subclase puede utilizar y extender los atributos y métodos de la superclase. 28. Enumere los tipos de herencia y descríbalos brevemente. - Herencia simple: Una subclase hereda de una única superclase. - Herencia múltiple: Una subclase puede heredar de múltiples superclases Ruby proporciona herencia simple, donde una clase puede heredar de una sola superclase. 43. ¿Qué es un módulo? Conjunto de clases, funciones y constantes que pueden incluir otros módulos, sirven para hacer espacios de nombre y para mixins (simular herencia múltiple) 44. ¿Qué es un espacio de nombres (namespace)? Un espacio de nombres (namespace) en programación se refiere a una región en la que los identificadores únicos, como nombres de variables, funciones o clases, son válidos y no entran en conflicto con identificadores en otros espacios de nombres. En Ruby, los módulos actúan como espacios de nombres y ayudan a organizar y encapsular funcionalidades. 45. ¿Qué es un (mix-in)? Un mixin es una técnica en la programación orientada a objetos donde un módulo es incluido en una clase para proporcionarle métodos y comportamientos adicionales. Los mixins permiten la reutilización de código de manera más flexible que la herencia única, ya que una clase puede incluir varios mixins. 46. ¿Qué es Enumerable? Enumerable es un módulo en Ruby que proporciona una implementación de iteradores para las colecciones de objetos. Cualquier clase que incluya el módulo Enumerable puede utilizar métodos como each, map, select, y otros. Esto facilita la iteración y manipulación de elementos en una colección (arrays, hashes, etc.). 47. ¿Qué es Comparable? Comparable es un módulo en Ruby que proporciona métodos de comparación a las clases que lo incluyen. Para usar Comparable, una clase debe implementar el método (llamado operador de comparación o spaceship operator). Esto permite que las instancias de la clase sean comparadas utilizando operadores como. Al incluir Comparable en una clase, se obtiene funcionalidad de comparación sin tener que implementar manualmente cada operador de comparación. 58. ¿Qué es una clase abstracta? Una clase abstracta en programación es una clase que no puede ser instanciada directamente y que a menudo sirve como una plantilla para otras clases. La principal característica de una clase abstracta es que puede contener métodos abstractos. Un método abstracto es un método que no tiene implementación en la clase abstracta y debe ser implementado por las clases derivadas que la heredan. En Ruby no existen como tal, pero se pueden simular. 63. ¿Qué es un método singleton? Un método singleton en Ruby es un método que está definido solo para una instancia particular de una clase, en lugar de para la clase en su conjunto. Cada objeto en Ruby tiene su propio espacio para métodos singleton, lo que permite agregar métodos específicos a una única instancia. 66. ¿Qué es la eigenclass? La eigenclass, es una clase especial en Ruby que almacena los métodos singleton de un objeto. Cada objeto en Ruby tiene su propia eigenclass, que se utiliza para almacenar los métodos que son específicos de esa instancia en lugar de la clase en sí. 148. ¿En qué consiste la comprobación continua (Continuous Testing)? La comprobación continua, o Continuous Testing, es una práctica en desarrollo de software que implica ejecutar pruebas automáticamente cada vez que se realiza un cambio en el código fuente, garantizando que las nuevas implementaciones no introduzcan errores y que las funcionalidades existentes sigan funcionando correctamente. 155. ¿Qué es RDoc? RDoc es una herramienta de documentación en Ruby que genera documentación a partir de comentarios en el código fuente. 1. ¿Qué es un bloque en Ruby? Un bloque en Ruby es un conjunto de código rodeado por llaves {} o las palabras clave do y end. Puede ser pasado como argumento a un método y ejecutarse dentro de ese método. Los bloques son fundamentales para la programación funcional y la implementación de iteradores en Ruby. 3. ¿Qué es un Proc? Un Proc es un objeto que encapsula un bloque de código y puede ser almacenado en una variable. Puede ser pasado como un argumento de método y ejecutarse posteriormente. Los Procs son flexibles y se pueden llamar como bloques. 5. ¿Qué es un lambda? Un lambda en Ruby es una forma de crear una función anónima o un bloque de código que se puede almacenar en una variable. A diferencia de los Procs, los lambdas son más estrictos en cuanto al número de argumentos que reciben y cómo se manejan. También tienen un alcance de variables más restrictivo, lo que significa que las variables externas no se capturan de la misma manera que en un Proc. 14. ¿Qué son las funciones de orden superior (high order functions)? Las funciones de orden superior son aquellas que toman una o más funciones como argumentos y/o devuelven una función como resultado. En lenguajes de programación que admiten funciones de orden superior, como Ruby, esto permite tratar las funciones como ciudadanos de primera clase (pueden ser asignadas a variables, pasadas como argumentos, devueltas como resultados o almacenadas en estructuras de datos) 15. ¿Qué es la memorización (memoization)? La memorización es una técnica de optimización que consiste en almacenar en caché los resultados de llamadas costosas a funciones y devolver el resultado almacenado cuando la misma entrada ocurre nuevamente. Esto mejora el rendimiento al evitar recalcular resultados ya conocidos. En Ruby, esto se puede lograr mediante el uso de variables para almacenar resultados anteriores. 27. ¿Qué es la reflexión o introspección? La metaprogramación consiste en escribir programas que ayudan a crear otros programas así como sus datos. La metaprogramación es el conjunto de técnicas que permiten extender la sintaxis de Ruby para hacer más fácil la programación. El lenguaje en el que se escribe el metaprograma se denomina metalenguaje. El lenguaje de los programas que son manipulados se denomina lenguaje objeto. La habilidad de un lenguaje de programación para ser su propio metalenguaje se denomina reflexión. La metaprogramación está fuertemente relacionada con la definición de Lenguajes de Dominio Específico (Domain Specific Languages). Por ejemplo: Rake, RSpec, Gemfile, etc. 29. ¿Qué se entiende por metaprogramación? La metaprogramación es una técnica de programación en la que un programa es capaz de escribir o manipular su propio código durante el tiempo de compilación o ejecución. En Ruby, esto implica la capacidad de crear, modificar o extender clases y métodos en tiempo de ejecución, lo que proporciona flexibilidad y dinamismo al código. 30. ¿Qué es un Lenguaje de Dominio Específico (DSL - Domain Specific Language)? Un DSL es un lenguaje de programación o especificación diseñado para abordar un dominio específico de problemas o tareas, optimizando la expresividad y facilitando la resolución de problemas dentro de ese dominio particular.

Use Quizgecko on...
Browser
Browser