Históricamente pasamos de tener el primer computador basado en electricidad en el año 1943, el computador Colossus, usado en la segunda guerra mundial por los británicos para decodificar mensajes encriptados, a computadores personales con miles de millones de transistores, lo que habla del gran poder computacional que tenemos hoy a nuestro alcance.
Es perfectamente normal si tienes en este momento uno o dos celulares personales a la mano: un poder computacional bastante importante, y muy superior a cualquier super-computador de los años 50: la evolución desde computadoras que ocupaban habitaciones enteras, a computadores completos de un poco menos de 0.3 mm en tamaño (McAlpine, 2018) en menos de 80 años, hablan de los grandes avances que se han logrado.
Hoy tenemos el boom de ‘la internet de las cosas’: todo pequeño dispositivo quiere recoger datos suyos o de cualquier cosa o ser vivo, para ponerlos a disposición de “otros” a través de la red de internet que llamamos nube, y por eso hablamos de ‘Computación en la Nube’, donde los grandes volúmenes de datos requieren de estrategias especiales de recolección, almacenamiento y análisis, que llamamos ‘Data Science’ y ‘Big Data’.
Es perfectamente normal si tienes en este momento uno o dos celulares personales a la mano: un poder computacional bastante importante, y muy superior a cualquier super-computador de los años 50: la evolución desde computadoras que ocupaban habitaciones enteras, a computadores completos de un poco menos de 0.3 mm en tamaño (McAlpine, 2018) en menos de 80 años, hablan de los grandes avances que se han logrado.
Hoy tenemos el boom de ‘la internet de las cosas’: todo pequeño dispositivo quiere recoger datos suyos o de cualquier cosa o ser vivo, para ponerlos a disposición de “otros” a través de la red de internet que llamamos nube, y por eso hablamos de ‘Computación en la Nube’, donde los grandes volúmenes de datos requieren de estrategias especiales de recolección, almacenamiento y análisis, que llamamos ‘Data Science’ y ‘Big Data’.
Modelos y programación
Antes de comenzar a programar, debemos modelar una solución. Un modelo de solución es una estrategia clara de cómo resolver un problema. Muchas veces hay patrones de solución para problemas comunes. Otras veces sólo se piensa en la mejor solución posible algorítmicamente, para lo cual, hay muchos tipos de estrategias de solución algorítmica.
Para efectos prácticos, piense en el modelado como una formalización de la solución. Por ejemplo, creamos un modelo cuando usamos algún tipo de lenguaje para expresar un comportamiento de un fenómeno, sea este natural o artificial; lo que pretendemos es ampliar el entendimiento del fenómeno o proceso.
Podemos ir más allá y hablar de un modelo matemático, donde la intención es poder hacer predicciones concretas del comportamiento del fenómeno a partir de un estado inicial de un sistema. Es lo que hace la física: entender el fenómeno y crear un modelo matemático, de tal modo que pueda predecir nuevos estados de un sistema.
Ahora suponga que hacer el cálculo matemático del modelo en el tiempo le tomaría a mano y con calculadora, muchas horas e incluso días de trabajo. Ese tipo de problemas podrían requerir demasiado tiempo como para que sea viable solucionarlos manualmente y habría demasiada posibilidad de cometer errores. Es aquí donde las computadoras hacen bien su trabajo: si tienes un modelo, llévalo al computador; y para llevarlo, requieres herramientas computacionales o informáticas. Una de ellas son los lenguajes de programación. Algunos lenguajes de programación podrían apoyarte de forma muy directa con esos modelos matemáticos, y es allí donde entran a jugar los lenguajes de propósito científico.
Pero no todo problema es científico: en esos casos usamos lenguajes de propósito general.
Para efectos prácticos, piense en el modelado como una formalización de la solución. Por ejemplo, creamos un modelo cuando usamos algún tipo de lenguaje para expresar un comportamiento de un fenómeno, sea este natural o artificial; lo que pretendemos es ampliar el entendimiento del fenómeno o proceso.
Podemos ir más allá y hablar de un modelo matemático, donde la intención es poder hacer predicciones concretas del comportamiento del fenómeno a partir de un estado inicial de un sistema. Es lo que hace la física: entender el fenómeno y crear un modelo matemático, de tal modo que pueda predecir nuevos estados de un sistema.
Ahora suponga que hacer el cálculo matemático del modelo en el tiempo le tomaría a mano y con calculadora, muchas horas e incluso días de trabajo. Ese tipo de problemas podrían requerir demasiado tiempo como para que sea viable solucionarlos manualmente y habría demasiada posibilidad de cometer errores. Es aquí donde las computadoras hacen bien su trabajo: si tienes un modelo, llévalo al computador; y para llevarlo, requieres herramientas computacionales o informáticas. Una de ellas son los lenguajes de programación. Algunos lenguajes de programación podrían apoyarte de forma muy directa con esos modelos matemáticos, y es allí donde entran a jugar los lenguajes de propósito científico.
Pero no todo problema es científico: en esos casos usamos lenguajes de propósito general.
Programas dentro de nuestros documentos
Hay millones de personas en el planeta que usan hojas de cálculo como Excel de Microsoft Office, o las de Google Apps para modelar sus problemas. De hecho, las hojas de cálculo como se le conoce a este tipo de aplicaciones, es tal vez el tipo de aplicación de escritorio más usada hoy por cualquier ejecutivo (a excepción de algunas aplicaciones de redes sociales y chats), y es claro que son suficientes para resolver una vasta variedad de problemas.
Lo más interesante de estas hojas de cálculo es que lo único que tienes que hacer es manipular y referir celdas para aplicar funciones a ellas o a rangos de ellas.
Pero otras veces estas poderosas hojas de cálculo se quedan cortas, y podría ser más simple hacer algo de programación que dar muchas vueltas con muchas funciones y celdas. Cuando se quiere ir más lejos, posiblemente la mejor opción es usar algún lenguaje de programación que permita interactuar mejor con tu documento (hoja de cálculo).
Es por eso por lo que MS Excel trae su propio lenguaje de programación denominado VBA, mismo lenguaje que se encuentra alrededor de las otras aplicaciones de la ‘suite’ de MS Office, como Word, PowerPoint, entre otros (Usted puede activar los módulos de programación en VBA para Excel, Word y Power Point, entre otros productos).
La suite de Google Apps no se queda atrás con la incorporación de Google Apps Script a su ‘suite’. Aunque los usuarios tradicionalmente solo escriben y comparten documentos de texto en las herramientas de Google Docs como documentos, hojas electrónicas, y presentaciones, muy pocos usuarios saben es que estos documentos pueden llevar código incrustado escrito en Google Apps Script, una versión alterada de Javascript, posiblemente el lenguaje más usado históricamente para la web. ¡Un documento de Google o de Microsoft puede entonces ser programado!
Entonces, no solo tienes email y documentos: también tienes un ambiente de programación con el cual crear código que pertenece al documento, y que corre en el mismo documento, lo que se convierte en un buen ejemplo de uno de los usos prácticos de la programación.
Lo más interesante de estas hojas de cálculo es que lo único que tienes que hacer es manipular y referir celdas para aplicar funciones a ellas o a rangos de ellas.
Pero otras veces estas poderosas hojas de cálculo se quedan cortas, y podría ser más simple hacer algo de programación que dar muchas vueltas con muchas funciones y celdas. Cuando se quiere ir más lejos, posiblemente la mejor opción es usar algún lenguaje de programación que permita interactuar mejor con tu documento (hoja de cálculo).
Es por eso por lo que MS Excel trae su propio lenguaje de programación denominado VBA, mismo lenguaje que se encuentra alrededor de las otras aplicaciones de la ‘suite’ de MS Office, como Word, PowerPoint, entre otros (Usted puede activar los módulos de programación en VBA para Excel, Word y Power Point, entre otros productos).
La suite de Google Apps no se queda atrás con la incorporación de Google Apps Script a su ‘suite’. Aunque los usuarios tradicionalmente solo escriben y comparten documentos de texto en las herramientas de Google Docs como documentos, hojas electrónicas, y presentaciones, muy pocos usuarios saben es que estos documentos pueden llevar código incrustado escrito en Google Apps Script, una versión alterada de Javascript, posiblemente el lenguaje más usado históricamente para la web. ¡Un documento de Google o de Microsoft puede entonces ser programado!
Entonces, no solo tienes email y documentos: también tienes un ambiente de programación con el cual crear código que pertenece al documento, y que corre en el mismo documento, lo que se convierte en un buen ejemplo de uno de los usos prácticos de la programación.
Sistemas operativos como gestores de dispositivos
Todos tenemos contacto a diario con varios sistemas operativos. Por ejemplo, al tocar la pantalla de tu celular, el primer código que activas es el del sistema operativo. Algunos de los más comunes son los equipos con sistema operativo Android de Google, o aquellos que portan sistema operativo iOS de Apple (los famosos iPhone).
Dicho de forma simple, el software que más usa un usuario siempre es el sistema operativo de sus dispositivos y no las aplicaciones. Esto se debe a que el sistema operativo controla todo el dispositivo, incluyendo las aplicaciones que corren en él.
Es la misma historia con un pc, debido a que lo primero que debe hacer el usuario es autenticarse ante el sistema, ya sea usando un nombre de usuario y clave, o usando su huella digital, o su rostro para identificación visual, y luego que ya está ‘adentro’ se mueve buscando en su escritorio la aplicación que necesita, o activa un menú del sistema para buscar la aplicación y correrla. Todas esas tareas, son del dominio del sistema operativo.
El sistema operativo (OS de la sigla en inglés para Operating System), también denominado sistema operacional, se encarga de gestionar todo tipo de periféricos asociados al dispositivo que gestiona, como micrófonos, parlantes, pantallas -incluyendo las sensibles al tacto-, teclado, mouse, wifi, puertos de red, puertos USB, Bluetooth, discos duros, memorias, controles remotos, giroscopios, acelerómetros, cámaras, sensores, baterías, y todo lo que sea posible encontrar en un pc, en un celular, en una tableta, en un panel de automóvil, en calculadoras, o en grabadoras de video y audio. El sistema operativo es el software capaz de operar todos estos periféricos internos y externos.
El sistema operativo Unix es uno de los más antiguos exponentes. MS-DOS de Microsoft, MS Windows de Microsoft, MacOS de Apple, todas las distintas versiones de Linux y las distintas versiones de Unix, son hoy nombres de sistemas operativos muy conocidos.
Como dijimos previamente, el sistema operativo se encarga también de gestionar los distintos programas que corren en el dispositivo. Por ejemplo, en tu celular, la aplicación de hacer y recibir llamadas o la aplicación de fotos, son administradas por el sistema operativo, que es quien les brinda recursos de memoria para trabajar y les da tiempo de ejecución.
Cuando corres la aplicación de música y apagas la pantalla del celular para seguirla oyendo sin gastar más batería, es el sistema operativo quien lo permite. Puedes correr varias aplicaciones que permanecen abiertas corriendo aparentemente de forma simultánea, pero en realidad lo hacen de ese modo porque el sistema operativo les da de forma equitativa tiempo de ejecución y uso de los recursos.
Dicho de forma simple, el software que más usa un usuario siempre es el sistema operativo de sus dispositivos y no las aplicaciones. Esto se debe a que el sistema operativo controla todo el dispositivo, incluyendo las aplicaciones que corren en él.
Es la misma historia con un pc, debido a que lo primero que debe hacer el usuario es autenticarse ante el sistema, ya sea usando un nombre de usuario y clave, o usando su huella digital, o su rostro para identificación visual, y luego que ya está ‘adentro’ se mueve buscando en su escritorio la aplicación que necesita, o activa un menú del sistema para buscar la aplicación y correrla. Todas esas tareas, son del dominio del sistema operativo.
El sistema operativo (OS de la sigla en inglés para Operating System), también denominado sistema operacional, se encarga de gestionar todo tipo de periféricos asociados al dispositivo que gestiona, como micrófonos, parlantes, pantallas -incluyendo las sensibles al tacto-, teclado, mouse, wifi, puertos de red, puertos USB, Bluetooth, discos duros, memorias, controles remotos, giroscopios, acelerómetros, cámaras, sensores, baterías, y todo lo que sea posible encontrar en un pc, en un celular, en una tableta, en un panel de automóvil, en calculadoras, o en grabadoras de video y audio. El sistema operativo es el software capaz de operar todos estos periféricos internos y externos.
El sistema operativo Unix es uno de los más antiguos exponentes. MS-DOS de Microsoft, MS Windows de Microsoft, MacOS de Apple, todas las distintas versiones de Linux y las distintas versiones de Unix, son hoy nombres de sistemas operativos muy conocidos.
Como dijimos previamente, el sistema operativo se encarga también de gestionar los distintos programas que corren en el dispositivo. Por ejemplo, en tu celular, la aplicación de hacer y recibir llamadas o la aplicación de fotos, son administradas por el sistema operativo, que es quien les brinda recursos de memoria para trabajar y les da tiempo de ejecución.
Cuando corres la aplicación de música y apagas la pantalla del celular para seguirla oyendo sin gastar más batería, es el sistema operativo quien lo permite. Puedes correr varias aplicaciones que permanecen abiertas corriendo aparentemente de forma simultánea, pero en realidad lo hacen de ese modo porque el sistema operativo les da de forma equitativa tiempo de ejecución y uso de los recursos.
La unidad de procesamiento central (CPU)
Según lo planteado anteriormente, el sistema operativo es la magia tras las bambalinas de los dispositivos, los computadores personales, y los grandes servidores y supercomputadores. Pero detrás de ellos y corriendo en su metal, están los elementos físicos del cerebro del computador: los procesadores centrales o cerebros digitales de los dispositivos, que se encargan de hacer posible la vida del sistema operativo, y la vida de cualquier otro fragmento de código que corra en una máquina.
La electrónica que hace posible la vida de las aplicaciones es, tal vez la más especializada que uno pueda encontrar al interior de un computador. Esta electrónica es la que se encarga de correr una a una las instrucciones que están escritas en el código de máquina al que deben ser transformadas las líneas de instrucciones contenidas en un programa. Allí, en el procesador central, es donde realmente se da toda la magia de hardware que permite que finalmente todo ese universo virtual del software se materialice. Son, resumiendo, los cerebros.
Todo está controlado por los procesadores. Antiguamente un computador contaba con un solo procesador, pero hoy un computador puede contar con varios. Las marcas más dominantes en el mercado son Intel y AMD. Estos cerebros son muy poderosos, y su arquitectura es muy distinta a la de un cerebro humano, y pueden procesar miles de millones de instrucciones cada segundo.
Cada procesador tiene una frecuencia específica, y entre más alta la frecuencia, más instrucciones podrá procesar. Por ejemplo, si vas a un almacén de computadores y te dicen que el computador que quieres comprar tiene un procesador de 3.6GHz, te están informando que el procesador puede llevar a cabo 3600 millones de ciclos cada segundo, y para procesar una instrucción de máquina, un procesador tomará varios ciclos. Pero dado que los procesadores hoy vienen con varios núcleos, la velocidad podría multiplicarse algunas veces en tareas que permiten paralelismo.
Aquí es fundamental entender las unidades de tamaño de almacenamiento: G es unidad de Giga, o sea millones de millones. M es unidad de Mega, o sea millones.
A comienzos de 2020, durante la pandemia, los mejores procesadores en computadores comerciales que se anunciaban no habían superado los 5 GHz[1]. Esto se debe a la complejidad en la fabricación de un procesador, y al consumo energético y calor generado.
Cuando tu computador se calienta, se debe precisamente al calor emitido por estos pequeños cerebros, aunque a veces otros periféricos ayudan a incrementar la temperatura del computador, ya que a su vez tienen también mucha electrónica compleja de proceso de datos.
Es probable que algún día aparezcan computadores con procesadores que funcionen a terahertz[2]. Mientras tanto, grandes poderes computacionales pueden ser alcanzados con computación paralela, lo que significa que puedo fraccionar un problema en distintos procesadores y multiplicar la velocidad.
[1] https://www.gamesradar.com/best-cpu-for-gaming-pc/
[2] https://hothardware.com/news/researchers-pave-way-terahertz-computing-chips-optic-technology
La electrónica que hace posible la vida de las aplicaciones es, tal vez la más especializada que uno pueda encontrar al interior de un computador. Esta electrónica es la que se encarga de correr una a una las instrucciones que están escritas en el código de máquina al que deben ser transformadas las líneas de instrucciones contenidas en un programa. Allí, en el procesador central, es donde realmente se da toda la magia de hardware que permite que finalmente todo ese universo virtual del software se materialice. Son, resumiendo, los cerebros.
Todo está controlado por los procesadores. Antiguamente un computador contaba con un solo procesador, pero hoy un computador puede contar con varios. Las marcas más dominantes en el mercado son Intel y AMD. Estos cerebros son muy poderosos, y su arquitectura es muy distinta a la de un cerebro humano, y pueden procesar miles de millones de instrucciones cada segundo.
Cada procesador tiene una frecuencia específica, y entre más alta la frecuencia, más instrucciones podrá procesar. Por ejemplo, si vas a un almacén de computadores y te dicen que el computador que quieres comprar tiene un procesador de 3.6GHz, te están informando que el procesador puede llevar a cabo 3600 millones de ciclos cada segundo, y para procesar una instrucción de máquina, un procesador tomará varios ciclos. Pero dado que los procesadores hoy vienen con varios núcleos, la velocidad podría multiplicarse algunas veces en tareas que permiten paralelismo.
Aquí es fundamental entender las unidades de tamaño de almacenamiento: G es unidad de Giga, o sea millones de millones. M es unidad de Mega, o sea millones.
A comienzos de 2020, durante la pandemia, los mejores procesadores en computadores comerciales que se anunciaban no habían superado los 5 GHz[1]. Esto se debe a la complejidad en la fabricación de un procesador, y al consumo energético y calor generado.
Cuando tu computador se calienta, se debe precisamente al calor emitido por estos pequeños cerebros, aunque a veces otros periféricos ayudan a incrementar la temperatura del computador, ya que a su vez tienen también mucha electrónica compleja de proceso de datos.
Es probable que algún día aparezcan computadores con procesadores que funcionen a terahertz[2]. Mientras tanto, grandes poderes computacionales pueden ser alcanzados con computación paralela, lo que significa que puedo fraccionar un problema en distintos procesadores y multiplicar la velocidad.
[1] https://www.gamesradar.com/best-cpu-for-gaming-pc/
[2] https://hothardware.com/news/researchers-pave-way-terahertz-computing-chips-optic-technology
Memoria RAM
Dentro de un computador, el código y los datos deben mantenerse almacenados para poder tener acceso a ellos. La memoria es un área donde guardamos elementos que necesitamos recuperar, y puede ser temporal o permanente. Aunque hay muchos tipos de memorias, la más importante para el usuario es la memoria RAM.
La memoria RAM (Random Access Memory) es una memoria temporal de trabajo, y solo está disponible mientras el computador está encendido. En una memoria RAM se pueden escribir datos y se pueden leer datos con un acceso igual en tiempo para cualquiera de las posiciones (de allí su denominación de aleatoria-‘random’). Todo dato que se vaya a procesar debe cargarse a memoria RAM, incluyendo el código del sistema operacional. Por ejemplo, en el mismo centro de ventas del ejemplo anterior te pueden decir que el computador viene con 8GB de memoria principal o memoria RAM. Eso significa que esa es la capacidad máxima de almacenamiento para correr código, incluyendo el código del sistema operacional. En total serían 8000 millones de bytes (un byte es la capacidad mínima de representación de un dato). Por eso, entre más memoria RAM tenga tu computador, más información puedes cargar en ella [1].
Algunas veces tener más memoria RAM alivia la disponibilidad de los datos y eso hace que el computador pueda trabajar más rápido. Hay que tener presente que la memoria RAM no conserva su contenido cuando no hay flujo energético, por lo que en una falla energética se pierden los datos, y es por ello por lo que deben ser almacenados en dispositivos de almacenamiento persistente, como los discos duros.
[1] G es unidad de Giga, o sea miles de millones (109). M es unidad de Mega, o sea millones (106). Entonces, un Giga son 1000 megas. Estas unidades pueden ser aplicadas a muchos tipos de variables físicas, y también es utilizado para hablar de escalas de memoria, como los MB (Megabytes), los GB (Gigabytes), entre otras escalas. Más adelante veremos que hay dos formas de medir la memoria: múltiplos de 1000 y múltiplos de 1024.
La memoria RAM (Random Access Memory) es una memoria temporal de trabajo, y solo está disponible mientras el computador está encendido. En una memoria RAM se pueden escribir datos y se pueden leer datos con un acceso igual en tiempo para cualquiera de las posiciones (de allí su denominación de aleatoria-‘random’). Todo dato que se vaya a procesar debe cargarse a memoria RAM, incluyendo el código del sistema operacional. Por ejemplo, en el mismo centro de ventas del ejemplo anterior te pueden decir que el computador viene con 8GB de memoria principal o memoria RAM. Eso significa que esa es la capacidad máxima de almacenamiento para correr código, incluyendo el código del sistema operacional. En total serían 8000 millones de bytes (un byte es la capacidad mínima de representación de un dato). Por eso, entre más memoria RAM tenga tu computador, más información puedes cargar en ella [1].
Algunas veces tener más memoria RAM alivia la disponibilidad de los datos y eso hace que el computador pueda trabajar más rápido. Hay que tener presente que la memoria RAM no conserva su contenido cuando no hay flujo energético, por lo que en una falla energética se pierden los datos, y es por ello por lo que deben ser almacenados en dispositivos de almacenamiento persistente, como los discos duros.
[1] G es unidad de Giga, o sea miles de millones (109). M es unidad de Mega, o sea millones (106). Entonces, un Giga son 1000 megas. Estas unidades pueden ser aplicadas a muchos tipos de variables físicas, y también es utilizado para hablar de escalas de memoria, como los MB (Megabytes), los GB (Gigabytes), entre otras escalas. Más adelante veremos que hay dos formas de medir la memoria: múltiplos de 1000 y múltiplos de 1024.
Dispositivos de entrada y salida
Para comunicarse con una máquina se requieren periféricos. Los periféricos son todos aquellos elementos alrededor de un computador que hacen posible la interacción de un humano con dicha máquina (computador). Como la información fluye unas veces de adentro hacia afuera del computador, y viceversa, a estos periféricos se les denomina dispositivos de entrada y salida. Por ejemplo, las pantallas, teclados, mouses, ‘pads’ y micrófonos, son periféricos. Las impresoras, lectores de códigos de barras, y discos duros, también son periféricos. Los periféricos de entrada aceptan ingreso de datos, mientras que los periféricos de salida generan datos de salida. También hay periféricos que se clasifican como periféricos de entrada y salida, pues tienen ambas características, como por ejemplo los discos duros, que permiten almacenar datos y leer datos.
Periféricos de almacenamiento de datos
Un periférico de almacenamiento de datos es un dispositivo de entrada y salida en el que se puedan grabar datos para luego recuperarlos, incluso luego de haber apagado el computador. Los discos magnéticos son bastante populares y fueron un medio muy rápido de almacenamiento hasta la aparición de nuevas tecnologías de estado sólido que no requieren materiales ferromagnéticos.
Los discos duros mecánicos son dispositivos que se componen internamente de varios discos que rotan a alta velocidad mientras unas cabezas lectoras y escritoras se mueven en dirección radial para interactuar con el medio magnético, y así grabar o leer datos.
Los datos siempre permanecen almacenados así no haya flujo de corriente, por lo que son ideales para almacenaje de datos de forma parcial o permanente; pero desafortunadamente pueden ser alterados por campos magnéticos externos, como por ejemplo pasar un imán cerca a los discos; también pueden irse deteriorando el tiempo, lo que los hace susceptibles a fallas, y por lo tanto tienen una vida útil asociada.
Hasta el momento, posiblemente el medio de almacenamiento más durable en el tiempo sea el DNA[1], molécula encargada de almacenar la información genética de los seres vivos[2].
Los discos duros son diseñados para que se pueda almacenar en ellos mucha información. Hoy puedes adquirir discos de varios Terabytes (un Terabyte son 1000 Gigabytes), y es normal encontrar que se conectan varios discos duros magnéticos a un computador. El costo de estos dispositivos es bastante aceptable, y se espera que pronto las nuevas tecnologías de estado sólido que reemplazarán estas viejas tecnologías de almacenamiento magnético bajen sus precios.
En un disco duro de almacenamiento magnético, los platos giran a una alta velocidad que se mide en revoluciones por minuto. Tradicionalmente, se consiguen discos en el mercado de entre 5400 rpm (revoluciones por minuto) y 7200 rpm. Eso hace que el acceso a un dato no sea inmediato, sino que tenga un tiempo que va a variar dependiendo de la localización de los datos en los platos del disco. Si un conjunto de datos que están relacionados se encuentra muy disperso dentro de los platos del disco, se dice que el disco está muy fragmentado y se debe desfragmentar para agilizar el acceso a los datos. Un disco típico de 7200 rpm puede dar una velocidad de acceso/escritura de 80-160 MB/s (Megabytes por segundo).
Hoy, los discos magnéticos vienen siendo reemplazados por los dispositivos de almacenamiento de estado sólido SSD que no trabajan con materiales magnéticos, sino con memorias clásicamente denominadas ‘flash’ que pueden ser alteradas, y que conservan su estado cuando no hay flujo de corriente. Este tipo de dispositivos no presentan los problemas de los tradicionales discos duros magnéticos y sus velocidades superan considerablemente las de un disco típico. Hoy estos dispositivos pueden alcanzar velocidades entre 300 MB/s y 600 MB/s.
El ejemplo más claro de cómo los medios de almacenamiento masivo de discos rotatorios fueron reemplazados, son las tarjetas SD o micro-SD usadas en los celulares, las memorias USB, cámaras fotográficas digitales, videocámaras, grabadoras de audio, drones, televisores, y todo tipo de dispositivos que usan este tipo de almacenamiento. Las tarjetas SD se convirtieron también en medios de alta densidad de datos, pues es posible comprar memorias SD y micro-SD de 1000 GB. La ventaja de este tipo de almacenamiento electrónico está en su alta velocidad de acceso, que supera los 300 MB/s, pues la velocidad en un dispositivo de estado sólido es la que permita la electrónica de los circuitos, muy alta comparada con la de platos rotantes.
[1] Varios trabajos de investigación se han hecho al respecto. Uno interesante en el que se representaron 200MB de archivos de datos en 13 millones de nucleótidos, es https://www.nature.com/articles/nbt.4079
[2] Pero actualmente no se cuenta con la tecnología para almacenar grandes volúmenes de datos en estas cadenas de aminoácidos dado el alto costo que se requiere para codificar en dicho medio.
Los discos duros mecánicos son dispositivos que se componen internamente de varios discos que rotan a alta velocidad mientras unas cabezas lectoras y escritoras se mueven en dirección radial para interactuar con el medio magnético, y así grabar o leer datos.
Los datos siempre permanecen almacenados así no haya flujo de corriente, por lo que son ideales para almacenaje de datos de forma parcial o permanente; pero desafortunadamente pueden ser alterados por campos magnéticos externos, como por ejemplo pasar un imán cerca a los discos; también pueden irse deteriorando el tiempo, lo que los hace susceptibles a fallas, y por lo tanto tienen una vida útil asociada.
Hasta el momento, posiblemente el medio de almacenamiento más durable en el tiempo sea el DNA[1], molécula encargada de almacenar la información genética de los seres vivos[2].
Los discos duros son diseñados para que se pueda almacenar en ellos mucha información. Hoy puedes adquirir discos de varios Terabytes (un Terabyte son 1000 Gigabytes), y es normal encontrar que se conectan varios discos duros magnéticos a un computador. El costo de estos dispositivos es bastante aceptable, y se espera que pronto las nuevas tecnologías de estado sólido que reemplazarán estas viejas tecnologías de almacenamiento magnético bajen sus precios.
En un disco duro de almacenamiento magnético, los platos giran a una alta velocidad que se mide en revoluciones por minuto. Tradicionalmente, se consiguen discos en el mercado de entre 5400 rpm (revoluciones por minuto) y 7200 rpm. Eso hace que el acceso a un dato no sea inmediato, sino que tenga un tiempo que va a variar dependiendo de la localización de los datos en los platos del disco. Si un conjunto de datos que están relacionados se encuentra muy disperso dentro de los platos del disco, se dice que el disco está muy fragmentado y se debe desfragmentar para agilizar el acceso a los datos. Un disco típico de 7200 rpm puede dar una velocidad de acceso/escritura de 80-160 MB/s (Megabytes por segundo).
Hoy, los discos magnéticos vienen siendo reemplazados por los dispositivos de almacenamiento de estado sólido SSD que no trabajan con materiales magnéticos, sino con memorias clásicamente denominadas ‘flash’ que pueden ser alteradas, y que conservan su estado cuando no hay flujo de corriente. Este tipo de dispositivos no presentan los problemas de los tradicionales discos duros magnéticos y sus velocidades superan considerablemente las de un disco típico. Hoy estos dispositivos pueden alcanzar velocidades entre 300 MB/s y 600 MB/s.
El ejemplo más claro de cómo los medios de almacenamiento masivo de discos rotatorios fueron reemplazados, son las tarjetas SD o micro-SD usadas en los celulares, las memorias USB, cámaras fotográficas digitales, videocámaras, grabadoras de audio, drones, televisores, y todo tipo de dispositivos que usan este tipo de almacenamiento. Las tarjetas SD se convirtieron también en medios de alta densidad de datos, pues es posible comprar memorias SD y micro-SD de 1000 GB. La ventaja de este tipo de almacenamiento electrónico está en su alta velocidad de acceso, que supera los 300 MB/s, pues la velocidad en un dispositivo de estado sólido es la que permita la electrónica de los circuitos, muy alta comparada con la de platos rotantes.
[1] Varios trabajos de investigación se han hecho al respecto. Uno interesante en el que se representaron 200MB de archivos de datos en 13 millones de nucleótidos, es https://www.nature.com/articles/nbt.4079
[2] Pero actualmente no se cuenta con la tecnología para almacenar grandes volúmenes de datos en estas cadenas de aminoácidos dado el alto costo que se requiere para codificar en dicho medio.
LENGUAJES
La programación es el medio por el cual podemos lograr que fragmentos de código de máquina corran en un procesador de un computador. Es el medio para lograr que una máquina haga lo que yo quiera que haga con sus periféricos, o con los datos de los registros del procesador que traemos desde el periférico de memoria.
Esta tarea no es simple vista desde la óptica del lenguaje de máquina, ya que el lenguaje de máquina son solo ceros y unos, lo que requiere tener conocimientos de programación a extremadamente bajo nivel sobre las instrucciones posibles con un procesador; es como intentar coreografiar pulsos electrónicos que representan datos y operaciones sobre los datos, buscando obtener un resultado.
Es posible, sin embargo, programar a un nivel un poco más alto que solo ceros y unos, con instrucciones muy específicas que pueden ser entendidas por los programadores, y para ese tipo de programación existen los lenguajes ensambladores, que traducen instrucciones a ceros y unos. Pero a pesar de que contamos con ese tipo de lenguajes, Se requiere de mucho código para lograr pequeñas tareas, y es por eso por lo que históricamente se fueron diseñando lenguajes de programación de más alto nivel.
Entonces en vez de escribir en ceros y unos (lenguaje de máquina), o más humano en lenguaje ensamblador, escribimos en lenguajes de programación donde podemos hablarle fácil al computador. Con un lenguaje de programación podemos escribir un conjunto de pasos que se encarguen de procesar datos y así obtener resultados concretos. Las instrucciones de estos lenguajes de alto nivel luego serán transformadas a lenguaje de bajo nivel, y el lenguaje de bajo nivel pasará a ser luego una hilera de ceros y unos ininteligible.
En el siguiente ejemplo, se muestran equivalencias de lenguaje de alto nivel, lenguaje ensamblador, y lenguaje de máquina:
Esta tarea no es simple vista desde la óptica del lenguaje de máquina, ya que el lenguaje de máquina son solo ceros y unos, lo que requiere tener conocimientos de programación a extremadamente bajo nivel sobre las instrucciones posibles con un procesador; es como intentar coreografiar pulsos electrónicos que representan datos y operaciones sobre los datos, buscando obtener un resultado.
Es posible, sin embargo, programar a un nivel un poco más alto que solo ceros y unos, con instrucciones muy específicas que pueden ser entendidas por los programadores, y para ese tipo de programación existen los lenguajes ensambladores, que traducen instrucciones a ceros y unos. Pero a pesar de que contamos con ese tipo de lenguajes, Se requiere de mucho código para lograr pequeñas tareas, y es por eso por lo que históricamente se fueron diseñando lenguajes de programación de más alto nivel.
Entonces en vez de escribir en ceros y unos (lenguaje de máquina), o más humano en lenguaje ensamblador, escribimos en lenguajes de programación donde podemos hablarle fácil al computador. Con un lenguaje de programación podemos escribir un conjunto de pasos que se encarguen de procesar datos y así obtener resultados concretos. Las instrucciones de estos lenguajes de alto nivel luego serán transformadas a lenguaje de bajo nivel, y el lenguaje de bajo nivel pasará a ser luego una hilera de ceros y unos ininteligible.
En el siguiente ejemplo, se muestran equivalencias de lenguaje de alto nivel, lenguaje ensamblador, y lenguaje de máquina:
Lenguaje
Fuente int main(){ ; } |
Lenguaje
Ensamblador pushq %rbp movq %rsp, %rbp xorl %eax, %eax popq %rbp retq |
Lenguage
de máquina 1010101 1001000 10001001 11100101 11001 11000000 1011101 11000011 |
Dentro de los lenguajes de alto nivel, existen muchos tipos, como los de propósito general y otros de propósito más específico. Existen posiblemente más de 500 lenguajes[1] relativamente populares, pero podríamos enumerar más de 1500 lenguajes de programación, lo que se puede demostrar revisando las líricas de la canción ‘99 bottles of beer’ escrita en alrededor de 1500 lenguajes de programación[2].
En la industria abundan los lenguajes de propósito general: algunos nombres muy populares son C#, Java, Go, Javascript, Swift, Objective-C, Cofee, Groove, Clojure, Python, PHP, Perl, Ruby, F#, C, C++, Haskell, Pascal, entre muchos otros, y existen otros de propósito más específico como lenguajes de sistemas entre los que tenemos a C, C++, D y Rust, o lenguajes de computación científica entre los que encontramos Julia, R, Octave, SciLab, Matlab, Mathematica, Fortran, entre otros.
Algunos de estos lenguajes son muy fáciles de aprender, como por ejemplo el lenguaje de programación de propósito general Python, que gana su fama y popularidad de la mano de su simpleza y expresividad. A pesar de no ser un lenguaje creado para la ciencia, el lenguaje Python logró incursionar fuertemente en los entornos académicos, lo que lo llevó a ser uno de los lenguajes predilectos de los investigadores, por lo que ha impulsado el desarrollo de librerías científicas en todo ámbito.
[1] https://en.wikipedia.org/wiki/List_of_programming_languages
[2] http://www.99-bottles-of-beer.net
En la industria abundan los lenguajes de propósito general: algunos nombres muy populares son C#, Java, Go, Javascript, Swift, Objective-C, Cofee, Groove, Clojure, Python, PHP, Perl, Ruby, F#, C, C++, Haskell, Pascal, entre muchos otros, y existen otros de propósito más específico como lenguajes de sistemas entre los que tenemos a C, C++, D y Rust, o lenguajes de computación científica entre los que encontramos Julia, R, Octave, SciLab, Matlab, Mathematica, Fortran, entre otros.
Algunos de estos lenguajes son muy fáciles de aprender, como por ejemplo el lenguaje de programación de propósito general Python, que gana su fama y popularidad de la mano de su simpleza y expresividad. A pesar de no ser un lenguaje creado para la ciencia, el lenguaje Python logró incursionar fuertemente en los entornos académicos, lo que lo llevó a ser uno de los lenguajes predilectos de los investigadores, por lo que ha impulsado el desarrollo de librerías científicas en todo ámbito.
[1] https://en.wikipedia.org/wiki/List_of_programming_languages
[2] http://www.99-bottles-of-beer.net
Tal vez uno de los lenguajes de programación más complejos que existe es el lenguaje Brainfuck, un lenguaje bastante esotérico creado por un físico suizo en 1993, y que pretendía tener el compilador más pequeño posible para ser incorporado en pequeños dispositivos.
¡El famoso programa para escribir la frase “Hello World!”, usado como ejemplo por muchos lenguajes, se escribe en Brainfuck como la secuencia de caracteres:
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
Brainfuck en realidad es complejo, y dada su dificultad para aprender y para leer y modificar, hoy es meramente una curiosidad académica, lo que no quiere decir que no pueda ser útil, y se pueden encontrar muchos ejemplos de código fuente escrito en él. Existen muchos otros lenguajes extraños, hasta el punto de que existe una wiki para lenguajes esotéricos, denominada esolang.org; esta wiki cubre cientos de ejemplos de distintos lenguajes esotéricos[1].
Este mismo programa ejemplo se escribiría en modernas versiones del lenguaje Python simplemente como print ("Hello World!").
[1] https://esolangs.org/
¡El famoso programa para escribir la frase “Hello World!”, usado como ejemplo por muchos lenguajes, se escribe en Brainfuck como la secuencia de caracteres:
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
Brainfuck en realidad es complejo, y dada su dificultad para aprender y para leer y modificar, hoy es meramente una curiosidad académica, lo que no quiere decir que no pueda ser útil, y se pueden encontrar muchos ejemplos de código fuente escrito en él. Existen muchos otros lenguajes extraños, hasta el punto de que existe una wiki para lenguajes esotéricos, denominada esolang.org; esta wiki cubre cientos de ejemplos de distintos lenguajes esotéricos[1].
Este mismo programa ejemplo se escribiría en modernas versiones del lenguaje Python simplemente como print ("Hello World!").
[1] https://esolangs.org/
Algoritmos
Hablar de algoritmos en las ciencias de la computación es bastante serio, ya que alude una inmensa cantidad de técnicas según su clasificación [1].
La palabra algoritmo, llevada a su definición neta más clara, es probablemente la que aparece en la Wikipedia: “conjunto prescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permite realizar una actividad informática mediante pasos sucesivos que no generen dudas a quien deba hacer dicha actividad”[2].
Dados un estado inicial y una entrada, siguiendo los pasos sucesivos se llega a un estado final y se obtiene una solución.
Para llevarse una idea de lo que es un algoritmo, usemos una actividad del día a día de un estudiante en una universidad, por ejemplo, comprar un producto en una cafetería.
Cada que un estudiante va a una cafetería, pregunta por un producto, y si se encuentra disponible, lo pide, y tan pronto lo recibe, lo paga. Si el producto no está disponible, se retira sin comprarlo, o compra otra cosa siguiendo esa misma lógica.
Lo que queremos es escribir, de principio a fin, esto mismo, en un formato diferente que denominamos algoritmo. La forma en que lo escribimos podría ser el primer paso antes de llevar el programa a un pseudocódigo, y posteriormente, a código en algún lenguaje de programación.
[1] https://en.wikipedia.org/wiki/Algorithm#Classification
[2] https://es.wikipedia.org/wiki/Algoritmo
La palabra algoritmo, llevada a su definición neta más clara, es probablemente la que aparece en la Wikipedia: “conjunto prescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permite realizar una actividad informática mediante pasos sucesivos que no generen dudas a quien deba hacer dicha actividad”[2].
Dados un estado inicial y una entrada, siguiendo los pasos sucesivos se llega a un estado final y se obtiene una solución.
Para llevarse una idea de lo que es un algoritmo, usemos una actividad del día a día de un estudiante en una universidad, por ejemplo, comprar un producto en una cafetería.
Cada que un estudiante va a una cafetería, pregunta por un producto, y si se encuentra disponible, lo pide, y tan pronto lo recibe, lo paga. Si el producto no está disponible, se retira sin comprarlo, o compra otra cosa siguiendo esa misma lógica.
Lo que queremos es escribir, de principio a fin, esto mismo, en un formato diferente que denominamos algoritmo. La forma en que lo escribimos podría ser el primer paso antes de llevar el programa a un pseudocódigo, y posteriormente, a código en algún lenguaje de programación.
[1] https://en.wikipedia.org/wiki/Algorithm#Classification
[2] https://es.wikipedia.org/wiki/Algoritmo
Pasos en un algoritmo
Veamos un ejemplo de un algoritmo. Se trata de comprar un producto en una tienda. Dado que todos lo hemos hecho, podrá incluso sugerir mejoras, o determinar problemas en el algoritmo. Sin embargo, el propósito es tener la idea de lo que significa escribir un algoritmo en lenguaje natural.
Simplemente la idea es entrar a la tienda, averiguar si el producto está disponible, y preguntar por su precio, y si es adecuado y tenemos dinero, hacemos una transacción de compra del producto.
A continuación se presenta un algoritmo escrito con lenguaje natural, pero intentando llevarlo a una estructura algorítmica imperativa tradicional.
Simplemente la idea es entrar a la tienda, averiguar si el producto está disponible, y preguntar por su precio, y si es adecuado y tenemos dinero, hacemos una transacción de compra del producto.
A continuación se presenta un algoritmo escrito con lenguaje natural, pero intentando llevarlo a una estructura algorítmica imperativa tradicional.
ALGORITMO comprar un producto en una tienda
Entradas: dinero, idea de producto
Salidas: producto comprado
INICIO
entrar a la tienda
preguntar por un producto
si producto disponible entonces
si precio es adecuado entonces
si me alcanza el dinero entonces
pedir producto
recibir producto
pagar producto
fin si
fin si
fin si
salir de la tienda
FIN ALGORITMO
Este algoritmo pueda ser escrito de diversas formas, e incluso puede ser mejorado para contemplar otras posibilidades de la situación. Note que el algoritmo procede de arriba abajo paso por paso.
Entradas: dinero, idea de producto
Salidas: producto comprado
INICIO
entrar a la tienda
preguntar por un producto
si producto disponible entonces
si precio es adecuado entonces
si me alcanza el dinero entonces
pedir producto
recibir producto
pagar producto
fin si
fin si
fin si
salir de la tienda
FIN ALGORITMO
Este algoritmo pueda ser escrito de diversas formas, e incluso puede ser mejorado para contemplar otras posibilidades de la situación. Note que el algoritmo procede de arriba abajo paso por paso.
Pseudocódigo
Cuando hacemos un algoritmo desde una perspectiva conceptual como en el ejemplo anterior, lo que tenemos es la representación de un modelo en etapas de solución. Al modelo anterior podemos llamarlo macro algoritmo. Pero a medida que escribimos algoritmos, podemos empezar a hacerlo de tal forma que nos aproximamos mejor a los lenguajes tradicionales de computadoras, y lo podemos hacer a través de un pseudocódigo.
Un pseudocódigo (del griego ψευδής, pseudes, falso), o código falso, no corre en un computador ya que no es un lenguaje de programación; es una convención para escribir algoritmos usando una forma estándar de tal forma que sea legible y comprensible por otra persona que esté usando el mismo pseudocódigo; simplemente se trata de una forma de hacerlo que facilite su lectura para otros humanos, pero no es comprensible por un computador.
Para que un algoritmo sea entendido y procesado por un computador deberá estar escrito en un lenguaje de programación formalmente definido. En la primera parte de este libro sobre algoritmos, se presentan soluciones en pseudocódigo dejando abierta la posibilidad de que el lector lleve sus soluciones de seudocódigo a un lenguaje de programación formal de su preferencia. También se incluye un capítulo sobre los fundamentos mínimos de un lenguaje de programación muy popular al momento de escribir este libro, y es Python. Este capítulo, presenta una gran cantidad de problemas para desarrollar, y podrá ser usado por estudiantes o profesionales interesados en trabajar con dicho lenguaje, o podría ser usado por profesores de introducción a la programación usando lenguaje Python.
Un pseudocódigo (del griego ψευδής, pseudes, falso), o código falso, no corre en un computador ya que no es un lenguaje de programación; es una convención para escribir algoritmos usando una forma estándar de tal forma que sea legible y comprensible por otra persona que esté usando el mismo pseudocódigo; simplemente se trata de una forma de hacerlo que facilite su lectura para otros humanos, pero no es comprensible por un computador.
Para que un algoritmo sea entendido y procesado por un computador deberá estar escrito en un lenguaje de programación formalmente definido. En la primera parte de este libro sobre algoritmos, se presentan soluciones en pseudocódigo dejando abierta la posibilidad de que el lector lleve sus soluciones de seudocódigo a un lenguaje de programación formal de su preferencia. También se incluye un capítulo sobre los fundamentos mínimos de un lenguaje de programación muy popular al momento de escribir este libro, y es Python. Este capítulo, presenta una gran cantidad de problemas para desarrollar, y podrá ser usado por estudiantes o profesionales interesados en trabajar con dicho lenguaje, o podría ser usado por profesores de introducción a la programación usando lenguaje Python.
TALLER DE CONCEPTOS
- Indague cual es el sistema operativo que más se usa entre sus compañeros de estudio, o sus familiares. Intente determinar porqué usan esos sistemas operativos y no otros.
- Determine de qué modo puede consultar qué tipo de procesador central tiene su celular. Haga lo mismo con computador en el que más trabaja. ¿Cuál de ellos maneja más ciclos por segundo?
- ¿Es más rápido un procesador de 32 GHz o uno de 32 MHz?
- Si se requiere resolver un problema a 10 GHz, y no se consiguen computadoras comerciales que lo hagan, ¿qué sugiere?
- ¿Cómo clasificaría la memoria RAM de un computador?
(a) Entrada (b) Entrada y Salida (c) Solo salida - El autor de este material, cuando era joven hace muchos años, tuvo su primer computador con 48 KB de memoria RAM, lo que equivale a 0.048 MB (0.000048 GB). Para el año 2020 los computadores personales que se conseguían comercialmente ya tenían 8 GB o 16 GB de memoria principal.
- ¿Cuántas veces más memoria tiene uno de estos computadores personales comparado con el computador de museo de 48 KB?
- Si un byte puede almacenar una letra, ¿cuántas letras se pueden almacenar en 16 MB?
- ¿Si cada letra del código genético humano ocupa un byte, cuántos códigos genéticos es posible almacenar en un disco de estado sólido de capacidad de 1 Terabyte? (Un Terabyte (escrito 1 TB) equivale a 1000 GB). Asuma que el código genético humano se compone de 3 mil millones de pares de bases. Asuma que se almacena solo un hilo de la cadena de DNA, pues el otro es complementario y no hay que almacenarlo.
- Escriba un algoritmo para sacar dinero de un cajero.
- Escriba un algoritmo para hacer limonada.