Teoría sobre Desenvolvemento de software

De MediaWiki
Ir a la navegación Ir a la búsqueda

Obxectivos

  • Comprender os principios básicos do desenvolvemento de software
  • Coñecer as linguaxes de programación e as súas características
  • Coñecer as fases de desenvolvemento das aplicacións e as filosofías áxiles
  • Comprender a diferencia entre compiladores, intérpretes e máquinas virtuais

Concepto de programa informático

Fases do desenvolvemento dunha aplicación: análise, deseño, codificación, probas, documentación, explotación e mantemento

Linguaxes de programación e tipos

Definición

Un lenguaje de programación es un lenguaje formal que le proporciona a una persona, en este caso el programador, la capacidad de escribir (o programar) una serie de instrucciones o secuencias de órdenes en forma de algoritmos con el fin de controlar el comportamiento físico o lógico de un sistema informático, de manera que se puedan obtener diversas clases de datos o ejecutar determinadas tareas.

Características

Programar viene a ser el proceso de crear un software fiable mediante la escritura, prueba, depuración, compilación o interpretación, y mantenimiento del código fuente de dicho programa informático. Básicamente, este proceso se define aplicando lógicamente los siguientes pasos:

  • El desarrollo lógico del programa para resolver un problema en particular.
  • Escritura de la lógica del programa empleando un lenguaje de programación específico (codificación del programa).
  • Compilación o interpretación del programa hasta convertirlo en lenguaje de máquina.
  • Prueba y depuración del programa.
  • Desarrollo de la documentación.

Los lenguajes de programación están formados por un conjunto de símbolos (llamado alfabeto), de reglas gramaticales (léxico/morfológicas y sintácticas) y de reglas semánticas, que en conjunto definen las estructuras válidas del lenguaje y su significado

Generaciones

Pueden clasificarse en cinco generaciones.

Primera generación (1GL)

Formada por los lenguajes de programación utilizados en los primeros ordenadores: lenguaje máquina y ensamblador.

Segunda generación (2GL)

Formada por el lenguaje macroensamblador que es ensamblador combinado con instrucciones de control y de manejo de datos más complejas. Estos lenguajes son específicas para una familia de procesadores y el hardware relacionado con el. Aún se siguen utilizando para programar los núcleos (kernel) de los sistemas operativos y los controladores de algunos dispositivos (device drivers).

Tercera generación (3GL)

Formada por la mayor parte de los lenguajes de alto nivel actuales. El código es independiente de la máquina y el lenguaje de programación es parecido al lenguaje humano. Por ejemplo: Java, C, C++, PHP, JavaScript, e Visual Basic.

Cuarta generación (4GL)

Formada por lenguajes y entornos diseñados para una tarea o propósito muy específico como acceso a bases de datos, generación de informes, generación de interfaces de usuario, etcétera. Por ejemplo: SQL, Informix 4GL y Progress 4GL.

Quinta generación (5GL)

Formada por lenguajes en las que el programador establece el problema a resolver y las condiciones a cumplir. Se usan en inteligencia artificial, sistemas basados en el conocimiento, sistemas expertos, mecanismos de inferencia o procesamento del lenguaje natural. Por ejemplo: Prolog, Smalltalk y Lisp.

Tipos

= Código fonte, obxecto e executable. Linguaxes compiladas vs interpretadas vs intermedias

Código fonte, código obxecto e código executable

Lenguajes interpretados

Lenguajes compilados

Máquinas virtuais e linguaxe intermedia

En función del nivel de abstracción

En función del nivel de abstracción podemos diferenciar de más bajo a más alto nivel entre:

  • Lenguaje máquina: Mantiene una dependencia total con la arquitectura física de la máquina; siguen una notación binaria.
  • Lenguaje ensamblador: Permite escribir instrucciones con una notación simbólica o nemotécnica.
  • Lenguaje de alto nivel: Aporta una mayor independencia de la máquina; esto lenguajes requieren ser compilados o interpretados

En función paradigma de programación

Un paradigma de programación es una metodología o filosofía de programación a seguir con un núcleo central incuestionable; es decir, los lenguajes que utilizan el mismo paradigma de programación utilizarán los mesmos conceptos básicos para programar.

Pueden clasificarse en dos grandes grupos: el grupo que sigue el paradigma imperativo e el que sigue el paradigma declarativo.

Lenguajes Declarativos

El código indica que es lo que se quiere obtener pero no cómo se tiene que obtener.

Es un conjunto de condiciones, proposiciones, afirmaciones, restricciones, ecuaciones o transformaciones que describen el problema y detallan se solución. El programador tiene que pensar en la lógica del algoritmo y no en la secuencia de ordenes para que se lleve a cabo.

Un lenguaje declarativo es un tipo de lenguaje de programación basado más en las matemáticas y en la lógica que los lenguajes imperativos, más cercanos estos al razonamiento humano. Los lenguajes declarativos no dicen cómo hacer una cosa, sino, más bien, qué cosa hacer. Hay dos subtipos:

  • Lenguajes Funcionales
  • Lenguajes Lógicos.

Lenguajes funcionales

Se trata de lenguajes de programación sin asignaciones, basados en el concepto matemático de función.

Consisten en combinar funciones para conseguir funciones más complejas hasta llegar a la función que es el programa.

Ejemplos de estos lenguajes son LISP y SCHEME

Lenguajes lógicos

Son lenguajes en los que se especifican un conjunto de hechos y una serie de reglas que permiten la deducción de otros hechos. El sistema utiliza esa información para encontrar la solución.

La programación lógica desde la perspectiva del programador consiste en establecer correctamente todos los hechos y reglas, ya que el cálculo está implícito.

El lenguaje lógico más representativo es PROLOG, basado en la lógica de predicados.

Lenguajes Imperativos

El código está formado por una serie de pasos o instrucciones para realizar una tarea organizando o cambiando valores en memoria. Las instruciones se ejecutan de forma secuencial, es decir, hasta que no se ejecuta una no se pasa a ejecutar la siguiente. Entre muchos otros, Java, C, C++, PHP, JavaScript y Visual Basic son ejemplos de lenguajes imperativos.

Dentro de los lenguajes imperativos se van produciendo evoluciones de la metodología estructurada a nuevos enfoques como son la programación orientada a objetos, la programación orientada a aspectos, la programación concurrente u la programación multiparadigma.

A finales de los años 60 nace la metodología estructurada que permitía tres tipos de estructuras en el código:

  • la secuencial
  • la alternativa (basada en una decisión)
  • la repetitiva (bucles).

Los programas están formados por datos y esas estructuras. Un ejemplo sería el lenguaje Basic.

La primera evolución supuso añadir al módulo como componente básico dando lugar a la programación estructurada y modular. Los programas estaban formados por módulos o procesos por un lado y datos por otro. Los módulos necesitaban unos datos de entrada y obtenían otros de salida que a su vez podían ser utilizados por otros módulos. Por ejemplo, C es un lenguaje estructurado y modular.

En los años 80 apareció la programación orientada a objetos, y otros enfoques como la programación concurrente, la orientada a eventos, la orientada a aspectos, y la multiparadigma

Orientados a objetos

Esta metodología se popularizó a principios de los 90 siendo actualmente una de las más utilizadas. Cada objeto sigue el patrón especificado en una clase. Los programas contienen objetos que se relacionan o colaboran con otros objetos de su misma clase o de otras clases. La clase está compuesta de atributos (datos) y métodos (procesos) y puede tener las propiedades:

  • Herencia. Pueden declararse clases hijas que heredan las propiedades y métodos de la clase padre. Los métodos heredados pueden sobrecargarse; esto es, dentro de la misma clase puede aparecer definido con distinto comportamiento el mismo método con diferente firma (número de parámetros y tipo de los mismos)
  • Polimorfismo. Propiedad que permite que un método se comporte de diferente manera dependiendo del objeto sobre el que se aplica.
  • Encapsulamiento. Permite ocultar detalles internos de una clase.

C++, C# y Java son ejemplos de lenguajes orientadas a objetos.

Lenguajes concurrentes

Dijkstra instigó el estudio de la programación concurrente en su ahora clásico artículo "Procesos secuenciales de cooperación", publicado en 1967. En ese artículo vemos la introducción de algunos problemas ahora bien conocidos como "The Dining Philosophers","The Sleeping Barber " y "The Dutch Flag Problem"; y quizás lo más importante, el problema de la sección crítica y su solución utilizando semáforos. Este artículo fue, de hecho, el primero en tener una visión de alto nivel de la programación concurrente.

Su filosofía es la división de un problema en subproblemas que se solucionan de forma individual, para crear un programa o aplicación que no se vea afectada en tiempo real.

Un lenguaje de programación será concurrente si posee las estructuras necesarias para **definir y manejar diferentes tareas (hilos de ejecución)** dentro de un programa de forma simultánea gestionando los problemas de comunicación y sincronización entre esos hilos.

Ejemplos: Java, Ada

Lenguajes conducidos por eventos

La programación dirigida por eventos, es un paradigma de programación en el que tanto la estructura como la ejecución de los programas van determinados por los sucesos que ocurran en el sistema, definidos por el usuario (como un clic de ratón o pulsación de teclado) o que ellos mismos provoquen.

Este es el paradigma más habitual en el desarrollo de interfaces gráficas de usuario (GUI) o drivers de dispositivos.

Swift sería un lenguaje representativo de este paradigma.

Lenguajes orientados a aspectos

La idea central de la POA es permitir que un programa sea construido describiendo cada concepto (o incumbencia) separadamente. El soporte para este nuevo paradigma se logra a través de una nueva clase de lenguajes, llamados lenguajes orientados a aspectos (LOA), los cuales brindan mecanismos para capturar y declarar aquellos elementos que se diseminan por todo el sistema (aspectos).

Los LOA son aquellos lenguajes que permiten separar la definición de la funcionalidad “principal” de la definición de los diferentes aspectos.

Los LOA deben satisfacer varias propiedades deseables, entre las que se pueden mencionar:

  • Cada aspecto debe ser claramente identificable.
  • Cada aspecto debe auto contenerse.
  • Los aspectos deben ser fácilmente modificables.
  • Los aspectos no deben interferir entre ellos.
  • Los aspectos no deben interferir con los mecanismos usados para definir y evolucionar la funcionalidad principal, como la herencia.

Se distinguen dos enfoques diferentes en el diseño de los lenguajes orientados a aspectos:

  • los lenguajes orientados a aspectos de dominio específico. Por ejemplo:
    • COOL (COOrdination Language) es un lenguaje de dominio específico, desarrollado por Xerox, cuya finalidad es tratar los aspectos de sincronismo entre hilos concurrentes.
    • RIDL (Remote Interaction and Data transfers aspect Language) es un LOA de dominio específico que maneja la transferencia de datos entre diferentes espacios de ejecución.
    • MALAJ (Multi Aspect LAnguage for Java) [13] es un LOA de dominio especifico, focalizado en la sincronización y reubicación.
  • los lenguajes orientados a aspectos de propósito general. Algunos ejemplos
    • AspectC: LOA que extiende C.
    • AspectC++: LOA que extiende de C++
    • AspectJ: LOA que extiende de Java

Programación multiparadigma

La Programación Multiparadigma es una práctica que emerge como resultado de la coeexistencia de los paradigmas orientado a objetos, procedural, declarativo y funcional buscando mejorar la producción en el desarrollo de proyectos.

Rust quizás sea su mejor exponente: es un lenguaje de programación compilado, de propósito general y multiparadigma que está siendo desarrollado por Mozilla.​ Ha sido diseñado para ser "un lenguaje seguro, concurrente y práctico".

Python también encajaría: es orientado a objetos, reflexivo, imperativo y funcional.

En función del dominio de aplicación

Podemos tener la siguiente clasificación en función de los dominios de aplicación siguientes:

  • Aplicaciones científico-técnicas: Como ejemplo tenemos MATLAB o R.
  • Aplicaciones de gestión de información: Como ejemplo tenemos Java, o SQL.
  • Aplicaciones de programación de sistemas: Como ejemplo tenemos C, o C++.
  • Aplicaciones Web: Como ejemplo tenemos PHP, o Javascript.
  • Aplicaciones para movilidad: Como ejemplos tenemos Swift, o Kotlim.

Otros lenguajes y su clasificación

Existen otros lenguajes informáticos, que sin ser estrictamente de programación, si son de gran importancia en la informática y en la web. Una posible clasificación de esos lenguajes sería: lenguajes de marcas, especificación, consulta y transformación

Lenguajes de marcas

Permiten colocar distintivos o señales en el texto que serán interpretadas por aplicaciones o procesos. Algunos ejemplos de lenguajes de marcas:

  • XML (eXtensible Markup Language): metalenguaje extensible pensada para la transmisión de información estructurada y que pueda ser validada.
<?xml version="1.0" encoding="UTF-8"?>
<alumnos>
  <alumno>
     <nome>Xurxo</nome>
     <apelidos>Losada Blanco</apelidos>
  </alumno>
  <alumno>
     <nome>Antía</nome>
     <apelidos>Pérez López</apelidos>
  </alumno>   
</alumnos>
  • HTML (Hiper Text Markup Language) o XHTML (eXtensible Hiper Text Markup Language): sirven ambas para publicar hipertexto en la Word Wide Web.
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
 <!-- Ejemplo muy básico de XHTML con estilo externo -->
 <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>Ejemplo básico de xhtml</title>
        <meta   content="text/html; charset=utf-8" 
                http-equiv="Content-Type" />
        <link   rel="stylesheet" href="ejemplo_css.css" 
                type="text/css" />
    </head>
    <body>
        <h1>Cabeceira principal</h1>
        <p class="principal">Este párrafo contiene texto y un enlace a 
            <a href="http://www.realacademiagalega.org/">Real Academia Galega </a>.
        </p>
    </body>
 </html>

Lenguajes de especificación

Describen algo de forma precisa. Por exemplo CSS (Cascading Style Sheets) é unha linguaxe formal que especifica a presentación ou estilo dun documento HTML, XML ou XHTML. Exemplo de código CSS que se podería aplicar ao exemplo XHTML anterior e editado en Notepad++:

body{
   font-family: "MS Sans Serif", Geneva, sans-serif;
   font-size: 15px;
   color: Black;
   border:black 2px double;
   padding: 40px;
   margin: 20px;}
h1 {
   font: 40px "Times New Roman", Times, serif;
   font-weight: bolder;
   word-spacing: 25px;}
p.principal{
   text-align: center;
   font: 10px "MS Serif", "New York", serif;}

Lenguajes de consultas

Permiten extraer o manipular información de un grupo de información. Por ejemplo:

  • el lenguaje de consultas SQL (Standard Query Language) permite buscar y manipular información en bases de datos relacionales
-- Ejemplo de script SQL:
select *
from empleados;
  • el lenguaxe XQuery permite buscar y manipular información en bases de datos XML nativas
--Ejemplo de expresión FLOWR (for, let, order by, where, return) en XQuery:
for $libro in doc("libros.xml")/bib/libro
let $editorial := $libro/editorial
where $editorial="MCGRAW/HILL" or contains($editorial, "Toxosoutos")
return $libro

Lenguajes de transformación

Actúan sobre una información inicial par obtener otra nueva.

Por exemplo, el lenguaje XSLT (eXtensible Stylesheet Language Tranformations) permite describir las transformaciones que se van realizar sobre un documento XML para obtener otro archivo.

Un ejemplo de transformación XSL que cuando actúa sobre el exemplo XML anterior obtiene una páxina HTML con una lista del alumnado:

 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Ejemplo sencillo de transformación XSL -->
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html"/>
    <xsl:template match="alumnos">
        <html>
            <head>
                <title>fundamentos.xsl</title>
            </head>
            <body>
                <h1>Alumnos</h1>
                <ul>                
                    <xsl:for-each select="alumno">
                        <li>
                            <xsl:value-of select="apelidos"/>, 
                            <xsl:value-of select="nome"/>
                        </li>
                    </xsl:for-each>
                </ul>
            </body>
        </html>
    </xsl:template>
 </xsl:stylesheet>

Proceso de obtención de código executable a partir do código fonte: ferramentas implicadas

Resumo

  • O software é a parte intanxible e lóxica dun sistema informático. Ten estas características:
    • é lóxico, non físico
    • desenvólvese, non se fabrica
    • non se estropea e facer unha copia da lugar a un clon.
    • pode construirse a medida.
  • Un programa é unha serie de órdenes o instrucciones secuenciadas u ordenadas cunha finalidade concreta que realizan unha función determinada
  • Un software a medida é unha ou varias aplicacións realizadas segundo os requerimentos e instruccións dunha empresa ou organismo
  • O software estándar ou enlatado é aquel de tipo xenérico que resolve múltiples necesidade.
  • As linguaxes de programación son unha linguaxe artificial creada para que cada unha das instruccións da linguaxe den lugar ó traducirse a código máquina nunha ou varias instruccións máquina
  • A linguaxe máquina:
    • é inintelixible
    • componse de combinacións de uns e ceros
    • non necesita ser traducida
    • é a única linguaxe que entende directamente o ordenador
    • foi a primeira utilizada
    • debe ser diferente para cada procesador
  • A linguaxe de nivel medio ou ensamblador:
    • substituíu a linguaxe máquina para facilitar a labor de programación
    • segue estando cercano al hardware, pero en lugar de uns e ceros, se programa usando mnemotécnicos
    • traballa cos registros do procesador e enderezos físicos
    • é difícil de comprender e programar
  • As linguaxes de alto nivel:
    • teñen unha forma de programar más intuitiva e sinxela
    • son máis cercanos a linguaxe humana que a linguaxe máquina
  • As linnguaxes poden clasificarse en:
    • compiladas
    • interpretadas
    • virtuais
  • Los traductores son programas cuya finalidad es traducir lenguajes de alto nivel a len guajes de bajo nivel como ensamblador o código máquina.
  • Existen dos grandes grupos de tipos de traductores:
    • Compiladores: traducen el código fuente a código máquina.
    • Intérpretes: traducen el código fuente línea a línea.
  • Os estados dun programa son os seguintes:
  • Código fonte. Código escrito nunha linguaxe de programación.
  • Código obxecto. Resultado de compilar o código fonte.
  • Código executable. Resultado de compilar e enlazar o código coas librerías.
  • As fases clásicas do desenvovemento dunha aplicación son:
    • Fase inicial
    • Análise
    • Deseño
    • Codificación
    • Probas
    • Explotación
    • Mantemento
  • Como mínimo deberán xerarse en calquer aplicación os seguintes documentos:
    • manual de usuario
    • manual técnico
    • manual de instalación
  • Non hai unha clara definición de roles na programación, pero algúns poden ser
    • arquitecto de software
    • jefe de proxecto
    • analista de sistemas
    • analista programador
    • programador

Bibliografía

Referencias