El entorno de programación Bash

Estoy algo frustrado, he intentado estudiar el libro “El Entorno de programación UNIX” de Pike y Kernighan y he tenido la mala suerte de que una vez lo compré y lo perdí, no podía volverlo a comprar porque realmente es muy caro, el libro es viejo, luego le saqué una copia, pues como ya lo había comprado, pensé que no habrían inconvenientes, pero lo volví a perder.

Lo he buscado por internet y resulta que no lo encuentro. Así que hoy voy a comenzar una guía de Bash que espero se vuelva en algo similar al libro, no obstante me gustaría volverlo a tener para darle la misma estructura a este documento, lamentablemente yo nunca termino lo que empiezo, siempre lo dejo todo botado, espero que esto tampoco sea igual.

Existe otro documento un pdf hecho por Bellas, pero creo que comete el mismo error del libro, explica como se hacían las cosas en la década de los 80, ahora tenemos mas y mejores herramientas. Tampoco quiero hacer un documento en el cual sus scripts corran hasta en la taza del sanitario, quiero tomar la versión de Bash que estoy actualmente utilizando, y que a como se mueve la tecnología, será obsoleta cuando termine el escrito, para hacer scripts, por último sólo he probado los scripts en GNU/Linux, pues mi ideología, por mas radical que parezca, es utilizar software libre en la medida de lo posible.

Breve introducción

Como todo buen libro, tiene que existir una breve introducción.

Cualquier dispositivo moderno está construido con el fin de ejecutar una o mas tareas, los dispositivos están programados para realizar esas tareas, son programados por los seres humanos. La programación es entonces la manera mediante la cual yo puedo ejecutar una tarea mediante un dispositivo.

En la edad media Musa al-Juarismi diseñó los algoritmos, los cuales son métodos para resolver un problema, en un principio para problemas matemáticos, no obstante los algoritmos se pueden aplicar para cualquier tipo de tarea, la misma puede ser ejecutada por un ser humano, por ejemplo, las recetas de cocina, pueden ser representadas mediante un algoritmo. En una receta de cocina se listan los ingredientes para preparar un platillo, algunas recetas incluyen la preparación, donde se indica que en que orden y como se debe agregar un ingrediente.

Gallos de chicharrón

INGREDIENTES:
    1/2 Kg chicharrón
    20 tortillas de maíz
    1 limón
    1 tomate
    Chiles picantes

PREPARACIÓN:

Calentar las tortillas hasta que estén suaves. Poner una cucharada de la carne en el centro y agregar tomate picado y limón. Agregar el chile picante.

Ejemplo de una receta.

Tal y como podemos observar se indican los ingredientes y los pasos, no obstante esto no es un algoritmo, si un ser humano sigue los pasos podría equivocarse, mucho menos, una computadora entendería como preparar “los Gallos”. Actualmente ni siquiera podría entender el concepto de Gallos.

Durante varios años se crearon máquinas que facilitaban las tareas del ser humano, pero continuaban requiriendo de que un ser humano las manipulara completamente, ejemplos de ellos son la calculadora de Wilhelm Schickard, la pascalina de Blaise Pascal o el demostrador lógico de Charles Mahon. Todos estos mecanismos eran manipulados por un ser humano que se encargaba de ejecutar las tareas y la máquina se las facilitaba.

Pero no fue hasta que Joseph Marie Jacquard utilizó tarjetas perforadas para ¡programar los telares!, mediante este método una máquina sola era capaz de ejecutar una tarea repetitiva sin necesidad de la intervención humana. Antes de esto se contrataba a mucha gente para producir tela o ropa en grandes cantidades, la gente era explotada, les pagaban mal, tenían jornadas laborales extensas e incluso algunas personas preferían vivir en las fábricas que mantener una casa, sus hijos trabajan igual que sus padres en la misma fábrica, no obstante los telares programados no fueron los que evitaron que los abusos continuaran, las personas lucharon por sus derechos y ganaron muchos de los que actualmente disfrutamos, los telares también significaron que no se necesitaban personas para esas tareas, lo cual significó que las personas perdieran sus empleos, algunos ex empleados quemaron las fábricas que los reemplazaron por máquinas y muchas personas temían a las máquinas.

Charles Babbage trabajó en dos máquinas conceptuales, el artefacto de la diferencia y la máquina analítica, el primer concepto fue el de una máquina que fuera de ejecutar cualquier cálculo, los cuales ahora son la base de las computadoras modernas, el segundo concepto era de una computadora de propósito general, Charles pensó en una máquina que fuera programada mediante tarjetas perforadas, tomara la información la procesara y la devolviera, mediante una impresora, una campana y/o tarjetas perforadas. ¡Que es básicamente lo que hacen las computadoras actuales!

Babbage nunca pudo trasladar del concepto al hecho sus proyectos, pero la gente continuó estudiándolos e incluso amplíandolos, no sería hasta mas o menos 100 años después que una computadora podría hacer lo que Babbage diseñó.

Dentro de las personas que tomaron los trabajos anteriores se encontraba Ada Lovelace, quien leyó el trabajo de Babbage, ya que le solicitaron traducirlo, y comenzó a tomar notas para ampliar el trabajo, Ada era matemática y escritora, diseñó otra máquina analítica mecánica, ella notó que todos lo trabajos anteriores solo generaban información conocida, no podían generar conocimiento nuevo. ¡Diseñó el primer algoritmo para una computadora y también el primer lenguaje de programación aplicado a una computadora!. Ada recibió la ayuda del mismo Babbage, o mas bien al contrario, pues ella fue quien sugirió el uso de las tarjetas perforadas.

Herman Hollerith creó una máquina que trabajaba con tarjetas perforadas, permitiendo realizar la tarea de tabular la información de un censo de una manera mas expedita.

Leonardo Torres Quevedo creó el Telekino, el cual era una autómata que ejecutaba órdenes a distancia, la demostración que realizó fue navegar un bote a distancia, el método utilizado fue enviando ondas hertzianas, ¡el primer dispositivo sin cables! Leonardo también creó el Ajedrecista, un robot capaz de jugar una final de ajedrez, utilizando una torre y un rey, contra un rey manipulado por un humano, era capaz de lograr la victoria en todas las ocasiones, el autómata era capaz mediante un algoritmo y electroimanes, de evaluar las posiciones para jugar. Torres también creó la primera calculadora digital, con una máquina de escribir se transmitían mediante impulsos eléctricos las operaciones a la calculadora, las procesaba, y luego mediante impulso eléctricos devolvía el resultado a la máquina de escribir. Este proceso requería de algo nunca antes visto. memoria, un concepto muy primitivo pero válido.

Konrad Zuse diseña la Z3, la primera computadora que funcionaba, anteriormente había construido la Z1, pero no funcionaba bien y cometía errores, fue la primera computadora programable y automática, leía los programas desde tarjetas perforadas y utilizaba el sistema binario. No obstante esta computadora no era de uso general.

No fue hasta que John Presper Eckert y John William Mauchly desarrollaron la ENIAC, la primera computadora de propósito general, no obstante la ENIAC estaba llena de defectos, era necesario cambiar cables muy similar a como cambiaban los cables de las llamadas las operadoras de las compañías de teléfonos, no utilizaba el sistema binario y al utilizar válvulas estas se fundían con frecuencia dejando inutilizada la computadora. Un dato curioso que generalmente no se conoce es que fueron mujeres las que se encargaban de programar la ENIAC.

A finales de 1950 las computadoras se volvieron mas accesibles y se desarrollaron mas, dejaron de utilizar tubos al vacío y comenzaron a utilizar transistores.

Como bien vemos las tarjetas perforadas fueron la primera manera de programar una computadora o un dispositivo, no obstante, las perforaciones de las tarjetas no significan lo mismo para cada una de las computadoras, el orden de las perforaciones y como es interpretado es lo que se podría llamar como lenguaje de programación, era muy común que para cada computadora existiera una sola manera de transmitirle la información, o sea, un lenguaje de programación.

El sistema A-0 fue el primer compilador desarrollado para una computadora electrónica, los programas se escribían como subrutinas y argumentos, luego los mismos eran traducidos o convertidos en un código que la computadora pudiera entender.

En ensamblador es un lenguaje de programación de bajo nivel, estos lenguajes ejercen el control directamente sobre el hardware, es decir que son escritos para manipular el dispositivo directamente, estos lenguajes por su naturaleza dependen del hardware y no sirven para programar dispositivos diferentes, por ejemplo, en su computadora usted puede escribir un programa que apague o encienda la computadora, pero ese programa no va a funcionar en su teléfono celular, asumiendo que su celular es basado en un procesador arm y su computadora en un procesador x86_64, incluso podríamos afirmar que siendo ambos arm, pero por ejemplo de diferente fabricantes y con diferentes marcas de pantallas, el programa no funcionará.

Es importante hacer notar que los lenguajes de bajo nivel son una manera de representar las instrucciones, esto es escribiendo sencillas siglas o números, las mismas son tomadas por un ensamblador que las traduce al lenguaje que una máquina entiende y que puede ejecutar. Uno de los primeros lenguajes ensamblador fue SOAP.

No obstante las personas debían aprender un lenguaje de programación nuevo para cada computadora, esto hacía difícil trabajar con una computadora nueva, ya que se debían traducir todos los programas al nuevo lenguaje de programación.

FLOW-MATIC fue el primer lenguaje de programación de alto nivel, en lugar de utilizar siglas, este lenguaje utilizaba palabras reconocidas por los seres humanos, fue creado por Grace Murray Hopper.

COBOL fue diseñado para resolver este problema, fue uno de los primeros lenguajes utilizados de manera transparente al usuario, no dependía de la computadora en la cual se estuviera escribiendo un programa. Se basó en FLOW-MATIC.

ALGOL fue el primer lenguaje de programación con procedimientos, esto es que las instrucciones se pueden agrupar para que sean ejecutada una o varias veces, incluso los procedimientos pueden ser ejecutados para diferentes propósitos, imagine que necesita sumar, restar, dividir y multiplicar, mediante un procedimiento se puede solicitar la información al usuario, mediante otro ejecutar la operación y con un último devolver el resultado. Anteriormente la cosa no era tan sencilla, el código debía ser escrito para cada una de las tareas, lo cual hacía los programas largos e incluso difíciles de entender. En el caso de los lenguajes de alto nivel se le llama programación funcional y puede ser algo diferente, pero el concepto es básicamente el mismo.

También existen muchos otros conceptos, de los cuales se puede dar gusto leyendo en Wikipedia, no obstante existen algunos que nos van a servir para comenzar a trabajar en Bash, el cual es la programación estructurada, la cual únicamente utiliza tres rutinas o procedimientos para escribir los programas. Esto se hace con el fin de que los programas escritos en un lenguaje de programación no se vuelvan un infierno de instrucciones, ejemplo clásico a tomar es el de la instrucción “GOTO”. Esta instrucción permite que si se desea se mueva el programa a una parte determinada del programa, por ejemplo:

¿Tiene los ingredientes?
Si si tiene ir a línea Calendar
Si no tiene ir a la línea Comprar.
Calentar las tortillas hasta que estén suaves. Poner una cucharada de la carne en el centro y agregar tomate picado y limón. Agregar el chile picante.
Comprar en el supermercado los ingredientes, ir a ¿Tiene los ingredientes?

Supongamos que esto es muy sencillo y útil, pero imagine un montón de ir a en diferentes partes de la receta o un programa, entre mas largo y mas cantidad, más difícil será leerla, incluso será mas difícil predecir donde o cuando se ejecutar una instrucción.

entorno_de_programacion_bash.txt · Last modified: 2015/04/26 14:38
Public Domain Except where otherwise noted, content on this wiki is licensed under the following license: Public Domain