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:
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.