Intro Prog 1 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Voy a grabar esta clase, por lo tanto, si habláis, me autorizáis a que graben vuestro.
00:00:00
Primera clase, vamos a ver un poquito de introducción a la programación.
00:00:07
Primera cosa, ¿qué es la programación y qué es un programa?
00:00:18
Una definición así no formal, pero para que nos entendamos un poco.
00:00:21
La programación consiste en la creación de un conjunto concreto de instrucciones
00:00:26
que un ordenador puede interpretar denominado programa de ordenador vale entonces lo que vamos
00:00:29
a hacer nosotros es crear cosas y escribir un párrafo de código raro que sustancialmente es
00:00:34
una forma que tenemos para poder comunicar con nuestro ordenador y decirle que queremos que
00:00:43
haga el ordenador vale a partir de allí estas cosas que escribimos este lenguaje raro que
00:00:49
utilizamos es un programa el programa lo puede entender el ordenador y nosotros nos transformamos
00:00:55
sustancialmente en lingüistas en personas capaces de comunicar con un ordenador y decirle que
00:01:02
queremos crear si esto lo hacemos creando programas un programa se escribe normalmente en un lenguaje
00:01:10
de programación pero no necesariamente este lenguaje de programación es de alto nivel es
00:01:18
se puede llegar a hablar con un ordenador a nivel de ceros y unos vale tú puedes escribir un programa
00:01:24
con ceros y unos hoy en día eso no se hace porque es aburrido pero si habéis visto alguna película
00:01:36
vieja o cosas por el estilo había un tiempo los primeros ordenadores había una figura profesional
00:01:42
de una persona que el matemático físico o matemática física que hacía el algoritmo
00:01:48
lo escribía en un papel, se lo daba a esta persona que transfería en unas tarjetas perforadas
00:01:55
el algoritmo, el programa que el otro se había inventado.
00:02:03
Y, sustancialmente, las tarjetas perforadas eran ceros y unos.
00:02:10
O sea, la perforación es un cero, si no la perforación es un uno, o al revés.
00:02:13
entonces a esos tiempos se programaba en ceros y unos
00:02:16
y había alguien que decía
00:02:19
vale, tú quieres hacer esto
00:02:21
la máquina puede interpretar solo ceros y unos
00:02:22
y yo estoy en el medio
00:02:25
y lo que hago es transformar lo que tú has pensado
00:02:26
en un código de ceros y unos
00:02:29
con el pasar del tiempo
00:02:31
pues la cosa se ha ido hacia
00:02:33
mayores niveles de
00:02:34
abstracción hasta llegar a los
00:02:36
programas que tenemos
00:02:39
a los lenguajes de programación que tenemos nosotros
00:02:40
ahora más adelante veremos
00:02:42
cosillas de este estilo
00:02:44
¿Qué más?
00:02:46
Lenguaje de programación, aquí lo ven.
00:02:50
Son conjuntos de símbolos y palabras claves, palabras concretas,
00:02:52
que conforman una sintaxis y una forma de crear los comandos
00:02:57
para que, sustancialmente, yo, utilizando lo que tengo a disposición,
00:03:03
pueda elaborar un programa.
00:03:08
Entonces, yo antes tengo que saber cuáles son las palabras que puedo utilizar,
00:03:10
cómo se usan, en qué secuencia se pueden poner,
00:03:13
una vez que sé esto, que he aprendido la sintaxis de un lenguaje de programación,
00:03:17
pues he hecho la parte fácil, porque ahora lo que viene fuera
00:03:21
es el pensar cómo se resuelve el problema que quiero resolver.
00:03:25
Y eso es crear el algoritmo, que es la parte más compleja del programa.
00:03:30
Nosotros en el primer trimestre principalmente
00:03:35
nos centraremos en sintaxis, porque muchos de vosotros no han visto
00:03:38
nunca un lenguaje de programación, entonces esa
00:03:42
será la parte un poquito más compleja, entender
00:03:44
qué quiere, cómo se
00:03:46
puede mandar la
00:03:48
información al
00:03:50
generador
00:03:51
luego paso a paso eso se volverá
00:03:53
lo normal, el estándar
00:03:56
y nosotros nos empecemos a centrarnos
00:03:58
en proyectos un poquito más complejos, programas
00:04:00
un poquito más retorcidos, un poquito
00:04:02
más interesantes
00:04:04
también y más potentes
00:04:06
los lenguajes de programación
00:04:07
pueden ser
00:04:10
de distintos niveles de abstracción, digamos así.
00:04:12
El más bajo en absoluto sería programar
00:04:16
en ceros y unos. Ya no se programa en ceros y unos, lo hemos dicho.
00:04:18
El siguiente paso sería el lenguaje máquina. El lenguaje máquina
00:04:21
es como un lenguaje que
00:04:24
los procesadores puedan entender directamente.
00:04:26
Cada procesador tiene un conjunto de comandos
00:04:30
de muy bajo nivel que se podrían
00:04:33
escribir, entre comillas, directamente al procesador
00:04:36
para que él entienda que tiene que hacer y trabaje, ¿vale?
00:04:39
Normalmente, una parte de estos comandos son estándar,
00:04:44
pero hay otras partes que cada productor,
00:04:52
cada constructor, digamos, de procesadores,
00:04:55
tiene su propio lenguaje máquina dedicado, ¿vale?
00:05:01
Esto implicaría que si yo trabajo con un Intel de una cierta forma,
00:05:06
o trabajo con un AMD de otra forma, o trabajo con un Apple de otra forma,
00:05:10
pues debería conocer el lenguaje propio de ese procesador, ¿vale?
00:05:14
Cosa que sería muy compleja.
00:05:19
Un tempo se hacía así, pues ahora ya no, ¿vale?
00:05:21
Lo que yo quiero es abstraer de lo que tengo
00:05:24
y tener una forma de hacer cosas más abstractas, más a alto nivel,
00:05:27
y que luego estos programas que yo escribo a más alto nivel
00:05:32
se puedan ejecutar en procesadores distintos.
00:05:36
Para esto, el primer paso de abstracción es el Ensemblador o Assembler en inglés.
00:05:40
Esto es un pequeño lenguaje de programación
00:05:46
que en vez de programar en ceros y unos
00:05:48
y con comandos directamente del lenguaje máquina del propio procesador
00:05:52
me abstrae un poquito.
00:05:55
Entonces yo ya tengo una operación, que es la operación ADD, que lo que permite es sumar un determinado trozo de memoria con otro determinado trozo de memoria.
00:05:59
Estoy siempre a muy bajo nivel, estoy trabajando con lo que son los registros de un procesador.
00:06:09
La memoria más a bajo nivel, más cercana al procesador, son los registros.
00:06:14
Son trocitos de memoria muy, muy, muy rápida, pero muy, muy, muy cara, que están directamente incrustados dentro de los procesadores.
00:06:19
Entonces, cuando hacen las operaciones, cuando ejecutan las operaciones, los procesadores utilizan estos registros, ¿sí? Pues el ensemblador hace operaciones sobre los datos que están en el registro, ¿vale? Cargan datos en estos registros y luego lo pueden sumar, le pueden restar, le pueden mover, le pueden hacer cosas allí, pero es un primer paso de abstracción porque no es ya 0, 2 y 1, o sea, un poquito más independiente con respecto al procesador que tengo dentro,
00:06:27
pero sigue siendo una cosa muy de bajo nivel, ¿vale? Eso no se suele ver, no se suele trabajar.
00:06:56
Si vosotros después de esto o en algún momento de vuestra vida iréis a la universidad y haréis una carrera de informática
00:07:03
en una asignatura que se llama compiladores, pues probablemente tendréis que hacer algo con el sembrador, ¿vale?
00:07:11
Veremos ahora dentro de un rato qué es un compilador, ¿vale?
00:07:18
y entenderemos que es traducir el lenguaje de alto nivel, como Java o lo que sea, que utilizo yo, a un ensamblador.
00:07:21
Y luego el ensamblador tendrá un intérprete o algo por el estilo que transformará este lenguaje en lenguaje máquina
00:07:31
y entonces el procesador podrá ejecutar ese programa.
00:07:39
Pero a nosotros nos interesa el alto nivel, a nosotros nos interesa la abstracción.
00:07:44
en un cierto sentido la inteligencia artificial
00:07:48
misma es otro nivel de
00:07:51
extracción a nivel de programación
00:07:53
a nosotros nos gustaría programar
00:07:55
diciendo que era un programa que
00:07:57
calcula la suma de dos números
00:07:59
esto, así, en
00:08:01
lenguaje natural, y que el ordenador
00:08:03
lo entiende y diga, vale, muy bien, esto
00:08:05
ahora lo hago, que un poco
00:08:07
la inteligencia artificial está yendo hacia
00:08:09
esa posibilidad
00:08:11
eso sería un nivel de extracción
00:08:13
todavía más alto de lo que tenemos
00:08:15
nosotros. Cuando hablamos de alto nivel, nosotros hablamos de lenguajes como Java, como C, como
00:08:17
Python, como no lo sé, hay otros ejemplos por ahí, que me permiten describir lo que
00:08:23
tiene que hacer mi programa, ¿vale? Pero totalmente independiente de lo que tengo por
00:08:33
debajo a nivel de ordenador que tengo por debajo, ¿vale? Yo le explico que, oye, mira,
00:08:39
quiero que me escribas en pantalla esta cosa, para hacer esto tengo que ponerle un código,
00:08:45
un comando específico del lenguaje, pero luego ¿cómo se hace esto? O sea, todo el proceso de
00:08:51
que el procesador tiene que entenderlo, pillar los datos que yo quiero que se imprima en pantalla,
00:08:58
ir a hablar por la pantalla, decirle a la pantalla tienes que escribir esto, todo esto yo quiero que
00:09:02
esté escondido. Eso es bajo nivel. Yo quiero verlo desde arriba. Yo le digo escríbeme esto ¿cómo se
00:09:06
hace para escribir todo eso, pues es problema tuyo. Esto es programar en un
00:09:13
cierto sentido a alto nivel. Yo me voy a centrar principalmente en el algoritmo y
00:09:20
en una sintaxis mucho más parecida, mucho más vecina, cercana a la del lenguaje
00:09:25
natural y no quiero molestarme con todo lo que es por debajo de él. Vete a la
00:09:32
memoria a la RAM
00:09:39
vete a buscar en la RAM la celda
00:09:40
37, allí me pillas
00:09:43
ese dato, me lo escribes en un fichero
00:09:45
yo no quiero todas esas cosas, la cosa me la tiene que
00:09:46
hacer alguien por debajo, yo quiero
00:09:49
programar a un nivel más alto
00:09:50
¿se entiende más o menos?
00:09:52
nosotros trabajaremos con Java
00:09:54
que está aquí
00:09:56
entonces
00:09:58
hay lenguajes de programación
00:10:00
de alto nivel imperativos
00:10:03
¿vale? los imperativos
00:10:04
son sustancialmente
00:10:07
lenguajes que funcionan con que yo describo lo que quiere hacer mi
00:10:08
programa paso a paso. La forma de programar a nivel imperativo es hoy
00:10:15
ordenador haz esto, luego haz esto, luego haz esto y si sigues todos mis pasos
00:10:22
habrás cumplido el algoritmo que me hacía falta y al final tendrás un
00:10:28
Un resultado, ese resultado, impríbelo en pantalla, eso es lo que yo quiero.
00:10:33
¿Vale?
00:10:38
Es dar comandos.
00:10:39
Dar, haz esto, esto, esto, esto, en secuencia.
00:10:42
¿Sí?
00:10:44
Cuando estamos en un lenguaje de alto nivel, un comando solo, una línea de comando que vosotros pondréis diciendo,
00:10:48
hace esta cosa, en realidad
00:10:56
a bajo nivel
00:10:57
puede incluir
00:10:59
muchas instrucciones
00:11:01
máquinas. El
00:11:03
escríbeme esto en pantalla, que tú ves
00:11:05
escríbeme hola en pantalla, tú ves un programa
00:11:07
que te escribe hola y se acabó.
00:11:10
En realidad, por debajo, a nivel
00:11:12
de procesador, pues tendrá
00:11:14
mucho más pasos.
00:11:16
Pasos que pedirá la H.
00:11:18
La H tendrá un código,
00:11:20
la carga en un lado, luego pilla
00:11:21
la O, luego se
00:11:24
comunicará con la pantalla, le dirá, oye, mire, el driver de la pantalla tiene que escribir
00:11:26
este código que se refiere a una H, etc. Todos estos programas,
00:11:30
todos estos pasos, estarán a nivel bajo y nosotros no lo vemos.
00:11:34
Nosotros nos quedamos.
00:11:38
Lenguaje imperativo describe secuencias de operaciones a realizar para obtener un
00:11:42
resultado. Entonces se programa así, a nivel imperativo.
00:11:46
Mi algoritmo será una secuencia de pasos.
00:11:50
Yo tengo que dividir el problema
00:11:54
¿Cómo se calcula la área de un triángulo?
00:11:55
Pues, algoritmo
00:11:59
Pillo la base
00:12:00
La multiplico por la altura
00:12:02
La divido por 2
00:12:03
El resultado en primera del pantalla
00:12:05
Pues, te he dado 3 pasos
00:12:07
Pues, esos son los pasos que tienes que seguir para hacer
00:12:09
Para solucionar el problema
00:12:12
Calcular la área de un triángulo
00:12:13
¿Me entiendes?
00:12:15
Vale, entre los lenguajes de alto nivel
00:12:18
Siempre a nivel imperativo
00:12:21
¿Vale?
00:12:23
Tenemos programas, lenguajes no estructurados, ¿vale? Ya no se usan, pero algunos de vosotros
00:12:24
podrían haber oído alguna vez el BASIC, ¿vale? Estos son programas donde sustancialmente
00:12:31
la esencia, la unidad del programa es la línea de código, ¿vale? Esto es, bueno, años 80, 90, por ahí,
00:12:37
donde se programaba
00:12:48
programas sencillos
00:12:50
no se podía hacer programas complejos
00:12:53
y grandes
00:12:55
y con esta
00:12:55
con este tipo de lenguajes
00:12:58
era suficiente
00:13:03
teniendo en cuenta que
00:13:04
también en informática las cosas evolucionan
00:13:06
en base a la necesidad
00:13:09
si yo tengo cosas muy sencillas
00:13:10
pues pillaré una cosa sencilla y sigo adelante
00:13:12
en cuanto las cosas se complican y se vuelven más
00:13:14
difíciles, pues a lo mejor lo que tenía antes, las herramientas que tenía antes
00:13:17
no son suficientes, entonces necesito desarrollar algo más
00:13:21
algo quizás a un nivel un poquito más alto de extracción
00:13:25
para que sostancialmente sea más fácil centrarme en lo que ahora
00:13:29
es importante, no lo de antes.
00:13:33
Entonces, el BASIC se basaba sobre la línea de código y tenía
00:13:37
el infernal GOTU. El GOTU era un comando que me permitía
00:13:41
saltar donde sea dentro de mi programa. ¿Vale? Eso era infernal porque para programas muy pequeños
00:13:45
te decía tú haces esto, haces esto, haces esto y si llegas a esta línea de aquí salta la línea 900. Vale,
00:13:53
tú seguías a la línea 900 y hacías esto y cuando llegas aquí salta la 37 y ibas a la 37. Programas
00:14:00
pequeños más o menos ves dónde vas. Programas muy muy complejos, estos saltos que no son estructurados
00:14:06
se volvían a enfermar. Los equipos eran incapaces de mantener sus propios programas.
00:14:14
Hacías los programas, mientras que este equipo trabajaba, a lo mejor se entendía más o menos,
00:14:21
en cuanto el equipo se iba porque cambiaba de trabajo, se jubilaba o pasaba a otro proyecto,
00:14:27
alguien de fuera que llegaba a ver ese código no podía entender que se había hecho.
00:14:32
con el aumentar de la complejidad de los programas
00:14:38
pues llegaron a ser estructurados
00:14:43
como por ejemplo el lenguaje C
00:14:45
que a lo mejor conocéis
00:14:47
es como el abuelo de C++
00:14:48
o Pascal
00:14:51
en estos de aquí la base, la unidad
00:14:53
no es tanto la línea de código
00:14:58
cuanto la función en los módulos
00:15:00
o funciones y proceduras
00:15:02
Sostancialmente se dan bloques de líneas de códigos
00:15:04
A las que se le da un nombre
00:15:09
Esta es una función que se llama calcular el triángulo
00:15:11
Donde dentro están todos los comandos para calcular el triángulo
00:15:17
Luego estará una función que es calcular el cuadrado
00:15:21
Donde estarán todas las funciones de calcular el cuadrado
00:15:24
Cuando ahora hago mi programa matemática
00:15:26
Que permite hacer muchas cosas
00:15:29
Entre ellas calcular el triángulo
00:15:31
de calcular la área del cuadrado, pues tengo una estructuración.
00:15:33
No tengo todo mezclado en líneas de códigos retorcidos entre ellos
00:15:38
y saltos por aquí y por allá.
00:15:43
Tengo todo lo que es calcular la área del triángulo
00:15:44
bien empaquetado en una función concreta.
00:15:47
Y el cuadrado en otra.
00:15:50
Y el círculo en otra.
00:15:52
Entonces, esto me permite hacer muchas cosas.
00:15:54
Primero, entender más programas complejos.
00:15:58
organizarlos mejor, segundo, poder compartir trabajo, ¿vale?
00:16:03
Porque yo puedo decir que yo hago el programa que gestionará todas estas funciones
00:16:11
y a un grupo de trabajo le doy la parte que se ocupe de todo el triángulo.
00:16:15
Vosotros vais a desarrollar todas las funciones relacionadas con el triángulo.
00:16:21
A otro grupo, todos los que son el cuadrado.
00:16:25
A otro grupo, todo el cubo.
00:16:28
Entonces, de esta forma, es más fácil luego, una vez que cada uno ha hecho su trabajo, recolectarlo todo porque yo haré como interfaz a los demás, no su código que tendré que incrustar en mi código,
00:16:30
sino simplemente haré llamadas a las funciones cuando las necesitaré.
00:16:46
tengo que calcularla de un triángulo, llamaré la función calcularla de triángulo
00:16:50
que dentro tendrá el algoritmo, los procedimientos, los pasos para calcularla de 10.
00:16:54
¿Se entiende más o menos?
00:17:01
Aún así, no es tan fácil analizar y diseñar, ¿vale?
00:17:04
Es más fácil que si usas un estructurado, pero aún así se vuelve un poquito complejo
00:17:09
siempre cuando el problema escala, ¿vale?
00:17:16
Escalar un problema quiere decir ir a más dificultad, con más datos, con más cosas a tener en cuenta, pues la cosa se complica.
00:17:19
Entonces, cambiaron de paradigma hacia la orientación a objetos.
00:17:26
La orientación a objetos es como una estructuración de más alto nivel.
00:17:31
Entonces, lo que se hace cuando se orienta a objetos es construir, identificar clases.
00:17:37
Estas clases definen, modelizan una parte de mi programa
00:17:43
Por ejemplo, yo si tengo una escuela, tendré una clase que modeliza el alumno
00:17:52
Una clase que modeliza el aula
00:17:56
Una clase que modeliza el profesor
00:17:58
En cada una de estas clases pondré la información relacionada con ese propio agente
00:18:01
O sea, el alumno tendrá su nombre, tendrá su DNI, tendrá sus notas, por ejemplo
00:18:07
El profesor las notas no las tendrá, porque el profesor no tiene notas. El profesor tendrá una lista de asignaturas que imparte, por ejemplo, y las asignaturas podrían tener una lista de alumnos que están cursando esa asignatura.
00:18:12
Y así, así, así. Lo que estoy haciendo es poder, digamos, diseñar la aplicación a un nivel más abstracto, dividirla en bloques, que son estas clases, que luego interactuarán entre ellas.
00:18:25
Cada una de estas clases, además de los datos propios, tendrá lo que se llama un comportamiento, una serie de métodos, una serie de funciones, que pero son propias de esa clase. O sea, el alumno tendrá la función estudiar, porque el alumno estudia, pero no tendrá la función impartir clase. Esa es la nueva función del profesor.
00:18:43
el aula podría tener
00:19:04
la función limpiar aula
00:19:08
que se llama una vez al día
00:19:09
al final del... no sé si me explico
00:19:11
entonces
00:19:13
lo que se intenta hacer es
00:19:15
mejorar la capacidad
00:19:17
de diseño y reutilización del código
00:19:20
para que se puedan hacer
00:19:22
programas mucho más complejos
00:19:24
y sea más fácil organizarnos
00:19:26
y entender
00:19:28
qué se quiere hacer, la análisis
00:19:29
dividirla y organizar
00:19:32
las varias componentes del
00:19:34
programa y del
00:19:36
proceso para que funcione
00:19:38
y sobre todo si mañana
00:19:39
en vez de una escuela como la nuestra
00:19:41
hago otra escuela de otro tipo
00:19:43
pues toda la parte que
00:19:45
pueda reutilizar la pueda
00:19:48
ya utilizar en el nuevo proyecto
00:19:49
sin tener que volver a desarrollarla
00:19:52
desde cero. Eso me ahorra costes
00:19:54
me ahorra problemas, me ahorra
00:19:56
también en expertise porque
00:19:58
probablemente quien ha hecho este programa
00:20:00
ya ha aprendido el problema
00:20:01
y ha hecho un buen trabajo
00:20:03
entonces yo reutilizo su trabajo
00:20:05
sin tener que volver desde cero
00:20:07
a entender cuál es el problema
00:20:09
y hacer los errores
00:20:10
que a lo mejor él ya ha cometido y solucionado
00:20:13
dudas
00:20:15
existen pero
00:20:17
otros tipos de lenguaje de programaciones
00:20:22
que son los lenguajes de programaciones
00:20:25
declarativos
00:20:26
antes eran imperativos
00:20:27
ahora son declarativos
00:20:30
la diferencia es que en mente de imperativos
00:20:31
yo le digo, haz esto, haz esto, haz esto, y tendrás la solución.
00:20:34
O sea, le explico cómo quiero que se hagan los pasos para llegar a una solución.
00:20:38
En el declarativo, la idea es que yo describo lo que quiero como resultado.
00:20:43
No cómo se llega a ese resultado.
00:20:50
Te digo lo que yo quiero al final, y luego tú, de alguna forma, lo sacas.
00:20:52
En el imperativo te digo
00:20:59
Tú pillas
00:21:01
No es exactamente así
00:21:03
Pero tené entendido
00:21:06
Pilla la base, pilla la altura
00:21:07
La multiplicas entre ellos, divide por dos
00:21:09
Todos los pasos
00:21:11
Has obtenido el área del triángulo
00:21:12
En un declarativo
00:21:14
No es exactamente así, pero entendedme
00:21:16
Yo le diría
00:21:18
Quiero tener el área de un triángulo
00:21:19
Es sustancialmente lo que está aquí dentro
00:21:22
Digo un triángulo
00:21:24
Y digo aquí
00:21:26
¿vale? y él
00:21:27
mágicamente lo hace
00:21:28
¿vale? ahora, está claro que
00:21:31
hay campos
00:21:33
en el que el imperativo
00:21:35
es mucho más cómodo de utilizar
00:21:37
como por ejemplo calcularlo en un triángulo
00:21:39
y el declarativo es súper
00:21:41
complejo porque no lo entendería un
00:21:43
lo que acabo de decir
00:21:45
un ordenador no lo va a entender
00:21:46
pero hay otros campos donde va al revés
00:21:48
¿vale? un ejemplo
00:21:51
que a lo mejor algunos de vosotros
00:21:52
ha oído de
00:21:55
lenguaje declarativo es
00:21:56
SQL.
00:21:58
SQL es un lenguaje de consultas
00:22:00
para bases de datos.
00:22:03
Si vosotros habéis visto alguna vez en vuestra
00:22:05
vida una query SQL,
00:22:07
sustancialmente es, selecciona
00:22:09
los campos
00:22:11
nombre de una tabla
00:22:12
de alumnos ordenados
00:22:14
por
00:22:17
en orden alfabético.
00:22:17
Tú no estás diciendo
00:22:22
cómo hacer esas cosas.
00:22:23
Estás diciendo lo que quieres y al final quiero un listado de nombres de alumnos ordenados alfabéticamente.
00:22:24
Estoy describiendo el resultado. Luego, ¿cómo tú llegas a ese resultado? El problema es tuyo.
00:22:31
Habrá un sistema gestor de base de datos que interpretará lo que tú quieres como solución final y hará los pasos dentro para llegar a esa cosa.
00:22:37
Pero si es declarativo, en un cierto sentido, tú estás pidiendo lo que quieres al final, no cómo se llega a ese final.
00:22:46
En imperativo estás describiendo los pasos para llegar a lo que tú quieres.
00:22:52
¿Se entiende la diferencia?
00:22:58
Vale.
00:23:00
Otros lenguajes declarativos son, por ejemplo, lisp o prolog.
00:23:01
Aquí siempre cuento mi experiencia personal.
00:23:06
Cuando en la prehistoria yo era estudiante de informática y vine aquí a la UPM, en Erasmus,
00:23:11
pues me pusieron junto con otra chica
00:23:18
a hacer un programa de elaboración
00:23:22
de lenguaje natural, ¿vale?
00:23:25
Entonces estábamos haciendo esta asignatura
00:23:26
nos dieron un ejercicio, no me acuerdo
00:23:28
pero tenías que analizar algunas palabras
00:23:31
sacar algunos patrones y cosas por el estilo.
00:23:35
Yo me puse a hacerlo en Java, ¿vale?
00:23:37
Me tiré un par de horas de Java
00:23:39
hice una cantidad de código así
00:23:41
¡pa, pa, pa!
00:23:44
Lancé el programa, funcionaba perfectamente.
00:23:45
Mi compañera, pues estábamos en la misma práctica, dijo, mira, se puso con Prolog, si no me equivoco, y en tres líneas de código me hizo lo mismo que hacía mi programa y quizás más rápido.
00:23:47
Simplemente porque en ese contexto, en esa práctica, la programación declarativa habría sido una solución mucho mejor con respecto a la programación imperativa.
00:24:01
solo que yo la programación declarativa a ese tiempo no sabía ni siquiera que existía
00:24:15
y por lo tanto ella sí
00:24:19
la idea es que uno es mejor uno es peor
00:24:21
depende del campo en el que estás trabajando
00:24:26
estos de aquí son programaciones lógicas y funcionales
00:24:30
utilizan funciones y funciones lógicas
00:24:34
de una forma mucho más dinámica
00:24:39
con respecto a lo que lo utiliza la programación imperativa,
00:24:43
nosotros emprenderemos programación imperativa,
00:24:47
que es lo más normal allí afuera.
00:24:50
Digamos que un 75% quizás de programas que se hacen allí afuera
00:24:54
para la empresa, para navegación, internet, cosas por el estilo,
00:24:59
son programación imperativa.
00:25:04
Estos entran más en cosas, por ejemplo, ahora con la inteligencia artificial,
00:25:06
ahora con algunos campos de procesamiento de vídeo de Maré,
00:25:10
pues estas cosas pueden salir porque permiten cosas que el lenguaje imperativo no permite.
00:25:17
Pero, por ejemplo, justo para eso, las últimas versiones,
00:25:24
y por último entiendo ya desde un rato, versiones de Java,
00:25:27
han empezado a construir la posibilidad de hacer pequeñas cosas declarativas
00:25:31
dentro de un marco imperativo hay algunas lo veremos algunas pinceladas más mucho más adelante
00:25:36
en el curso hay algunos comandos algunas sintaxis para que el lenguaje java que es imperativo se
00:25:47
porte más como declarativo en general por tiempo de entender algo de programación podemos pasar
00:25:56
como parámetro en vez que un dato, una función. Entonces, códigos. Este de aquí es cálculo de la
00:26:02
serie de Fibonacci. ¿Qué es la serie de Fibonacci? Es 1, 1 y luego el siguiente número es la suma de
00:26:17
los dos anteriores. Entonces, 1, 1, 2, porque 2 es 1 más 1. 3, porque 2 más 1. 3 más 2, 5. 5 más 3, 8.
00:26:25
esa es la serie Fibonacci. Entonces tú puedes hacer un programita que dice
00:26:34
cálculame el veintisietésimo número de la serie Fibonacci. Este de aquí es
00:26:39
cómo saldría el cálculo del número n de la serie Fibonacci en Ensembler,
00:26:48
Assemblador. ¿Vale? ¿Lo explicáis?
00:26:54
Ah, tengo que recordar que el año pasado cuando hacía zoom, luego se veía mal en la grabación,
00:26:59
por lo tanto no lo hago, luego lo pruebo. Pero bueno, ¿cuánto lo tenéis allí? Si os fijáis,
00:27:13
estos comandos de aquí te están diciendo mueve el registro 0, mueve registro 1, mueve registro 2
00:27:20
dentro del registro 1, hace cosas
00:27:30
raras, ¿vale? pero esto es
00:27:32
un lenguaje de programación de lo que
00:27:34
hemos visto antes, no el lenguaje máquina
00:27:36
el siguiente nivel, el primer nivel de abstracción
00:27:38
esto sería como se hace el Fibonacci
00:27:40
en
00:27:42
en Semblador, ahora si yo lo
00:27:43
miro así, tengo una idea
00:27:46
es complejo de entender
00:27:48
entender y programar
00:27:49
en Semblador es complejo
00:27:52
porque no hay nada aquí que me hace
00:27:54
aparte de los comentarios que son las partes
00:27:56
en verde, si yo quitarlo a la parte
00:27:58
en verde, pues se entiende mal, no se entiende
00:28:00
ni siquiera lo que está haciendo.
00:28:02
Porque es de muy bajo nivel.
00:28:04
Entonces vamos a ver lo mismo
00:28:06
en C
00:28:08
o en Python.
00:28:09
Esto de aquí, hacen
00:28:12
lo mismo que antes, pero ves
00:28:14
ahora, por ejemplo, en C, yo tengo
00:28:16
comandos que son printf,
00:28:18
print, imprimir,
00:28:20
pues son cosas que me imprime estas
00:28:22
cosas en pantalla. Scan
00:28:24
es de leer, ¿vale?
00:28:26
Esto de aquí sirve para leer un número desde teclado.
00:28:28
Entonces, este de aquí, por, diga, hazme esto.
00:28:31
Son palabras, son formas de escribir que no es lenguaje natural, no es castellano, no es inglés,
00:28:36
pero se acerca un poquito, se entiende un poquito más.
00:28:44
Es más compacto porque cada una de estas instrucciones en realidad corresponderá
00:28:47
a varios bloques de programación en el sembrador.
00:28:53
pero esto ya lo entiendo un poquito más vale es de más alto nivel esto es python vale si os fijáis
00:28:58
no tiene nada que ver uno con otro vale son formas de escribir las cosas distintas tienen
00:29:07
la sintaxis distintas algunas cosas uno será más fácil algunas cosas más difíciles pero
00:29:14
Pero, de su modo, Python tiene la... yo no lo conozco muy bien, Pablo, pero tiene la fama de ser bastante sencillo de aprender, ¿vale?
00:29:21
Entonces, probablemente, entender esto es mucho más fácil que otras cosas.
00:29:32
Esto es Fibonacci en Prologue en Lisp.
00:29:40
¿Veis? Es todavía más pequeño.
00:29:44
Aquí, para entenderlo de otro modo, te estoy diciendo que si buscas Fibonacci de 0,
00:29:48
o sea, el elemento 0 de Fibonacci, te doy 0.
00:29:55
Si buscas Fibonacci de 1, te doy 1, ¿vale?
00:29:58
Que son los dos casos bases.
00:30:03
Y a partir de aquí, si me das el número n, te devuelvo el número y.
00:30:05
¿Cómo está calculado el número y?
00:30:11
Si n es mayor que 1, entonces suma n1 más n2, que se calculan aquí, que son el mismo Fibonacci calculado sobre el anterior.
00:30:13
Pero en vez de ir acumulando y cosas por el estilo, hace cosas.
00:30:34
Esta se llama recursividad, que es llamar la misma función de Fibonacci dentro de la definición.
00:30:38
son cosas más
00:30:44
complejas, sobre todo a este nivel
00:30:47
normal que no lo entendas
00:30:49
¿vale?
00:30:50
esto en vez de decir una función Fibonacci
00:30:52
que hace cosas raras
00:30:55
y cosas por el estilo, aquí también está
00:30:57
utilizando recursividad para poder hacer
00:30:58
¿sí? pues cada
00:31:01
uno tiene sus ventajas y sus
00:31:03
desventajas
00:31:05
entonces, resumiendo
00:31:06
hasta aquí, hay lenguajes de programación
00:31:08
a nosotros nos interesa el lenguaje de programación de alto
00:31:11
nivel, hay distintos tipos de lenguaje de programación de alto nivel, en particular
00:31:13
hay imperativos y declarativos. A nosotros nos interesan más los imperativos. Dentro
00:31:18
de los imperativos hay no estructurados, estructurados y orientados a objetos. A nosotros nos interesan
00:31:25
los orientados a objetos. ¿Estamos colocados más o menos en el sitio correcto? Siguiente
00:31:30
Este concepto, compilación e interpretación, para que un lenguaje de alto nivel funcione, yo tengo dos posibilidades.
00:31:38
O lo compilo o lo interpreto. Una de las dos opciones.
00:31:48
Esto siempre estamos hablando de lenguaje de alto nivel.
00:31:55
Si yo tengo un lenguaje como un lenguaje máquina que trabaja directamente con el procesador,
00:31:57
allí no hay interpretación
00:32:03
ni compilación
00:32:04
allí funciona directamente
00:32:07
pero si yo tengo un lenguaje de alto nivel
00:32:08
tengo esta cosa aquí
00:32:10
¿vale?
00:32:12
necesito que alguien transforme
00:32:15
esto
00:32:17
en ceros y unos
00:32:18
que el procesador pueda entender
00:32:20
¿vale?
00:32:23
el proceso
00:32:25
que pilla un lenguaje de programación
00:32:26
de alto nivel y lo
00:32:29
transforma en una secuencia
00:32:31
de ceros y unos, que serán comandos propios del procesador para que se puedan ejecutar
00:32:33
en el procesador, se llama o compilación, veremos ahora qué es exactamente, o interpretación.
00:32:39
Dependiendo de cómo hago este proceso, estoy compilando o estoy interpretando.
00:32:46
Entonces, ¿qué es un intérprete? Un intérprete es un programa que funciona por su cuenta.
00:32:53
alguien ya ha creado este programa y este programa está funcionando
00:33:00
al que yo le paso comando por comando
00:33:03
las líneas de mi programa, es decir
00:33:07
le paso primero esta línea de aquí, luego esta línea de aquí
00:33:11
luego esta línea de aquí, y el intérprete
00:33:16
recibe como input esta
00:33:19
línea de código, la transforma en ceros y unos
00:33:23
en varias operaciones de lenguaje máquina
00:33:28
que pueden ser interpretadas por el procesador
00:33:33
y se la da al procesador para que la ejecute.
00:33:40
Un intérprete es un programa que recibe en input, en entrada,
00:33:45
líneas de comando, líneas de código de un lenguaje de alto nivel
00:33:51
y lo traduce, lo interpreta en ceros y unos que son ejecutables por el procesador.
00:33:58
El intérprete es un programa, es algo que tiene que ser ejecutado, ¿vale?
00:34:09
Entonces alguien tiene que, antes de haber creado un programa de alguna forma,
00:34:15
haber creado los ceros y unos interpretables por un procesador
00:34:20
y decir, ok, procesador, empieza a trabajar con este programa.
00:34:23
Ahora yo tengo un proceso que está en ejecución
00:34:26
En el procesador
00:34:29
Está funcionando
00:34:31
Y empieza a decirle, haz esta cosa
00:34:32
En lenguaje a alto nivel
00:34:35
Y él lo traduce en 0x1 y se lo ejecuta
00:34:36
Ahora haz esta cosa
00:34:38
Y él 0x1 y se lo ejecuta
00:34:40
Haz esta otra, etc, etc
00:34:41
¿Entienden un intérprete?
00:34:43
Vale
00:34:46
¿Qué es en vez de un compilador?
00:34:46
Un compilador es otro programita
00:34:49
Que pero
00:34:51
Lo que hace es pillar todo el código de alto nivel
00:34:52
De golpe
00:34:56
yo le paso el programa entero él lo analiza lo machaca entero todas las líneas y a partir del
00:34:56
programa que le he dado yo genera una versión que hace lo mismo pero todos en ceros y uno
00:35:06
mientras el intérprete pillaba una línea y la traduce y ya trae línea en la traduce linterna
00:35:15
El compilador pilla el programa entero y me da como output otro programa entero, pero escrito en ceros y unos.
00:35:22
Lo que se llama un ejecutable.
00:35:30
Lo que vosotros habéis visto alguna vez en vuestra vida como .exe.
00:35:32
Un .exe, sustancialmente, es un programa compilado.
00:35:37
Había alguien escrito un programa en algún lenguaje de programación, le ha dado al compilador,
00:35:43
El compilador ha sacado este fichero
00:35:49
Lo llamamos .exe
00:35:51
Y es ejecutable
00:35:53
Porque si yo le doy doble clic
00:35:54
El procesador leerá esos ceros y unos
00:35:55
Y como son lenguaje máquina
00:35:58
Lo puedes ejecutar directamente
00:36:00
¿Entiendes?
00:36:02
Proceso de compilación
00:36:12
Yo tengo un programa en C
00:36:13
Por ejemplo, esto es basado sobre C
00:36:15
Porque típicamente C es un lenguaje de programación compilado
00:36:17
Por lo tanto, cuando vosotros escribís un programa en C
00:36:22
luego tenéis que hacer estos dos pasos, este otro, para que funcione este
00:36:25
vuestro programa. Entonces vosotros tenéis el lenguaje básico, el lenguaje de alto nivel C,
00:36:32
tenéis vuestro programa, llamáis uno programa que viene con la suite de programas para hacer
00:36:40
funcionar C, es algo que no tenéis que crear vosotros, os lo dan bajándolo de internet desde
00:36:47
algún sitio donde se desarrollan este tipo de cosas este programa aquí recibe vuestro
00:36:53
código en c como input y lo que hace es compilarlo transformándolo en ceros y unos
00:37:02
ahora cuando nosotros por ejemplo aquí utilizamos 30 este 30 nos descubriremos
00:37:12
dentro de un dato, es una función
00:37:22
¿vale? eso, ¿os acordáis
00:37:24
estos bloques de programación estructurada
00:37:26
que yo decía, calcular
00:37:28
el triángulo, y dentro ponía
00:37:30
como se ha calculado el triángulo, pues esta
00:37:32
es la función, printf
00:37:34
que lo que hace es recibir
00:37:36
estas palabras
00:37:37
como parámetro, y lo que
00:37:40
hace es escribirlo en la pantalla
00:37:42
ahora, ¿dónde está el código
00:37:44
de esta printf?
00:37:46
¿dónde está escrito
00:37:49
los comandos que se tienen que ejecutar
00:37:50
para que se imprima esto
00:37:53
en pantalla
00:37:55
aquí no está
00:37:55
y yo no quiero
00:37:58
cada vez que hago un programa
00:38:01
básico que tiene que escribir
00:38:02
hola mundo en pantalla
00:38:04
tener que implementarme como
00:38:06
se me interfazó, como lo leo
00:38:08
desde la memoria, como voy a la
00:38:10
pantalla, como pido al sistema
00:38:12
operativo que escriba en pantalla, como va
00:38:14
el sistema operativo al driver, todas estas cosas
00:38:16
yo quiero que me las den ya hechas
00:38:18
y me la dan ya hecha, es la print test
00:38:20
no la he desarrollado yo
00:38:22
está en una librería
00:38:23
de funciones
00:38:26
que C
00:38:28
o Java o C++
00:38:29
me dan a disposición y que yo puedo utilizar
00:38:31
¿vale? ahora
00:38:34
en la primera
00:38:35
fase de compilación
00:38:38
lo que se hace es pillar mi
00:38:39
programa y transformarlos
00:38:42
en ceros y unos, lo que he hecho yo
00:38:44
pero claramente
00:38:46
Y de allí habrá algunas funciones que yo he utilizado como la printrc que no he hecho.
00:38:48
Entonces no la puede transformar en 081.
00:38:54
Necesita lo que hemos dicho, estas librerías, este conjunto de datos que ya alguien más
00:38:57
ha hecho y que no quiero hacer yo, donde estará escrito cómo funciona la printrc.
00:39:03
Pues esto es aquí.
00:39:08
Las librerías que usa mi programa.
00:39:12
En la primera fase compilo mi programa y después enlazo aquellas funciones que mi programa
00:39:15
usa que Perón no he hecho yo, que me ha dado ya a disposición el lenguaje de programación,
00:39:23
por ejemplo C, que me da a disposición la Printerz.
00:39:30
En la compilación se hacen dos pasos, compilo lo que tengo y le añado las funciones que
00:39:34
he usado que Perón no son mías.
00:39:42
enlazo las librerías que alguien más ha hecho para que complete los huecos que he dejado yo.
00:39:45
Porque yo aquí sustancialmente he dicho, oye, escríbeme en pantalla esta cosa,
00:39:52
pero no le he dicho cómo, entonces él dejará un hueco diciendo,
00:39:57
pues luego ya aquí en este hueco pondré la implementación de esta printf.
00:40:01
Alguien me dirá que la printf tiene que hacer estos comandos y yo los copiaré aquí.
00:40:05
Esto se hace en la fase de enlazado
00:40:10
¿Entiende?
00:40:13
Entonces
00:40:16
La compilación es esto
00:40:17
Tengo mi lenguaje de alto nivel
00:40:20
Compilo lo que puedo compilar
00:40:22
Que he escrito yo
00:40:24
Relleno las funciones
00:40:24
De terceros que he utilizado
00:40:27
En mi programa
00:40:30
Y a este punto tengo
00:40:30
Mi ejecutable
00:40:32
Un programa de ceros y unos
00:40:35
Que se puede ejecutar
00:40:37
en un cierto Windows
00:40:39
con un cierto procesador
00:40:40
porque el lenguaje máquina
00:40:42
depende de un procesador, depende del entorno
00:40:46
donde lo ejecuto, no es lo mismo
00:40:48
compilar para
00:40:50
Windows que compilar
00:40:52
para Macintosh
00:40:54
que compilar para Linux
00:40:56
o para
00:40:58
AMD que para Intel
00:41:00
por eso que, porque no se puede
00:41:01
ahora ya vamos más, pero porque no se
00:41:04
todos los juegos que hay en PC
00:41:06
no se pueden jugar en
00:41:08
en Apple, en Mac
00:41:09
porque no están compilados
00:41:11
¿vale?
00:41:14
y compilar
00:41:16
en otro sistema puede dar problemas
00:41:18
y no hay inversión suficiente
00:41:19
para decir no lo quiero compilar
00:41:21
también para la otra cosa ¿vale? porque no hay
00:41:23
juegos en Linux o hay muy pocos juegos
00:41:25
en Linux porque la gente, la mayoría
00:41:27
tiene Windows en casa y
00:41:29
tener el esfuerzo de hacer
00:41:31
compilaciones que funcionan y
00:41:33
debugging, o sea, quitar los errores
00:41:35
también en Linux para
00:41:37
los 3% de usuarios
00:41:39
que tienen Linux y que juegan
00:41:42
en Linux, pues no compensa.
00:41:43
¿Entiendes? Pues
00:41:47
esta es la compilación.
00:41:50
Entonces,
00:41:53
en la primera fase,
00:41:54
se pilla el programa fuente,
00:41:57
lo que he escrito yo en código, y se
00:41:58
transforma en un programa objeto
00:42:00
que es como
00:42:02
una
00:42:03
nueva versión del mismo
00:42:05
programa, pero escrito en otro lenguaje.
00:42:08
Esto está escrito en C,
00:42:11
esto está escrito en
00:42:12
lenguaje mágico
00:42:14
y después
00:42:16
con el código objeto
00:42:18
y las librerías que son
00:42:20
toda esta información adicional
00:42:22
que viene cuando yo programo en C
00:42:24
me instalo el kit para programar
00:42:26
en C o cuando por ejemplo
00:42:29
trabajo en Java, me instalaré
00:42:30
el JDK, el Java Development Kit
00:42:32
¿vale? aun si Java es un poquito distinto
00:42:35
ya lo veremos
00:42:37
pues sumando estas dos cosas
00:42:37
obtengo mi programa ejecutado este de aquí ya lo puedo llevar a mi ordenador a hacer doble clic y
00:42:40
se ejecutará y funcionará mi programa si lo lleva a otro ordenador con características similares
00:42:46
también me funciona lo llevo un ordenador con otro sistema operativo o con otro hardware
00:42:52
completamente el posible entre los dobles que no me funciona si dudas el intérprete
00:42:58
vez analiza el programa fuente y lo ejecuta directamente. Va línea por línea. Facilita
00:43:10
la búsqueda de errores ya que un programa puede interrumpirse en cada momento. Una cosa
00:43:19
interesante del intérprete es que yo digo ejecútame esto, vale, ejecútame esto, vale, ejecútame esto y ahora
00:43:24
cuando llegas aquí déjame ver qué está pasando. Como él ejecuta de uno en uno pues es mucho más
00:43:30
fácil. En un compilador no, porque el compilador ya está todo compilado y ejecuta de golpe.
00:43:36
Se puede modificar sobre la marcha. Hay intérprete que me permite, mira esto está
00:43:40
funcionando mal, espera un momento, cambio el código y como él va interpretando de uno en uno,
00:43:48
pues al añadirle un código adentro o en un bucle cambiándole algo, pues la siguiente vez que pasa
00:43:53
por allí, pues ejecutará una cosa distinta. Y es menos eficiente porque es un programa compilado.
00:44:00
porque claro, si yo compilo
00:44:05
ya tengo todo hecho, es solo ejecutar
00:44:08
lo que está allí, puedo ir del tirón rápido
00:44:10
esto por cada línea
00:44:12
de programa tendrá que hacer una serie
00:44:14
de ejecuciones que son
00:44:16
voy a mirar que quieres hacer
00:44:17
lo voy a traducir en lenguaje máquina
00:44:20
lo ejecuto, vale, ahora otro
00:44:22
son pasos más lejos
00:44:24
aquí está la comparación
00:44:29
entre compilador e intérprete
00:44:32
que veremos mañana
00:44:34
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Autor/es:
- Stefano Chiesa
- Subido por:
- Stefano C.
- Licencia:
- Reconocimiento - No comercial
- Visualizaciones:
- 46
- Fecha:
- 16 de septiembre de 2025 - 13:04
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 44′ 39″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 374.59 MBytes