Programación y lenguajes

Introducción

  • En las clases anteriores aprendimos del hardware que necesitamos para la computación científica.
  • Ahora veremos como dar las instrucciones al computador para realizar tareas:
    • Necesitamos software.

Programación

  • Podemos dar instrucciones a un computador a través de un programa de computador.
    • Este es la diferencia más importante (y más útil) entre un computador programable y una máquina cálculadora.
  • Lo más común es escribir un programa utilizando un lenguaje de programación.
    • Hay muchos lenguajes: e.g. Python, C, Java, etc.

¿Qué es un programa de computador?

  • Un programa es un conjunto de instrucciones que dice al computador qué hacer, para llegar a un resultado.
  • Los programas siempre siguen pasos con una estructura bien definida.
  • Detrás de cada programa existe una estructura: un algoritmo.

¿Qué es un algoritmo?

  • Un algoritmo es simplemente un conjunto de instrucciones, como una receta.
  • Podemos escribir una receta en castellano o en inglés: el proceso es el mismo.
  • Los algoritmos son independientes del lenguaje de programación.

La importancia de los algoritmos

  • Los principales avances en la computación (después del desarrollo de computadores programables) han sido en el área de algoritmos.
  • Veremos mucho más sobre algoritmos en la próxima clase.

Tipos de lenguaje de programación

El lenguaje de los computadores

  • En la clase anterior, vimos que los computadores procesan información en el sistema binario.
  • Por lo tanto, las instrucciones que componen el programa deben estar en binario.
  • Entonces, ¿tenemos que escribir muchos $0$ y $1$ para programar un computador...?

Lenguajes de programación

  • Como humanos, nos es mucho más fácil comunicar instrucciones en nuestro propio lenguaje que en binario.
  • Entonces, para escribir programas, utilizamos lenguajes de programación (como las recetas en castellano, inglés, etc.).
  • Los programas escritos así, son luego convertidos, o traducidos, a binario para su ejecución.

Lenguajes de programación

Abstracción

  • Existen muchos lenguajes de programación (siguen inventándose continuamente).
  • Una clasificación básica de los lenguajes tiene que ver con su nivel de abstracción.

Abstracción

"Abstracción" se refiere a que tan "lejano" es un lenguaje de programación y las instrucciones binarias que usa el computador.

  • Lenguajes de bajo nivel: poca abstracción.
  • Lenguajes de alto nivel: mucha abstracción.

Lenguajes de alto nivel

  • Lenguajes de alto nivel usan mucha más abstracción:
    • Los comandos utilizan lenguaje natural.
    • No hay control directo de las instrucciones del CPU.
    • El flujo de un programa está estructurado en una forma que tiene sentido para los humanos.

Lenguajes de bajo nivel

  • Lenguajes de bajo nivel tienen muy poca abstracción.
  • Código de máquina: el nivel más bajo, cero abstracción, comandos en binario.
  • Lenguaje ensamblador: nivel muy bajo, reemplaza el binario por palabras de lenguaje natural. Todavía corresponde al nivel de las instrucciones del CPU.

Traducción de lenguajes de programación

¿Cómo podemos "traducir" un programa escrito en un lenguaje de programación a las intrucciones en binario que entiende el computador? Hay dos métodos:

  • Interpretación
  • Compilación

Interpretación

  • Interpretación: usa un programa llamado interprete para procesar las instrucciones del programa y traducirlas a código máquina línea por línea durante la ejecución.
    • Ventaja: Muy flexible, y podemos usar el interprete en "tiempo real" para dar comandos uno tras otro.
    • Desventaja: hace que la ejecución del programa sea lenta.
  • Python es un lenguaje interpretado.

Interpretación

Compilación

  • Compilación: usa un programa llamado compilador para convertir las instrucciones del programa a código máquina.
    • Ventaja: se convierte todo el programa a código máquina antes de la ejecución, así que el programa se ejecuta mucho más rapidamente.
    • Desventaja: hay que dar más información sobre nuestro código a un compilador que a un interprete. Es menos flexible en ese sentido.
  • Hay muchos lenguajes compilados como C, Java, etc.

Compilación

Lenguajes de programación

Python

  • Propiedades: propósito general, interpretado.
  • Es un lenguaje muy popular, utilizado por muchas organizaciones y en la academia. Es uno de los lenguajes más populares en data science.
  • Python apareció, por primera vez, en 1991, y ahora es uno de los top 3 lenguajes de programación más utilizado.

Python

                    
                        import numpy as np

                        def suma(a,n):
                            suma = 0
                            for i in range(n):
                                for j in range(n):
                                    suma += a[i,j]
                            return suma

                        n = 100
                        b = np.random.rand(n,n)
                        resultado = suma(b,n)
                        print(resultado)
                    
                

C

  • Propiedades: propósito general, compilado.
  • C es un lenguaje imperativo.
  • Diseñado para proporcionar acceso directo a las funciones basicas de la computadora (i.e. la memoria), y para tener una correspondencia cercana al código máquina.
  • Se ha utilizado para escribir sistemas operativos (Windows, Mac, Linux).
  • Nació en 1972, y sigue siendo uno de los lenguajes más utilizado en el mundo.

C

                    
                        #include<stdio.h>
                        #include<stdlib.h>

                        float suma(float** arr, int n){
                        float suma = 0;
                        int i,j;

                        for (i=0; i < n; i++){
                            for (j=0; j < n; j++){
                                suma += arr[i][j];
                            }
                        }
                        return suma;
                        }

                        void random_array(float** arr, int n){
                        int i, j;
                        srand(time(NULL));
                        for(i=0; i < n; i++){
                        for(j=0; j < n; j++){
                        arr[i][j] = (float)rand()/(float)RAND_MAX;
                        }
                        }
                        }

                        int main(){
                        int n = 100, i;
                        float **b;
                        float resultado;

                        b = malloc(n * sizeof *b);
                        for (i=0; i < n; i++){
                        b[i] = malloc(n * sizeof *b[i]);
                        }
                        random_array(b, n);
                        resultado = suma(b, n);
                        printf("%f\n",resultado);

                        for (i=0; i < n; i++){
                        free(b[i]);
                        }
                        free(b);
                        }
                

C++

  • Propiedades: propósito general, compilado.
  • C++ es una extensión de C, que incluye la capacidad de programación orientada a objetos (object-oriented programming).
  • Apareció originalmente en 1983, y ha sido ampliamente utilizado en el desarrollo de software comercial.

Java

  • Propiedades: propósito general, compilado.
  • Tiene una sintaxis similar a C++.
  • Diseñado con el fin de obtener máxima portabilidad, i.e. para que un programa escrito en Java pueda usarse en cualquier plataforma.
  • Ampliamente utilizado para desarrollar aplicaciones en el Internet de cliente-servidor.
  • Fue el lenguaje más utilizado en el mundo por muchos años, y sigue siendo muy popular.

Fortran

  • Propiedades: propósito general, compilado. Su nombre viene de FORmula TRANslation.
  • Una ventaja de los programas de Fortran es que son muy rápidos. Además, Fortran tiene capacidades muy útiles para la manipulación de vectores y matrices.
  • Tiene muy poco uso fuera de la computación científica.
  • Apareció originalmente en 1957, la versión más reciente (Fortran 2008) salió en 2010.

Dos lenguajes más especializados

Wolfram: Lenguaje empleado por el software Mathematica. Popular en la física teórica debido a sus capacidades de cálculo simbólico. Requiere pagar licencia.

IDL: Interactive Data Language. Se usa bastante en astronomía, ciencias atmosféricas y imagen médica. Requiere pagar licencia.

Extensiones y lenguajes más recientes

Cython

  • Un lenguaje que extiende Python.
  • Con Cython se puede escribir programas con la sintaxis de Python, pero con la rapidez de C.

Otra forma de acelerar Python

  • Numba: un módulo para Python que compila partes del programa a código de máquina.

Lenguajes nuevos

  • Julia: diseñado para computación numérica y científica de alto rendimiento, pero todavía de propósito muy general. La idea es tener un lenguaje fácil de usar como Python, pero rápido como C. Bastante nuevo (está en versión 1.4.2).
  • Scala: basado en Java, pero con caracteristicas adicionales, tipo programación funcional.
  • Rust: algunas similitudes con C/C++, programación imperativa y funcional. Diseñado para programación de sistemas, pero de uso general.

Paradigmas de programación

Paradigmas de programación

  • Hay diferentes "estilos" de programación, denominados "paradigmas".
  • No son diferencias superficiales en el programa, sino formas fundamentalmente diferente de organizar la lógica y estructura de un programa.

Programación de procedimiento

  • Es el paradigma 'básico' y es bastante común en computación científica.
  • Se basa crear e invocar funciones (también llamadas procedimientos) y alterar variables.
  • Las instrucciones están ejecutadas en el órden en que aparecen en el código.
  • También se llama programación imperativa.
  • Lenguajes donde se utiliza este paradigma: Python, C, Fortran.

Programación orientada a objetos, POO (Object Oriented Programming)

Programación orientada a objetos

  • Los datos (variables) y las instrucciones están organizados en "objetos" abstractos.
    • Se definen clases y métodos.
  • La funcionalidad del programa viene de las "interacciones" de los objetos.
  • Es un paradigma muy común en programación profesional así como en la computación científica.
  • Lenguajes: Java, C++, Python.

Programación orientada a objetos, POO (Object Oriented Programming)

Resumen

  • Todos los científicos hoy en día tienen que programar.
  • Programación es la realización de un algoritmo.
  • Hay muchos lenguajes de programación, y cada uno tiene sus ventajas y desventajas.
  • Los lenguajes más comunes en la ciencia de datos son: Python y R.
  • En simulaciones numéricas se usa: C/C++ y Fortran.
  • Siempre hay nuevas opciones para la computación científica: Cython, Julia, Rust, etc.