B3-T2 Lenguajes de Programación.pdf
Document Details
Uploaded by frsoal
Full Transcript
1. Lenguajes de Programación 1.1. Definiciones Básicas Algoritmo: Secuencia ordenada y finita de pasos o instrucciones que se siguen para resolver un problema o realizar una tarea específica. En términos de programación, un algoritmo describe de forma clara cómo se debe proceder para...
1. Lenguajes de Programación 1.1. Definiciones Básicas Algoritmo: Secuencia ordenada y finita de pasos o instrucciones que se siguen para resolver un problema o realizar una tarea específica. En términos de programación, un algoritmo describe de forma clara cómo se debe proceder para llegar a una solución. Características de un algoritmo: ○ Definido: Cada paso del algoritmo debe ser claro y no debe generar ambigüedades. ○ Finito: El número de pasos del algoritmo debe ser limitado, debe terminar en algún momento. ○ Entrada: El algoritmo puede recibir uno o más valores de entrada. ○ Salida: Debe generar uno o más resultados. ○ Efectividad: Los pasos deben ser lo suficientemente simples como para ser ejecutables en un tiempo razonable Instrucción: es una orden o comando específico que indica al sistema realizar una acción Una operación aritmética, una asignación de valor a una variable, una llamada a un subprograma… Programa: Conjunto de instrucciones organizadas y ejecutadas por una computadora para realizar una tarea específica Lenguaje de programación: Conjunto de reglas, sintaxis y semántica que permiten escribir programas de manera comprensible tanto para los humanos como para las computadoras. Subprograma: Es un bloque de código que realiza una tarea específica y puede ser llamado desde cualquier parte del programa principal. Función: Es un tipo de subprograma que recibe parámetros de entrada, realiza un conjunto de instrucciones y devuelve un valor de salida Procedimiento es un tipo de subprograma similar a una función, pero no necesariamente devuelve un valor. Traductor es un programa que convierte el código escrito en un lenguaje de programación a un lenguaje comprensible por la máquina, normalmente a código máquina o bytecode Compilador: Traduce el código fuente completo antes de que el programa se ejecute (como en C o C++). Intérprete: Traduce el código fuente línea por línea y lo ejecuta de inmediato (como en Python). Ensamblador: Convierte código en lenguaje ensamblador a código máquina. 1.2. Compiladores Programa que traduce el código fuente escrito en un lenguaje de programación de alto nivel (como C, C++ o Java) a un código objeto o código máquina, que puede ser ejecutado directamente por la computadora Fases: Análisis léxico(scanner): Convierte el código fuente en una secuencia de tokens (unidades mínimas como palabras clave, identificadores, operadores, etc.). Análisis sintáctico (parsing): Verifica la estructura gramatical del código fuente de acuerdo con las reglas del lenguaje de programación. Análisis semántico: Comprueba la validez semántica. Comprueba tipos de datos, identificadores no declarados, y otras reglas semánticas. Generación de código intermedio: Se genera una representación intermedia del programa, más abstracta que el código máquina, pero más cercana a la ejecución. Esta etapa facilita optimizaciones Optimización de código: Optimiza el código intermedio para que sea más eficiente, eliminando instrucciones redundantes o simplificando cálculos. Generación de código: Traduce el código intermedio optimizado al código máquina específico del sistema donde se ejecutará. Enlazado (linking): Combina el código máquina generado con otras bibliotecas o módulos necesarios para crear un programa ejecutable final. Tipos de compilador Compilador Nativo: Convierte el código fuente de un lenguaje de programación a código máquina específico para la arquitectura del sistema en el que se ejecuta. Compilador cruzado: genera código máquina para una plataforma o arquitectura diferente a la del sistema en el que se ejecuta el compilador. ○ Ejemplo: Un compilador que se ejecuta en una PC con arquitectura x86 pero genera código para un microcontrolador ARM Transpilador: Traduce el código fuente de un lenguaje de programación a otro lenguaje de programación de alto nivel. Útil cuando se desea migrar código entre lenguajes o aprovechar características de otro lenguaje. 1.3. Clasificación de los lenguajes de programación Clasificación según el nivel de abstracción Lenguajes de bajo nivel: Lenguajes cercanos al hardware ○ Lenguaje máquina, ensamblador Lenguajes de alto nivel: más cercanos al lenguaje humano, por lo que son más fáciles de leer, escribir y mantener ○ Ejemplos: Python, Java, C++, JavaScript, Ruby Lenguajes de intermedio nivel: Están entre los lenguajes de bajo nivel y alto nivel, proporcionando cierto control sobre el hardware mientras son relativamente fáciles de leer y escribir ○ Ejemplo: C, C++, Rust. Clasificación según el paradigma de programación: estilo o enfoque de programación. Paradigma imperativo: secuencias de instrucciones que modifican el estado del programa. Se enfoca en cómo se debe realizar una tarea. ○ Programación estructurada: C, Pascal ○ Programación orientada a objetos (POO): Java Paradigma declarativo: describe qué quiere lograr sin especificar los pasos exactos. ○ Programación funcional: Basada en la evaluación de funciones matemáticas. Evita el uso de estados mutables y variables globales. Ejemplos: Haskell, Lisp, Scala, Erlang. ○ Programación lógica: Basada en el uso de reglas lógicas para deducir resultados a partir de hechos conocidos. Ejemplo: Prolog. Paradigma reactivo: se centra en la propagación de cambios. Los datos o eventos reaccionan de manera automática a las modificaciones en el sistema. ○ Ejemplos: RxJS (JavaScript), React (biblioteca de JavaScript) Paradigma orientado a eventos: El flujo del programa está determinado por eventos como entradas del usuario, mensajes de otros programas o sensores. ○ Ejemplos: JavaScript (para aplicaciones web), Visual Basic. Clasificación según el propósito Lenguajes de propósito general: sin estar limitados a un tipo particular de problema. ○ Ejemplos: Python, Java, C, C++ Lenguajes de propósito específico: para resolver problemas específicos en áreas especializadas ○ Ejemplo: HTML, MATLAB Clasificación según la forma de ejecución Lenguajes compilados Lenguajes interpretados Lenguajes híbridos (compilados e interpretados) Clasificación según la tipificación de datos: se refiere a cómo los lenguajes manejan los tipos de datos y el chequeo de tipos Tipado estático: Las variables se deben declarar explícitamente y se verifican en tiempo de compilación. ○ Ejemplos: C, C++, Java, Rust. Tipado dinámico: Las variables se determinan en tiempo de ejecución, lo que da mayor flexibilidad pero puede llevar a errores difíciles de detectar. ○ Ejemplos: Python, JavaScript, Ruby. Tipado fuerte: No permite operaciones entre diferentes tipos de datos sin una conversión explícita. ○ Ejemplos: Haskell, Python, Java. Tipado débil: Las conversiones entre tipos pueden ocurrir implícitamente. ○ Ejemplos: JavaScript, PHP Clasificación según la generación: 1ª generación (1GL): lenguaje máquina. 2ª generación (2GL): lenguajes simbólicos: 3ª generación (3GL): lenguajes de medio y alto nivel. ○ C, Java, Python, FORTRAN, COBOL, C++ 4ª generación (4GL): lenguajes utilizados para propósitos específicos (Orientado a Problemas). La característica principal es especificar qué hay que hacer y no cómo se hace. ○ SQL, MATLAB, ABAP, SAS, Oracle Forms 5ª generación (5GL): lenguajes de inteligencia artificial ○ Prolog, LISP, Mercury Nota: Principales lenguajes de Programación 2. Representación de tipos de datos 2.1. Tipos de datos Tipo de datos: es una clasificación que especifica el tipo de valor que una variable puede almacenar y las operaciones que se pueden realizar sobre ese valor. Nota En Java, los tipos de datos primitivos son los tipos básicos de datos que no son objetos y que se almacenan directamente en la memoria. Tipo Descripción Valor por defecto byte Entero de 8 bits con signo. Rango: -128 a 127. 0 short Entero de 16 bits con signo. Rango: -32,768 a 32,767. 0 int Entero de 32 bits con signo. Rango: -2^31 a 2^31 - 1. 0 long Entero de 64 bits con signo. Rango: -2^63 a 2^63 - 1. Número en coma flotante de 32 bits. Precisión simple. float Rango: 1.4E-45 a 3.4E+38. Número en coma flotante de 64 bits. Precisión doble. double Rango: 4.9E-324 a 1.7E+308. Carácter Unicode de 16 bits. Representa un único char carácter. Rango: '\u0000' (0) a '\uffff' (65,535) boolean Valor lógico que solo puede ser true o false. FALSE casting: (convertir): es el proceso de transformar un valor de un tipo a un valor de otro tipo. Nota Los Strings en java son constantes. No se pueden cambiar realmente NO concatena strings, sino que lo que hace es crear strings nuevos y asignarles valor, haciendo así que la ocupación del proceso sea mayor y quedando datos sueltos en la memoria (memory leak). Para paliar este problema podemos utilizar “StringBuffer y y String.Concat, que no genera memory leaks 3. Operadores Aritméticos Operador Significado Ejemplo + Suma 5+3=8 - Resta 5-3=2 * Multiplicación 5 * 3 = 15 / División 6/3=2 Módulo (residuo de % la división) 5%2=1 ++ Incremento int x = 5; x++; // x = 6 -- Decremento int x = 5; x--; // x = 4 Relacionales Operador Significado Ejemplo == Igual a 5 == 3 // false != No igual a 5 != 3 // true > Mayor que 5 > 3 // true < Menor que 5 < 3 // false >= Mayor o igual que 5 >= 3 // true 1) // true || OR ` Negación lógica ! (NOT) !(5 > 3) // false Ternarios Operador Significado Ejemplo Si la condición se evalúa como verdadera se ejecuta la instrucción después del ?, en caso contrario, la int resultado = (5 > 3) ? 10 Condicion? si true: si false instrucción después de : : 20; // resultado = 10 A nivel de bit Operador Significado Ejemplo & AND a nivel de bit 5 & 3 // 1 | OR OR a nivel de bit ^ XOR a nivel de bit 5 ^ 3 // 6 ~ NOT a nivel de bit ~5 // -6 Desplazamiento a la derecha 5 >> 1 // 2 Asignación Operador Significado Ejemplo = Asignación int x = 5; += Suma y asignación x += 3; // x = x + 3 -= Resta y asignación x -= 3; // x = x - 3 *= Multiplicación y asignación x *= 3; // x = x * 3 /= División y asignación x /= 3; // x = x / 3 %= Módulo y asignación x %= 3; // x = x % 3 &= AND a nivel de bit y asignación x &= 3; // x = x & 3 OR a nivel de bit y | OR asignación ^= XOR a nivel de bit y asignación x ^= 3; // x = x ^ 3 Desplazamiento a la izquierda y > 1 Escape Secuencia de Escape Significado Ejemplo \n Salto de línea "Hola\nMundo" \t Tabulación "Hola\tMundo" \' Comilla simple "Es una comilla simple: \' " \" Comilla doble "Es una comilla doble: \" " \\ Barra invertida "La barra invertida: \\ " \r Retorno de carro "Hola\rMundo" \b Retroceso (backspace) "Hola\bMundo" \f Avance de página "Hola\fMundo" 4. Sentencias de programación 4.1. nstrucciones condicionales if: Java Python C++ C# if-else Java Python C++ C# if anidados Java Python C++ C# switch Java Python C++ C# 4.2. Bucles While: Ejecuta el bloque de código mientras la condición especificada sea verdadera. Java Python C++ C# for: Ejecuta el bloque de código un número definido de veces Java Python C++ C# for-each: Itera sobre los elementos de una colección, como un array o una lista, sin necesidad de usar un índice Java Python C++ C# do-while: Ejecuta el bloque de código al menos una vez y luego continúa ejecutando mientras la condición sea verdadera. La condición se verifica después de cada iteración. Java Python C++ C# 5. Procedimiento, Funciones y Parámetros Procedimiento: es un bloque de código que realiza una tarea específica. En algunos lenguajes, el término "procedimiento" se usa para describir lo que en otros lenguajes se llama una "función" sin valor de retorno. Ejemplo en Java: Función: bloque de código que realiza una tarea específica y devuelve un valor. Las funciones pueden tomar parámetros de entrada, procesar estos datos y devolver un resultado. Ejemplo en Java: Parámetros: Son variables que se pasan a un procedimiento o función para que puedan utilizarse dentro de ese bloque de código. Ámbito de las variables: ○ Globales: Variables accesibles desde cualquier parte del programa, dependiendo de su nivel de acceso. ○ Locales: Aquellas que se declaran dentro de un bloque de código, como una función, método o bucle. Su ámbito está limitado al bloque donde se definen, y no se puede acceder a ellas fuera de ese bloque. Solo son accesibles dentro del bloque donde fueron definidas. Se destruyen cuando el bloque de código finaliza su ejecución. Útil para almacenar valores temporales o intermedios en el código. Como pasar una variable ○ Valor: Se pasa una copia del valor de la variable al método llamado. Los cambios realizados en el valor dentro del método no afectan la variable original. ○ Referencia: Se pasa una referencia al objeto, no una copia del valor. Esto significa que cualquier modificación en el objeto dentro del método afectará el objeto original. 6. Vectores y Registros Arrays (Arreglos): Estructura de datos que permite almacenar un conjunto de elementos del mismo tipo. El tamaño del array se define al momento de su creación y no puede cambiar posteriormente. Los elementos se almacenan de forma consecutiva en memoria Se accede a los elementos utilizando índices (empezando desde 0). Vectores: Estructura de datos similar a un array, pero tiene la capacidad de redimensionarse dinámicamente. Los elementos se almacenan de forma consecutiva en memoria En Java: Pertenecen al paquete java.util.Vector Característica Array Vector Dinámico (crece y disminuye Tamaño Fijo (definido al crearlo) automáticamente) Ligeramente más lento debido a la Más rápido, ya que es más sincronización para ser seguro en Performance simple y no tiene sincronización múltiples hilos Se accede por índices, rápido y Se accede por índices, pero es Acceso a elementos eficiente menos eficiente que el array Se puede redimensionar Modificación de tamaño No se puede modificar automáticamente Utilizado cuando se sabe el Utilizado cuando el tamaño puede Uso en Java tamaño fijo de antemano variar durante la ejecución 7. Tipos de variables Lenguaje Tipo de Variable Ejemplo int int edad = 25; char char letra = 'A'; double double salario = 3000.50; Java String String nombre = "Juan"; boolean boolean esActivo = true; int[] int[] edades = {25, 30, 35}; int edad = 25 float salario = 3000.50 Python str nombre = "Juan" bool esActivo = True list edades = [25, 30, 35] int int edad = 25; char char letra = 'A'; double double salario = 3000.50; C++ std::string std::string nombre = "Juan"; bool bool esActivo = true int[] int edades[] = {25, 30, 35}; int int edad = 25; char char letra = 'A'; double double salario = 3000.50; C# string string nombre = "Juan"; bool bool esActivo = true; int[] int[] edades = {25, 30, 35}; 8. Lógica matemática Explicación Resumen con 2 bits Entrada A Entrada B AND OR XOR XNOR NAND 0 0 0 0 0 1 1 0 1 0 1 1 0 1 1 0 0 1 1 0 1 1 1 1 1 0 1 0 Resumen con 3 bits Entrada A Entrada B Entrada C AND OR XOR XNOR NAND 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 1 0 1 0 1 1 1 0 0 0 1 1 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 0