apuntes:desarrollo
Diferencias
Muestra las diferencias entre dos versiones de la página.
apuntes:desarrollo [23/10/2019 18:58] – [Construccion de un programa informático] Fernando Valdeón | apuntes:desarrollo [30/09/2020 19:54] (actual) – editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | ====== Fundamentos de Desarrollo de Software ====== | ||
+ | La labor de desarrollo de software es realizada por un programador, | ||
+ | |||
+ | El concepto de desarrollo de software incluye: | ||
+ | * __Trabajo en equipo__: los proyectos en la mayor parte de los casos parte de la colaboración entre diferentes desarrolladores, | ||
+ | |||
+ | * __Concepción o diseño a partir de unas condiciones__, | ||
+ | * __Pruebas__: | ||
+ | * __Mantenimiento__: | ||
+ | |||
+ | |||
+ | |||
+ | ===== Lenguajes de Programación ===== | ||
+ | {{ : | ||
+ | Los podemos clasificar atendiendo a distintos criterios: | ||
+ | |||
+ | ==== Según su nivel de abstracción ==== | ||
+ | Se entiende como la separación de un elemento de su contexto, o del resto de elementos que lo acompañan. La abstracción se centra en el //¿Qué hace?// más que en el //¿Cómo lo hace?//. | ||
+ | * Lenguajes de Alto Nivel | ||
+ | Los lenguajes de alto nivel son aquellos que expresan sus algoritmos de forma comprensible por la capacidad humana, en lugar de la capacidad de las máquinas. Cuando hay un gran nivel de abstracción tratamos con variables, matrices, objetos, aritmética, | ||
+ | Generan un código más sencillo y comprensible, | ||
+ | * Lenguajes de Nivel Medio | ||
+ | Tienen características que los acercan a los lenguajes de bajo nivel, pero a la vez también tiene características de los lenguajes de alto nivel. Se suelen utilizar para la aplicaciónes como la creación de sistemas operativos (p.e. Unix en C) Ejemplos: C, C++ | ||
+ | * Lenguajes de Bajo Nivel | ||
+ | El bajo nivel de abstracción se centra en lenguajes próximos a los que entiende la máquina, //código máquina//. Ejercen un control directo sobre el hardware (memoria, cpu) y dependen de la estructura física de este. Es por esto que los programas escritos en lenguajes de bajo nivel no son portables entre distintos equipos. Apuntemos que el código máquina es el código nativo de cada procesador, está organizado en instrucciones y se ejecuta directamente. No es un código escrito por programadores. | ||
+ | Ejemplos: código máquina, lenguaje ensamblador. | ||
+ | ==== Según su forma de ejecución ==== | ||
+ | * Lenguajes Compilados | ||
+ | {{ : | ||
+ | Ejemplos: C, C++, Visual Basic, Fortran, Pascal | ||
+ | |||
+ | * Lenguajes Interpretados | ||
+ | {{ : | ||
+ | Ejemplos: Html, Php, Python, Ruby, Javascript | ||
+ | |||
+ | * Lenguaje Intermedio | ||
+ | Conocemos bajo este concepto el producto de la compilación de algunos lenguajes de alto nivel en un tipo de lenguaje ([[https:// | ||
+ | |||
+ | |||
+ | |||
+ | ==== Según su sistema de tipos ==== | ||
+ | En una clasificación menos convencional y poco consensuada, | ||
+ | |||
+ | * Lenguajes fuertemente tipados (tipado estático): | ||
+ | |||
+ | * Lenguajes débilmente tipados (tipado dinámico): Los lenguajes de programación no tipados o débilmente tipados no controlan los tipos de las variables que declaran, de este modo, es posible usar valores de cualquier tipo en una misma variable. Por ejemplo, una función puede recibir indiferentemente como parámetro un valor entero, cadena de caracteres, número flotante, etc. Un lenguaje que no está tipado se refiere a que no está fuertemente tipado. Son lenguajes en los que no se define el tipo de una variable y puede almacenar distintos tipos de datos: números, caracteres, etc. Ejemplo: Javascript, Python | ||
+ | |||
+ | ===== Construccion de un programa informático ===== | ||
+ | Para ver nuestro programa en ejecución, debemos aplicar unos procesos intermedios mediante los cuales nuestro programa cambia de un estado a otro hasta que obtenemos una versión ejecutable. Este concepto se conoce como //Build//. | ||
+ | * Código Fuente: Es el código escrito por los programadores utilizando algún editor de texto o algun entorno de desarrollo. Este código no es directamente ejecutable por el ordenador. | ||
+ | * Código Objeto: Es el código resultante de compilar el código fuente. No es directamente ejecutable por el ordenador, pero tampoco es entendido por el ser humano. Es un código o representación intermedia de bajo nivel. | ||
+ | * Código Ejecutable: Es el resultado de enlazar el código objeto con una serie de rutinas y librerías, obteniendo el código que es directamente ejecutable por la máquina. | ||
+ | |||
+ | |||
+ | ==== Proceso de compilación ==== | ||
+ | {{ : | ||
+ | La obtención de un programa ejecutable se lleva a cabo mediante dos programas: el compilador y el enlazador (linker). Aunque difiere dependiendo de la tecnología o plataforma de programación que usemos. | ||
+ | |||
+ | Aun así, la compilación se compone internamente de varias etapas: | ||
+ | * **Análisis léxico**: se lee secuencialmente todo el código fuente agrupándolo en unidades significativas de caracteres (tokens). Son secuencias de caracteres que tienen significado (int, =, void, ...). Todos los espacios en blanco, lineas en blanco, comentarios, | ||
+ | * **Analizador sintáctico**: | ||
+ | * **Analizador semántico**: | ||
+ | * **Generación del código intermedio**: | ||
+ | |||
+ | En los __lenguajes compilados__ completamente a codigo máquina, la fase de enlazado (linker) une todos los códigos objetos resultados de la compilación de todos los ficheros fuentes que forman parte de un programa. También se une el código de los métodos de las librerías usadas. Todos estos códigos objetos se traducen a código máquina creando un programa ejecutable (p.e. un fichero .exe). | ||
+ | |||
+ | ==== Máquina virtual ==== | ||
+ | {{ : | ||
+ | En el caso de que nuestra plataforma use una máquina virtual para ejecutar nuestro código compilado, la máquina se inicia automáticamente cuando se lanza el programa que se desea ejecutar y se detiene cuando se finaliza. Este tipo de máquinas virtuales se conocen como máquinas virtuales de proceso, y son en sí un proceso normal más dentro del sistema operativo. Su objetivo es el de proporcionar un entorno de ejecución independiente de la plataforma de hardware y del sistema operativo. El ejemplo más conocido es la //Java Virtual Machine//. | ||
+ | |||
+ | La máquina virtual de java se encarga de cargar, verificar, enlazar e inicializar los ficheros //.class// obtenidos del proceso de compilación de los fuentes //.java//. | ||
+ | * El proceso de compilación del código fuente, es el mismo descrito en el punto anterior hasta obtener un código intermedio. A diferencia del anterior, la fase de enlazado se realiza cada vez que se ejecuta el programa. | ||
+ | * En el proceso de carga se buscan los ficheros binarios de las clases (ficheros .class) atendiendo a los identificadores y se crea la clase a partir de esos ficheros binarios. | ||
+ | * En la fase de verificación se comprueban que los bytecodes recibidos no contienen instrucciones que son obviamente dañinas para el sistema. | ||
+ | * Fase de enlace, es el momento en el que se cogen las clases o interfaces y se combinan en un estado de ejecución de la máquina virtual y se van traduciendo mediante el interprete (linea a linea) y el compilador JIT de Java (Just In Time, compila el fichero class completo) a código nativo. Este código es ejecutado. | ||
+ | |||
+ | A diferencia de los lenguajes compilados, en este tipo de funcionamiento el enlazado de las clases y las librerías y la traducción a código máquina __se realiza cada vez que ejecutamos el programa__, por lo que es más lento que otros lenguajes puramente compilados. | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | (c) {{date> %Y}} Fernando Valdeón |