1 00:00:00,000 --> 00:00:09,039 Voy a grabar esta clase, por lo tanto, si habláis, me dais el permiso de grabar vuestras cosas, ¿vale? 2 00:00:09,300 --> 00:00:12,900 Entonces, esta es la primera clase de programación. 3 00:00:13,179 --> 00:00:17,460 Vamos a empezar con algunos conceptos teóricos que se quedarán allí. 4 00:00:17,719 --> 00:00:22,800 A lo mejor a lo largo del curso, en determinados momentos, surgirán otra vez. 5 00:00:22,980 --> 00:00:25,899 Entonces iremos a ver, oye, mira, ¿os acordáis de esta parte de aquí? 6 00:00:25,899 --> 00:00:35,219 la desplegaremos un poquito y a lo mejor tendrá más sentido ahora mismo preguntarme lo que sea 7 00:00:35,219 --> 00:00:47,079 si no lo entendéis, me paráis, pero hasta un cierto nivel porque estos son conceptos básicos 8 00:00:47,079 --> 00:00:55,539 pero también completamente complejos entre comillas y entonces para ser para que empieza 9 00:00:55,539 --> 00:01:01,200 hoy con la programación pues a lo mejor no se entienden ahora al cien por cien se necesita 10 00:01:01,200 --> 00:01:06,040 construir un poquito más de infraestructura de programación para luego entender de verdad de 11 00:01:06,040 --> 00:01:13,060 que ese estado si esto ahora mismo es no entiendo nada de lo que está diciendo pues daros algunos 12 00:01:13,060 --> 00:01:19,019 días, preguntados claramente, pero daros algunos días para que esto con calma encaje, ¿vale? 13 00:01:19,019 --> 00:01:24,180 Seguramente antes de que ellos lo pregunten en un examen o cosas por el estilo, ¿vale? 14 00:01:28,870 --> 00:01:33,930 Programación y programas, ¿vale? Estos son más bien para que entendamos un poquito el 15 00:01:33,930 --> 00:01:39,349 significado de algunas palabras, ¿vale? La programación, ¿qué es? Es la creación de 16 00:01:39,349 --> 00:01:46,349 un conjunto concreto de instrucciones que un ordenador puede interpretar, denominado programa de ordenador. 17 00:01:46,349 --> 00:01:56,349 La programación es lo que haremos nosotros para escribir un conjunto de instrucciones, un conjunto de comandos, 18 00:01:56,349 --> 00:02:03,349 es aprender un idioma que el ordenador pueda entender. 19 00:02:03,349 --> 00:02:28,610 Hoy en día esto está migrando, porque nosotros hoy en día con la inteligencia artificial es relativamente sencillo explicarle con lenguaje humano lo que queremos y él, la inteligencia artificial, que no sé qué es, pues lo traduce a una serie de conjuntos de código, a un conjunto de instrucciones que el ordenador puede interpretar. 20 00:02:28,610 --> 00:02:35,449 Nosotros, por ahora, y en este curso en concreto, lo que intentamos hacer es evitar este paso. 21 00:02:35,449 --> 00:02:37,729 O sea, ir a un nivel más bajo. 22 00:02:38,270 --> 00:02:43,789 Cuanto más es bajo el nivel, más estoy cerca del procesador. 23 00:02:44,069 --> 00:02:50,830 Yo puedo hablar con el procesador con varios distintos idiomas, distintos lenguajes. 24 00:02:51,610 --> 00:02:58,370 Cuanto más cerca estoy a hablar en binario con el procesador, más estoy a bajo nivel. 25 00:02:58,610 --> 00:03:13,310 Cuanto más lejos estoy del procesador, o sea que escribo cosas que el procesador no entendería nunca, pero que yo entiendo mejor porque son un nivel un poquito más abstracto, más estoy a alto nivel. 26 00:03:13,310 --> 00:03:17,490 La programación con inteligencia artificial sería un nivel muy, muy alto. 27 00:03:17,930 --> 00:03:21,449 Porque yo no necesito saber nada del procesador, del ordenador, 28 00:03:21,569 --> 00:03:24,870 de qué tiene como hardware el ordenador mismo. 29 00:03:25,229 --> 00:03:27,509 Simplemente le digo, cálculame, o sea, 30 00:03:27,569 --> 00:03:30,569 créame un programa que calcula la serie Fibonacci. 31 00:03:31,389 --> 00:03:32,409 Y él lo hace. 32 00:03:32,830 --> 00:03:35,289 Es muy alto nivel, es muy abstracto. 33 00:03:35,370 --> 00:03:38,889 No le estoy diciendo cómo, en qué lenguaje, cómo hacerlo. 34 00:03:38,949 --> 00:03:40,050 Yo le digo solo lo que quiero. 35 00:03:40,050 --> 00:03:54,569 ¿Vale? Cuanto más me acerco a la estructura física, digamos, del ordenador, podría llegar a un cierto momento en programar, en hacer hacer al ordenador lo que yo quiero, simplemente dándole tiras muy largas de ceros y unos. 36 00:03:55,389 --> 00:03:59,090 ¿Vale? Eso sería muy bajo nivel. Antes se programaba así. 37 00:03:59,090 --> 00:04:04,750 ¿Habréis visto alguna película o documental donde había las tarjetas perforadas? 38 00:04:04,750 --> 00:04:07,889 antes había un matemático 39 00:04:07,889 --> 00:04:10,169 o un científico que se inventaba 40 00:04:10,169 --> 00:04:12,210 un algoritmo pero no lo sabía 41 00:04:12,210 --> 00:04:14,330 programar, se lo daba a otro 42 00:04:14,330 --> 00:04:16,110 a otra figura 43 00:04:16,110 --> 00:04:18,189 profesional que era el que traducía 44 00:04:18,189 --> 00:04:19,850 lo que él quería hacer 45 00:04:19,850 --> 00:04:20,810 en 46 00:04:20,810 --> 00:04:24,310 hojas con agujeros 47 00:04:24,310 --> 00:04:26,129 que representaban ceros y unos 48 00:04:26,129 --> 00:04:27,730 y estas hojas con 49 00:04:27,730 --> 00:04:29,870 ceros y unos eran interpretadas por los 50 00:04:29,870 --> 00:04:31,730 ordenadores, eso era un nivel 51 00:04:31,730 --> 00:04:32,490 muy bajo 52 00:04:32,490 --> 00:04:49,009 Entonces, con el tiempo hemos crecido, hemos subido de nivel para que sea más fácil para nosotros programar, ¿vale? El ejemplo extremo de la inteligencia artificial es claramente más fácil programar la inteligencia artificial que programar en 0-1, ¿sí? 53 00:04:49,009 --> 00:05:03,490 Entonces, ¿qué es el programa? El programa es ese conjunto de instrucciones que normalmente se escribe utilizando un lenguaje de programación. 54 00:05:03,490 --> 00:05:18,170 El lenguaje de programación es un lenguaje, es un idioma con sus reglas tanto morfológicas como para hacer una frase que tú tienes que conocer para poder decir, mira, este comando es un comando concreto, un comando que puede funcionar, este comando no. 55 00:05:18,170 --> 00:05:33,430 Esta palabra la puedo utilizar, esta palabra no. Esta palabra es una palabra reservada y quiere decir algo concreto para el ordenador, mientras esta otra la puedo utilizar como me da la gana y le puedo dar un nombre yo a mi programa, a mi variable, a mi lo que sea lo que quiero. 56 00:05:33,430 --> 00:05:37,149 Entonces cuando yo estudio un lenguaje de programación 57 00:05:37,149 --> 00:05:38,810 Lo que tengo que hacer es sostancialmente 58 00:05:38,810 --> 00:05:42,430 Entender cuál es la sintaxis 59 00:05:42,430 --> 00:05:46,769 Con la que se puede escribir un programa 60 00:05:46,769 --> 00:05:48,509 Utilizando ese lenguaje de programación 61 00:05:48,509 --> 00:05:51,329 Cada lenguaje de programación tiene su propia sintaxis 62 00:05:51,329 --> 00:05:53,709 Su forma de, empieza con esta palabra 63 00:05:53,709 --> 00:05:56,129 Luego después de esta palabra no puede ir esto 64 00:05:56,129 --> 00:05:57,430 Pero sí puede ir este otro 65 00:05:57,430 --> 00:05:59,610 Luego tiene al final de un comando 66 00:05:59,610 --> 00:06:00,910 Tiene que ir un punto y coma 67 00:06:00,910 --> 00:06:02,889 el siguiente comando 68 00:06:02,889 --> 00:06:04,269 tiene que estar en la siguiente línea 69 00:06:04,269 --> 00:06:07,209 lo que sea, las reglas de un determinado lenguaje 70 00:06:07,209 --> 00:06:08,269 lenguajes distintos 71 00:06:08,269 --> 00:06:11,129 pueden tener reglas completamente 72 00:06:11,129 --> 00:06:12,269 distintas 73 00:06:12,269 --> 00:06:15,250 esa es la parte fácil de la programación 74 00:06:15,250 --> 00:06:17,370 aprender la sintaxis 75 00:06:17,370 --> 00:06:19,069 de un lenguaje de programación 76 00:06:19,069 --> 00:06:19,949 es 77 00:06:19,949 --> 00:06:23,269 estudio puro y duro de memorización 78 00:06:23,269 --> 00:06:25,069 de entender como es 79 00:06:25,069 --> 00:06:27,370 y ya está, sencillo 80 00:06:27,370 --> 00:06:28,050 lo difícil 81 00:06:28,050 --> 00:06:38,949 es obtener el algoritmo, o sea, dado un problema, saber cuáles son los pasos concretos que tengo que hacer 82 00:06:38,949 --> 00:06:41,649 para solucionar bien ese problema. 83 00:06:42,389 --> 00:06:47,329 Una vez que yo sé el algoritmo, puedo elegir cualquier lenguaje de programación 84 00:06:47,329 --> 00:06:54,910 y usando las reglas del lenguaje de programación voy a escribir, voy a decir al ordenador 85 00:06:54,910 --> 00:06:58,350 el algoritmo en un idioma que él pueda entender. 86 00:07:00,850 --> 00:07:01,550 ¿Entiende más o menos? 87 00:07:04,699 --> 00:07:08,139 Un lenguaje de pronunciación es un conjunto de símbolos y palabras 88 00:07:08,139 --> 00:07:10,740 que el usuario tiene a su disposición para elaborar un programa. 89 00:07:11,240 --> 00:07:11,360 ¿Vale? 90 00:07:11,439 --> 00:07:16,220 Entonces nosotros, para buena parte del primer trimestre, 91 00:07:16,339 --> 00:07:17,379 quizás un poquito el segundo, 92 00:07:17,660 --> 00:07:21,339 pues lo que haremos es introducir nuevas palabras mágicas 93 00:07:21,339 --> 00:07:24,660 que me permiten comunicarle al ordenador lo que yo quiero hacer. 94 00:07:24,980 --> 00:07:25,060 ¿Vale? 95 00:07:25,060 --> 00:07:35,060 Cada palabra añadirá un comando, una posibilidad de hacer algo distinto con respecto a lo que se podía hacer antes, ¿vale? 96 00:07:35,060 --> 00:07:44,879 Y combinando estas varias posibilidades que yo tengo, combinando todos los comandos que me permiten hacer acciones distintas 97 00:07:44,879 --> 00:07:49,079 o que permiten comunicar al ordenador que haga acciones distintas, 98 00:07:49,079 --> 00:07:51,480 si las combino de tal forma 99 00:07:51,480 --> 00:07:53,259 que cumplan con las reglas 100 00:07:53,259 --> 00:07:55,620 con un algoritmo, con una secuencia 101 00:07:55,620 --> 00:07:57,420 de pasos que se resuelve 102 00:07:57,420 --> 00:07:59,519 un problema, pues habré hecho un programa 103 00:07:59,519 --> 00:08:01,579 que sirve de algo. Si no, habré 104 00:08:01,579 --> 00:08:02,060 hecho un programa. 105 00:08:05,610 --> 00:08:06,610 Ejemplos de lenguaje 106 00:08:06,610 --> 00:08:08,189 de programación son 107 00:08:08,189 --> 00:08:10,209 lenguaje máquina, ensemblador 108 00:08:10,209 --> 00:08:12,230 o de alto nivel. Esto es siempre 109 00:08:12,230 --> 00:08:14,310 lo que decíamos antes de ir desde 110 00:08:14,310 --> 00:08:16,129 más bajo nivel 111 00:08:16,129 --> 00:08:17,870 a más alto nivel. Desde 112 00:08:17,870 --> 00:08:20,350 más cerca del procesador 113 00:08:20,350 --> 00:08:21,990 a más lejos del procesador. 114 00:08:22,610 --> 00:08:26,310 El lenguaje máquina es un lenguaje especial 115 00:08:26,310 --> 00:08:30,290 que cada procesador tiene, 116 00:08:30,290 --> 00:08:33,110 o sea, procesadores de la misma empresa 117 00:08:33,110 --> 00:08:35,970 probablemente tendrán lenguajes máquinas muy parecidos, 118 00:08:36,450 --> 00:08:39,809 pero sustancialmente es una secuencia de ceros y unos 119 00:08:39,809 --> 00:08:44,549 que el procesador puede interpretar para hacer un comando. 120 00:08:44,750 --> 00:08:48,029 Por ejemplo, si yo tengo 0, 1, 1, 0, 1, 0, 121 00:08:48,029 --> 00:08:52,230 Para el procesador quiere decir, oye mira, prepárate a hacer una suma 122 00:08:52,230 --> 00:08:56,690 Ahora te voy a dar dos números, o te voy a dar dos zonas de memoria 123 00:08:56,690 --> 00:09:02,149 O te voy a dar dos cosas, y tú con estas dos cosas las sumas y me das el resultado 124 00:09:02,149 --> 00:09:07,470 Habrá otro código, me lo estoy inventando, que es 11101 125 00:09:07,470 --> 00:09:10,769 Que en vez de decir, oye prepárate a hacer una resta 126 00:09:10,769 --> 00:09:15,409 Ahora te voy a decir el primer número, el segundo número 127 00:09:15,409 --> 00:09:17,830 Y luego tú lo que haces es una resta entre estos dos 128 00:09:17,830 --> 00:09:35,730 Y así habrá una cantidad bastante grande de comandos que yo puedo decir al procesador para que el procesador funcione. Este es el lenguaje máquina. Es fuertemente legado al procesador y es muy eficiente porque es pensado para ese procesador. 129 00:09:35,730 --> 00:09:40,129 Cada procesador tiene su lenguaje máquina y por lo tanto funciona muy bien. 130 00:09:40,509 --> 00:09:43,450 A los procesadores, a los ordenadores, les encanta el binario. 131 00:09:43,809 --> 00:09:46,110 Eso es todo binario y va súper rápido. 132 00:09:46,389 --> 00:09:48,750 Puede hacer un mogollón de operaciones al segundo. 133 00:09:49,250 --> 00:09:52,610 Cuando nosotros decimos esto, va a 2 gigahercios. 134 00:09:53,190 --> 00:09:54,549 ¿Qué son 2 gigahercios? 135 00:09:56,090 --> 00:09:56,750 ¿Qué es un hertz? 136 00:09:58,669 --> 00:10:02,950 Un hertz es una unidad de medida que es 1 sobre s, 1 sobre segundos. 137 00:10:02,950 --> 00:10:05,970 son cuántas operaciones 138 00:10:05,970 --> 00:10:07,409 puede hacer en un segundo 139 00:10:07,409 --> 00:10:09,610 2 gigaherzios quiere decir que 140 00:10:09,610 --> 00:10:11,610 este procesador puede hacer de estas 141 00:10:11,610 --> 00:10:13,889 operaciones básicas que hemos dicho antes 142 00:10:13,889 --> 00:10:15,549 2000 millones 143 00:10:15,549 --> 00:10:16,629 en un segundo 144 00:10:16,629 --> 00:10:19,710 para las operaciones básicas 145 00:10:19,710 --> 00:10:21,649 y de suma me resta más de una cosa 146 00:10:21,649 --> 00:10:22,970 pues el procesador es 147 00:10:22,970 --> 00:10:25,629 fenomenal, es mucho más rápido 148 00:10:25,629 --> 00:10:27,570 que nuestro CPU, para otras 149 00:10:27,570 --> 00:10:28,830 cosas el ordenador es 150 00:10:28,830 --> 00:10:29,169 sí 151 00:10:29,169 --> 00:10:38,769 entonces como programar en ceros y unos vale imaginaos que hay que hacer una suma vale la 152 00:10:38,769 --> 00:10:44,049 suma es este código de ceros y unos vale ahora escriben ahora tengo escribir el número ahora 153 00:10:44,049 --> 00:10:48,730 tengo hacer una resta cual era la de esta y tengo todo un listado de ceros y unos que 154 00:10:48,730 --> 00:10:54,309 éste resta este suma sería un infierno es lo que se hacía antes pero antes también 155 00:10:54,309 --> 00:10:59,889 el lenguaje de máquina probablemente tenía muchas menos operaciones posibles. Como esto es un infierno, 156 00:10:59,889 --> 00:11:05,769 ¿es programado en lenguaje de máquina? No. A un cierto momento de la historia, no sé en qué años 157 00:11:05,769 --> 00:11:16,309 somos, pero bastante, 1900, no sé, me atrevo, 70, no lo sé, por ahí, dijeron ¿por qué no hacemos una 158 00:11:16,309 --> 00:11:25,929 cosa que es crear un lenguaje que me esconde los ceros y unos y me transforma cuando yo tengo hacer 159 00:11:25,929 --> 00:11:34,090 una operación en vez de poner ceros y unos pongo la palabra por ejemplo ADD ADD de sumar para mí 160 00:11:34,090 --> 00:11:40,929 ser humano es una maravilla porque yo escribo ADD número uno y número dos y lo entiendo mucho más 161 00:11:40,929 --> 00:11:53,250 que 0 0 1 0 0 1 1 1 0 1 0. ¿Qué pasa? Pero que a mí me gusta, al ordenador no. El ordenador quiere 0 y 1. 162 00:11:53,250 --> 00:12:00,649 Entonces, lo que se inventaron es, hagamos un nuevo programa, que sea un nuevo lenguaje de 163 00:12:00,649 --> 00:12:05,370 programación, que se llama Ensemblador, que es un poquito más alto nivel, que me viene contra mí, pero 164 00:12:05,370 --> 00:12:10,230 cuando luego lo tengo que utilizar en el procesador necesitaré que alguien de 165 00:12:10,230 --> 00:12:17,190 alguna forma, lo veremos dentro un rato, me modifique este ADD, que es lo 166 00:12:17,190 --> 00:12:23,070 que quiero usar yo como ser humano, en el correspondiente 01001, que es el 167 00:12:23,070 --> 00:12:26,169 que entiende el procesador. 168 00:12:27,129 --> 00:12:32,870 Y esto fue un gran paso, fue una cosa muy interesante a esa época. Vieron que 169 00:12:32,870 --> 00:12:43,509 Pero mientras que los problemas, los sistemas que creemos en informático son pequeñitos, esto era una abstracción suficiente, ¿vale? 170 00:12:44,250 --> 00:12:51,830 Era mucho más cómodo que programar en ceros euros, pero seguía siendo una cosa bastante engorrosa, ¿vale? 171 00:12:52,429 --> 00:12:57,549 Entonces, con el pasar del tiempo, empezar a decir, vale, ¿por qué no hacemos un paso más, vale? 172 00:12:57,549 --> 00:12:59,970 Llegamos a un paso todavía más arriba. 173 00:13:00,389 --> 00:13:02,529 Empezamos a hacer cosas que no tengan 174 00:13:02,529 --> 00:13:08,129 gran relación con el procesador, 175 00:13:08,629 --> 00:13:10,629 pero que sea bastante más fácil 176 00:13:10,629 --> 00:13:12,210 para un ser humano entenderlo. 177 00:13:12,350 --> 00:13:15,490 Hasta un límite en que si tú lees, 178 00:13:15,870 --> 00:13:20,429 pues puedas entender porque parece una cosa humana. 179 00:13:20,690 --> 00:13:22,610 Por ejemplo, el comando if, 180 00:13:22,990 --> 00:13:23,809 que quiere decir sí. 181 00:13:23,809 --> 00:13:25,990 Y tú dices, sí, esta cosa, 182 00:13:25,990 --> 00:13:30,649 DEN hace esta cosa, ELSE hace esta cosa, ¿vale? 183 00:13:30,669 --> 00:13:35,889 Que quiere decir, si esta condición es verdadera, entonces hace esta cosa de aquí, 184 00:13:36,149 --> 00:13:41,710 un programa, una cosa, no lo sé, y si no, si esto era falso, hace una cosa distinta. 185 00:13:42,169 --> 00:13:47,710 Y eso a nivel lógico de humano, tú lo lees, es un poco, no es lo que yo escribiría 186 00:13:47,710 --> 00:13:52,870 en lenguaje natural, pero ya es bastante distinto, tanto de haceros y unos, 187 00:13:52,870 --> 00:13:54,509 como en este de aquí que era un poco 188 00:13:54,509 --> 00:13:56,190 retorcido y completo. 189 00:13:56,769 --> 00:13:58,389 Y entonces, hemos ido hacia 190 00:13:58,389 --> 00:13:59,929 los lenguajes de alto nivel. 191 00:14:00,450 --> 00:14:02,009 Java es un lenguaje de alto nivel. 192 00:14:02,350 --> 00:14:04,269 C es un lenguaje de alto nivel. C++, 193 00:14:05,129 --> 00:14:06,970 Python, Ruby, 194 00:14:07,690 --> 00:14:09,350 Kotlin, 195 00:14:09,750 --> 00:14:10,629 hay mogollón 196 00:14:10,629 --> 00:14:12,309 de lenguajes. 197 00:14:12,529 --> 00:14:14,210 De vez en cuando viene fuera, 198 00:14:14,210 --> 00:14:14,970 me sale 199 00:14:14,970 --> 00:14:18,590 la necesidad de crear un nuevo lenguaje 200 00:14:18,590 --> 00:14:20,110 para un determinado contexto 201 00:14:20,110 --> 00:14:22,269 porque los lenguajes más 202 00:14:22,269 --> 00:14:24,090 viejos a lo mejor no permiten 203 00:14:24,090 --> 00:14:26,149 determinadas acciones que en ese 204 00:14:26,149 --> 00:14:28,289 contexto se usan mucho, entonces 205 00:14:28,289 --> 00:14:30,409 se dice, vale, hagamos una abstracción 206 00:14:30,409 --> 00:14:32,470 si en Java, algo para decir 207 00:14:32,470 --> 00:14:34,370 se necesita 50 líneas 208 00:14:34,370 --> 00:14:36,269 de código cada vez que hago esta operación 209 00:14:36,269 --> 00:14:38,029 que se hace mucho, porque, no sé 210 00:14:38,029 --> 00:14:40,429 estoy pensando a 211 00:14:40,429 --> 00:14:42,470 dispositivos wearable 212 00:14:42,470 --> 00:14:44,070 esto que puedes 213 00:14:44,070 --> 00:14:46,129 poner en los vestidos 214 00:14:46,129 --> 00:14:47,490 y cosas de ese estilo, y 215 00:14:47,490 --> 00:14:50,330 Java es muy engorroso porque no está 216 00:14:50,330 --> 00:14:51,590 pensado para eso, entonces 217 00:14:51,590 --> 00:14:57,190 de las funcionalidades que tú usas normalmente allí en Java no está pensado para eso, 218 00:14:57,289 --> 00:15:04,570 pues me creo un nuevo lenguaje de programación que lo que hace es esconder estos 50 líneas de código Java 219 00:15:04,570 --> 00:15:08,549 en un solo comando, que yo luego utilizaré muchas veces, ¿vale? 220 00:15:08,549 --> 00:15:19,490 Entonces, cada lenguaje está pensado para resolver algunos problemas que a lo mejor otros lenguajes no resolvían bien. 221 00:15:19,490 --> 00:15:28,690 Entonces, ay mira, he creado este otro. Algunos de esos lenguajes son un paso adelante. Dicen, ay mira, es perfecto, funciona mejor, son mucho más fáciles, son mucho más sencillos de utilizar. 222 00:15:29,129 --> 00:15:39,250 Y otros, no. Entonces, algunos lenguajes de programación se crean y luego no se utilizan porque sí, has resuelto este problema, pero has complicado otros 20 problemas. No me interesa. 223 00:15:39,250 --> 00:15:44,929 Por ejemplo, Python es uno de los lenguajes de programación que últimamente ha salido 224 00:15:44,929 --> 00:15:53,169 muchísimo porque es bastante sencillo, se puede aprenderlo, es fácil, es rápido y 225 00:15:53,169 --> 00:15:55,809 entonces a la gente le gusta. 226 00:15:55,809 --> 00:15:59,929 Como primera aproximación a la programación es bastante bueno. 227 00:15:59,929 --> 00:16:05,149 Es más fácil aprender Python que aprender Java, por ejemplo. 228 00:16:05,149 --> 00:16:13,190 tiene cosas que java por ejemplo como java es fuertemente tipado o sea que trata mucho muy 229 00:16:13,190 --> 00:16:19,490 bien los tipos de datos mientras python no y entonces para tú que quieres aprender saber 230 00:16:19,490 --> 00:16:24,529 que es un tipo de dato te puede venir bien hasta si luego después decides de no utilizarlo 231 00:16:24,529 --> 00:16:33,950 programando en python pero es bien que sepas que no. ok se entiende esto de bajo nivel alto nivel 232 00:16:33,950 --> 00:16:40,629 que nos alejamos del profesor entonces los lenguajes de programación de alto 233 00:16:40,629 --> 00:16:48,330 nivel imperativos vale un primer paradigma de programación que se creó es 234 00:16:48,330 --> 00:16:53,690 el paradigma imperativo en un lenguaje imperativo se sienten un lenguaje 235 00:16:53,690 --> 00:17:01,429 programación que es imperativo funciona con que yo describo al ordenador paso 236 00:17:01,429 --> 00:17:03,029 por paso lo que tiene que hacer. 237 00:17:04,049 --> 00:17:05,630 O sea, es imperativo 238 00:17:05,630 --> 00:17:07,349 porque yo como emperador le digo 239 00:17:07,349 --> 00:17:09,569 ahora haz esto, ahora haz esto, 240 00:17:09,849 --> 00:17:10,750 ahora haz esto. 241 00:17:11,250 --> 00:17:13,509 No le estoy diciendo a dónde quiero 242 00:17:13,509 --> 00:17:15,509 llegar. No lo sé dónde tengo 243 00:17:15,509 --> 00:17:17,509 llegar. Pero le estoy diciendo al procesador 244 00:17:18,170 --> 00:17:19,490 oye, mira, pilla este 245 00:17:19,490 --> 00:17:21,569 número, luego pilla este otro 246 00:17:21,569 --> 00:17:23,430 número, multiplícalos 247 00:17:23,430 --> 00:17:25,470 entre ellos y divide por dos. 248 00:17:26,029 --> 00:17:26,910 ¿Qué he obtenido? 249 00:17:29,859 --> 00:17:31,759 Pillo dos números, lo multiplico y divido por dos. 250 00:17:32,480 --> 00:17:33,079 ¿A qué os suena? 251 00:17:33,640 --> 00:17:35,180 ¿Qué podría ser? 252 00:17:40,250 --> 00:17:41,190 Cálculo de una media 253 00:17:41,190 --> 00:17:43,049 o el cálculo del área de un triángulo. 254 00:17:43,910 --> 00:17:45,170 ¿No? Podría ser eso. 255 00:17:45,690 --> 00:17:47,150 Ahora, yo no le he dicho lo que estoy 256 00:17:47,150 --> 00:17:48,190 haciendo y cómo lo voy a hacer. 257 00:17:48,730 --> 00:17:51,170 Yo no le he dicho lo que quiero tener. 258 00:17:51,730 --> 00:17:53,309 Yo le estoy diciendo, tú tienes que hacer esto. 259 00:17:53,470 --> 00:17:54,630 Pilla el número, paso uno. 260 00:17:54,970 --> 00:17:57,069 Paso dos, pilla el otro número. Paso tres, 261 00:17:57,170 --> 00:17:58,269 multiplícalos entre ellos. 262 00:17:58,609 --> 00:18:01,289 O suma o no sé qué he dicho. Y luego divide por dos. 263 00:18:01,849 --> 00:18:01,950 ¿Sí? 264 00:18:03,069 --> 00:18:05,049 El concepto es, vas 265 00:18:05,049 --> 00:18:07,069 diciendo paso por paso 266 00:18:07,069 --> 00:18:08,970 los comandos que tiene que hacer. Esa es la 267 00:18:08,970 --> 00:18:10,970 programación imperativa. Cuando un lenguaje 268 00:18:10,970 --> 00:18:13,309 de programación es imperativo, le está diciendo 269 00:18:13,309 --> 00:18:15,430 esta forma 270 00:18:15,430 --> 00:18:17,329 de programa. ¿Vale? Nosotros 271 00:18:17,329 --> 00:18:19,230 en todo el, casi 272 00:18:19,230 --> 00:18:21,349 todo el primer trimestre, trabajaremos 273 00:18:21,349 --> 00:18:23,470 así, de forma imperativa, estructural. 274 00:18:24,190 --> 00:18:24,269 ¿Sí? 275 00:18:25,650 --> 00:18:27,450 Lenguaje de alto nivel quiere decir 276 00:18:27,450 --> 00:18:29,369 que una instrucción 277 00:18:29,369 --> 00:18:31,230 sola de mi programa, 278 00:18:31,390 --> 00:18:33,309 de mi lenguaje de programación, puede 279 00:18:33,309 --> 00:18:43,450 englobar muchas instrucciones máquinas. O sea, que un solo comando de alto nivel puede hacer 280 00:18:43,450 --> 00:18:51,750 varias operaciones en sembladores que serán traducidas en varias operaciones de lenguaje 281 00:18:51,750 --> 00:19:00,470 máquina. Yo le digo como comando a más b dividido 2, punto y coma, esto es mi comando, pero en 282 00:19:00,470 --> 00:19:06,869 realidad a nivel máquina se hará. Pilla el número A, vete a ver dónde está guardado, píllalo y 283 00:19:06,869 --> 00:19:12,569 guárdalo aquí. Ahora vete a B, vete a ver dónde está guardado, píllalo el contenido y guárdalo 284 00:19:12,569 --> 00:19:20,569 aquí. Ahora estas dos celdas de memoria que has pillado, multiplícala entre ellas y luego después 285 00:19:20,569 --> 00:19:25,869 guarda el resultado en otro lado. Ahora este resultado aquí, divídelo por el número 2 y 286 00:19:25,869 --> 00:19:31,710 guardado en otro lado. Todas estas operaciones para mí es una línea de código de alto nivel. 287 00:19:31,710 --> 00:19:39,470 Cuanto más alto nivel, más es sencillo para mí hacer una cosa y se tendrá que traducir 288 00:19:39,470 --> 00:19:46,950 en las equivalentes instrucciones de nivel matemático. 289 00:19:46,950 --> 00:19:52,509 Entre los lenguajes de alto nivel que conocemos y que encontramos, 290 00:19:52,509 --> 00:19:54,329 Podemos encontrar estos tipos de datos, ¿vale? 291 00:19:54,730 --> 00:19:55,789 No estructurados. 292 00:19:57,430 --> 00:19:58,730 Os suena BASIC. 293 00:19:59,089 --> 00:20:07,349 BASIC era el lenguaje con el que yo casi empecé a programar en 1990 y pico. 294 00:20:07,349 --> 00:20:07,769 ¿Vale? 295 00:20:08,390 --> 00:20:12,450 En particular, yo utilizaba QUICKBASIC. 296 00:20:12,630 --> 00:20:13,809 Fue el primero que escribí. 297 00:20:13,910 --> 00:20:14,069 ¿Vale? 298 00:20:14,890 --> 00:20:17,349 Eran programas, eran lenguajes no estructurados. 299 00:20:18,150 --> 00:20:18,750 ¿Qué quiere decir? 300 00:20:19,170 --> 00:20:21,569 Que, sustancialmente, está basado en la línea de código. 301 00:20:21,569 --> 00:20:30,390 o sea que cada línea típicamente era un comando, y luego estaba el infierno, el 302 00:20:30,390 --> 00:20:37,529 go to. Go to, vete a. Quiere decir que mientras yo ejecutaba un programa en cualquier momento 303 00:20:37,529 --> 00:20:45,029 puedo decirle cuando llegas aquí vete a la línea 37. Entonces él hacía la línea, llegaba aquí y 304 00:20:45,029 --> 00:20:49,769 saltaba a la línea 37 y de allí seguía. Y luego a lo mejor a un cierto momento, y ahora vete a la 305 00:20:49,769 --> 00:20:57,529 línea 140 y él saltaba la línea por el 140. No había una estructura. Era así. Era tú escribes, 306 00:20:57,529 --> 00:21:03,150 escribes, escribes y en cierto momento te dice y si el usuario ha pulsado la tecla A vete a la línea 307 00:21:03,150 --> 00:21:13,589 5000. Si ha pulsado la tecla B vete a la línea 4900. Pero mantener esa cosa era infernal. El 308 00:21:13,589 --> 00:21:24,410 El GUTU es la razón de por qué a un cierto momento de la historia de la informática los lenguajes no estructurados no servían más, 309 00:21:24,410 --> 00:21:33,630 porque cuando los sistemas se volvían demasiado complejos, tú tenías un código de un millón de líneas de código, 310 00:21:33,869 --> 00:21:40,410 donde dentro había un montón de, ahora vete a las 5.000, ahora vete a las 149.000, ahora vete... 311 00:21:40,410 --> 00:21:42,910 y mantener esa cosa 312 00:21:42,910 --> 00:21:44,769 entender que estaba haciendo tu programa 313 00:21:44,769 --> 00:21:47,170 era un infierno, porque tú tenías constantemente 314 00:21:47,170 --> 00:21:48,769 que saltar de una parte a otra 315 00:21:48,769 --> 00:21:50,970 del código a ver que estaba haciendo 316 00:21:50,970 --> 00:21:52,630 donde seguía la 317 00:21:52,630 --> 00:21:55,109 información, ¿vale? esta es no estructurada 318 00:21:55,109 --> 00:21:56,869 mal, SEO 319 00:21:56,869 --> 00:21:57,470 para nosotros 320 00:21:57,470 --> 00:22:00,529 entonces, en un cierto momento la gente dijo 321 00:22:00,529 --> 00:22:02,670 vamos a poner un poco una estructura 322 00:22:02,670 --> 00:22:04,289 vamos a hacerlo mejor, y se crearon 323 00:22:04,289 --> 00:22:06,869 los lenguajes de alto nivel, estructurados 324 00:22:06,869 --> 00:22:09,009 como por ejemplo, C o Pascal 325 00:22:09,009 --> 00:22:09,809 ¿vale? 326 00:22:09,809 --> 00:22:11,430 ¿Qué pasa aquí? 327 00:22:11,589 --> 00:22:12,730 Que sustancialmente 328 00:22:12,730 --> 00:22:15,930 En vez de ser basado en líneas de código 329 00:22:15,930 --> 00:22:19,210 Esto de aquí es basado en funciones o módulos 330 00:22:19,210 --> 00:22:21,109 Es decir, que yo pillo 331 00:22:21,109 --> 00:22:23,329 Una determinada funcionalidad 332 00:22:23,329 --> 00:22:25,849 Un determinado conjunto de instrucciones 333 00:22:25,849 --> 00:22:27,470 Que hace algo concreto 334 00:22:27,470 --> 00:22:28,930 Y le doy un nombre 335 00:22:28,930 --> 00:22:31,250 Por ejemplo, nuestro programa de antes 336 00:22:31,250 --> 00:22:33,269 Que calculaba el área del triángulo 337 00:22:33,269 --> 00:22:35,730 Yo lo guardo a un lado 338 00:22:35,730 --> 00:22:36,529 Lo llamo 339 00:22:36,529 --> 00:22:38,430 Calcular triángulo 340 00:22:38,430 --> 00:22:40,670 y le escribo dentro las líneas 341 00:22:40,670 --> 00:22:42,789 para poder calcular la área del triángulo 342 00:22:42,789 --> 00:22:44,009 a partir de ahora 343 00:22:44,009 --> 00:22:46,609 cuando yo quiero calcular la área de un 344 00:22:46,609 --> 00:22:48,710 triángulo, en vez de escribir 345 00:22:48,710 --> 00:22:50,369 el código que estaba escrito dentro 346 00:22:50,369 --> 00:22:52,529 como aquí, o saltar a un 347 00:22:52,529 --> 00:22:54,230 trozo de código de no sé dónde 348 00:22:54,230 --> 00:22:55,890 que dice, y ahora empieza allí 349 00:22:55,890 --> 00:22:58,410 pues llamo simplemente el nombre de la función 350 00:22:58,410 --> 00:23:00,589 le digo, calcular este triángulo 351 00:23:00,589 --> 00:23:04,849 todo se vuelve 352 00:23:04,849 --> 00:23:06,589 más estructurado, todo se vuelve 353 00:23:06,589 --> 00:23:08,250 más empaquetado, la información 354 00:23:08,250 --> 00:23:13,990 porque lo que me calcula una determinada cosa le doy un nombre lo ponga aquí la calcula una 355 00:23:13,990 --> 00:23:17,430 cosa distinta ahora esta área del cuadrado pues me crea otra función que se llama área 356 00:23:17,430 --> 00:23:24,329 del cuadrado y pongo aquí como se hace ahora necesito serie de Fibonacci pues crea una 357 00:23:24,329 --> 00:23:31,650 función que se llama serie de Fibonacci que me calcula la serie de Fibonacci con este de aquí 358 00:23:31,650 --> 00:23:37,450 aquí se evita el uso del gotu, porque en vez de irte a una línea concreta, 359 00:23:37,609 --> 00:23:40,630 tú no dices que vete a una línea concreta, tú dices, oye, mira, cuando llegas a este punto, 360 00:23:41,130 --> 00:23:47,690 llama o ejecuta aquella funcionalidad que calcula la área del triángulo, 361 00:23:48,049 --> 00:23:51,950 esté donde esté, aquí tienes que saltar allí y volver, ¿vale? 362 00:23:52,069 --> 00:23:57,910 Y además, pudiendo darle un nombre, yo, programador, ya sé de qué va, ¿vale? 363 00:23:57,910 --> 00:24:00,089 si eso se llama calcular el triángulo 364 00:24:00,089 --> 00:24:02,309 asumo que una vez pasado 365 00:24:02,309 --> 00:24:03,950 por ese código, pues si yo tenga 366 00:24:03,950 --> 00:24:06,009 como resultado la red del triángulo 367 00:24:06,009 --> 00:24:08,210 mucho más fácil 368 00:24:08,210 --> 00:24:10,529 por respecto a, vete a la 375 369 00:24:10,529 --> 00:24:12,089 y que hay en la 375 370 00:24:12,089 --> 00:24:14,190 bajo la 375, miro y veo 371 00:24:14,190 --> 00:24:16,230 que hay para calcular la red, ah, esta calcular 372 00:24:16,230 --> 00:24:17,410 la red del triángulo 373 00:24:17,410 --> 00:24:20,369 aun así 374 00:24:20,369 --> 00:24:22,430 esto no es 375 00:24:22,430 --> 00:24:23,769 la panacea, vale 376 00:24:23,769 --> 00:24:26,650 basarse sobre funciones y módulos 377 00:24:26,650 --> 00:24:34,589 Fue un buen paso adelante, pero cuando los sistemas empezaron a complicarse 378 00:24:34,589 --> 00:24:41,809 ancora más, a llegar a situaciones también con internet, con programas 379 00:24:41,809 --> 00:24:46,549 y proyectos que a lo mejor empezaban desde un proyecto anterior 380 00:24:46,549 --> 00:24:49,109 y lo tenían que hacer más grande, cosa por el estilo, 381 00:24:49,910 --> 00:24:54,849 los programas simplemente estructurados se complicaban. 382 00:24:56,650 --> 00:25:02,289 cierto momento que decidieron elegir un nuevo paradigma de programación que es la programación 383 00:25:02,289 --> 00:25:09,789 orientada a objetos. La nuestra. Lo que haremos nosotros. Nosotros empezaremos por aquí. ¿Vale? 384 00:25:09,789 --> 00:25:15,910 Porque empezamos de lo básico, pero luego nos daremos cuenta que, ¡ay! os he engañado. En 385 00:25:15,910 --> 00:25:21,829 realidad no estábamos haciendo esto, no estábamos haciendo esto. ¿Vale? Java es un lenguaje de 386 00:25:21,829 --> 00:25:30,829 programación orientado a objetos. Y hoy en día, una buena parte de los lenguajes que se utilizan 387 00:25:30,829 --> 00:25:35,509 y una buena o una mala parte de la programación se hace con programación orientadas a objetos. 388 00:25:35,509 --> 00:25:46,150 ¿Qué es esto? Aquí había líneas de código, al azar. Las hemos empaquetado en funciones. Y ahora 389 00:25:46,150 --> 00:25:51,109 Ahora, lo que hacemos es agrupamos estas funciones en objetos. 390 00:25:52,109 --> 00:25:53,089 ¿Qué quiere decir? 391 00:25:54,250 --> 00:25:57,690 Por ejemplo, nosotros hemos hecho una función que calcula el área del triángulo. 392 00:25:57,990 --> 00:26:00,990 Y podría hacer una función que calcula el perímetro del triángulo. 393 00:26:01,150 --> 00:26:07,369 Y una función que calcula la altura de un triángulo. 394 00:26:08,109 --> 00:26:13,609 Todas estas tres funciones, que en este mundo serían cosas deslegadas entre ellas, 395 00:26:13,609 --> 00:26:20,410 En realidad, lo que están haciendo es trabajar sobre el concepto de triángulo, ¿vale? 396 00:26:20,509 --> 00:26:22,910 Sobre el objeto triángulo. 397 00:26:23,529 --> 00:26:28,970 Entonces, lo que dice la programación orientada a objetos es que yo modelizo una cosa. 398 00:26:29,069 --> 00:26:32,569 Por ejemplo, voy a modelizar la figura geométrica triángulo, ¿vale? 399 00:26:33,069 --> 00:26:39,589 Y empaqueto dentro de esta cosa, hago un conjunto de funcionalidades, 400 00:26:39,589 --> 00:26:49,710 Es un conjunto de características, un conjunto de elementos, todos relacionados con el triángulo, para que todos estén empaquetados ahí. 401 00:26:50,150 --> 00:27:02,589 Entonces, en cualquier proyecto del mundo mundial en el que yo quiera utilizar triángulos, puedo pillar esta definición de objeto triángulo que he hecho y reutilizarla. 402 00:27:02,589 --> 00:27:09,690 utilizarla. Entonces, si mi intención es hacer un programa, un videojuego donde hay gráfica 403 00:27:09,690 --> 00:27:16,670 poligonal a triángulos y tengo que calcular muchos triángulos, me importo el objeto triángulo que 404 00:27:16,670 --> 00:27:22,349 ha hecho alguien y allí dentro me encontraré la posibilidad de calcular el área, calcular el 405 00:27:22,349 --> 00:27:28,029 perímetro, calcular la altura de todos los triángulos. Si ahora hago otro programa, otro 406 00:27:28,029 --> 00:27:30,190 sistema, que en vez de ser un videojuego 407 00:27:30,190 --> 00:27:32,109 es un programa 408 00:27:32,109 --> 00:27:33,269 para gestionar 409 00:27:33,269 --> 00:27:35,710 lotización de tierra 410 00:27:35,710 --> 00:27:38,029 o cosas por el estilo, donde 411 00:27:38,029 --> 00:27:40,130 se tienen que calcular allí también 412 00:27:40,130 --> 00:27:42,509 triángulos, yo puedo reutilizar 413 00:27:42,509 --> 00:27:44,130 este objeto triángulo 414 00:27:44,130 --> 00:27:45,589 que había creado antes 415 00:27:45,589 --> 00:27:47,609 para también este nuevo sistema. 416 00:27:47,869 --> 00:27:49,890 Porque las funcionalidades 417 00:27:49,890 --> 00:27:52,009 del triángulo siguen siendo esas. 418 00:27:52,730 --> 00:27:54,049 Y así con el cuadrado, así con 419 00:27:54,049 --> 00:27:55,490 el círculo, así con 420 00:27:55,490 --> 00:27:57,170 otros conceptos. 421 00:27:57,170 --> 00:27:58,750 ¿Se entiende? 422 00:27:59,990 --> 00:28:02,509 Aquí, solo líneas de códigos. 423 00:28:02,730 --> 00:28:03,269 Un desastre. 424 00:28:03,730 --> 00:28:06,109 Aquí se agrupan por funcionalidades 425 00:28:06,109 --> 00:28:08,650 y aquí se agrupan por objetos 426 00:28:08,650 --> 00:28:12,130 que tendrán un conjunto de funcionalidades 427 00:28:12,130 --> 00:28:14,309 todas relacionadas con este objeto. 428 00:28:15,150 --> 00:28:16,769 Si yo me creo el objeto coche, 429 00:28:17,769 --> 00:28:20,309 en el objeto coche tendré las funcionalidades 430 00:28:20,309 --> 00:28:22,549 de arrancar el coche, parar el coche, 431 00:28:23,269 --> 00:28:25,410 chequear gasolina, 432 00:28:25,410 --> 00:28:33,269 mueve coche vende coche que se yo todas las cosas que me pueden servir sobre un coche 433 00:28:38,369 --> 00:28:48,049 lenguaje de programación entre objetos java c++ c sharp o python vale todas estas cosas por aquí 434 00:28:48,049 --> 00:28:50,509 Y temas más que no dar nada. 435 00:28:51,029 --> 00:28:59,849 Pero en este instituto, nosotros damos Java, C Sharp lo veréis si vais a segundo de DAM en programación de videojuegos, por ejemplo, utilizamos C Sharp. 436 00:29:00,150 --> 00:29:04,710 No sé si en segundo de DAW se utiliza también en otros lados, puede ser. 437 00:29:05,630 --> 00:29:11,910 Y Python, hay también clases de introducción a Python en SMR, por ejemplo. 438 00:29:13,410 --> 00:29:18,670 ¿Dudas? Vale. 439 00:29:18,670 --> 00:29:24,910 Ahora, existen lenguajes de programación que no son imperativos 440 00:29:24,910 --> 00:29:27,250 Que son declarativos 441 00:29:27,250 --> 00:29:30,089 Es el opuesto a lo que decíamos antes 442 00:29:30,089 --> 00:29:34,230 En el imperativo tú dices, haz esto, esto, esto, esto 443 00:29:34,230 --> 00:29:36,089 Pero ¿a dónde quieres llegar? No me interesa 444 00:29:36,089 --> 00:29:37,890 Tú haz esto, esto, esto, te digo que haces 445 00:29:37,890 --> 00:29:40,049 El declarativo es un poco distinto 446 00:29:40,049 --> 00:29:44,609 Tú hablas con el ordenador para sostancialmente decir 447 00:29:44,609 --> 00:29:46,910 Yo quiero tener esta cosa 448 00:29:46,910 --> 00:29:51,349 Luego, ¿cómo llegas allí? 449 00:29:53,930 --> 00:29:55,549 Te doy un margen de flexibilidad 450 00:29:55,549 --> 00:29:56,710 No lo sé 451 00:29:56,710 --> 00:29:59,430 Pero yo este es el resultado que quiero 452 00:29:59,430 --> 00:30:00,269 ¿Vale? 453 00:30:01,309 --> 00:30:03,769 No tan fácil, eso parece inteligencia artificial 454 00:30:03,769 --> 00:30:06,130 No es eso, no es a ese nivel 455 00:30:06,130 --> 00:30:11,190 ¿Alguno de vosotros conoce SQL de base de datos? 456 00:30:12,190 --> 00:30:14,049 Cuando tú usas una base de datos 457 00:30:14,049 --> 00:30:16,289 Cuando tú haces una consulta a una base de datos 458 00:30:16,289 --> 00:30:18,150 Con el lenguaje de SQL 459 00:30:18,150 --> 00:30:20,190 tú no le estás diciendo 460 00:30:20,190 --> 00:30:21,890 cómo tener esos datos 461 00:30:21,890 --> 00:30:23,750 tú le estás diciendo, yo quiero 462 00:30:23,750 --> 00:30:26,410 de todas mis bases de datos de vuelos 463 00:30:26,410 --> 00:30:27,990 que hemos hecho el ejemplo antes 464 00:30:27,990 --> 00:30:30,269 yo quiero todos los vuelos 465 00:30:30,269 --> 00:30:31,990 que salen después 466 00:30:31,990 --> 00:30:34,289 de la 9 y que empiecen 467 00:30:34,289 --> 00:30:36,130 en Madrid y acaben en Roma 468 00:30:36,130 --> 00:30:38,349 yo no te estoy diciendo cómo sacar 469 00:30:38,349 --> 00:30:40,430 estos datos, te estoy diciendo que al final 470 00:30:40,430 --> 00:30:42,490 lo que yo quiero es un listado 471 00:30:42,490 --> 00:30:44,470 de todos los vuelos que tengan 472 00:30:44,470 --> 00:30:45,549 estas características 473 00:30:45,549 --> 00:31:04,009 Te estoy describiendo a dónde quiero llegar y esto te lo describo a través de un lenguaje, simple query language, que lo que me permite hacer es definirte lo que quiero tener y luego tú harás lo que quieres dentro para obtenerlo. 474 00:31:04,009 --> 00:31:19,730 Esta es una forma completamente distinta del imperativo. Imperativo, haces esto, haces esto, haces esto. Llegarás donde tienes que llegar. Este de aquí, te estoy declarando donde quiero llegar y luego tú tendrás tus mecanismos para sacar los datos y obtenerlos. 475 00:31:19,730 --> 00:31:29,910 También aquí hay programaciones, o sea, lenguajes funcionales y lógicos que son otro mundo, ¿vale? 476 00:31:30,650 --> 00:31:35,490 Son, en vez de programación estructurada y la que veremos nosotros, 477 00:31:35,490 --> 00:31:44,690 esos de aquí son interesantes porque pueden pasarse, pueden utilizar como, ¿cómo decirlo? 478 00:31:44,690 --> 00:31:53,450 incógnita, como variable, como parámetro, en vez de pasar un valor, puedo pasar una 479 00:31:53,450 --> 00:31:54,490 entera función. 480 00:31:55,309 --> 00:31:56,470 Esas son cosas avanzadas. 481 00:31:56,509 --> 00:32:06,230 Nosotros veremos algo de esto a mitad del tercer trimestre y lo veremos un segundo y 482 00:32:06,230 --> 00:32:08,869 luego nos taparemos los ojos y veremos otro día será. 483 00:32:08,869 --> 00:32:15,710 Por ahora son cosas bastante más avanzadas que en ciertos campos son fundamentales. 484 00:32:16,769 --> 00:32:27,869 Hay campos en los que hacerlo con Java sería un infierno, sería un sistema lento, ineficaz y cosas por el estilo. 485 00:32:28,329 --> 00:32:34,349 Y que si tú lo haces con programación funcional o lógica, pues posiblemente se te simplifica todo y va mucho mejor. 486 00:32:34,349 --> 00:32:42,349 Por ejemplo, un campo donde se usa esto es el procesamiento del lenguaje natural. 487 00:32:42,349 --> 00:32:50,349 Eso de entender lo que estás diciendo y transformarlo, por ejemplo, en un texto para poder hacer algo. 488 00:32:50,349 --> 00:32:57,349 Pues allí los funcionales y lógicos funcionan mucho mejor que los estructurados en perfil. 489 00:32:57,349 --> 00:33:07,349 ¿Sí? Pero bueno, ¿esto para qué? Para que sepa que existe, ¿vale? Luego qué son, cómo se usan, no lo veremos. 490 00:33:07,349 --> 00:33:20,349 Ahora, este señor de aquí es un programa que calcula la serie de fibonacci en el sembrador, ¿vale? En el sembrador. 491 00:33:20,349 --> 00:33:24,349 ¿Qué es la serie de fibonacci? La serie de fibonacci es la serie que empieza con 0 y 1, 492 00:33:24,349 --> 00:33:28,509 cero y uno, me acuerdo nunca si es cero, uno o uno, y luego el siguiente número es la 493 00:33:28,509 --> 00:33:36,769 soma de los anteriores, cero y uno, el siguiente es uno, uno y uno, dos, dos y uno, tres, tres 494 00:33:36,769 --> 00:33:43,809 y dos, cinco, cinco y tres, ocho, y así, así, así, así, ¿vale? Es una serie muy 495 00:33:43,809 --> 00:33:50,069 conocida porque, por ejemplo, las conchas del mar y cosas por el estilo siguen una espiral 496 00:33:50,069 --> 00:33:53,569 y esa espiral sigue hacia la serie Fibonacci. 497 00:33:53,569 --> 00:33:59,829 Las galaxias, cuando veis esa cosa con los ramos así, pues siguen la serie Fibonacci. 498 00:33:59,829 --> 00:34:03,789 Una foto, que vosotros decís, esta foto me gusta mucho, si buscáis por ahí hay una 499 00:34:03,789 --> 00:34:06,390 serie Fibonacci por algún lado. 500 00:34:06,390 --> 00:34:12,250 Hay algo en nuestro cerebro que nos hace reconocer como interesante y guapo lo que sigue la serie 501 00:34:12,250 --> 00:34:15,519 Fibonacci. 502 00:34:15,519 --> 00:34:30,099 Entonces, toda esta cosa de aquí es como se programaría el ensemblador, no el lenguaje máquina, el ensemblador, eso de que yo, no sé si es verdad, pero lo han dicho desde 1970, ¿vale? 503 00:34:30,099 --> 00:34:42,880 Y si os fijáis, yo estoy diciendo, mueve el registro cero, mueve el número dos, mueve el registro uno y ponle cero, mueve el registro dos dentro del registro uno. 504 00:34:42,880 --> 00:34:50,579 Hace operaciones así básicas de pilla un trocito de memoria, cópialo en otro, pilla este trocito de memoria, sumale este, luego cópialo en otro. 505 00:34:51,079 --> 00:34:55,219 Son todos comandos relativamente complejos. 506 00:34:55,480 --> 00:35:01,639 Que si tú lo lees así, si no sabes en sembrador, no lo entiendes. 507 00:35:04,280 --> 00:35:12,360 Estos son los mismos, mismo ejercicio, mismo programa, hace lo mismo. 508 00:35:12,360 --> 00:35:19,199 es siempre calcular los elementos de la serie Fibonacci, pero en C y en Python. 509 00:35:19,199 --> 00:35:27,420 Entonces, si os fijáis aquí, te dice, ahora, define find, find, ¿vale? Se está definiendo 510 00:35:27,420 --> 00:35:36,000 una función de un cierto número. Si este número es cero, devuelve cero. Esto hasta sin saber, 511 00:35:36,000 --> 00:35:42,000 en un cierto sentido, lo puede entender. Digo, mira, estoy definiendo Fibonacci y me está 512 00:35:42,000 --> 00:35:50,880 diciendo que si tú quieres el cérimo, la posición cero de la serie Fibonacci, y este 513 00:35:50,880 --> 00:35:57,559 de aquí es el cero, pues entonces lo que tiene que devolver es cero. Si lo que has pedido es el primer 514 00:35:57,559 --> 00:36:06,659 elemento de la serie Fibonacci, o sea que el número es uno en vez de cero, pues entonces devuelve uno. Y si no, haz algo. 515 00:36:06,659 --> 00:36:09,960 no se entiende 516 00:36:09,960 --> 00:36:11,559 si yo no he hecho programación 517 00:36:11,559 --> 00:36:13,280 esto no entiendo que está haciendo 518 00:36:13,280 --> 00:36:15,940 pero ya es un pasito 519 00:36:15,940 --> 00:36:16,440 más 520 00:36:16,440 --> 00:36:19,380 cercano a como 521 00:36:19,380 --> 00:36:21,179 podría hablar un ser humano 522 00:36:21,179 --> 00:36:23,599 hay palabras que aquí dice si esto 523 00:36:23,599 --> 00:36:25,679 entonces hace esto y si este otro 524 00:36:25,679 --> 00:36:27,780 hace este otro, cosa que aquí no lo ves 525 00:36:27,780 --> 00:36:29,980 hace lo mismo 526 00:36:29,980 --> 00:36:31,739 aquí está haciendo lo mismo 527 00:36:31,739 --> 00:36:33,619 está haciendo que si tú le pides el Fibonacci 528 00:36:33,619 --> 00:36:35,420 de 0, te devuelve 0 529 00:36:35,420 --> 00:36:37,239 Fibonacci de 1 es el deber de 1 530 00:36:37,239 --> 00:36:39,099 y si no Fibonacci de n 531 00:36:39,099 --> 00:36:41,699 es n-1 532 00:36:41,699 --> 00:36:42,619 más n-2 533 00:36:42,619 --> 00:36:46,539 lo veremos, tanto programa de 534 00:36:46,539 --> 00:36:49,360 pero para que veáis también 535 00:36:49,360 --> 00:36:50,619 que esto es 536 00:36:50,619 --> 00:36:53,320 una parrafada de cosas raras 537 00:36:53,320 --> 00:36:54,820 que no se entiende, ya 538 00:36:54,820 --> 00:36:57,179 a un nivel más amplio, pues es algo 539 00:36:57,179 --> 00:36:58,340 bastante más pequeño 540 00:36:58,340 --> 00:36:59,079 más 541 00:36:59,079 --> 00:37:03,340 porque cada una de estas opciones 542 00:37:03,340 --> 00:37:04,860 aquí, en realidad 543 00:37:04,860 --> 00:37:14,400 un conjunto de estas acciones. Una operación a alto nivel, una línea, un código de alto nivel, 544 00:37:14,400 --> 00:37:21,380 pues posiblemente representa un conjunto de operaciones a nivel ensemblador. Y cada una 545 00:37:21,380 --> 00:37:26,340 de estas a nivel ensemblador posiblemente será un conjunto de operaciones al lenguaje máquina, 546 00:37:26,340 --> 00:37:28,079 eso de los 0 y 0 547 00:37:28,079 --> 00:37:29,880 dudas 548 00:37:29,880 --> 00:37:34,900 entonces esto es C 549 00:37:34,900 --> 00:37:36,599 también 550 00:37:36,599 --> 00:37:38,780 para el poquito más sencillo 551 00:37:38,780 --> 00:37:40,380 esto es Python 552 00:37:40,380 --> 00:37:41,920 fijaos en 553 00:37:41,920 --> 00:37:43,219 prolog list 554 00:37:43,219 --> 00:37:45,139 estos son declarativos 555 00:37:45,139 --> 00:37:48,420 en declarativo 556 00:37:48,420 --> 00:37:50,699 lo mismo que aquí se hacía en 557 00:37:50,699 --> 00:37:52,480 no sé cuántas líneas de código 558 00:37:52,480 --> 00:37:54,559 se hace en nada 559 00:37:54,559 --> 00:38:00,019 entonces dependiendo de lo que 560 00:38:00,019 --> 00:38:08,800 tú tienes que hacer pues a lo mejor por ejemplo en la programación lógica o funcional es mucho 561 00:38:08,800 --> 00:38:13,159 más práctico mucho más sintética con respecto a tener que hacerlo imperativamente de hacer 562 00:38:13,159 --> 00:38:20,179 esta fiesta de esta vez es dependiendo de lo que quieres desarrollar pues mejor utilizar 563 00:38:20,179 --> 00:38:32,780 declarativo mejor decir nosotros siempre tendremos siempre si dudas hasta aquí tres 564 00:38:32,780 --> 00:38:48,329 minutos de pausa. Entonces, nosotros hemos dicho que existe un nivel de programación muy bajo que 565 00:38:48,329 --> 00:38:54,170 está a nivel de ceros y unos en el procesador, luego está un nivel intermedio, digamos así, 566 00:38:54,170 --> 00:39:01,349 siempre bastante bajo, que se llama el ensemblador, o assembler, y luego por encima están los lenguajes 567 00:39:01,349 --> 00:39:08,010 de alto nivel, que es donde nosotros trabajaremos. El problema es que para hacer esta cosa, para que 568 00:39:08,010 --> 00:39:16,050 esta cosa funcione yo quiero escribir el lenguaje de alto nivel pero el procesador necesita ceros y 569 00:39:16,050 --> 00:39:22,889 unos para poder ejecutar lo que yo le he dicho que ejecuta para que esto funcione se necesita 570 00:39:22,889 --> 00:39:29,769 un mecanismo que me pide el lenguaje de alto nivel y los varios comandos del lenguaje nivel 571 00:39:29,769 --> 00:39:36,309 de alto nivel, y que lo traduzca en ceros y unos que el procesador puede ejecutar. 572 00:39:36,309 --> 00:39:43,289 Existen dos formas de hacer esto, la compilación y la interpretación. 573 00:39:45,130 --> 00:39:53,309 El intérprete es un programa, un programa extra, otro programa, yo tengo mi programa que quiero 574 00:39:53,309 --> 00:39:55,269 ejecutar, el programa este que calcula 575 00:39:55,269 --> 00:39:57,309 la área del triángulo 576 00:39:57,309 --> 00:39:59,389 vale, por un lado, necesito 577 00:39:59,389 --> 00:40:01,429 otro programa 578 00:40:01,429 --> 00:40:03,449 ¿vale? que es el intérprete 579 00:40:03,449 --> 00:40:05,210 que tendrá que ejecutarse, que 580 00:40:05,210 --> 00:40:07,369 alguien ya ha hecho para que funcione 581 00:40:07,369 --> 00:40:09,170 alguien a lo mejor ha programado el 0 582 00:40:09,170 --> 00:40:10,989 si uno, no lo sé, pero este funciona 583 00:40:10,989 --> 00:40:12,809 ¿vale? que 584 00:40:12,809 --> 00:40:14,949 recibirá como input 585 00:40:14,949 --> 00:40:17,010 mis comandos, o sea 586 00:40:17,010 --> 00:40:18,670 los comandos de mi programa 587 00:40:18,670 --> 00:40:21,570 y por cada uno de estos comandos 588 00:40:21,570 --> 00:40:23,050 hará la acción de 589 00:40:23,050 --> 00:40:26,929 traducirlos en ceros y unos y dárselo al procesador. 590 00:40:27,730 --> 00:40:31,090 Entonces hay en ejecución dos programas. 591 00:40:31,889 --> 00:40:34,570 Uno es el mío y uno es el intérprete. 592 00:40:35,250 --> 00:40:38,769 El intérprete está allí y yo le digo mira, el primer paso es 593 00:40:38,769 --> 00:40:43,409 preñar el número, díselo al procesador y él lo traduce en ceros y unos 594 00:40:43,409 --> 00:40:46,170 para que el procesador haga el paso que le dice. 595 00:40:46,170 --> 00:40:48,570 El segundo es multiplica. Vale, ok, espera. 596 00:40:49,010 --> 00:40:52,010 Lo traduzco en ceros y unos para que el procesador multiplique. 597 00:40:52,010 --> 00:40:56,269 Ahora guarda el resultado en esta celda de memoria 598 00:40:56,269 --> 00:40:57,809 Vale, espero que lo diga el procesador 599 00:40:57,809 --> 00:41:06,349 El intérprete está recibiendo comando por comando y lo traduce 600 00:41:06,349 --> 00:41:10,210 Recibe un comando, lo traduce, recibe un comando, lo traduce, recibe un comando, lo traduce 601 00:41:10,210 --> 00:41:11,730 ¿Se entiende con esto? 602 00:41:13,070 --> 00:41:19,050 Sin embargo, la compilación o el compilador es otro programa también 603 00:41:19,050 --> 00:41:21,530 que pero hace esta traducción 604 00:41:21,530 --> 00:41:22,769 toda de golpe 605 00:41:22,769 --> 00:41:25,530 es decir, yo te doy 606 00:41:25,530 --> 00:41:27,530 mi programa, el compilador 607 00:41:27,530 --> 00:41:29,530 lo pilla entero, él lo 608 00:41:29,530 --> 00:41:31,389 traduce todo en una 609 00:41:31,389 --> 00:41:32,829 secuencia de ceros y unos 610 00:41:32,829 --> 00:41:35,550 en lo que viene a ser un ejecutable 611 00:41:35,550 --> 00:41:36,929 un .exe 612 00:41:36,929 --> 00:41:39,289 habréis visto alguna vez dándole 613 00:41:39,289 --> 00:41:41,329 doble clic para arrancar 614 00:41:41,329 --> 00:41:43,289 un juego o un programa 615 00:41:43,289 --> 00:41:44,690 en vuestros ordenadores 616 00:41:44,690 --> 00:41:46,829 una vez traducido 617 00:41:46,829 --> 00:41:48,909 el compilador se apaga 618 00:41:48,909 --> 00:41:51,150 ya no existe, ya no hace falta 619 00:41:51,150 --> 00:41:53,630 yo tenía mi programa inicial 620 00:41:53,630 --> 00:41:57,690 he arrancado el compilador para que hiciera la traducción 621 00:41:57,690 --> 00:41:59,550 el compilador lo ha traducido entero 622 00:41:59,550 --> 00:42:01,230 y ahora ya el compilador no me sirve 623 00:42:01,230 --> 00:42:04,469 y lo que hago es que yo puedo ejecutar 624 00:42:04,469 --> 00:42:08,090 ese programa en ese procesador 625 00:42:08,090 --> 00:42:11,730 porque el compilador cuando compila 626 00:42:11,730 --> 00:42:13,349 cuando hace esta traducción 627 00:42:13,349 --> 00:42:17,789 hace la traducción en base al sistema en el que está 628 00:42:17,789 --> 00:42:21,250 si yo tengo mi programa escrito en Java 629 00:42:21,250 --> 00:42:22,789 o escrito en C 630 00:42:22,789 --> 00:42:25,369 o que sigo, y lo compilo 631 00:42:25,369 --> 00:42:27,050 para Windows 632 00:42:27,050 --> 00:42:28,710 con un determinado procesador 633 00:42:28,710 --> 00:42:30,690 me funcionará en todos los Windows 634 00:42:30,690 --> 00:42:32,829 con ese determinado procesador, pero si intento 635 00:42:32,829 --> 00:42:35,050 ejecutar esa cosa en un Linux 636 00:42:35,050 --> 00:42:36,389 con un procesador distinto 637 00:42:36,389 --> 00:42:38,650 no me funciona, porque tendré que 638 00:42:38,650 --> 00:42:40,809 pillar un compilador para ese otro 639 00:42:40,809 --> 00:42:42,789 sistema y volver a hacer 640 00:42:42,789 --> 00:42:44,630 la compilación para ese sistema 641 00:42:44,630 --> 00:42:46,170 que me dará un ejecutable 642 00:42:46,170 --> 00:42:50,210 en el otro sistema. Cada sistema tendrá su propio 643 00:42:50,210 --> 00:42:53,989 ejecutable. Es cuando vosotros bajáis un programa 644 00:42:53,989 --> 00:42:57,250 de algún tipo y os dicen, oye, ¿qué sistema tienes? 645 00:42:57,769 --> 00:43:02,250 Windows, Mac o Linux. Y tú eliges 646 00:43:02,250 --> 00:43:06,110 tu sistema y te estás bajando el ejecutable para ese sistema. 647 00:43:08,010 --> 00:43:11,670 ¿Entiendes? El intérprete 648 00:43:11,670 --> 00:43:14,590 vive mientras viva mi programa. 649 00:43:14,590 --> 00:43:16,809 porque le voy pasando 650 00:43:16,809 --> 00:43:19,369 comando a comando 651 00:43:19,369 --> 00:43:21,989 y él lo interpreta en ese instante 652 00:43:21,989 --> 00:43:23,610 el compilador 653 00:43:23,610 --> 00:43:25,289 se compila una vez 654 00:43:25,289 --> 00:43:27,670 y una vez compilado el compilador no me sirve 655 00:43:27,670 --> 00:43:28,570 y funciona 656 00:43:28,570 --> 00:43:31,210 el compilador 657 00:43:31,210 --> 00:43:33,849 es dependiente 658 00:43:33,849 --> 00:43:36,110 del sistema en el que estoy 659 00:43:36,110 --> 00:43:37,889 el intérprete 660 00:43:37,889 --> 00:43:39,869 el intérprete como tal 661 00:43:39,869 --> 00:43:40,250 sí 662 00:43:40,250 --> 00:43:43,769 yo necesito un intérprete que funcione 663 00:43:43,769 --> 00:43:47,550 en Windows y un intérprete que funcione en Linux, algo parecido. 664 00:43:48,010 --> 00:43:51,769 Pero una vez que tengo eso, el 665 00:43:51,769 --> 00:43:55,329 programa que escribo yo, eso del triángulo, 666 00:43:56,510 --> 00:43:59,070 me vale tanto para Linux como para Windows. 667 00:44:00,110 --> 00:44:03,710 Yo tengo esto escrito en un determinado lenguaje y si se lo 668 00:44:03,710 --> 00:44:07,889 paso como input al intérprete de Windows, me girará 669 00:44:07,889 --> 00:44:10,409 en Windows. Si se lo paso como 670 00:44:10,409 --> 00:44:13,090 input a un intérprete 671 00:44:13,090 --> 00:44:15,449 que gira en Linux, pues me funcionará 672 00:44:15,449 --> 00:44:16,190 también en Linux. 673 00:44:17,030 --> 00:44:19,449 Entonces, tiene ventajas y desventajas 674 00:44:19,449 --> 00:44:20,309 cada uno de estos. 675 00:44:21,050 --> 00:44:23,429 Uno es más dependiente 676 00:44:23,429 --> 00:44:24,650 de lo que hay por debajo 677 00:44:24,650 --> 00:44:27,110 del sistema en que estoy, pero luego 678 00:44:27,110 --> 00:44:29,050 gasta menos recursos porque una vez hecho 679 00:44:29,050 --> 00:44:31,150 el compilador ya no lo tengo que ejecutar 680 00:44:31,150 --> 00:44:33,269 otras veces. Mientras esté aquí 681 00:44:33,269 --> 00:44:35,289 el intérprete siempre tiene que estar funcionando. 682 00:44:35,409 --> 00:44:37,190 Es como una sobrecarga que tiene 683 00:44:37,190 --> 00:44:38,130 siempre que existir. 684 00:44:39,130 --> 00:44:40,750 ¿Cuál es mejor? Ningún. 685 00:44:40,969 --> 00:44:42,010 ¿Cuál es peor? Ningún. 686 00:44:42,510 --> 00:44:44,369 Depende de lo que tengo que hacer yo. 687 00:44:44,889 --> 00:44:49,750 Dependiendo de qué es mi sistema, si es un sistema, por ejemplo, que tiene que ir rápido, 688 00:44:50,630 --> 00:44:53,269 ¿qué creéis que es más rápido? 689 00:44:53,929 --> 00:44:59,250 ¿Pasar comando por comando, que uno lo traduzca y que lo ejecute, o tener ya todo listo? 690 00:45:01,570 --> 00:45:04,090 Por eso los videojuegos, por ejemplo, se compilan. 691 00:45:04,090 --> 00:45:11,530 Y los juegos se suelen hacer en C++, algo para decir, que es un lenguaje que se compila 692 00:45:11,530 --> 00:45:12,929 y una vez compilado funciona. 693 00:45:12,929 --> 00:45:20,769 Pero los juegos tienen versiones distintas para Windows, para Linux, para un juego que 694 00:45:20,769 --> 00:45:27,710 funcione en Windows no lo puedes jugar en el Mac. 695 00:45:27,710 --> 00:45:33,889 Pero siempre que tú quieres un programa único que luego funcione, que sea muy portable, 696 00:45:33,889 --> 00:45:37,989 funcione en muchos sistemas, pues que solamente con un intérprete que funcione. 697 00:45:38,849 --> 00:45:42,110 Porque con esto deberías hacer muchas veces las compilaciones 698 00:45:42,110 --> 00:45:45,010 y tener muchas versiones distintas del mismo programa. 699 00:45:45,769 --> 00:45:50,190 ¿Cómo funciona la compilación? Yo tengo un programa, ¿vale? 700 00:45:50,190 --> 00:45:53,610 Un programa escrito en C, por ejemplo, aquí. 701 00:45:55,030 --> 00:45:57,989 Ejecuto un compilador, ¿vale? 702 00:45:58,110 --> 00:46:02,429 Y este compilador me traduce una buena parte 703 00:46:02,429 --> 00:46:05,630 de este código en ceros y unos. 704 00:46:06,809 --> 00:46:11,230 Además de eso, es posible que mi programa 705 00:46:11,230 --> 00:46:16,150 utilice algunas funciones, algunos bloques de códigos 706 00:46:16,150 --> 00:46:21,070 que no he escrito yo y que me dan automáticamente 707 00:46:21,070 --> 00:46:23,610 el propio lenguaje de programación. 708 00:46:27,320 --> 00:46:31,119 Printf es una función que escribe en pantalla. 709 00:46:31,119 --> 00:46:35,619 Lo que está escrito aquí, me lo escribe en la pantalla. 710 00:46:36,840 --> 00:46:42,199 Pero esta función de aquí, printf, no la tengo que programar yo. 711 00:46:43,079 --> 00:46:48,280 C, este es el lenguaje en C, me la da ya hecha en una librería. 712 00:46:49,099 --> 00:46:55,280 Yo puedo importar librería que han hecho otros y utilizar las funciones que me dan los otros 713 00:46:55,280 --> 00:47:01,039 para evitar de tener que reescribir yo en cada programa una función que escribe en pantalla. 714 00:47:01,119 --> 00:47:08,619 Si no hubiese esto, cada vez que yo empiezo un programa, debería escribirme el código para poder imprimir en pantalla y luego usarlo. 715 00:47:08,619 --> 00:47:12,119 En vez de con esto, me lo dan ya hecho y yo lo uso. 716 00:47:12,119 --> 00:47:19,119 Pero no está aquí. La definición de este printf yo aquí la uso, pero no sé cómo está hecho. 717 00:47:19,119 --> 00:47:25,119 No sé qué programa es. Me la da una librería externa. 718 00:47:25,119 --> 00:47:37,639 Entonces, aquí la guía sería, esto compila lo que he escrito yo y luego le pega detrás las librerías externas que me sirven. 719 00:47:37,639 --> 00:47:48,039 y con esto hace un programa, un fichero, que dentro tiene el código máquina de mi programa 720 00:47:48,039 --> 00:47:55,179 y el código máquina de todas las funciones que otro me han dado listas para ser ejecutadas. 721 00:47:55,179 --> 00:48:00,039 En este fichero está todo lo que me sirve para poder ejecutar mi programa. 722 00:48:00,039 --> 00:48:04,119 pero lo he tenido que hacer 723 00:48:04,119 --> 00:48:06,059 para por ejemplo Windows 7 724 00:48:06,059 --> 00:48:07,760 con un Core 2 Duo 725 00:48:07,760 --> 00:48:09,659 la transparencia tiene un sonido 726 00:48:09,659 --> 00:48:14,079 si yo quiero hacerlo 727 00:48:14,079 --> 00:48:15,960 en Linux, no me vale 728 00:48:15,960 --> 00:48:18,199 esto, porque esta traducción 729 00:48:18,199 --> 00:48:20,139 aquí, estos ceros y unos, valen 730 00:48:20,139 --> 00:48:21,380 para estos sistemas 731 00:48:21,380 --> 00:48:24,119 no para sistemas Linux con otro procesador 732 00:48:24,119 --> 00:48:26,119 entonces debería volver 733 00:48:26,119 --> 00:48:28,119 a hacer este proceso para crear 734 00:48:28,119 --> 00:48:30,019 un distinto ejecutable 735 00:48:30,019 --> 00:48:32,199 que contenga empaquetado dentro 736 00:48:32,199 --> 00:48:34,219 los ceros y unos, que puede 737 00:48:34,219 --> 00:48:36,559 entender el otro procesador, el otro sistema 738 00:48:36,559 --> 00:48:38,219 y todas las 739 00:48:38,219 --> 00:48:40,539 funciones, pero interpretables 740 00:48:40,539 --> 00:48:42,139 o sea, ejecutables por 741 00:48:42,139 --> 00:48:44,179 el otro sistema, no para 742 00:48:44,179 --> 00:48:46,039 el Windows, ¿entiendes? 743 00:48:47,860 --> 00:48:48,199 una vez 744 00:48:48,199 --> 00:48:50,280 empaquetado, yo, cuando se hace 745 00:48:50,280 --> 00:48:52,159 así, pues, yo tengo el 746 00:48:52,159 --> 00:48:54,340 programa, lo he escrito, lo compilo 747 00:48:54,340 --> 00:48:56,260 para varias versiones, tendré 748 00:48:56,260 --> 00:48:57,619 para Windows, para Linux, ¿eh? 749 00:48:57,719 --> 00:48:59,980 y luego le digo a los usuarios, oye 750 00:48:59,980 --> 00:49:05,860 cuando tú te bajas el programa, bájatelo para tu sistema. Bájatelo para Windows, bájatelo 751 00:49:05,860 --> 00:49:19,869 para Linux, bájatelo para Mac, bájatelo para Android. ¿Se entiende? Vale. El programa 752 00:49:19,869 --> 00:49:26,429 fuente es el programa que he escrito yo. El programa objeto es el programa de 0 y 1. 753 00:49:26,429 --> 00:49:29,969 Sería esto, luego enlazado 754 00:49:29,969 --> 00:49:34,940 El código objeto 755 00:49:34,940 --> 00:49:36,719 Más las librerías externas 756 00:49:36,719 --> 00:49:38,179 Me dan el programa ejecutable 757 00:49:38,179 --> 00:49:41,059 O sea, código fuente 758 00:49:41,059 --> 00:49:42,139 Esto 759 00:49:42,139 --> 00:49:44,820 Esto es lo que está escrito 760 00:49:44,820 --> 00:49:46,619 En el código fuente, alto nivel 761 00:49:46,619 --> 00:49:48,760 Lo entiendo yo, pero la máquina no lo puede entender 762 00:49:48,760 --> 00:49:50,599 Código objeto 763 00:49:50,599 --> 00:49:53,300 Sería esta traducción en ceros y unos 764 00:49:53,300 --> 00:49:57,079 Pero le faltan todas las librerías externas 765 00:49:57,079 --> 00:49:58,480 A este punto 766 00:49:58,480 --> 00:50:05,039 mezcla lo que es lo que ha generado con las librerías externas pre compiladas y 767 00:50:05,039 --> 00:50:10,860 crea un único fichero que se les gusta más fuente programa objeto de programa 768 00:50:10,860 --> 00:50:17,800 código objeto más las librerías externas me dan el programa si toda esta 769 00:50:17,800 --> 00:50:26,409 compilación dudas sobre compilación la interpretación ya lo hemos dicho vale 770 00:50:26,409 --> 00:50:31,510 analiza el programa fuente en lo ejecuta directamente línea por línea vale por 771 00:50:31,510 --> 00:50:36,789 ejemplo estoy aquí es mucho más útil para buscar errores en compilación yo 772 00:50:36,789 --> 00:50:41,050 hago mi proyecto en mi programa lo quiero quiero ver si hay errores por lo 773 00:50:41,050 --> 00:50:45,849 tanto lo quiero lanzar lo que tengo hacer es una compilación y ahora he 774 00:50:45,849 --> 00:50:50,590 compilado todo si esto no funciona porque un error tengo que solucionar el 775 00:50:50,590 --> 00:50:55,610 error y volver a compilar y que cada vez que yo tengo una compilación un 776 00:50:55,610 --> 00:51:01,389 ejecutable puede ejecutar esa versión para cambiarlo no puedo trabajar 777 00:51:01,389 --> 00:51:03,250 sobre esta versión. Tengo que cambiar 778 00:51:03,250 --> 00:51:05,190 el código fuente y crear una nueva 779 00:51:05,190 --> 00:51:06,050 versión compilada. 780 00:51:07,650 --> 00:51:08,730 Sin embargo, el 781 00:51:08,730 --> 00:51:10,389 intérprete, como 782 00:51:10,389 --> 00:51:13,230 funciona línea por línea, 783 00:51:14,230 --> 00:51:15,170 hay sistemas 784 00:51:15,170 --> 00:51:17,449 para decirle, oye, mira, aquí está el intérprete. 785 00:51:17,590 --> 00:51:19,250 Te voy mandando los códigos y cuando veo 786 00:51:19,250 --> 00:51:21,309 que no funciona, puedo cambiar 787 00:51:21,309 --> 00:51:23,230 directamente el código aquí y 788 00:51:23,230 --> 00:51:25,309 el intérprete empieza a interpretar la línea 789 00:51:25,309 --> 00:51:27,090 cambiada, no la línea original. 790 00:51:27,710 --> 00:51:28,929 Porque está interpretando 791 00:51:28,929 --> 00:51:31,150 línea por línea. Entonces, para 792 00:51:31,150 --> 00:51:33,429 encontrar errores, buscar errores, cosas por el estilo 793 00:51:33,429 --> 00:51:35,070 con un intérprete es mucho más fácil 794 00:51:35,070 --> 00:51:37,510 le puedo pedir muchas más cosas que un compilador 795 00:51:37,510 --> 00:51:42,150 son cosas avanzadas 796 00:51:42,150 --> 00:51:43,809 cuando veis debugging 797 00:51:43,809 --> 00:51:46,329 en entornos 798 00:51:46,329 --> 00:51:48,269 de desarrollo, a lo mejor 799 00:51:48,269 --> 00:51:50,030 vendrá fuera cosas por eso 800 00:51:50,030 --> 00:51:50,510 ¿vale? 801 00:51:51,630 --> 00:51:54,110 se puede modificar el código sobre la marcha 802 00:51:54,110 --> 00:51:56,309 tengo el código fuente, le cambio 803 00:51:56,309 --> 00:51:58,030 algo y veo lo que pasa, le cambio 804 00:51:58,030 --> 00:52:00,269 otra cosa y veo lo que pasa, sin tener 805 00:52:00,269 --> 00:52:01,730 que compilar todo cada vez 806 00:52:01,730 --> 00:52:04,349 pero es mucho menos eficiente 807 00:52:04,349 --> 00:52:06,550 ¿vale? porque siempre tendrá 808 00:52:06,550 --> 00:52:08,409 un programa extra 809 00:52:08,409 --> 00:52:10,150 el intérprete que está trabajando 810 00:52:10,150 --> 00:52:11,449 ¿sí? 811 00:52:14,340 --> 00:52:16,380 aquí tenéis un esquema que 812 00:52:16,380 --> 00:52:17,760 sustancialmente os 813 00:52:17,760 --> 00:52:20,340 compara compilador 814 00:52:20,340 --> 00:52:22,400 e intérprete en base a varias 815 00:52:22,400 --> 00:52:24,360 características, o sea, como es la entrada 816 00:52:24,360 --> 00:52:26,539 como es la salida, cuál es la velocidad, cuánta memoria 817 00:52:26,539 --> 00:52:28,400 usa, puede que es como gestionar 818 00:52:28,400 --> 00:52:29,699 los errores, etc, etc 819 00:52:29,699 --> 00:52:32,679 nos lo saltamos, lo usaremos 820 00:52:32,679 --> 00:52:34,400 mañana para repasar esta parte. 821 00:52:37,119 --> 00:52:39,000 Paradigma de programación, ya lo hemos 822 00:52:39,000 --> 00:52:40,579 dicho, nos hemos visto, ¿vale? 823 00:52:40,639 --> 00:52:42,860 Nosotros tenemos programación 824 00:52:42,860 --> 00:52:44,679 estructurada, programación modular 825 00:52:44,679 --> 00:52:46,820 y programación orientada a 826 00:52:46,820 --> 00:52:48,800 objetos, ¿vale? Programación 827 00:52:48,800 --> 00:52:50,980 estructurada es la que sustancialmente 828 00:52:50,980 --> 00:52:53,099 se basa sobre secuencias alternativas 829 00:52:53,099 --> 00:52:54,239 e iterativas, ¿vale? 830 00:52:54,659 --> 00:52:57,280 Los que son una secuencia de instrucciones, 831 00:52:57,860 --> 00:52:58,440 los if 832 00:52:58,440 --> 00:53:00,840 y los while, que son 833 00:53:00,840 --> 00:53:02,619 los que estudiaremos nosotros al principio, 834 00:53:02,679 --> 00:53:11,000 luego empezaremos a empaquetar estas cosas en módulos en funciones entonces seguimos con 835 00:53:11,000 --> 00:53:17,260 programación modular un poquito lo hemos dicho antes cuando veíamos la programación estructurada 836 00:53:17,260 --> 00:53:23,739 que se basaba en funciones y módulos vale entonces de aquí esta es la base base se pasa a hacer 837 00:53:23,739 --> 00:53:29,440 módulos y luego la programación orientada a objetos que en vez de lo que hemos dicho de 838 00:53:29,440 --> 00:53:40,539 Yo me focalizo en un objeto general y empaqueto junto con este objeto todas las posibles funcionalidades y todas las características propias de ese objeto. 839 00:53:40,719 --> 00:53:50,159 Modelizo un avión, pues le pongo como característica la velocidad máxima, cuánta gasolina puede tener y cuántos motores tiene. 840 00:53:50,159 --> 00:53:58,960 Y luego como funcionalidades le puedo poner despegar, le puedo poner aterrizar, le puedo poner subir de altitud, que sí. 841 00:53:58,960 --> 00:54:21,059 ¿Vale? Todas estas cosas van juntas en el objeto y se mueven juntas. Si yo tengo que reutilizarla en entornos distintos, simplemente me reimporto todo el avión y tengo toda la información y todas las funcionalidades del avión ya listas. ¿Sí? Esa es la formación orientada a objetos. Es donde nos moveremos nosotros. 842 00:54:21,059 --> 00:54:27,159 Nosotros empezaremos de aquí, nos moveremos aquí y llegaremos aquí. 843 00:54:27,400 --> 00:54:28,579 Esto más o menos en diciembre. 844 00:54:33,000 --> 00:54:34,199 Todo esto era genérico. 845 00:54:34,800 --> 00:54:37,260 Lenguaje de programación genérico, etcétera, etcétera, etcétera. 846 00:54:37,460 --> 00:54:40,719 Nosotros vamos a utilizar Java o Java o Java. 847 00:54:41,079 --> 00:54:42,679 No lo sé, pronunciarlo como quiera. 848 00:54:42,920 --> 00:54:48,219 En Italia, cuando yo estudiaba era Java, entonces para mí se ha quedado así. 849 00:54:48,480 --> 00:54:51,639 En realidad probablemente es Java en inglés o Java en español. 850 00:54:52,139 --> 00:54:52,820 Llamarlo como quiera. 851 00:54:52,820 --> 00:54:56,400 es un lenguaje de programación orientado 852 00:54:56,400 --> 00:54:58,320 a objetos, nosotros desde el primer 853 00:54:58,320 --> 00:55:00,340 ejercicio que haremos y para siempre 854 00:55:00,340 --> 00:55:02,239 estaremos utilizando otra programación 855 00:55:02,239 --> 00:55:04,300 orientada al objeto, solo que nosotros 856 00:55:04,300 --> 00:55:06,159 al principio ignoraremos esa cosa 857 00:55:06,159 --> 00:55:08,219 veréis que hay 858 00:55:08,219 --> 00:55:10,320 palabras raras, que diréis, ¿por qué tengo que 859 00:55:10,320 --> 00:55:10,900 escribir esto? 860 00:55:11,539 --> 00:55:14,000 tú escríbelo, ya en diciembre 861 00:55:14,000 --> 00:55:15,559 entenderás por qué 862 00:55:15,559 --> 00:55:18,139 su objetivo fundamental es 863 00:55:18,139 --> 00:55:20,420 crear aplicaciones independientes 864 00:55:20,420 --> 00:55:21,420 de la plataforma 865 00:55:21,420 --> 00:55:37,960 ¿Vale? Una de las cosas importantes e interesantes de Java es que es muy portable. Escribe una vez el código y ejecútalo en un mogollón de cosas distintas. ¿Vale? Esto me hace pensar que si es un compilador o un intérprete. 866 00:55:37,960 --> 00:55:42,760 ¿Usa un compilador o usa un intérprete Java? 867 00:55:45,590 --> 00:55:47,110 En realidad usa los dos 868 00:55:47,110 --> 00:55:52,369 Pero el hecho que yo quiero algo que escriba una vez 869 00:55:52,369 --> 00:55:55,449 Y que luego se ejecute en todos los sistemas posibles 870 00:55:55,449 --> 00:55:58,869 Es que probablemente me hace pensar que no lo puedo compilar 871 00:55:58,869 --> 00:56:03,090 Porque lo que puedo hacer es tener intérpretes distintos en cada sistema 872 00:56:03,090 --> 00:56:05,630 Y estos intérpretes no interpretan mi programa 873 00:56:05,630 --> 00:56:10,630 Aún así, Java usa sea un compilador que un intérprete. 874 00:56:10,630 --> 00:56:12,630 Ahora veremos en qué se trata. 875 00:56:12,630 --> 00:56:13,630 ¿Vale? 876 00:56:13,630 --> 00:56:18,630 La idea es escribirlo una vez y ejecutarlo donde trabaje. 877 00:56:18,630 --> 00:56:21,630 Entonces, ¿qué se hace en Java? 878 00:56:21,630 --> 00:56:23,630 ¿Vale? 879 00:56:23,630 --> 00:56:25,630 Yo uso un editor. 880 00:56:25,630 --> 00:56:30,630 Para programar en Java se puede utilizar cualquier editor de texto plano. 881 00:56:30,630 --> 00:56:42,269 Yo puedo programar en Java con Notepad o con BlockNotes o con Notepad++ o con cualquier cosa que edite texto plano. 882 00:56:42,269 --> 00:56:50,269 No con Word. Word no es un editor de texto plano. Word mete cositas raras dentro que yo no veo que pero están allí. 883 00:56:50,469 --> 00:56:54,449 ¿Habéis abierto alguna vez un fichero de Word con un Notepad? 884 00:56:54,449 --> 00:56:56,489 hacerlo 885 00:56:56,489 --> 00:56:59,250 y veréis que está toda cosa rara 886 00:56:59,250 --> 00:57:00,710 ahí dentro que no es lo que he escrito ahí 887 00:57:00,710 --> 00:57:03,309 ¿vale? con lo que vemos casi yo puedo programar 888 00:57:03,309 --> 00:57:04,969 en Java, no es aconsejable 889 00:57:04,969 --> 00:57:07,190 hoy en día nosotros utilizamos IDE 890 00:57:07,190 --> 00:57:09,309 ¿vale? entornos de desarrollo 891 00:57:09,309 --> 00:57:10,389 integrados ¿vale? 892 00:57:10,989 --> 00:57:12,510 que son los que veréis también en 893 00:57:12,510 --> 00:57:14,710 entornos de desarrollo ¿vale? 894 00:57:14,789 --> 00:57:17,530 como NetBeans, como Eclipse 895 00:57:17,530 --> 00:57:19,630 como IntelliJ 896 00:57:19,630 --> 00:57:20,210 como 897 00:57:20,210 --> 00:57:23,409 varios tipos de cosas, nosotros usaremos 898 00:57:23,409 --> 00:57:23,829 Eclipse 899 00:57:26,449 --> 00:57:27,289 Entonces, ¿qué hago? 900 00:57:27,409 --> 00:57:30,050 Con este editor escribo el programa fuente. 901 00:57:30,230 --> 00:57:33,670 El programa fuente estará en un fichero que es .java. 902 00:57:33,809 --> 00:57:35,349 Entonces, eso es lo que veo yo. 903 00:57:35,510 --> 00:57:36,650 Es lo que haréis vosotros. 904 00:57:36,909 --> 00:57:38,190 Escribo el programa Java. 905 00:57:38,989 --> 00:57:42,130 Cuando lo quiero ejecutar, cuando quiero ver si funciona o no, 906 00:57:42,909 --> 00:57:45,530 el primer paso es una compilación. 907 00:57:46,750 --> 00:57:51,829 Java pilla el fichero y lo compila, lo transforma, 908 00:57:51,829 --> 00:57:55,090 en otro lenguaje que se llama el bytecode. 909 00:57:55,090 --> 00:58:00,170 que no es el assembler, que no es el lenguaje máquina. 910 00:58:00,670 --> 00:58:07,849 Es un lenguaje de alto nivel, pero un poco más bajo nivel con respecto al Java VDA. 911 00:58:09,289 --> 00:58:12,309 Entonces, yo tengo mi programa en Java que lo he escrito yo. 912 00:58:12,829 --> 00:58:15,969 Él, en automático, me lo transforma en bytecode. 913 00:58:16,690 --> 00:58:21,650 Este pasaje sirve porque haciendo este paso de compilación, 914 00:58:21,650 --> 00:58:24,909 el compilador puede optimizar el código. 915 00:58:25,090 --> 00:58:29,949 Puede hacerlo mejor, puede hacerlo que se ejecute más rápidamente. 916 00:58:30,969 --> 00:58:35,849 Y ahora tengo un nuevo fichero, que es el fichero .class. 917 00:58:36,309 --> 00:58:40,530 Yo tenía programa.java, ahora se creará programa.class. 918 00:58:40,690 --> 00:58:45,849 Yo tenía treno.java, ahora tendré treno.class. 919 00:58:46,449 --> 00:58:51,050 Y aquí dentro, si yo voy a ver, no entiendo nada de lo que está escrito. 920 00:58:51,530 --> 00:58:54,969 Pero no es lenguaje del procesador PRO. 921 00:58:55,090 --> 00:59:02,489 Es un lenguaje propio de Java que tendrá que ser interpretado. 922 00:59:03,190 --> 00:59:05,190 O sea, Java usa un intérprete también. 923 00:59:06,010 --> 00:59:08,530 Este intérprete se llama la Java Virtual Machine. 924 00:59:09,650 --> 00:59:17,829 Si tú quieres utilizar un programa de Java, necesitas en tu ordenador haber instalado la Java Virtual Machine. 925 00:59:18,550 --> 00:59:24,489 Java Virtual Machine es un programita que se ejecuta cada vez que tú quieras ejecutar algo de Java. 926 00:59:25,090 --> 00:59:47,050 Cuando tú quieres ejecutar este punto class, en automático el sistema lanza la Java Virtual Machine, que es un intérprete que te pilla comandos en bytecode, comandos escritos en bytecode, y los traduce al código máquina real. 927 00:59:47,050 --> 01:00:06,639 Entonces Java hace los dos pasos. Compilación y luego interpreta el código compilado. Se compila en bytecode y luego se interpreta el bytecode. La compilación me permite optimizar el código para que sea más eficiente y luego se interpreta. 928 01:00:06,639 --> 01:00:13,400 La ventaja de este sistema es que yo escribo el programa fuente una vez 929 01:00:13,400 --> 01:00:19,539 y luego lo puedo ejecutar en cualquier sistema que tenga una Java Virtual Machine. 930 01:00:21,380 --> 01:00:24,280 Serán los de Java, los que desarrollan Java, 931 01:00:24,500 --> 01:00:28,960 que se encargarán de crear una versión de Java Virtual Machine para Windows, 932 01:00:29,460 --> 01:00:31,800 una versión de Java Virtual Machine para Linux, 933 01:00:32,239 --> 01:00:35,679 una versión de Java Virtual Machine para Mac, 934 01:00:35,679 --> 01:00:38,239 una versión de Javaton Machine para Android. 935 01:00:39,900 --> 01:00:46,880 El cliente mío, lo único que tiene que hacer es bajarse e instalarse la Javaton Machine para su sistema. 936 01:00:47,480 --> 01:00:52,159 Y luego podrá ejecutar mi fichero en ByteDisk. 937 01:00:53,380 --> 01:00:59,619 Yo lo escribo una vez, lo compilo una vez y luego distribuyo el punto clase. 938 01:01:00,099 --> 01:01:01,659 Doy a quien lo quiera el punto clase. 939 01:01:01,659 --> 01:01:10,659 Quien quiera ejecutar mi programa tendrá que instalarse la Java Vector Machine propia de su sistema y usar el mismo punto clásico. 940 01:01:10,659 --> 01:01:21,150 Esto es potente porque permite a Java ser muy independiente del hardware por debajo. 941 01:01:21,150 --> 01:01:27,150 Mi proyecto, mi programa, Java son independientes. Lo que es dependiente es la Java Vector Machine. 942 01:01:27,150 --> 01:01:30,150 Pero ya se encargan ellos de crear la Java Vector Machine. 943 01:01:30,150 --> 01:01:50,199 Luego lo veremos con más detalle, pero aquí, si vosotros vais en este equipo de software, aquí tenéis los programas que se han instalado en estos ordenadores, ¿vale? 944 01:01:50,199 --> 01:02:01,920 Con la idea de, si en casa queréis la misma versión que está aquí, aquí tenéis el instalador que se ha utilizado para estos ordenadores, ¿vale? 945 01:02:02,099 --> 01:02:31,900 Entonces, por ejemplo, está el Eclipse que vamos a utilizar nosotros, debería estar también la Java Virtual Machine, ¿de acuerdo? El .js, este .js de aquí, que es el 25 que vamos a utilizar nosotros, esto es el Java Development Kit, ¿vale? El Java, el kit de Java para desarrolladores, digamos así, ¿vale? 946 01:02:31,900 --> 01:02:40,340 y aquí dentro incluye la java virtual no ship si vosotros tenéis windows en casa podéis traerlos 947 01:02:40,340 --> 01:02:47,059 desde aquí a instalarlo si tenéis mac os tendréis que instalar la versión 25 de jvk para mac 948 01:02:47,059 --> 01:02:55,409 luego hay un momento en que os explico que tenéis que hacer en casa para que esto funcione 949 01:02:55,409 --> 01:02:59,349 Entonces, ¿se entiende esto? 950 01:03:00,610 --> 01:03:04,409 Entonces, pregunta, ¿Java interpretado o compilado? 951 01:03:04,409 --> 01:03:10,449 Los dos. Utilizan la compilación para pasar de Java a bytecode 952 01:03:10,449 --> 01:03:14,150 y luego se interpreta utilizando como intérprete la Java Vector Machine. 953 01:03:16,190 --> 01:03:20,909 La Java Vector Machine está dentro de un paquete que se llama JRE, 954 01:03:21,190 --> 01:03:25,389 Java Runtime Environment, que está contenido dentro de JDK. 955 01:03:25,409 --> 01:03:26,949 que es el que instalamos nosotros. 956 01:03:27,570 --> 01:03:29,030 Solo que si soy un desarrollador, 957 01:03:29,289 --> 01:03:31,329 instalo en JDK, si soy solo 958 01:03:31,329 --> 01:03:33,730 un usuario, con el JRE es suficiente. 959 01:03:35,090 --> 01:03:35,530 Sinceramente, 960 01:03:36,030 --> 01:03:37,170 si soy un cliente, 961 01:03:37,389 --> 01:03:39,369 lo único que me sirve es la Java Virtual Machine. 962 01:03:39,789 --> 01:03:41,469 Si en vez de desarrollo en Java, 963 01:03:41,650 --> 01:03:43,369 pues necesito algo más. Entonces 964 01:03:43,369 --> 01:03:47,659 me instalo por ahí. La idea, 965 01:03:47,900 --> 01:03:49,739 tengo un programa fuente, el programa fuente 966 01:03:49,739 --> 01:03:52,179 f.java se compila, 967 01:03:52,340 --> 01:03:53,539 ¿vale? Aquí tendrá 968 01:03:53,539 --> 01:03:55,800 f.clase y otras clases, 969 01:03:55,800 --> 01:03:58,000 eso ya lo veremos en un futuro, pero en bytecode. 970 01:03:59,059 --> 01:04:04,659 Ahora, si yo tengo una máquina aquí que tiene Windows, por ejemplo, 971 01:04:04,900 --> 01:04:09,820 tendrá instalada la Java Vector Machine de Windows y mi bytecode será interpretable por él. 972 01:04:10,920 --> 01:04:14,639 Si este es un Linux y tendrá instalada la Java Vector Machine para Linux, 973 01:04:14,860 --> 01:04:19,659 pues usará este mismo bytecode para interpretarlo para trabajar en Linux. 974 01:04:19,980 --> 01:04:23,340 Y si aquí tengo un Mac, tendrá la Java Vector Machine de Mac 975 01:04:23,340 --> 01:04:27,639 y este mismo bytecode se podrá interpretar a través de esta cosa, ¿vale? 976 01:04:27,639 --> 01:04:35,139 O sea, mi bytecode es único, lo que tiene cada máquina distinta será la Javalt Machine, 977 01:04:35,139 --> 01:04:39,039 que no hago yo. Yo como programador no lo hago la Javalt Machine. 978 01:04:39,039 --> 01:04:44,710 La Javalt Machine la encuentro ya en Internet y la puedo bajar. 979 01:04:44,710 --> 01:04:49,389 Sí. 980 01:04:49,389 --> 01:04:55,389 ¿Dudas sobre esto de compilación, interpretación, Java, bytecode, cosas por el estilo? 981 01:04:55,389 --> 01:04:57,889 Mañana lo repasamos, pero rápidamente. 982 01:04:57,889 --> 01:05:05,050 Entonces, como última parte de hoy, el concepto de algoritmo. 983 01:05:05,329 --> 01:05:09,730 Nosotros lo hemos dicho varias veces por aquí, un algoritmo, esto es un algoritmo, tenemos que crear algoritmo. 984 01:05:09,849 --> 01:05:12,170 Es una de las partes más difíciles de la programación. 985 01:05:12,750 --> 01:05:15,670 Vosotros tendréis que aprender a hacer algoritmos. 986 01:05:15,809 --> 01:05:16,750 ¿Qué es un algoritmo? 987 01:05:16,750 --> 01:05:31,800 Un conjunto ordenado de filitos de operaciones que nos permiten hallar las soluciones a un problema. 988 01:05:32,579 --> 01:05:40,030 Por ejemplo, ¿quién me puede hacer un ejemplo de algoritmo? 989 01:05:40,750 --> 01:05:50,260 Objetivo 990 01:05:50,260 --> 01:05:54,460 Quiero la media de las notas que he sacado este año 991 01:05:54,460 --> 01:05:56,059 Vale, ¿cuál es el algoritmo? 992 01:05:59,150 --> 01:05:59,849 El algoritmo sería 993 01:05:59,849 --> 01:06:01,530 Pilla la primera nota 994 01:06:01,530 --> 01:06:03,949 Súmale la segunda nota 995 01:06:03,949 --> 01:06:06,030 Súmale la tercera nota 996 01:06:06,030 --> 01:06:08,210 Y suma hasta la nota N 997 01:06:08,210 --> 01:06:10,989 Una vez que has sumado todas estas N notas 998 01:06:10,989 --> 01:06:12,170 Lo divide por N 999 01:06:12,170 --> 01:06:13,389 Ese es el algoritmo 1000 01:06:13,389 --> 01:06:16,550 Los pasos que tengo que hacer para obtener lo que quiero 1001 01:06:16,550 --> 01:06:27,989 Un dulce, una receta es un algoritmo. Pilla la harina, échala en un bol, pilla los huevos, 1002 01:06:27,989 --> 01:06:34,630 échala en el bol, gira todo, añade el azúcar, ponlo en el horno. Esa es una secuencia de 1003 01:06:34,630 --> 01:06:39,869 pasos que llega a un objetivo, que soluciona el problema de tengo hambre y quiero un poco 1004 01:06:39,869 --> 01:06:41,610 de dulce. ¿Se entiende? 1005 01:06:46,860 --> 01:06:47,519 Pero una tarta 1006 01:06:47,519 --> 01:06:49,820 es un algoritmo. ¿Vale? 1007 01:06:50,239 --> 01:06:52,280 Cambiar una bombilla es un 1008 01:06:52,280 --> 01:06:54,239 algoritmo. Quita la 1009 01:06:54,239 --> 01:06:56,079 bombilla antigua, píllala 1010 01:06:56,079 --> 01:06:56,860 de repuesto. 1011 01:06:58,119 --> 01:06:59,860 Todo esto es 1012 01:06:59,860 --> 01:07:02,099 hacer un algoritmo es encontrar 1013 01:07:02,099 --> 01:07:04,320 la secuencia de pasos que me permite 1014 01:07:04,320 --> 01:07:05,739 resolver el problema que tengo, 1015 01:07:05,980 --> 01:07:07,380 que estoy intentando resolver. 1016 01:07:09,219 --> 01:07:09,820 ¿Vale? 1017 01:07:09,820 --> 01:07:11,380 Pero algoritmos son la base de la programación. 1018 01:07:11,679 --> 01:07:13,219 Nosotros, nuestro trabajo 1019 01:07:13,219 --> 01:07:15,239 no es programar. Nuestro trabajo es 1020 01:07:15,239 --> 01:07:16,280 resolver problemas. 1021 01:07:17,059 --> 01:07:18,940 Nosotros nos darán problemas 1022 01:07:18,940 --> 01:07:21,179 y tenemos que encontrar cómo, por una 1023 01:07:21,179 --> 01:07:23,440 secuencia finita de posibles 1024 01:07:23,440 --> 01:07:25,659 comandos, podemos solucionar 1025 01:07:25,659 --> 01:07:26,280 ese problema. 1026 01:07:27,320 --> 01:07:28,519 Nuestro grande 1027 01:07:28,519 --> 01:07:30,860 trabajo es 1028 01:07:30,860 --> 01:07:32,900 encontrar algoritmos eficientes. 1029 01:07:33,500 --> 01:07:35,099 Porque el mismo problema se 1030 01:07:35,099 --> 01:07:36,980 podrá resolver de 500 1031 01:07:36,980 --> 01:07:39,179 modos distintos, pero solo 3 1032 01:07:39,179 --> 01:07:41,079 de ellos son buenos, porque lo 1033 01:07:41,079 --> 01:07:43,000 hace rápido y sin gastarme 1034 01:07:43,000 --> 01:07:45,599 un gocillón 1035 01:07:45,599 --> 01:07:46,659 de energía 1036 01:07:46,659 --> 01:07:49,320 y haciéndolo en tiempos humanos. 1037 01:07:51,179 --> 01:07:51,539 ¿Entiende? 1038 01:07:53,780 --> 01:07:54,860 Los programas son 1039 01:07:54,860 --> 01:07:56,599 algoritmos escritos en un lenguaje 1040 01:07:56,599 --> 01:07:58,079 entendible por un ordenador. 1041 01:07:58,079 --> 01:08:00,000 La definición del algoritmo 1042 01:08:00,000 --> 01:08:01,780 tiene que seguir reglas sintáticas 1043 01:08:01,780 --> 01:08:03,980 y tiene que cubrir todos los casos posibles. 1044 01:08:05,619 --> 01:08:07,059 Me hago un ejemplo. 1045 01:08:07,519 --> 01:08:08,800 No sé si el más... 1046 01:08:08,800 --> 01:08:09,940 Pero yo quiero calcular 1047 01:08:09,940 --> 01:08:12,000 la área de un triángulo. 1048 01:08:12,159 --> 01:08:13,679 No digo... 1049 01:08:13,679 --> 01:08:18,100 ¿Cómo se llama? Base, multiplico por la altura, divido 2. 1050 01:08:18,479 --> 01:08:21,739 Perfecto. Eso es el triángulo. 1051 01:08:23,000 --> 01:08:28,899 Pero a lo mejor yo debería comprobar que el tamaño de la base sea positivo. 1052 01:08:31,590 --> 01:08:32,529 Esa es parte del algoritmo. 1053 01:08:33,869 --> 01:08:37,050 Dame un número. Comprueba que sea positivo. 1054 01:08:37,829 --> 01:08:41,369 Dame otro número. Comprueba que sea positivo también. 1055 01:08:41,930 --> 01:08:43,250 A este punto hace la multiplicación. 1056 01:08:43,250 --> 01:08:48,250 Ya es un algoritmo un poquito más complejo de lo que he dicho antes. 1057 01:08:48,250 --> 01:08:54,250 El algoritmo tiene que ser determinista. 1058 01:08:54,250 --> 01:08:59,250 En cada momento el procesador tiene que saber cuáles son las instrucciones que tiene que ejecutar. 1059 01:08:59,250 --> 01:09:10,250 Esto es un poco complejo, pero la idea es que en cada momento el procesador no puede dudar sobre cuál es el siguiente paso. 1060 01:09:10,250 --> 01:09:20,250 Ese es otro mundo, es otro tipo de programación, no la nuestra. Existe. Pero nuestra programación es determinista. 1061 01:09:20,250 --> 01:09:27,250 Yo le estoy diciendo, imperativamente, haz esto, esto, esto, esto, y en cada momento el procesador tiene que saber, 1062 01:09:27,250 --> 01:09:33,250 ok, yo he hecho esto, ¿cuál es el siguiente paso? Esto, seguro. No puede haber o esto o esto aquí. 1063 01:09:33,250 --> 01:09:41,789 Lo puede haber, pero en base a una condición que o es verdadero o es falso. 1064 01:09:42,750 --> 01:09:44,550 Ya lo veremos cómo lo hacemos los condicionales. 1065 01:09:44,869 --> 01:09:49,149 Pero en cada instante el procesador puede evaluar lo que tiene, 1066 01:09:49,149 --> 01:09:53,390 es decir, con el 100% de seguridad, el siguiente paso que tenga que hacer, 1067 01:09:53,430 --> 01:09:55,189 el siguiente comando que tenga que hacer es este. 1068 01:09:55,189 --> 01:10:06,970 mira pilla un número pilla en un otro y luego si te apetece lo multiplicas pero 1069 01:10:06,970 --> 01:10:10,310 si no te apetece pues lo divides pues esto no es un algoritmo 1070 01:10:10,310 --> 01:10:21,210 Cartesiano algoritmo, me lo paso. Resolver problemas para que está formulado, o sea, 1071 01:10:21,210 --> 01:10:29,449 si yo quiero que calcule la área del triángulo, por favor, no me calculeis la circunferencia 1072 01:10:29,449 --> 01:10:36,229 de un circo. El algoritmo tiene que resolver lo que se ha pedido. Esto, grabáoslo aquí 1073 01:10:36,229 --> 01:10:45,310 como se llama tatuaje para los exámenes se os pide esto vosotros hacéis esto y funciona 1074 01:10:45,310 --> 01:10:46,930 perfectamente y es un cero 1075 01:10:46,930 --> 01:10:55,229 los algoritmos son independientes del ordenador cuando tú creas el algoritmo en el ordenador 1076 01:10:55,229 --> 01:11:00,989 no piensas en la secuencia de pasos te da igual en qué ordenador se ejecutará es independiente 1077 01:11:00,989 --> 01:11:05,430 Deben ser precisos, o sea, rigurosos en los pasos que tienen que hacer. 1078 01:11:05,949 --> 01:11:10,270 Los algoritmos tienen que ser finitos, algoritmos que no acaban nunca, no nos gustan. 1079 01:11:13,720 --> 01:11:17,939 Debe poder repetirse, al igual que una vez haya funcionado, de la vez el siguiente no. 1080 01:11:18,939 --> 01:11:21,000 Siempre tiene que funcionar bien. 1081 01:11:22,199 --> 01:11:27,579 Tiene que ser válido, tiene que ser eficiente, y si lo conseguís, ótimo. 1082 01:11:27,579 --> 01:11:33,579 O sea, que no haya otro algoritmo que sea más eficiente que él. 1083 01:11:33,640 --> 01:11:38,300 ¿Ve? Esto no es un requisito para probar este examen. 1084 01:11:40,039 --> 01:11:48,310 Entonces, en cada algoritmo nosotros tenemos una serie de datos de entradas, 1085 01:11:49,270 --> 01:11:54,510 luego unos pasos de qué hago con estos señores y qué obtengo. 1086 01:11:55,270 --> 01:12:03,630 Dame base y altura, haz base por altura dividido dos, has obtenido la área del triángulo. 1087 01:12:04,970 --> 01:12:05,090 ¿Sí? 1088 01:12:06,750 --> 01:12:15,329 dame harina, azúcar, huevos, y no sé qué más, haz lo que tienes que hacer hasta 1089 01:12:15,329 --> 01:12:45,250 Entonces, ahora, intentad pillar un Word, o lo que sea, y dados estos problemas, encontrad un algoritmo que resuelva estos problemas. 1090 01:12:45,250 --> 01:12:48,909 Es decir, quiero calcular la área de un cuadrado. 1091 01:12:50,250 --> 01:12:52,050 ¿Qué datos pillo en entrada? 1092 01:12:52,369 --> 01:12:53,729 ¿Qué operaciones hago? 1093 01:12:54,510 --> 01:12:55,550 ¿Y qué salida me da? 1094 01:13:21,750 --> 01:13:24,970 Y ahora aquí ya estamos hablando de lenguaje de programación. 1095 01:13:25,270 --> 01:13:28,750 Esto es en papel, con palabras vuestras. 1096 01:13:28,750 --> 01:13:36,310 ¿Qué comprobaciones tengo que hacer para poder hacer una secuencia de pasos que resuelva este problema?