{"id":106,"date":"2018-01-09T10:47:17","date_gmt":"2018-01-09T15:47:17","guid":{"rendered":"http:\/\/blogs.gentoo.org\/chrisadr\/?p=106"},"modified":"2019-11-01T03:35:27","modified_gmt":"2019-11-01T08:35:27","slug":"variables-101-conociendo-tu-computadora","status":"publish","type":"post","link":"https:\/\/blogs.gentoo.org\/chrisadr\/2018\/01\/09\/variables-101-conociendo-tu-computadora\/","title":{"rendered":"Variables 101: Conociendo tu computadora"},"content":{"rendered":"<p>Tristemente he visto\u00a0que no muchos desean aprender a programar este 2018 :( pero aunque solo hubiese le\u00eddo mi <a href=\"https:\/\/blogs.gentoo.org\/chrisadr\/2018\/01\/04\/eligiendo-tu-primer-lenguaje-de-programacion\/\">art\u00edculo anterior<\/a> una persona y tras un poco de tiempo esta sea capaz de mandar un commit a alg\u00fan proyecto de software libre, yo me dar\u00eda por satisfecho con mi labor :)<\/p>\n<p>Para los amantes de la seguridad, les prometo que el siguiente ser\u00e1 un post sobre seguridad :) as\u00ed todos contentos, si alguno desea aprender otra cosa (como git, administraci\u00f3n de servidores, o yo que s\u00e9 :p ), o que comente alg\u00fan otro tema que no pueda responderse de manera sencilla en el cuadro de comentarios, av\u00edsenme y vemos c\u00f3mo podemos trabajarlo ;)<\/p>\n<p>Bueno, ahora si vamos a lo nuestro, anteriormente hablamos sobre tipado, y que este ten\u00eda que ver con la forma en la que guardamos nuestras variables en un programa, ahora vamos a revisar un poco de qu\u00e9 ocurre en el interior y esperemos que pueda ser lo suficientemente claro.<\/p>\n<h2>Bits<\/h2>\n<p>Creo que este es un tema que siempre toco cuando escribo sobre programaci\u00f3n, ciertamente es algo que me fascina y que me ha ayudado a comprender muchas cosas, ahora intentar\u00e9 explicar un poco c\u00f3mo son, c\u00f3mo se leen, y para qu\u00e9 sirven :)<\/p>\n<p>Piensen en un interuptor de luz, cuando el circuito est\u00e1 cerrado, tenemos un\u00a0<code>0<\/code>\u00a0en la pantalla, cuando cambiamos de posici\u00f3n el interruptor, pues un\u00a0<code>1<\/code>:) \u00bfsencillo no es cierto?<\/p>\n<p>Ahora, un\u00a0<code>0<\/code> y un\u00a0<code>1<\/code>\u00a0pueden significar muchas cosas, todo depende de la creatividad con que lo tomes, supongamos que yo quiero saber si alguien va a ir al Norte o al Sur,\u00a0<code>1<\/code>\u00a0puede significar norte y\u00a0<code>0<\/code>, sur :) digamos que yo quiero saber si alguien es hombre o mujer,\u00a0<code>1<\/code>\u00a0puede ser hombre y\u00a0<code>0<\/code>, mujer :) . Ahora quiero saber si esta persona es j\u00f3ven o mayor (&gt;22),\u00a0<code>0<\/code>\u00a0puede significar j\u00f3ven y\u00a0<code>1<\/code>, mayor. Sigamos imaginando&#8230; \u00bfTiene alguna mascota?\u00a0<code>1<\/code>\u00a0dir\u00eda que s\u00ed, mientras que\u00a0<code>0<\/code>\u00a0dir\u00eda que no. Ahora quiero que lean conmigo la siguiente l\u00ednea:<\/p>\n<p><code>1001<\/code><\/p>\n<p>Esto es la forma breve de decir&#8230;<\/p>\n<p><code>Una j\u00f3ven mujer de no m\u00e1s de 22 a\u00f1os se dirige al norte acompa\u00f1ada de su mascota.<\/code><\/p>\n<p>lo que es muy diferente a:<\/p>\n<p><code>0110<\/code>\u00a0o <code>Un hombre con m\u00e1s de 22 a\u00f1os de edad se dirige solo hacia el sur.<\/code><\/p>\n<h2>Bytes<\/h2>\n<p>Ahora vamos a ir un paso adelante, vamos a aprender a leer bytes. Un byte es la sucesi\u00f3n de 8 bits, los cuales se leen de derecha a izquierda y cada\u00a0<code>1<\/code>\u00a0representa una potencia de\u00a0<code>2<\/code>\u00a0elevado a la\u00a0<code>n<\/code>\u00a0donde\u00a0<code>n<\/code>\u00a0es la posici\u00f3n del bit. Como suena a chino, vamos a poner un peque\u00f1o ejemplo :)<\/p>\n<p><code>01001011<\/code>\u00a0Tenemos este byte, ahora vamos a ir de derecha a izquierda ( &lt;- ) yo voy a ponerlos de arriba a abajo para poder escribir su signifiacdo:<\/p>\n<p><code>1<\/code>: el bit al estar en la posici\u00f3n <code>0<\/code>\u00a0nos indica que tenemos lo siguiente 2 elevado a la cero o\u00a0<code>2^0<\/code>. Esto bien sabemos que equivale a\u00a0<code>1<\/code>.<\/p>\n<p><code>1<\/code>: el segundo bit, ahora la posici\u00f3n\u00a0<code>1<\/code>:\u00a0<code>2^1<\/code>\u00a0que es lo mismo que decir\u00a0<code>2<\/code><\/p>\n<p><code>0<\/code>: tercer bit&#8230; aqu\u00ed deber\u00eda ser\u00a0<code>2^2<\/code>, mas como no est\u00e1 encendido, vamos a dejarlo en\u00a0<code>0<\/code><\/p>\n<p><code>1<\/code>:cuarto bit,\u00a0<code>2^3<\/code>\u00a0u\u00a0<code>8<\/code>\u00a0:)<\/p>\n<p><code>0<\/code>: lo mismo que\u00a0<code>0<\/code><\/p>\n<p><code>0<\/code>: otro <code>0<\/code><\/p>\n<p><code>1<\/code>:ahora estamos en <code>2^6<\/code> o <code>64<\/code><\/p>\n<p>y finalmente\u00a0<code>0<\/code>\u00a0, que ya sabemos lo que significa :) ahora vamos a sumar nuestros resultados y compararlos con la siguiente tabla :) Tenemos un\u00a0<code>75<\/code>\u00a0por lo que vamos a buscarlo en la columna\u00a0<em>Decimal\u00a0<\/em>y veremos lo que aparece en\u00a0<em>Char<\/em><\/p>\n<p><img src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/1\/1b\/ASCII-Table-wide.svg\/875px-ASCII-Table-wide.svg.png\" alt=\"Resultado de imagen para ascii table\" \/><\/p>\n<p>\u00a1\u00a1Tenemos una <code>K<\/code>!! Felicidades, ya saben leer en binario :) Pero los m\u00e1s sagaces habr\u00e1n podido notar que tambi\u00e9n hemos obtenido un n\u00famero decimal, y que este tiene un l\u00edmite (cuando todos los valores son\u00a0<code>1<\/code>) Ese l\u00edmite se encuentra en el n\u00famero\u00a0<code>255<\/code>.<\/p>\n<h2>Word<\/h2>\n<p>Ahora m\u00e1s de uno me dir\u00e1, pero \u00bfqu\u00e9 pasa si necesito un n\u00famero mayor a\u00a0<code>255<\/code>? o \u00bfd\u00f3nde puedo encontrar otros caract\u00e9res como los japoneces? Pues la respuesta es simple, juntemos\u00a0<code>2 bytes<\/code>. Ahora que tenemos dos, la cantidad posible de combinaciones que tenemos es\u00a0<code>2^16<\/code>\u00a0o\u00a0<code>65536<\/code>\u00a0posibles resultados, como el\u00a0<code>0<\/code>\u00a0es uno de esos, el m\u00e1ximo posible es\u00a0<code>65535<\/code>. \u00bfA alguno le suena ese n\u00famero? \u00bfRecuerdan la cantidad m\u00e1xima de puertos en un sistema linux? Se los dejo de tarea ;)<\/p>\n<h2>Double word &amp; quad word<\/h2>\n<p>Para los m\u00e1s matem\u00e1ticos tambi\u00e9n existen formatos espec\u00edficos, los <em>double word\u00a0<\/em>contienen, como muchos ya habr\u00e1n imaginado\u00a0<code>2 word<\/code>\u00a0o\u00a0<code>4 bytes<\/code>\u00a0(o <code>32 bits<\/code>) de informaci\u00f3n, lo mismo que decir:<\/p>\n<p><code>11111111111111111111111111111111<\/code>\u00a0o de\u00a0<code>0<\/code>\u00a0a\u00a0<code>4 294 967 295<\/code><\/p>\n<p>A estas alturas muchos se preguntar\u00e1n qu\u00e9 sucede con los n\u00fameros negativos, es decir, en alg\u00fan lugar deben estar contemplados \u00bfno es cierto? Para poder almacenar un n\u00famero negativo, los desarrolladores de procesadores eligieron ocupar el primer bit de la izquierda como un valor de signo. Esto quiere decir que si el primero bit es\u00a0<code>0<\/code>\u00a0hablamos de un n\u00famero positivo, pero si es\u00a0<code>1<\/code>\u00a0tenemos un negativo. Ahora ven por qu\u00e9 los bits son tan especiales, pueden ser lo que tu quieras :D<\/p>\n<p>\u00a1Pero esto evidentemente nos deja con una posici\u00f3n menos para realizar la multiplicaci\u00f3n! Por lo que nuestro<code>0<\/code>\u00a0a\u00a0<code>4 294 967 295<\/code>\u00a0se convierte en:<\/p>\n<p><code>-2,147,483,648<\/code>\u00a0a <code>+2,147,483,647<\/code><\/p>\n<p>Ahora bien, muchos ya tenemos procesadores de\u00a0<code>64 bits<\/code>, y este es el valor de un <em>quad word<\/em>, podemos tener valores que van desde el\u00a0<code>0<\/code>\u00a0a\u00a0<code>18 446 744 073 709 551 615<\/code>. Ese s\u00ed es un n\u00famero grande :)<\/p>\n<h2>\u00bfPor qu\u00e9 8 bits?<\/h2>\n<p>Esto es algo que ya m\u00e1s de uno se estar\u00e1 preguntando, y la respuesta est\u00e1 en el hardware. Desde su origen, los procesadores necesitaban data para poder realizar operaciones. La data se almacena en la memoria de la computadora y cada vez que el procesador la requiere utiliza los buses de data para conseguirla. En la antig\u00fcedad, estos buses pod\u00edan comunicar un m\u00e1ximo de 8 bits por ciclo, esto quiere decir que el m\u00e1ximo y m\u00e1s eficiente modo de mover data, era agrupando 8 bits y mandando estos al procesador.<\/p>\n<p>Con el paso del tiempo, hasta el d\u00eda de hoy, los procesadores han desarrollado la hablidad de mover 16 bits, 32bits y&#8230; 64 bits.<\/p>\n<h2>\u00bfQu\u00e9 tiene que ver con el tipado?<\/h2>\n<p>Ya llegamos a la parte donde todo cobra sentido :) El tipado es una propiedad que utilizan los lenguajes de programaci\u00f3n para denominar estos espacios de memoria. Todas las variables tienen su contraparte en alguno de estos tipos de data, sin importar c\u00f3mo sean llamadas. Estos se conocen como <em>tipos de dato primitivos<\/em>, cada lenguaje fuertemente tipado tiene su concepci\u00f3n de estos valores, y la cantidad que representan. Por ejemplo en C tenemos la biblioteca\u00a0<code>limits.h<\/code>\u00a0que nos muestra la cantidad m\u00e1xima y m\u00ednima de los valores primitivos.<\/p>\n<p>Veamos lo que sucede si intentamos romper uno de los valores:<\/p>\n<figure id=\"attachment_78283\" aria-describedby=\"caption-attachment-78283\" style=\"width: 420px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" class=\"size-medium wp-image-78283\" src=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2018\/01\/Captura-de-pantalla-de-2018-01-09-10-13-22-420x82.png\" alt=\"\" width=\"420\" height=\"82\" \/><figcaption id=\"caption-attachment-78283\" class=\"wp-caption-text\">Dise\u00f1o propio. Christopher D\u00edaz Riveros<\/figcaption><\/figure>\n<p>A la derecha tenemos los valores del archivo\u00a0<code>limits.h<\/code>\u00a0y a la izquierda hemos tomado uno de estos valores (<code>unsigned short int<\/code>) y le hemos asignado un n\u00famero mayor al correspondiente. Como resultado el compilador nos advierte que estamos utilizando mal la memoria porque la forma binaria de <code>66666<\/code>\u00a0no puede caber en la forma binaria de\u00a0<code>65535<\/code>. Esto nos lleva a una lecci\u00f3n de <em>performance\u00a0<\/em>cuando programamos, si tu valor no va a crecer mucho a lo largo del tiempo, o si no requieres valores tan grandes como los de un <em>double<\/em> o <em>quad word<\/em>, utilizar el tipo correcto reduce la cantidad de memoria solicitada por el CPU, lo que implica una mayor velocidad de obtenci\u00f3n de data si est\u00e1 bien calculada.<\/p>\n<p>En el lado de los int\u00e9rpretes esto es m\u00e1s sencillo debido a las <em>conversiones impl\u00edcitas. C<\/em>uando definimos una variable en lenguajes como javascript o Python, el int\u00e9rprete se encarga de entender qu\u00e9 tipo es, y asignar el espacio suficiente de memoria para realizar las operaciones. Veamos un ejemplo sencillo :)<\/p>\n<figure id=\"attachment_78284\" aria-describedby=\"caption-attachment-78284\" style=\"width: 301px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" class=\"size-full wp-image-78284\" src=\"https:\/\/blog.desdelinux.net\/wp-content\/uploads\/2018\/01\/Captura-de-pantalla-de-2018-01-09-10-23-35.png\" alt=\"\" width=\"301\" height=\"204\" \/><figcaption id=\"caption-attachment-78284\" class=\"wp-caption-text\">Dise\u00f1o propio. Christopher D\u00edaz Riveros<\/figcaption><\/figure>\n<p>Como pueden ver, no tenemos que explicar al int\u00e9rprete de python el tipo de nuestra variable, porque \u00e9l mismo se encarga de asignar un tipo y almacenarlo en memoria :)<\/p>\n<h2>Conoce tus variables<\/h2>\n<p>Esto depende del lenguaje y tipo de implementaci\u00f3n que vayas a utilizar, pero el primer paso para poder programar es aprender las variables que puedes utilizar :) Una vez comprendas las variables, estar\u00e1s en situaci\u00f3n de poder utilizarlas de manera eficiente y l\u00f3gica para almacenar informaci\u00f3n (provista por un usuario o por el sistema). Este es el primer paso en la escalera de la programaci\u00f3n y con suerte, tras leer este art\u00edculo, habr\u00e1s comprendido un poco mejor c\u00f3mo es que funciona tu computadora y c\u00f3mo almacena la informaci\u00f3n. Conmigo ser\u00e1 hasta el siguiente art\u00edculo, recuerden dejar sus comentarios para saber si hay que reforzar o comentar alg\u00fan punto en espec\u00edfico. Saludos<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tristemente he visto\u00a0que no muchos desean aprender a programar este 2018 :( pero aunque solo hubiese le\u00eddo mi art\u00edculo anterior una persona y tras un poco de tiempo esta sea capaz de mandar un commit a alg\u00fan proyecto de software libre, yo me dar\u00eda por satisfecho con mi labor :) Para los amantes de la &hellip; <a href=\"https:\/\/blogs.gentoo.org\/chrisadr\/2018\/01\/09\/variables-101-conociendo-tu-computadora\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Variables 101: Conociendo tu computadora<\/span><\/a><\/p>\n","protected":false},"author":169,"featured_media":108,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[20],"tags":[17,21],"jetpack_featured_media_url":"https:\/\/blogs.gentoo.org\/chrisadr\/files\/2018\/01\/variable.jpeg","_links":{"self":[{"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/posts\/106"}],"collection":[{"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/users\/169"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/comments?post=106"}],"version-history":[{"count":2,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/posts\/106\/revisions"}],"predecessor-version":[{"id":109,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/posts\/106\/revisions\/109"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/media\/108"}],"wp:attachment":[{"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/media?parent=106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/categories?post=106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.gentoo.org\/chrisadr\/wp-json\/wp\/v2\/tags?post=106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}