OCR Computer Science A Level: Tipos de Lenguajes de Programación - Notas Avanzadas
Paradigmas de Programación
- Definición de Paradigmas: Los paradigmas de programación son diferentes enfoques para utilizar un lenguaje de programación con el fin de resolver un problema particular.
- Categorización General:
* Imperativo: Utiliza código que especifica claramente las acciones que se deben realizar. Incluye los paradigmas procedimental y orientado a objetos.
* Declarativo: Se enfoca en declarar el resultado deseado en lugar de la serie exacta de instrucciones necesarias para obtenerlo. El lenguaje determina cómo obtener el resultado, abstrayendo los detalles del usuario. Es común en sistemas expertos e inteligencia artificial.
- Paradigma Procedimental:
* Es un tipo de programación imperativa que utiliza una secuencia de instrucciones contenidas dentro de procedimientos.
* Las instrucciones se ejecutan de manera paso a paso.
* Es ampliamente utilizado por ser aplicable a una gran variedad de problemas y relativamente fácil de escribir e interpretar.
* Ejemplos: Pascal, Python, Logo.
- Paradigma Orientado a Objetos (OOP):
* Aplicable a problemas con componentes reutilizables que comparten características similares.
* Se basa en entidades denominadas objetos, formados a partir de clases.
* Se enfoca en la reutilización, actualización y mantenimiento sencillo de los programas.
* Ejemplos: Python, Delphi, Java.
- Paradigma Funcional:
* Parte del paradigma declarativo.
* Utiliza el concepto de reutilizar un conjunto de funciones que forman el núcleo del programa.
* El código consiste en llamadas a funciones, a menudo combinadas unas dentro de otras.
* Está estrechamente vinculado con las matemáticas.
* Ejemplos: Haskell, C#, Java.
- Paradigma Lógico:
* Parte del paradigma declarativo.
* Utiliza código que define un conjunto de hechos y reglas basados en el problema.
* Se emplean consultas (queries) para encontrar respuestas a los problemas.
* Ejemplo: Prolog.
Lenguaje Procedimental
- Uso y Limitaciones: Se emplea en una amplia gama de desarrollo de software por su simplicidad. Sin embargo, no todos los problemas pueden resolverse de forma eficiente con este paradigma.
- Tipos de Datos y Estructuras:
* Utiliza tipos de datos tradicionales integrados como integers (enteros) y strings (cadenas).
* Proporciona estructuras de datos como diccionarios y arreglos (arrays).
- Programación Estructurada: Es una subsección popular donde el flujo de control se define por cuatro estructuras principales:
* Secuencia: El código se ejecuta línea por línea, de arriba hacia abajo.
* Selección: Un bloque de código se ejecuta si se cumple una condición específica (uso de sentencias IF).
* Iteración: Un bloque de código se ejecuta un número determinado de veces o mientras se cumpla una condición (bucles FOR, WHILE o REPEATUNTIL).
* Recursión: Las funciones se expresan en términos de sí mismas. Se ejecutan llamándose a sí mismas hasta alcanzar un caso base (basecase) que no realiza la llamada.
Lenguaje Ensamblador (Assembly Language)
- Naturaleza: Es un lenguaje de bajo nivel, situado un nivel por encima del código máquina.
- Traducción: Se convierte a código máquina mediante un ensamblador (assembler) al momento de la ejecución.
- Características:
* Utiliza mnemónicos en lugar de binario para facilitar su uso.
* Cada mnemónico es representado por un código numérico.
* Es específico del procesador, ya que interactúa directamente con los registros de propósito especial de la CPU.
* Permite la interacción directa con el hardware, siendo útil en sistemas empotrados (embeddedsystems).
* Típicamente, cada instrucción equivale a casi una línea de código máquina.
- Mnemónicos de LMC (Little Man Computer):
* ADD (Suma): Suma el valor de una dirección de memoria específica al valor en el Acumulador.
* SUB (Resta): Resta el valor de la dirección de memoria dada al valor en el Acumulador.
* STA (Almacenar/Store): Guarda el valor del Acumulador en la dirección de memoria indicada.
* LDA (Cargar/Load): Carga el valor de la dirección de memoria indicada en el Acumulador.
* INP (Entrada/Input): Permite al usuario ingresar un valor que se guardará en el Acumulador.
* OUT (Salida/Output): Imprime el valor actual dentro del Acumulador.
* HLT (Detener/Halt): Detiene el programa, evitando la ejecución del resto del código.
* DAT (Dato/Data): Crea una bandera con una etiqueta donde se almacenan datos.
* BRZ (Saltar si es cero/Branch \, if \, zero): Salto condicional a una dirección si el Acumulador es 0.
* BRP (Saltar si es positivo/Branch \, if \, positive): Salto condicional a una dirección si el Acumulador es positivo.
* BRA (Saltar siempre/Branch \, always): Salto incondicional a una dirección sin importar el valor del Acumulador.
- Ejemplo de Programa LMC (Cálculo de Módulo):
* El programa devuelve el resto cuando num1 se divide por num2:
1. INP
2. STAnum1
3. INP
4. STAnum2
5. LDAnum1
6. positiveSTAnum1 (Etiqueta para el bucle de resta).
7. SUBnum2 (Resta repetidamente mientras el resultado sea positivo).
8. BRPpositive
9. LDAnum1
10. OUT
11. HLT
12. num1DAT
13. num2DAT
Modos de Direccionamiento de Memoria
- Componentes de la Instrucción: Las instrucciones en código máquina constan de dos partes:
* Opcode: Especifica la instrucción a realizar.
* Operand: Contiene un valor relacionado con los datos sobre los cuales se ejecuta la instrucción.
- Función de los Modos: Permiten acceder a un mayor número de ubicaciones de memoria, ya que el tamaño del operando limitaría de otro modo las direcciones accesibles. El modo de direccionamiento es parte del opcode.
- Tipos de Direccionamiento:
* Direccionamiento Inmediato (Immediate Addressing): El operando es el valor real sobre el cual se realiza la instrucción, representado en binario.
* Direccionamiento Directo (Direct Addressing): El operando indica la dirección de memoria que contiene el valor. Es el modo usado en LMC.
* Direccionamiento Indirecto (Indirect Addressing): El operando indica la dirección de un registro que a su vez contiene otra dirección donde se encuentran los datos.
* Direccionamiento Indexado (Indexed Addressing): Utiliza un registro de índice que almacena un valor. La dirección del operando se determina sumando el operando al registro de índice. Es necesario para añadir un desplazamiento (offset) y acceder a datos contiguos como en los arreglos.
Lenguajes Orientados a Objetos (OOP)
- Fundamentos:
* Clase: Plantilla para un objeto; define su estado y comportamiento.
* Estado: Definido por los atributos (propiedades del objeto).
* Comportamiento: Definido por los métodos (acciones que puede realizar).
* Instanciación: Proceso de usar una clase para crear un objeto. Una clase puede crear múltiples objetos con los mismos atributos y métodos.
- Encapsulación:
* Propiedad que asegura que los atributos no puedan ser accedidos ni editados directamente por los usuarios.
* Los atributos se declaran como privados (private) y solo se alteran mediante métodos públicos (public).
* Getters: Métodos especiales para recuperar el valor de un atributo.
* Setters: Métodos especiales para establecer el valor de un atributo.
- Constructor: Cada clase debe tener un método constructor llamado new, que permite la creación de un nuevo objeto.
- Ejemplo de Pseudocódigo (Clase Book):
class Book:
private reserved
private onLoan
private author
private title
public procedure new(title, author, reserved, onLoan)
title = givenTitle
author = givenAuthor
reserved = givenReserved
onLoan = givenOnLoan
end procedure
public function set_reserved()
reserved = True
end function
end class
* Para crear un objeto: myBook=newBook(′GreatExpectations′,′CharlesDickens′,′False′,′False′).
* Para llamar al setter: myBook.setreserved(). - Herencia (Inheritance):
* Una clase puede heredar de otra clase.
* La subclase (o clase derivada) posee todos los métodos y atributos de la superclase (o clase padre), pudiendo añadir propiedades adicionales.
* Ejemplo: classBiographyinheritsBook. Un objeto Biography tendría autor y título, pero podría añadir un atributo como Subject.
- Polimorfismo:
* Propiedad que permite que los objetos se comporten de manera diferente según su clase.
* Overriding (Anulación): Redefinir un método dentro de una subclase con código alterado para que funcione de forma distinta.
* Overloading (Sobrecarga): Pasar diferentes parámetros a un mismo método.
Ventajas y Desventajas de la OOP
- Ventajas:
* Reutilización: Alto nivel de reusabilidad gracias a la herencia y el polimorfismo.
* Portabilidad: Las clases pueden usarse en múltiples proyectos.
* Fiabilidad: La encapsulación protege los atributos de accesos directos. Las clases pueden producirse de forma independiente.
* Diseño de Calidad: Requiere planificación avanzada, lo que deriva en software con menos vulnerabilidades.
* Mantenimiento: La estructura modular facilita actualizaciones.
* Abstracción: Los programadores no necesitan conocer los detalles de implementación; las clases probadas pueden usarse como una "caja negra" (blackbox).
- Desventajas:
* Curva de Aprendizaje: Requiere un estilo de pensamiento alternativo que puede ser difícil para quienes vienen de otros paradigmas.
* Inadecuación: No es apto para todos los problemas; si hay poca reutilización, el programa puede ser más largo e ineficiente.
* Escala: Generalmente no es adecuado para problemas muy pequeños.