1 00:00:01,389 --> 00:00:17,309 Entonces, esta es la segunda clase. Vamos a seguir de donde hemos dejado ayer. Estamos hablando de compilador e intérprete. Si habláis, me autorizáis a grabar vuestra voz en la grabación. 2 00:00:17,309 --> 00:00:36,990 ¿Vale? Entonces, aquí tenemos un esquema que lo que hace es comparar un poquito compilador e intérprete en base a algunos parámetros. ¿Vale? Por ejemplo, hablamos de la entrada, de lo que recibe el input. ¿Vale? Un compilador necesita el programa completo entero, hemos dicho. 3 00:00:36,990 --> 00:00:43,109 Entonces, si ha acabado mi programa, se lo paso y a este punto el compilador creará lo que tenga que hacer. 4 00:00:43,490 --> 00:00:48,369 Un intérprete, en vez de va línea por línea de código, interpreta siempre una sola línea. 5 00:00:48,570 --> 00:00:53,310 Yo podría hacer hasta un programa parcial, ejecutarlo en un intérprete y ver hasta dónde llega. 6 00:00:55,109 --> 00:01:01,390 La salida, el compilador crea un código objeto, crea un código máquina, digamos así, 7 00:01:01,689 --> 00:01:05,810 que luego será enlazado con las librerías y se podrá ejecutar. 8 00:01:05,810 --> 00:01:16,989 Sin embargo, el intérprete no produce un código objeto, porque simplemente recibirá la línea y esa línea hará algo para que se ejecute, ¿vale? 9 00:01:17,269 --> 00:01:23,790 Pero no me crea un fichero donde yo puedo ver la traducción, digamos así, ¿sí? 10 00:01:24,909 --> 00:01:33,010 Mecanismo de trabajo. La compilación se realiza antes de la ejecución, o sea, que yo antes hay una fase de compilación en la que compilo mi programa 11 00:01:33,010 --> 00:01:42,689 Y ahora que tengo el programa ejecutable, lo ejecuto, mientras que la compilación y ejecución se realizan simultáneamente en el intérprete. 12 00:01:42,769 --> 00:01:50,569 ¿Qué quiere decir? Que es como si cada línea de código yo la compilaras, no el programa entero, más línea por línea, 13 00:01:50,870 --> 00:01:56,049 y una vez compilada en lenguaje que puede entender el procesador, pues lo ejecuto. 14 00:01:56,950 --> 00:01:57,590 ¿Entiendes? 15 00:01:57,590 --> 00:01:59,730 velocidad 16 00:01:59,730 --> 00:02:03,090 el compilador suele ser más rápido 17 00:02:03,090 --> 00:02:04,969 en el sentido de lo que se produce 18 00:02:04,969 --> 00:02:07,129 con el compilador, el programa compilado 19 00:02:07,129 --> 00:02:08,569 suele ser más rápido 20 00:02:08,569 --> 00:02:10,729 por respecto a un programa interpretado 21 00:02:10,729 --> 00:02:12,870 que es más, por lo que hemos 22 00:02:12,870 --> 00:02:13,949 dicho antes, que 23 00:02:13,949 --> 00:02:16,909 la compilación aquí la hago una vez 24 00:02:16,909 --> 00:02:18,710 sola, al principio, luego ya 25 00:02:18,710 --> 00:02:20,110 tengo todo compilado, mientras aquí 26 00:02:20,110 --> 00:02:22,750 hasta si yo repito un mismo trozo 27 00:02:22,750 --> 00:02:24,629 de código, lo vuelvo a 28 00:02:24,629 --> 00:02:26,789 compilar, a interpretar una y otra 29 00:02:26,789 --> 00:02:33,210 vez y otra vez por lo tanto es más de memoria el requisito de memoria es más debido a la creación 30 00:02:33,210 --> 00:02:38,030 de código objeto vale tener en cuenta que si yo tengo un compilador lo que quiero hacer a 31 00:02:38,030 --> 00:02:43,669 nivel de memoria secundaria nivel de espacio físico tengo mi código original y tengo que 32 00:02:43,669 --> 00:02:50,949 crear un nuevo fichero que tendrá dentro mi código compilado y todas las librerías compiladas 33 00:02:50,949 --> 00:02:53,289 enlazadas dentro. Entonces, posiblemente 34 00:02:53,289 --> 00:02:54,710 el ejecutable viene una cosa grande. 35 00:02:56,189 --> 00:02:56,229 ¿Sí? 36 00:02:56,930 --> 00:02:59,009 Sin embargo, a nivel 37 00:02:59,009 --> 00:03:01,030 de intérprete, requiere menos memoria 38 00:03:01,030 --> 00:03:03,409 física, digamos, menos memoria secundaria 39 00:03:03,409 --> 00:03:05,229 porque no se 40 00:03:05,229 --> 00:03:07,110 crea un código intermedio. Es simplemente 41 00:03:07,110 --> 00:03:08,949 leo el origen y lo ejecuto. 42 00:03:09,270 --> 00:03:11,270 No hay otro fichero. Hay el fichero 43 00:03:11,270 --> 00:03:12,669 origen y su ejecución. 44 00:03:13,789 --> 00:03:13,949 ¿Sí? 45 00:03:15,409 --> 00:03:16,810 Sin embargo, podríamos 46 00:03:16,810 --> 00:03:18,889 razonar sobre memoria principal, 47 00:03:19,009 --> 00:03:20,550 o sea RAM, que 48 00:03:20,550 --> 00:03:23,050 dependerá. Porque tened en cuenta que esto 49 00:03:23,050 --> 00:03:24,949 necesitará sólo la memoria 50 00:03:24,949 --> 00:03:27,009 del programa, mientras que 51 00:03:27,009 --> 00:03:29,110 el intérprete necesita la memoria 52 00:03:29,110 --> 00:03:31,090 del programa y también la memoria 53 00:03:31,090 --> 00:03:32,590 para ejecutar el intérprete. 54 00:03:33,490 --> 00:03:34,750 Que gastará recursos. 55 00:03:34,949 --> 00:03:36,449 A lo mejor es un intérprete ligero. 56 00:03:36,870 --> 00:03:38,289 Pero algo gastará. 57 00:03:39,590 --> 00:03:40,710 Los errores. 58 00:03:41,270 --> 00:03:42,930 El compilador muestra todos 59 00:03:42,930 --> 00:03:44,650 los errores después de la compilación. 60 00:03:44,969 --> 00:03:46,849 Todos al mismo tiempo. Entonces si yo le doy a 61 00:03:46,849 --> 00:03:49,009 compilar, y me empezará 62 00:03:49,009 --> 00:03:54,330 decir aquí falta un punto y coma y no has puesto me esperaba que tú pusiera 63 00:03:54,330 --> 00:03:58,250 esto en vez de has puesto este otro aquí falta una paréntesis después de verlo 64 00:03:58,250 --> 00:04:02,930 compilar sin embargo el intérprete yo lo puedo lanzar y él cuando llega a la 65 00:04:02,930 --> 00:04:07,009 línea que da problemas pues hasta allí ha funcionado y allí me dice a ver mira 66 00:04:07,009 --> 00:04:11,889 aquí hay un error entonces a nivel de debugging esto puede ser una cosa más 67 00:04:11,889 --> 00:04:17,050 interesante de utilizar la recepción de errores a nivel de 68 00:04:17,050 --> 00:04:23,649 compilación es más compleja vale justo porque te da errores de golpe y a lo mejor los errores que 69 00:04:23,649 --> 00:04:29,430 te da el compilador no es el error de verdad a lo mejor tú has hecho un error al principio que 70 00:04:29,430 --> 00:04:35,029 te has olvidado un punto y coma y entonces el arrastra este problema intentando entender lo 71 00:04:35,029 --> 00:04:38,810 que viene después de este punto de coma pero a lo mejor se equivoca que a lo mejor te dice 72 00:04:38,810 --> 00:04:42,790 mira aquí falta una paréntesis pero en realidad no falta una paréntesis falta paréntesis porque 73 00:04:42,790 --> 00:04:45,509 Él ha contado mal porque a raíz de ese punto y coma 74 00:04:45,509 --> 00:04:48,209 ha arrastrado un error y ya no entiende que es el programa. 75 00:04:49,250 --> 00:04:51,029 Entonces luego tú pones ese punto y coma 76 00:04:51,029 --> 00:04:52,790 y el error que era allí de la paréntesis 77 00:04:52,790 --> 00:04:54,990 se soluciona mágicamente. 78 00:04:56,069 --> 00:04:58,189 Es un poquito más complejo. 79 00:04:58,449 --> 00:05:00,949 También porque quien ha hecho este compilador, 80 00:05:01,110 --> 00:05:02,490 quien ha hecho el programa del compilador, 81 00:05:02,730 --> 00:05:04,889 tiene que haber hecho un buen trabajo 82 00:05:04,889 --> 00:05:09,089 para que el compilador te dé información 83 00:05:09,089 --> 00:05:10,769 sobre cuál es el error. 84 00:05:10,769 --> 00:05:13,129 qué ha pasado, por qué te estoy diciendo 85 00:05:13,129 --> 00:05:13,629 que hay un error. 86 00:05:15,550 --> 00:05:17,029 Es comparativamente más fácil 87 00:05:17,029 --> 00:05:18,769 cuando hay un intérprete, justo porque, siempre 88 00:05:18,769 --> 00:05:20,709 es mejor la razón, yendo línea por línea, 89 00:05:20,970 --> 00:05:23,110 tú puedes llegar hasta un cierto momento, hasta aquí ha ido todo bien, 90 00:05:23,269 --> 00:05:24,170 y ahora, ¿qué pasa? 91 00:05:26,350 --> 00:05:27,629 Lenguaje de programaciones 92 00:05:27,629 --> 00:05:29,189 que son 93 00:05:29,189 --> 00:05:31,389 con compilador, C, C++, 94 00:05:31,970 --> 00:05:32,790 C Sharp, 95 00:05:33,550 --> 00:05:35,149 Dice, Script, 96 00:05:35,370 --> 00:05:37,670 Scala, no lo conozco, 97 00:05:37,810 --> 00:05:39,089 hay varios, 98 00:05:39,089 --> 00:05:45,050 típicamente C++ y C Sharp hoy en día se utilizan 99 00:05:47,089 --> 00:05:55,769 información así, no sé como se llama, pero para que lo sepáis, C Sharp en realidad es C++++ 100 00:05:55,769 --> 00:06:05,439 son cuatro más, pues el intérprete en vez de interpretado son Java 101 00:06:05,439 --> 00:06:12,720 php, perl, python, ruby, estos lenguajes de programación tienen un interno 102 00:06:12,720 --> 00:06:16,720 en realidad ya va muy bien 103 00:06:16,720 --> 00:06:25,040 dudas? va, otro tema, paradigmas de programación 104 00:06:25,040 --> 00:06:30,620 vale entonces esto ya un poquito lo hemos hablado vale pero es un paradigma de 105 00:06:30,620 --> 00:06:37,060 programación es a la hora de programar un sistema complejo como me enfoco como 106 00:06:37,060 --> 00:06:45,500 lo diseño, qué herramientas tengo, qué tengo en cuenta, cómo me pongo a trabajar. Nosotros 107 00:06:45,500 --> 00:06:49,779 empezaremos o hablaremos de programación estructurada. Los primeros ejercicios que 108 00:06:49,779 --> 00:06:55,699 haremos estarán en este paradigma y luego iremos escalando. Cuando hablamos de programación 109 00:06:55,699 --> 00:07:02,680 estructurada, se utiliza una técnica que genera programas que solo permiten utilizar 110 00:07:02,680 --> 00:07:05,519 tres estructuras de control. 111 00:07:05,879 --> 00:07:07,040 Secuencias, alternativas 112 00:07:07,040 --> 00:07:07,720 e iterativas. 113 00:07:08,420 --> 00:07:10,399 Es decir, que cuando estamos aquí 114 00:07:10,399 --> 00:07:13,060 podemos hacer tres cosas con nuestros programas. 115 00:07:13,399 --> 00:07:14,740 La primera es la secuencia. 116 00:07:15,379 --> 00:07:15,699 Haz este 117 00:07:15,699 --> 00:07:19,180 comando, luego el siguiente, luego el siguiente, 118 00:07:19,279 --> 00:07:21,160 luego el siguiente. Un bloco de instrucciones 119 00:07:21,160 --> 00:07:22,660 ejecutados en secuencia. 120 00:07:22,980 --> 00:07:23,360 La base. 121 00:07:24,639 --> 00:07:27,459 Pero también tenemos los condicionales 122 00:07:27,459 --> 00:07:29,199 o alternativas. Yo puedo decir 123 00:07:29,199 --> 00:07:31,160 a mi programa, oye, mira, cuando llegas aquí 124 00:07:31,160 --> 00:07:41,560 Comprueba una condición. Mira si este valor es mayor que 3. Mira si el usuario te ha dado ya su nombre. 125 00:07:41,560 --> 00:07:56,620 Mira si este trozo de memoria está lleno o no. En base a la verdad o no verdad de esta condición, ejecuta un trozo u otro trozo. 126 00:07:56,620 --> 00:07:59,120 esto se suele llamar 127 00:07:59,120 --> 00:08:00,600 las sentencias is 128 00:08:00,600 --> 00:08:03,759 o las sentencias condicionales 129 00:08:03,759 --> 00:08:05,480 yo llego aquí, hasta ahora 130 00:08:05,480 --> 00:08:07,360 hacia secuencial esto, esto, esto 131 00:08:07,360 --> 00:08:08,939 y hago un momento que digo, si 132 00:08:08,939 --> 00:08:11,480 esta condición es verdadera 133 00:08:11,480 --> 00:08:13,579 si un número que me has 134 00:08:13,579 --> 00:08:14,860 dado es mayor que 10 135 00:08:14,860 --> 00:08:17,420 entonces sigue con este bloque 136 00:08:17,420 --> 00:08:19,480 de instrucción, si es 137 00:08:19,480 --> 00:08:21,480 falso, si el número que me has dado es menor 138 00:08:21,480 --> 00:08:23,620 o igual a 10, pues entonces 139 00:08:23,620 --> 00:08:25,079 el bloque de 140 00:08:25,079 --> 00:08:31,560 las instrucciones que tiene que ejecutar no es éste, sino es éste otro. Entonces se crean dos 141 00:08:31,560 --> 00:08:41,159 posibilidades, dos posibles ejecuciones, dependiendo de la condición que se verifica. Estas se llaman 142 00:08:41,159 --> 00:08:47,500 condiciones. Y luego están los iterativos. O sea, yo tengo un bloque de instrucciones y quiero que 143 00:08:47,500 --> 00:08:52,200 este bloque de instrucciones se repita una y otra vez y otra vez y otra vez, por ejemplo, mientras 144 00:08:52,200 --> 00:08:58,240 que una condición sea verdadera. Mírame si este número es 10. Mientras que este 145 00:08:58,240 --> 00:09:04,259 número es 10, haz este bloque y vuelve a comprobar que si este número es 10. 146 00:09:04,259 --> 00:09:09,480 Si sigue siendo 10, pues sigue. Si sigue siendo 10, pues sigue. Cuando este número ya no será 10 147 00:09:09,480 --> 00:09:17,519 por alguna razón, pues sáltate este bloque y sigue abajo de este bloque. 148 00:09:17,519 --> 00:09:24,519 son el while o el for, los núcleos, etc. Entonces, con estas tres cosas, la posibilidad de hacer 149 00:09:24,519 --> 00:09:31,559 comandos secuenciales, la posibilidad de decir, este comando hazlo, pero solo si una condición, 150 00:09:31,700 --> 00:09:37,460 si no hace otra cosa. Y la posibilidad de decir, oye, mira, este bloque lo tienes que repetir 151 00:09:37,460 --> 00:09:44,580 unas cuantas veces, ¿vale? Pues puede hacer programación estructural. Y es la base de la programación 152 00:09:44,580 --> 00:09:46,360 que nosotros tenemos que aprender. 153 00:09:47,259 --> 00:09:48,080 ¿Vale? Entonces, 154 00:09:48,360 --> 00:09:49,620 el primer trimestre 155 00:09:49,620 --> 00:09:52,299 será principalmente orientado 156 00:09:52,299 --> 00:09:54,039 a que nosotros entendamos bien 157 00:09:54,039 --> 00:09:54,879 esta cosa. 158 00:09:56,320 --> 00:09:58,639 ¿Sí? Ahora, cuando nosotros 159 00:09:58,639 --> 00:10:00,440 sabemos ya hacer la programación 160 00:10:00,440 --> 00:10:02,320 estructurada, sabemos trabajar con la programación 161 00:10:02,320 --> 00:10:04,240 estructurada, pues hay 162 00:10:04,240 --> 00:10:06,159 paradigmas que son más potentes de la 163 00:10:06,159 --> 00:10:08,159 programación estructurada. Estas herramientas 164 00:10:08,159 --> 00:10:10,320 son las básicas, pero son 165 00:10:10,320 --> 00:10:12,259 un destornillador y un 166 00:10:12,259 --> 00:10:14,139 martillo, y ahora tienes que 167 00:10:14,139 --> 00:10:16,139 construir un castillo. Y con un 168 00:10:16,139 --> 00:10:18,240 destornillador o un martillo no se construyen 169 00:10:18,240 --> 00:10:20,000 muchos castillos. Se necesitan 170 00:10:20,000 --> 00:10:21,820 otras herramientas. A lo mejor 171 00:10:21,820 --> 00:10:24,120 lo puedes hacer, pero tardarías mucho. 172 00:10:24,820 --> 00:10:26,019 ¿Vale? Y no te sale un gran mercado. 173 00:10:26,580 --> 00:10:28,240 Entonces, se cambió 174 00:10:28,240 --> 00:10:30,460 de paradigma de programación 175 00:10:30,460 --> 00:10:32,379 ¿Vale? Hacia la programación 176 00:10:32,379 --> 00:10:34,299 modular. La programación modular me dice 177 00:10:34,299 --> 00:10:36,320 simplemente que lo que sabemos 178 00:10:36,320 --> 00:10:37,799 hacer en programación estructurada 179 00:10:37,799 --> 00:10:40,639 vamos a hacerlo por módulos. 180 00:10:41,240 --> 00:10:42,120 O sea que cuando yo 181 00:10:42,120 --> 00:10:51,460 me enfrento a un programa complejo, a un sistema complejo, a un sistema grande, a un programa que 182 00:10:51,460 --> 00:10:56,960 tiene una cierta dificultad, en vez de enfrentarme a él en programación estructurada simplemente 183 00:10:56,960 --> 00:11:05,500 tirando código, antes hago una fase de diseño. Lo divido en bloques, en módulos. Cada módulo 184 00:11:05,500 --> 00:11:11,419 será dependiente de alguna forma con los otros módulos y habrá una forma, un módulo general, 185 00:11:11,419 --> 00:11:14,200 que será como el organizador de los otros módulos. 186 00:11:14,720 --> 00:11:16,559 Si vosotros pensáis a un sistema operativo, 187 00:11:16,659 --> 00:11:18,200 que todavía no lo habéis visto, no lo veréis, 188 00:11:18,659 --> 00:11:20,639 hay un kernel, ¿vale? 189 00:11:20,639 --> 00:11:24,840 Que es el núcleo, es la parte que hace las cosas de verdad 190 00:11:24,840 --> 00:11:26,000 del sistema operativo. 191 00:11:26,399 --> 00:11:28,600 Y luego hay un montón de otros módulos 192 00:11:28,600 --> 00:11:31,840 que se conectan con este kernel. 193 00:11:32,100 --> 00:11:33,980 Por ejemplo, hay un módulo que se encarga 194 00:11:33,980 --> 00:11:35,100 de la comunicación en red. 195 00:11:35,759 --> 00:11:37,840 Entonces, todo lo que es comunicación en red 196 00:11:37,840 --> 00:11:39,259 irá en el módulo de redes. 197 00:11:40,240 --> 00:11:46,039 Habrá otro que se encarga de escribir y leer desde disco duro. 198 00:11:46,460 --> 00:11:52,899 Entonces, habrá un sistema de gestión de entrada y salida que será otro módulo del sistema operativo. 199 00:11:53,399 --> 00:11:56,279 Y así, así, así, otro que será la interfaz gráfica. 200 00:11:56,279 --> 00:12:03,899 Entonces, todo lo que es la interfaz gráfica, el pillar donde va el ratón, los cliques del ratón, enseñarlo en la pantalla, etc. 201 00:12:04,080 --> 00:12:06,240 Estará en el módulo de la interfaz gráfica. 202 00:12:06,240 --> 00:12:21,159 Cada uno es separado de los demás y tiene sus propias funcionalidades y proporciona una interfaz, proporciona una forma para que otros módulos puedan pedirles de hacer cosas. 203 00:12:21,360 --> 00:12:36,179 Es el kernel que le dirá al sistema de gestión de ficheros, oye mira, yo tengo esta información y el usuario me ha dado al botón guardar y por lo tanto quiero que estos datos tú me los escribas en el disco duro. 204 00:12:37,000 --> 00:12:41,779 El kernel activa lo que tiene que activar para que se escriba en el disco duro 205 00:12:41,779 --> 00:12:46,960 y será el módulo de escritura en ficheros que hará lo que tiene que hacer para escribir en el fichero. 206 00:12:48,460 --> 00:12:54,639 Lo que se hace es pensar en varios módulos, diseñar mi sistema en módulos 207 00:12:54,639 --> 00:12:57,879 para que cada módulo sea lo más independiente posible 208 00:12:57,879 --> 00:13:03,779 y que a este punto yo pueda hasta separar el trabajo de los módulos. 209 00:13:03,779 --> 00:13:06,080 asignar a un grupo de trabajo, un equipo 210 00:13:06,080 --> 00:13:07,960 oye, vosotros vais a desarrollar 211 00:13:07,960 --> 00:13:09,840 la parte gráfica, mientras 212 00:13:09,840 --> 00:13:11,820 otro estará desarrollando el kernel 213 00:13:11,820 --> 00:13:13,740 mientras otro estará desarrollando 214 00:13:13,740 --> 00:13:15,960 cómo se acceden a los ficheros. Y estos pueden 215 00:13:15,960 --> 00:13:17,860 trabajar en paralelo porque 216 00:13:17,860 --> 00:13:19,620 luego lo que contará 217 00:13:19,620 --> 00:13:21,460 es la interfaz. Es 218 00:13:21,460 --> 00:13:23,860 estos puntos de conexión 219 00:13:23,860 --> 00:13:25,840 entre módulos que un módulo puede 220 00:13:25,840 --> 00:13:27,639 pedir a otro. Si tú 221 00:13:27,639 --> 00:13:29,700 respetas esos, luego cómo 222 00:13:29,700 --> 00:13:31,759 se hacen las cosas dentro te da igual. 223 00:13:31,759 --> 00:13:34,460 yo tengo la función escribe en fichero 224 00:13:34,460 --> 00:13:36,500 como se escribe en fichero me da igual 225 00:13:36,500 --> 00:13:37,860 será otro equipo 226 00:13:37,860 --> 00:13:39,379 que lo desarrolle 227 00:13:39,379 --> 00:13:42,159 pero yo sé que desde 228 00:13:42,159 --> 00:13:44,779 el kernel puedo solicitar 229 00:13:44,779 --> 00:13:46,460 escriben estos datos en fichero 230 00:13:46,460 --> 00:13:48,639 con este formato, con este 231 00:13:48,639 --> 00:13:50,820 modo, con este mecanismo 232 00:13:50,820 --> 00:13:52,120 una vez que lo he hecho 233 00:13:52,120 --> 00:13:54,580 ya he pasado la pelota a otro 234 00:13:54,580 --> 00:13:56,259 módulo que 235 00:13:56,259 --> 00:13:57,399 trabaja 236 00:13:57,399 --> 00:14:00,139 esto es un poco la programación 237 00:14:00,139 --> 00:14:07,820 modular. La programación modular evoluciona en la programación orientada a objetos. 238 00:14:07,820 --> 00:14:13,759 En la programación orientada a objetos, en vez de hablar de módulos en general, lo que se 239 00:14:13,759 --> 00:14:21,460 hace es hablar de clases y objetos. Entonces yo, por cada módulo en un cierto sentido, lo que hago 240 00:14:21,460 --> 00:14:23,500 es estructurarlo 241 00:14:23,500 --> 00:14:25,120 en base a agentes 242 00:14:25,120 --> 00:14:25,639 a 243 00:14:25,639 --> 00:14:29,659 no sé cómo definirlos 244 00:14:29,659 --> 00:14:30,340 a 245 00:14:30,340 --> 00:14:33,059 a ver si aquí viene algo 246 00:14:33,059 --> 00:14:33,659 que me puede 247 00:14:33,659 --> 00:14:37,659 unidades, ¿vale? Algo genérico 248 00:14:37,659 --> 00:14:38,960 que representa 249 00:14:38,960 --> 00:14:41,360 un trocito de mi 250 00:14:41,360 --> 00:14:43,399 programa, y yo a este 251 00:14:43,399 --> 00:14:45,399 trocito le doy todos los datos 252 00:14:45,399 --> 00:14:47,320 que necesite, todas las funcionalidades 253 00:14:47,320 --> 00:14:49,299 que necesitas, y una vez que lo he 254 00:14:49,299 --> 00:14:51,379 implementado, yo lo tengo allí y lo puedo utilizar 255 00:14:51,379 --> 00:14:58,940 allá donde lo necesite. Si yo creo la estructura que modeliza una persona, que entonces tendrá su 256 00:14:58,940 --> 00:15:05,620 nombre, su apellido, su DNI, su edad, su... no lo sé, su dirección, etcétera, etcétera, etcétera. Una vez que yo he 257 00:15:05,620 --> 00:15:11,100 definido esto con lo que puede hacer una persona, una persona puede saltar, una persona puede 258 00:15:11,100 --> 00:15:16,860 saltar, una persona puede moverse, no lo sé. Lo que yo necesito para mi programa, una vez que lo tenga, 259 00:15:16,860 --> 00:15:23,820 allá donde tenga que utilizar una persona, yo puedo reutilizar este objeto, esta clase. 260 00:15:23,820 --> 00:15:28,480 Entonces, si ahora quiero modelizar alumnos, los alumnos son personas, 261 00:15:28,480 --> 00:15:34,039 puedo utilizar la clase Persona para modelizar alumnos. Si ahora quiero modelizar profesores, 262 00:15:34,039 --> 00:15:39,399 como los profesores también parece que no, pero son personas, pues entonces puedo reutilizar 263 00:15:39,399 --> 00:15:46,480 también el módulo, o sea, la clase de personas para los profesores. Y así, así, así, ¿vale? 264 00:15:46,480 --> 00:15:49,419 es una modularidad 265 00:15:49,419 --> 00:15:51,179 pero quizás un poquito más 266 00:15:51,179 --> 00:15:53,059 fina y al mismo tiempo más 267 00:15:53,059 --> 00:15:54,500 abstracta, más genérica 268 00:15:54,500 --> 00:15:56,840 yo hago clases 269 00:15:56,840 --> 00:15:58,980 que representan conceptos más 270 00:15:58,980 --> 00:16:01,159 genéricos y luego uso estas clases 271 00:16:01,159 --> 00:16:03,039 en forma de objetos, veremos la 272 00:16:03,039 --> 00:16:04,720 diferencia, para crear 273 00:16:04,720 --> 00:16:06,919 lo que hace mi programa 274 00:16:06,919 --> 00:16:08,659 si 275 00:16:08,659 --> 00:16:10,980 se utiliza algo más interesante 276 00:16:10,980 --> 00:16:20,019 como antes comunicaban entre sí 277 00:16:20,019 --> 00:16:21,899 los módulos, ahora comunican entre sí 278 00:16:21,899 --> 00:16:24,019 los propios objetos 279 00:16:24,019 --> 00:16:25,799 las propias clases 280 00:16:25,799 --> 00:16:27,659 entonces tengo mis objetos 281 00:16:27,659 --> 00:16:29,899 creados y estos objetos podrán 282 00:16:29,899 --> 00:16:32,279 interactuar entre ellos 283 00:16:32,279 --> 00:16:33,980 pidiéndose cosas, haciendo 284 00:16:33,980 --> 00:16:36,340 funciones, llamando 285 00:16:36,340 --> 00:16:38,000 proceduras que 286 00:16:38,000 --> 00:16:40,220 sustancialmente harán 287 00:16:40,220 --> 00:16:42,840 Hacer al final lo que quiero que haga mi programa. 288 00:16:42,980 --> 00:16:45,759 Si mi programa es una escuela, una gestión de escuela, 289 00:16:45,899 --> 00:16:49,860 pues sí tendré, por ejemplo, que el aula puede añadir un alumno, 290 00:16:49,980 --> 00:16:52,019 puede quitar un alumno, puede... 291 00:16:52,019 --> 00:16:53,399 Bueno, sí, todas estas cosas. 292 00:16:54,039 --> 00:16:54,240 ¿Vale? 293 00:16:57,399 --> 00:16:59,379 Hasta aquí, general. 294 00:17:00,159 --> 00:17:00,419 ¿Vale? 295 00:17:00,639 --> 00:17:05,660 Hemos hablado de, en general, de lenguajes de programación genéricos. 296 00:17:06,099 --> 00:17:08,759 Ahora vamos a meternos en lo que vamos a usar nosotros. 297 00:17:08,759 --> 00:17:26,839 O sea, todo lo que hemos aprendido o que hemos oído hasta ahora de compilación, interpretación, orientado a objetos y cosas por el estilo, vamos a aplicarlo al lenguaje que hemos elegido nosotros, que he elegido nosotros para este curso, ¿vale? 298 00:17:26,839 --> 00:17:35,779 Que es Java, o Java, o Java, dependiendo de dónde queréis colocar la pronunciación de esta palabra, ¿vale? 299 00:17:36,460 --> 00:17:39,140 Es un lenguaje de programación orientado a objetos, ¿vale? 300 00:17:39,319 --> 00:17:43,480 Entonces, es del paradigma más interesante de los que hemos visto. 301 00:17:43,960 --> 00:17:54,700 Aún así, el primer trimestre nosotros ignoraremos casi toda la parte orientada a objetos y lo trataremos como estructural, ¿vale? 302 00:17:54,700 --> 00:17:58,539 Y veremos que esto nos comporta un pequeño problema. 303 00:17:59,039 --> 00:18:05,019 Que algunas cosas que deberían ser muy fáciles porque son programas sencillos, muy, muy sencillos, 304 00:18:05,019 --> 00:18:13,180 pues nos vendrán con mucho código que no entendemos qué es, que tenemos que escribir y no entendemos por qué está allí. 305 00:18:13,259 --> 00:18:19,180 Porque mi programa es esto y luego tengo que poner un montón de cosas antes y después para que funcione y para qué. 306 00:18:19,559 --> 00:18:21,859 Pues el para qué lo veremos más adelante. 307 00:18:21,859 --> 00:18:24,539 Lo veremos cuando entenderemos que es un objeto en una clase 308 00:18:24,539 --> 00:18:25,400 Y entenderemos 309 00:18:25,400 --> 00:18:28,880 Ah, he estado programando orientado a objetos desde el primer día 310 00:18:28,880 --> 00:18:29,480 Y no lo sabía 311 00:18:29,480 --> 00:18:30,160 ¿Vale? 312 00:18:30,559 --> 00:18:31,720 Pero, ok 313 00:18:31,720 --> 00:18:36,299 Su objetivo fundamental es crear aplicaciones independientes de la plataforma 314 00:18:36,299 --> 00:18:37,299 Subyacente 315 00:18:37,299 --> 00:18:39,680 Write once, run everyone 316 00:18:39,680 --> 00:18:40,279 ¿Qué quiere decir? 317 00:18:40,759 --> 00:18:42,880 Java está pensado para que sea portable 318 00:18:42,880 --> 00:18:43,640 ¿Vale? 319 00:18:44,200 --> 00:18:46,480 Java está pensado para que tú escribas un programa 320 00:18:46,480 --> 00:18:49,759 Y que este programa se ejecute en cualquier sistema 321 00:18:49,759 --> 00:18:50,779 ¿Ve? 322 00:18:50,779 --> 00:18:54,980 Es un poco la filosofía parecida a la interpretación, ¿sí? 323 00:18:55,480 --> 00:19:02,539 O sea, yo lo que necesitaría es que en los ordenadores esté instalado algo, ¿vale? 324 00:19:02,539 --> 00:19:11,619 Ese algo es la Java Virtual Machine, la máquina virtual de Java, que actuará más o menos como intérprete. 325 00:19:11,619 --> 00:19:28,140 Entonces, cuando yo quiero usar Java en algún ordenador, la primera cosa que tengo que hacer es instalar allí algo que permita la ejecución de la Java Virtual Machine, del intérprete de Java. 326 00:19:28,140 --> 00:19:47,619 Ese algo es el JRE, Java Runtime Environment, si yo quiero solo ejecutar, o el JDK, el Java Development Kit, si yo quiero además de ejecutar, pues también programar. 327 00:19:47,619 --> 00:19:52,400 Para nosotros que somos desarrolladores, nosotros instalaremos el jdk. 328 00:19:53,599 --> 00:19:57,299 Pero una vez que yo he hecho mi programa, para que se ejecute, 329 00:19:57,859 --> 00:20:04,259 el requisito es que esté instalado un JRE, o sea un Java Runtime Environment, 330 00:20:04,759 --> 00:20:09,859 un entorno de ejecución de Java, en el ordenador donde voy a ejecutar. 331 00:20:12,990 --> 00:20:18,089 Pero ya que escribo mi programa una vez, y lo puedo ejecutar donde me da la gana. 332 00:20:18,089 --> 00:20:20,950 es lo que decíamos antes, el de la compilación 333 00:20:20,950 --> 00:20:21,529 y de la 334 00:20:21,529 --> 00:20:24,630 interpretación, ahora yo quiero 335 00:20:24,630 --> 00:20:26,750 escribirlo una vez, instalaré 336 00:20:26,750 --> 00:20:28,549 si lo quiero ejecutar en este ordenador 337 00:20:28,549 --> 00:20:30,849 lo único que tengo que hacer es instalar en este ordenador 338 00:20:30,849 --> 00:20:32,750 el JRE y ya me funciona 339 00:20:32,750 --> 00:20:34,529 no tengo que compilar nada 340 00:20:34,529 --> 00:20:36,549 para este ordenador, allá donde 341 00:20:36,549 --> 00:20:38,809 haya la posibilidad 342 00:20:38,809 --> 00:20:40,130 de instalar un JRE 343 00:20:40,130 --> 00:20:42,009 mi programa funcionará 344 00:20:42,009 --> 00:20:48,220 pero 345 00:20:48,220 --> 00:20:50,440 Java es un poquito particular 346 00:20:50,440 --> 00:20:52,299 ¿Por qué usa las dos cosas? 347 00:20:55,900 --> 00:20:59,940 Usa tanto un compilador como un intérprete. 348 00:21:00,140 --> 00:21:01,440 Java hace dos fases. 349 00:21:01,940 --> 00:21:07,440 Primero hace una compilación y después interpreta esta compilación. 350 00:21:08,160 --> 00:21:14,660 Hemos dicho que el compilador lo que hace es traducir de un idioma, de un lenguaje a otro. 351 00:21:14,660 --> 00:21:33,240 En vez de tener un compilador que traduce de mi lenguaje a código máquina, que es la compilación estándar, Java hace una traducción desde Java, como lo conocemos nosotros, a un lenguaje intermedio que se llama el bytecode. 352 00:21:33,240 --> 00:21:38,759 el bytecode es un lenguaje raro que nosotros no vemos 353 00:21:38,759 --> 00:21:40,559 que no es lenguaje máquina 354 00:21:40,559 --> 00:21:45,259 pero está a mitad entre lenguaje de alto nivel 355 00:21:45,259 --> 00:21:46,980 que es el Java que conocemos nosotros 356 00:21:46,980 --> 00:21:49,180 y el lenguaje máquina que está por abajo 357 00:21:49,180 --> 00:21:52,640 el intérprete, el Java Virtual Machine 358 00:21:52,640 --> 00:21:55,980 no interpreta líneas de códigos de Java 359 00:21:55,980 --> 00:21:58,759 sino que interpreta líneas de códigos de bytecode 360 00:21:58,759 --> 00:22:18,849 Es decir, que si yo tengo un programa en Java, esto se compila en un programa en bytecode, 361 00:22:18,849 --> 00:22:38,670 y luego por algún lado estará la Java Virtual Machine, que recibirá línea por línea estos comandos y los ejecutará en el ordenador que está por debajo. 362 00:22:38,670 --> 00:22:47,930 ¿Por qué esto? Por lo que decíamos antes. Porque en esta fase de compilación, yo puedo meter un poquito de optimización. 363 00:22:48,549 --> 00:22:55,029 Yo he escrito mi programa y cuando lo voy a compilar, el bytecode que sale ya está un poquito más optimizado, 364 00:22:55,130 --> 00:22:58,670 está un poquito más organizado respecto al Java que he escrito yo. 365 00:22:59,990 --> 00:23:06,309 Y aquí puedo meter también todas las cosas positivas de la compilación, como por ejemplo, 366 00:23:06,309 --> 00:23:08,369 oye, si hay algún error 367 00:23:08,369 --> 00:23:10,269 o cosa por el estilo, detectalo y dime 368 00:23:10,269 --> 00:23:12,029 que error es, entonces lo puedo 369 00:23:12,029 --> 00:23:14,069 contar, por ejemplo, errores sintáticos 370 00:23:14,069 --> 00:23:16,049 ¿vale? una vez que tengo 371 00:23:16,049 --> 00:23:18,329 compilado esto, sé que el bytecode 372 00:23:18,329 --> 00:23:20,250 a nivel sintático está bien 373 00:23:20,250 --> 00:23:21,670 no hay errores sintáticos 374 00:23:21,670 --> 00:23:24,150 ya no puedo a un cierto momento ejecutar 375 00:23:24,150 --> 00:23:26,230 un programa y decir, ah, falta un punto y coma 376 00:23:26,230 --> 00:23:28,089 o no sé qué hacer, pues esto 377 00:23:28,089 --> 00:23:30,250 ya se ha comprobado en esta fase 378 00:23:30,250 --> 00:23:31,950 ¿vale? claramente 379 00:23:31,950 --> 00:23:34,029 los errores semánticos, eso 380 00:23:34,029 --> 00:23:36,130 no lo puedes detectar, ni esto, ni esto 381 00:23:36,130 --> 00:23:38,170 que yo lo que decíamos antes 382 00:23:38,170 --> 00:23:40,269 si el área del triángulo la he calculado como base 383 00:23:40,269 --> 00:23:42,329 por altura y ya está, pues el error es 384 00:23:42,329 --> 00:23:44,190 mío, he fallado yo en el 385 00:23:44,190 --> 00:23:45,150 algoritmo, no él 386 00:23:45,150 --> 00:23:47,750 ¿sí? ¿dudas? 387 00:23:54,039 --> 00:23:54,319 vale 388 00:23:54,319 --> 00:23:57,640 compilación en Java 389 00:23:57,640 --> 00:23:59,599 entonces tengo el editor, el editor 390 00:23:59,599 --> 00:24:01,559 en Java es un texto plano, o sea un editor 391 00:24:01,559 --> 00:24:03,460 de texto plano, puedo yo, de hecho 392 00:24:03,460 --> 00:24:05,680 nuestro primer programa que lo vamos a hacer en breve 393 00:24:05,680 --> 00:24:07,779 será con Notepad 394 00:24:07,779 --> 00:24:09,599 ¿vale? o sea cualquier 395 00:24:09,599 --> 00:24:11,480 editor de texto plano es 396 00:24:11,480 --> 00:24:13,180 un editor de Java, no me importa. 397 00:24:13,420 --> 00:24:15,619 No se puede programar en Word, 398 00:24:16,359 --> 00:24:17,440 pero sí en blocnotas. 399 00:24:17,980 --> 00:24:19,599 ¿Vale? Sabéis que Word añade 400 00:24:19,599 --> 00:24:21,519 cosas detrás que nosotros no vemos 401 00:24:21,519 --> 00:24:23,579 y que son lenguajes de marcas 402 00:24:23,579 --> 00:24:25,019 raros suyos propietarios 403 00:24:25,019 --> 00:24:27,420 que nosotros no queremos ver. Y si yo 404 00:24:27,420 --> 00:24:29,319 luego intento interpretar eso, pues hay 405 00:24:29,319 --> 00:24:31,180 todas estas datos que no sé qué son. 406 00:24:31,700 --> 00:24:33,579 En vez de blocnotas, lo que yo he escrito 407 00:24:33,579 --> 00:24:35,619 allí y que se vea es lo que se ha escrito en el fichero. 408 00:24:35,619 --> 00:24:37,559 Con eso, puedo editar 409 00:24:37,559 --> 00:24:39,680 un lenguaje. Lo que hago 410 00:24:39,680 --> 00:24:45,319 es obtener un programa fuente a través del editor hago una compilación con un programa que se llama 411 00:24:45,319 --> 00:24:53,900 java java compiler vale esto me crea un programa punto clas vale mientras el programa fuente está 412 00:24:53,900 --> 00:25:03,839 en un punto ya el bytecode está en un punto clas y esto es el fichero interpretable por la java 413 00:25:03,839 --> 00:25:07,119 virtual machine. Entonces ahora yo tendré instalada la 414 00:25:07,119 --> 00:25:14,500 virtual machine, la enciendo y le voy a pasar el bytecode como input. La 415 00:25:14,500 --> 00:25:19,400 virtual machine leerá línea por línea el bytecode y lo traducirá al código 416 00:25:19,400 --> 00:25:25,079 máquina y lo ejecutará. La cosa interesante es que yo esto lo he escrito una vez 417 00:25:25,079 --> 00:25:30,759 en cada ordenador distinto, Linux, Windows o no sé qué, está instalado en la virtual machine 418 00:25:30,759 --> 00:25:33,240 yo esto lo compilo una vez 419 00:25:33,240 --> 00:25:34,420 y obtengo el bytecode 420 00:25:34,420 --> 00:25:37,019 este bytecode ya se ejecuta 421 00:25:37,019 --> 00:25:38,859 en cualquier dispositivo 422 00:25:38,859 --> 00:25:40,099 que tenga la Java Virtual Machine 423 00:25:40,099 --> 00:25:47,210 el bytecode es independiente 424 00:25:47,210 --> 00:25:48,769 del hardware y del sistema operativo 425 00:25:48,769 --> 00:25:50,849 que está preparado, esta es la parte interesante 426 00:25:50,849 --> 00:25:53,009 entonces es muy 427 00:25:53,009 --> 00:25:54,230 portable 428 00:25:54,230 --> 00:25:56,849 tengo el programa fuente 429 00:25:56,849 --> 00:25:58,789 lo compilo en bytecode 430 00:25:58,789 --> 00:26:01,069 y ahora la Java Virtual Machine 431 00:26:01,069 --> 00:26:02,829 para la máquina 1 que es un Windows 432 00:26:02,829 --> 00:26:04,490 se ejecutará con el código máquina 433 00:26:04,490 --> 00:26:06,529 de la máquina 1, esto que es un Linux 434 00:26:06,529 --> 00:26:08,390 tendrá una Java Vector Machine distinta 435 00:26:08,390 --> 00:26:10,349 pero pillará el mismo bytecode 436 00:26:10,349 --> 00:26:12,710 para ejecutarse, la Java Vector Machine está aquí 437 00:26:12,710 --> 00:26:14,990 que es de Mac, será una Java Vector Machine 438 00:26:14,990 --> 00:26:16,490 distinta, pero no la hago yo 439 00:26:16,490 --> 00:26:17,869 no la programo yo la Java Vector Machine 440 00:26:17,869 --> 00:26:20,390 habré instalado el 441 00:26:20,390 --> 00:26:22,650 JRE, el Java Runtime 442 00:26:22,650 --> 00:26:24,109 Environment, para 443 00:26:24,109 --> 00:26:26,309 ese sistema operativo 444 00:26:26,309 --> 00:26:28,529 y el bytecode es el mismo y se ejecutará 445 00:26:28,529 --> 00:26:29,269 en la tercera máquina 446 00:26:29,269 --> 00:26:47,839 Vamos a hacer una pequeña pausa ahora 447 00:26:47,839 --> 00:26:50,579 y luego seguimos con el concepto de la política