La Singularidad Desnuda

Un universo impredecible de pensamientos y cavilaciones sobre ciencia, tecnología y otros conundros

Archive for the ‘Programación’ Category

Carnaval en la CPU

Posted by Carlos en febrero 19, 2010

Mardi Grass on the CPU

ComicJK 357

Posted in Comic, Programación | Etiquetado: , , , | Comentarios desactivados

Navaja de Occam vs Profesor de Occam

Posted by Carlos en octubre 23, 2009

Si Occam hubiera sabido que se iba a dar su nombre a un lenguaje para la programación de transputers probablemente habría apreciado que el camino puede ser tanto o más divertido que el destino (y sí, eventualmente podías necesitar un destornillador).

Jorge Cham / PhDComics

Jorge Cham / PhDComics

Posted in Comic, Programación | Etiquetado: , , , | 1 Comment »

GOTO considerado dañino (muy dañino de hecho)

Posted by Carlos en junio 24, 2008

Si la resolución horizontal de la pantalla es de 1024 píxeles o inferior, hacer click en la imagen para ver cuán dañino puede ser un GOTO.

GOTO

Posted in Comic, Informática, Programación | Etiquetado: , , | 4 Comments »

C.A.R. Hoare cumple hoy 74 años

Posted by Carlos en enero 11, 2008

C.A.R. HoareHay dos formas de realizar un diseño software: hacer que sea tan simple que sea obvio que no tiene deficiencias, o hacer que sea tan complicado que no tenga deficiencias obvias. El primer método es más difícil.

C.A.R. Hoare (1934-), informático británico

Las “viejos cocodrilos” de la programación siguen cumpliendo años, y hoy le toca a Sir Charles Anthony Richard “Tony” Hoare, que cumple 74. A Hoare le debemos una de las joyas de la algorítmica, el algoritmo de ordenación quicksort, y el lenguaje formal CSP, en el que se basa Occam (lenguaje que en su día me dio tardes de gloria programando transputers). También desarrolló una lógica formal para verificación pre-post de algoritmos (qué tiempos aquellos, buscando invariantes en los bucles; luego vendría Dijkstra con su semántica de transformación de predicados y sus precondiciones más débiles). En 1980 recibió el premio Turing por “sus contribuciones fundamentales a la definición y diseño de los lenguajes de programación”. La frase del encabezado está tomada precisamente de su discurso de aceptación.

Hoare estuvo en 2005 en España, en el Primer Congreso Español de Informática, y dio una charla plenaria sobre software verificable. Se mostró en todo momento como una persona muy afable, y con toda amabilidad y la mayor de las sonrisas atendía a todo el que luego le buscaba para comentarle algo, o simplemente presentarle sus respetos. Sin duda, Sir C.A.R. Hoare es todo un caballero.

Posted in Algorítmica, Citas, Informática, Personajes, Programación | Etiquetado: , , | 4 Comments »

Donald Knuth cumple hoy 70 años

Posted by Carlos en enero 10, 2008

Donald E. Knuth

“Ciencia es aquello que conocemos lo suficientemente bien para explicárselo a un computador. El resto de lo que hacemos es Arte.

Donald Ervin Knuth (1938-), informático estadounidense

Hoy cumple 70 años Donald E. Knuth, uno de los padres fundadores de la algorítmica. A él debemos The Art of Computer Programming y el TeX, gracias al cual toda la comunidad científica no está a estas horas en las manos de Microsoft Word. Además de científico genial, Knuth siempre ha tenido un humor y un punto geek fantásticos. Por ejemplo, la versión i-ésima de TeX se identifica con la expansión en i dígitos de π, al igual que hace con METAPOST y el número e. También tiene la ocurrencia de emitir cheques por 2.56$ (1 dólar hexadecimal) a favor de quien encuentre un error en algún libro suyo (estos cheques son un trofeo cotizadísimo).

Su padre tenía una imprenta, y por ahí quizás venga el desarrollo de TeX, y su obsesión por la tipografía, que le ha hecho afirmar que no puede ir a comer a un restaurante, ya que no deja de mirar las fuentes tipográficas de la carta del menú. De todas formas, además de con la cita de más arriba, me quedo con otra suya sobre las matemáticas:

“¡Una fórmula matemática no debería ser nunca propiedad de nadie! Las matemáticas pertenecen a Dios.”

y con otra bastante irónica sobre la verificación formal:

Ten cuidado con este código. He demostrado su corrección, pero no lo he llegado a probar.”

{\cal FELICIDADES} , Profesor Knuth.

Posted in Algorítmica, Citas, Geek, Informática, Personajes, Programación | Etiquetado: | 11 Comments »

¿Puede un biólogo arreglar un tamagotchi?

Posted by Carlos en mayo 11, 2007

TamagotchiAyer comentábamos la ácida crítica que el Prof. Yuri Lazebnik hacía de la metodología dominante en el área de la biología de sistemas, y que ilustraba con una analogía a la reparación de una radio. La opinión del Prof. Lazebnik es que deben llegarse a conocer las redes de interacciones con la misma precisión que se conocen los circuitos eléctricos. Es indudable que tal objetivo es deseable, pero ¿es la meta final? Parece que no, tal como muy apropiadamente ilustra el Dr. Luca Cardelli -empleado actualmente en Microsoft- con otra analogía: ¿puede un ingeniero eléctrico arreglar un reproductor MP3, o un teléfono móvil que no recibe email? La respuesta es: muy probablemente, no. El funcionamiento de estos dispositivos no puede ser descrito convenientemente en forma de circuitos eléctricos, ya que una parte significativa (en algunos casos la más significativa) no es electrónica, sino programación. Esta analogía es especialmente interesante, si se interpreta que el material genético de un ser vivo es esencialmente un tipo de software, y que éste controla el funcionamiento del sistema (los seres vivos más simples -los virus- serían entonces de hecho puramente software).

El Dr. Cardelli explora esta situación, pero desde un prisma ligeramente distinto, en un artículo titulado

publicado en el Gilles Kahn Colloquium en enero de este año. La idea básica es considerar un organismo tecnológico, ya que esta elección asegura que el sistema que se quiere analizar fue creado mediante ingeniería directa, lo que en principio hace potencialmente factible la ingeniería inversa, tal como sería el objetivo biológico. El organismo en cuestión es un tamagotchi, que para ponernos en un contexto biológico denominaremos Tamagotchi Nipponensis. A la hora de abordar el estudio del T. Nipponensis mediante el método científico, hay diferentes enfoques que se pueden seguir: (1) comprender los principios de funcionamiento del sistema, (2) comprender su mecanismo, (3) comprender su comportamiento, (4) comprender su entorno, (5) comprender su matemática. Todos estos enfoques fallan, ya que el hadware del sistema es relativamente simple, muy compacto, muy interrelacionado, su comportamiento es estocástico, su entorno original (la sociedad japonesa) es muy compleja, y su matemática es externamente inaprehensible.

¿Cómo puede entenderse el T. Nipponensis? Lógicamente, hace falta examinar su software, y realizar ingeniería inversa de éste. Esto quiere decir que hay que trazar el código, definir puntos de ruptura, hacer volcados de memoria, análisis de paquetes de comunicaciones, etc. La analogía con la realidad biológica se cierra si consideramos que la genómica sería la recuperación del código objeto, la transcriptómica sería trazar el estado de la pila del sistema, la proteómica sería la realización de volcados de memoria, la metabolómica sería el estudio de la fuente de alimentación y el tamaño del heap, y la biología de sistemas sería el estudio del tráfico de comunicaciones. Sin embargo, el análisis no parece que sea muy factible si nos dedicamos a sacar promedios de millones de volcados en memoria, o a eliminar líneas de código una a una para ver qué pasa.

La conclusión debe ser que -como dijo Einstein- la Naturaleza es sutil, pero no maliciosa, por lo que el software estará encriptado para que sea difícil de modificar, no para que sea difícil de entender. La tarea no va a ser fácil en cualquier caso.

Enviar a Blog Memes Enviar a del.icio.us Enviar a digg Enviar a fresqui Enviar a menéame

Posted in Biología Molecular, Ciencia, Programación | 2 Comments »

Un fallo de punteros acabó con la Mars Global Surveyor

Posted by Carlos en abril 14, 2007

Cuando hace poco más de cinco meses la Mars Global Surveyor perdió contacto con la Tierra, La NASA formó un comité interno para estudiar las causas. Los resultados del informe se hicieron públicos ayer mismo, reconstruyendo la cadena de eventos que dieron lugar a la pérdida final de la sonda. A grandes rasgos, el error crítico que desencadenó todo fue un fallo en la escritura en memoria de la nave, que tuvo lugar al intentar corregir un error no-crítico anterior. Básicamente, la situación fue la siguiente:

  • Los sistemas de la nave están deseñados con redundancia, precisamente para hacerla más robusta ante posibles fallos de equipamiento o de programación. Así por ejemplo, los parámetros de control de la sonda se almacenan por duplicado, y cualquier inconsistencia entre las dos copias dispara una alerta de seguridad. Uno de estos parámetros hace referencia a la orientación de una de las antenas de la sonda (HGA), y se actualizó en septiembre de 2005 en dos momentos diferentes cada una de las dos copias. Durante este proceso, los datos se introdujeron con diferente precisión en cada ocasión. La diferencia era en la práctica irrelevante y no conllevaba ningún peligro, pero fue detectada por los sistemas de seguridad por lo que fue necesaria una actualización en junio de 2006. Durante la misma tuvo lugar el error crítico: el valor corregido se escribió en una dirección de memoria incorrecta. Esto afectó a los límites de seguridad de los paneles solares, y corrompió la dirección en la que debía apuntar la HGA durante una contingencia.
  • En noviembre de 2006 se mandaron instrucciones rutinarias a la sonda para reposicionar uno de sus paneles solares, pero la corrupción en el límite de seguridad hizo que el panel girará hasta el límite físico. En ese momento, la sonda interpretó que uno de los paneles estaba atascado por lo que entró en modo de contingencia con tan mala fortuna que una de las baterías quedó expuesta directamente al Sol. Dicha batería se sobrecalentó, lo que fue nuevamente erróneamente interpretado como una sobrecarga, lo que condujo a que se interrumpiera su recarga, y se pasara a la batería de reserva. Ésta no pudo soportar toda la carga eléctrica de la sonda, por lo que en un plazo de 12 horas ambas baterías se descargaron completamente.
  • Aunque la sonda esta orientada correctamente hacia la Tierra, la dirección en la que la HGA debía apuntar en ese caso estaba corrompida, por lo que fue imposible la comunicación con el equipo de seguimiento en tierra, y la detección de las falsas alarmas.

Como puede verse, la cadena de eventos fue realmente desafortunada, y aunque se parte de un fallo de programación, el informe de la NASA afirma que se siguieron los protocolos y procedimientos correctamente. No se culpa directamente a la reducción del presupuesto, pero sí se dice que con más medios quizás hubieran sido posibles revisiones periódicas que hubieran detectado el fallo antes de que se produjera.

Mars Global Surveyor

Sea como fuere, este lamentable accidente pone fin a una misión de 10 años, cinco veces más de los dos años iniciales planeados. Fue precisamente el valor científico de los datos proporcionados por la sonda lo que motivó que se extendiera tanto la misión. Cuando se habla de sacarle valor al dinero invertido en el programa espacial, sin duda esta misión ha de ser uno de los ejemplos. Al margen de esto, hay una moraleja doble para los estudiantes de informática: (1) hasta los ingenieros de la NASA comenten errores con los punteros, y (2) si queremos algún día conquistar el espacio, ¡estudia bien los punteros for favor!

Enviar a Blog Memes Enviar a del.icio.us Enviar a digg Enviar a fresqui Enviar a menéame

Posted in Astronáutica, Programación | Etiquetado: , , , | 21 Comments »

Adios a John Backus

Posted by Carlos en marzo 21, 2007

John BackusCreo que los lenguajes de programación convencionales son para los pájaros. Son sólo extensiones de la máquina de von Neumann, y mantienen nuestras narices a ras de suelo, tratando con palabras individuales y direcciones de memoria, y todo tipo de estupideces como esas.

John Warner Backus (1924-2007) , matemático e informático estadounidense

El pasado sábado 17 de marzo nos dejó John Backus, unas de las personas que más ha contribuido a que la informática en general, y la programación en particular sean lo que hoy en día conocemos. Y es que ni más ni menos fue la persona que ideó el primer lenguaje de programación de alto nivel, diseño el primer compilador, y formalizó la notación que hoy en día empleamos para describir lenguajes de programación.

Backus nació en 1924 en el seno de una familia acomodada. Empezó a estudiar química sin mucho éxito, y tras la II Guerra Mundial intentó estudiar medicina, de nuevo sin éxito. Según él, los estudios de medicina se basaban exclusivamente en la memorización, y se penalizaba el pensamiento propio. La afirmación era sin duda exagerada, pero dejaba patente el tipo de estudios que prefería Backus: las ciencias exactas. De hecho, no tardaría en matricularse en matemáticas, y pocos meses antes de graduarse, en la primavera de 1949, ocurrió una de esas anécdotas que cambian el curso de la Historia.

Backus visitó las oficinas centrales de IBM en Nueva York para ver el SSEC (Selective Sequence Electronic Calculator), un computador electromecánico recién construido, y puntero para la época. Durante la visita le comentó a la guía que era estudiante de matemáticas y que buscaba trabajo. La guía insistió entonces en que fuera a ver a Rex Seeber, uno de los inventores del SSEC. Backus se negaba, ya que como luego recordaría:

No llevaba corbata, mi chaqueta tenía un agujero en la manga, y no sabía nada de computadores.

La insistencia de la guía hizo que finalmente fuera recibido por Seeber que le sometió a un interrogatorio a base de -según diría el propio Backus- rompecabezas matemáticos, como si de un examen oral se tratara. Dicho examen fue realmente satisfactorio, ya que fue contratado de inmediato. “¿Para qué puesto?” -preguntó Backus- “De programador” fue la respuesta.

La programación del SSEC no era simple, y se realizaba a base de tarjetas perforadas. Durante los tres años que permaneció en ese puesto, Backus perfeccionó un programa llamado Speedcoding que permitía usar un factor de escala para manipular números grandes o pequeños (el punto flotante). A finales de 1953 preparó una propuesta para el nuevo computador que iba a sacar IBM (el 704): un lenguaje de programación que permitiera sacar el máximo partido de él. IBM aceptó la propuesta, y Backus creó un equipo para llevarla a cabo. No sólo había que diseñar el lenguaje, sino también un mecanismo para que los programas escritos en ese lenguajes fueran traducidos a algo que la máquina entendiera. Ambas cosas fueron conseguidas. El lenguaje diseñado fue llamado FORTRAN (FORmula TRANslating System), el primer lenguaje de programación de alto nivel (o al menos, el primero que tuvo popularidad). En cuanto al mecanismo de traducción, fue un programa de 25,000 líneas en código máquina que se distribuía con cada unidad IBM 704: había nacido el primer compilador.

El resto es historia. Participó en el desarrollo de los lenguajes de programación ALGOL 58 y ALGOL 60, y junto con Peter Naur propuso una notación para la representación de las gramáticas usadas en la definición de un lenguaje de programación (las llamadas gramáticas libres de contexto): la notación BNF. Poco a poco creció en él el rechazo hacia el paradigma de programación imperativo, hasta el punto de que cuando en 1977 le fue concedido el Premio Turing (el Nobel de la informática), el título de su disertación fue “¿Es posible liberar a la programación del estilo de von Neumann?“. Hay quien interpreta esto como una especie de disculpa por haber creado FORTRAN, uno de los baluartes de la programación imperativa. La propuesta alternativa de Backus nunca tuvo éxito, pero renovó el interés por la programación funcional en general.

Con Backus se ha ido no uno de los grandes, sino uno de los gigantes de la informática. Su legado permanecerá sin embargo siempre con nosotros.

Enviar a Blog Memes Enviar a del.icio.us Enviar a digg Enviar a fresqui Enviar a menéame

Posted in Citas, Informática, Personajes, Programación | 4 Comments »

La esencia del Universo…

Posted by Carlos en marzo 12, 2007

…no es sólo 42: también está Perl.

Esencia del Universo

Enviar a Blog Memes Enviar a del.icio.us Enviar a digg Enviar a fresqui Enviar a menéame

Posted in Comic, Geek, Nanoposts, Programación | Etiquetado: , | 7 Comments »

Algoritmos exquisitos y programación deliciosa en el lenguaje CHEF

Posted by Carlos en febrero 6, 2007

Cuando se comienza a estudiar programación, suele ser muy socorrido recurrir a una analogía con una receta de cocina para dar una primera idea informal de lo que se entiende por algoritmo. Acto seguido, se dan definiciones más precisas, y uno se puede adentrar en las maravillas de las máquinas de Turing, y quién sabe si incluso del lambda-cálculo. Sin embargo, no sólo es una pena abandonar una analogía tan gratificante como la de la receta de cocina, sino que es algo de hecho innecesario. Mediante el lenguaje de programación CHEF, podemos dar nuestros primeros pasos en el delicioso mundo de la programación, a la vez que profundizamos en el arte milenario de la cocina.

CHEF es un lenguaje cuyos programas tienen la estructura de una receta de cocina. Los elementos básicos del lenguaje son los ingredientes, que tienen el rol de variables, y los recipientes (platos y cuencos), que actúan como estructuras de datos de tipo pila (aunque con algunas operaciones adicionales a las habituales en las mismas). Todo programa comienza con el nombre de la receta, y va seguido de la lista de ingredientes (declaración de variables, con posibilidad de indicar un valor inicial), y del método del preparación (cuerpo principal del algoritmo). Dentro de este último, disponemos de diferentes acciones para insertar/extraer ingredientes de los cuencos, o para alterar sus valores. Por ejemplo (traduzco las instrucciones del inglés):

  • Tomar <ingrediente> del refrigerador: lee un valor desde teclado, y lo almacena en ingrediente.
  • Poner <ingrediente> en el [n-ésimo] cuenco: introduce el valor del ingrediente en el tope de la pila indicada.
  • Añadir|Quitar <ingrediente> en el [n-ésimo] cuenco: suma|resta el valor del ingrediente al valor que haya en el tope de la pila indicada.
  • Combinar|Dividir <ingrediente> en el [n-ésimo] cuenco: multiplica|divide el valor del ingrediente al valor que haya en el tope de la pila indicada.
  • Vertir contenidos del [n-ésimo] cuenco en el [m-ésimo] plato: copia los elementos de una pila en otra.
  • Servir para k comensales: muestra en pantalla k valores, sacados en orden del primer plato, luego del segundo si hace falta, etc.

Además de estas operaciones básicas, existe una construcción iterativa general, que permite simular bucles de tipo while-endwhile. Concretamente, cuando nos encontramos una acción del tipo <verbo> <ingrediente> (donde el verbo puede ser cualquiera que no sea una de las palabras reservadas) comenzamos un bucle while condicionado a que el valor de ingrediente sea mayor que cero. El fin del bucle se marca con una acción del tipo <verbo> [<ingrediente>] hasta que esté <adjetivo>. Nuevamente, el verbo y el adjetivo (típicamente un participio) indicados son arbitrarios, y en caso de indicarse un ingrediente su valor se decrementa en uno antes de volver al comienzo del bucle.

Con estos elementos tenemos suficiente para confeccionar exquisitos programas, como el Suflé Hola Mundo (bueno como entrante), o el Fibonacci Al Dente (un segundo plato adecuado). Yo he optado por completar el menú con un postre casero que casa muy bien con lo anterior: Factorial con Fresas y Nata. He aquí la receta:

Factorial con Fresas y Nata.

Esta receta calcula el factorial del número que se le indique. Un postre perfecto que combina muy bien con Fibonacci al Dente, o con solomillo Ackermann.

Ingredientes.
1 kg fresas de Lepe
nata montada

Método.
Tomar nata montada del refrigerador.
Poner fresas de Lepe en el cuenco.
Agitar la nata montada.
Combinar nata montada en el cuenco.
Esparcir la nata montada hasta que esté homogénea.
Vertir contenido del cuenco en el plato.

Servir para un comensal.

Como puede apreciarse, el valor cuyo factorial queremos calcular se almacena en la nata montada. El bucle principal está entre “agitar la nata montada” (mientras su valor sea mayor que cero) y “esparcir la nata montada hasta …” (decrementar su valor y volver al comienzo del bucle). Este lenguaje nos abre infinitud de novedosos paradigmas de programación, como por ejemplo la programación mediterránea, una combinación estructurada de funciones de la huerta y variables de mar, regado con bucles de oliva y procedimientos tintos. La programación sigue siendo un delicioso arte. ¡Buen apetito!

Enviar a Blog Memes Enviar a del.icio.us Enviar a digg Enviar a fresqui Enviar a menéame

Posted in Geek, Programación | 8 Comments »