Sitios como DZone, agregadores de noticias donde cada día pueden encontrarse cientos de artículos técnicos sobre desarrollo y tecnología, demuestran que por algún motivo los artículos tipo lista o ranking venden bastante, o al menos atraen la atención de muchos lectores. Y me refiero a aquellos artículos cuyo título comienza con frases como “Los 10 lenguajes que más…”, “Los 5 motivos por los que…”, y similares. Esta mañana yo mismo os pasaba un enlace a un artículo donde se publicaba una lista de los 10 lenguajes de programación más extraños, y como éste se pueden encontrar cientos de todas las formas y colores, hoy día parece que la gente confecciona listas y rankings para todo.

Pero entre todos ellos, hoy he encontrado una lista que me ha hecho tirarme de los pelos. Atención al título: “Los 10 libros que podrían sustituir a una carrera de Ingeniería Informática” [enlace al artículo original]. Y la lista es la siguiente:

  • Godel, Escher, Bach. Douglas Hofstadter
  • The Art of Computer Programming. Donald Knuth
  • The Elements of Programming Style. Brian W. Kernighan y P. J. Plauger
  • Theory of Parsing, Translation and Compiling. Alfred V. Aho y Jeffrey D. Ullman
  • The Computer and the Brain. John von Neumann
  • A Programming Language. Kenneth E. Iverson
  • Writing Efficient Programs. Jon Louis Bentley
  • Computation: Finite and Infinite Machines. Marvin L. Minsky
  • Operating System Principles. Per Brinch Hansen
  • Artificial Intelligence. Elaine Rich

En mi humilde opinión, de esta lista sustituiría alguno que otro y añadiría algunos más, como por ejemplo:

  • Modern Operating Systems. Andrew S. Tanenbaum
  • Operating Systems: Design and Implementation. Andrew S. Tanenbaum
  • Compilers: Principles, Techniques, and Tools” (conocido tradicionalmente como el Dragon Book). Alfred V. Aho, Ravi Sethi y Jeffrey D. Ullman
  • Design Patterns: Elements of Reusable Object-Oriented Software. Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides, conocidos de forma histórica como GOF o Gang of Four).

De cualquier forma, y éste es el verdadero motivo impulsor de mi artículo, creo que todo aquel que haya obtenido una titulación universitaria debe tener claro que ni la mayor y mejor seleccionada lista de libros del mundo podría sustituir, ni de lejos, a todo lo conseguido junto a un título. Y no me refiero a los conocimientos púramente técnicos, sino a todo lo demás.

Un libro es un medio de comunicación unidireccional, y aunque obviamente puede aportar enormes cantidades de información, nunca podrá sustituir al diálogo, a la discusión de alternativas, a los diferentes puntos de vista de un grupo, a la aplicación práctica de conocimientos teóricos… aspectos éstos tan importantes para fomentar por ejemplo la innovación, algo vital cuando se aplica al campo concreto de la informática. En definitiva un título universitario no sólo es un papel, ni siquiera un conjunto de conocimientos, sino un conjunto de experiencias que no caben entre las páginas de papel de un libro.

En resumen, es una gran lista que cubre muchos pilares básicos de la informática y la recomiendo personalmente, pero no reduzcamos a una simple lista lo que muchos hemos tenido que sudar durante años.

A quien pueda interesar, en los comentarios del artículo original en inglés se proponen algunos libros más, os los paso para completar la lista:

  • Structure and Interpretation of Computer Programs. Harold Abelson y Gerald Jay Sussma
  • The Mythical Man-Month. Fred Brooks
  • Introduction to Algorithms. Cormen, Leiserson, Rivest y Stein
  • Artificial Intelligence: a Modern Approach. Russell and Norvig
  • Object-Oriented Software Construction. Bertrand y Meyers
  • Code Complete. Steve McConnell
  • Refactoring. Martin Fowler

Ideas para completar vuestra biblioteca personal no os van a faltar.

, , ,

A través del blog de Jorge Serrano me entero de un libro gratuito en pdf sobre ADO.NET Entity Framework, la nueva tecnología de acceso a datos que, junto a LINQ, quiere institucionalizar Microsoft como parte de sus servicios de datos dentro del .NET Framework.

ADO.NET Entity Framework es la propuesta de Microsoft dentro del campo de los ORM (object-relational mapping) y se incluyó como parte del .NET Framework 3.5 SP1. Aunque su uso no está todavía demasiado extendido la experiencia con otras tecnologías de este tipo (y más cuando vienen de la mano de Microsoft) nos dice que acabará convirtiéndose en poco tiempo en un marco de trabajo de referencia dentro del mundillo .NET. Por tanto, nunca está de más aprender un poco sobre su filosofía, funcionamiento y forma de trabajo.

El autor del libro es Zeeshan Hirani, y podemos descargarlo de forma gratuita accediendo a su blog o mediante los siguientes enlaces directos:

Espero que os sea de utilidad. Saludos.

, , , , ,

La empresa Red Gate, muy conocida por ser la desarrolladora de uno de los mejores profilers para .NET (ANTS Profiler) y también por ser la actual dueña del famosísimo .NET Reflector, está ofreciendo de forma gratuita el libro Illustrated C# 2008, de Daniel Solis.

Entre los contenidos de este libro podemos encontrar una completa referencia técnica del lenguaje C#, que abarca desde los conceptos más básicos hasta temas más avanzados como LINQ o el desarrollo de aplicaciones multihilo y programación asíncrona.

Para descargar gratis el libro en formato PDF podéis acceder a la oferta de Red Gate o utilizar el siguiente enlace directo [descarga gratuita].

Un libro más para la colección.

, , , , ,

Algunos recursos con información valiosa sobre ASP.NET MVC:

  • La propia web oficial de ASP.NET MVC, con gran cantidad de información, tutoriales, videos, ejemplos…
  • La documentación oficial de ASP.NET MVC en MSDN.
  • Una lista de 10 cuestiones básicas sobre ASP.NET MVC que pueden ayudar a aclarar algunas dudas iniciales [Edito: Actulización de la lista de preguntas para la versión ASP.NET MVC 1.0].
  • Una serie de artículos de Scott Guthrie en cuatro entregas [1, 2, 3, 4].
  • Recordar también que el propio Scott Guthrie publicó en su blog hace unos días un fantástico tutorial de 185 páginas sobre ASP.NET MVC que forma parte del libro Professional ASP.NET MVC y cuyo enlace de descarga podéis encontrar en la entrada que dedicamos a dicha noticia.
  • Otro buen recurso de información sobre ASP.NET MVC es el ASP.NET MVC Training Kit publicado por Microsoft, que contiene entre otros Hand On Labs, demos y presentaciones sobre el framework.
  • Como utilizar ejemplos es casi siempre la mejor forma de aprender, os paso también una lista de aplicaciones de ejemplo [open source] construídas con ASP.NET MVC.
  • Y por último un par de artículos sobre consejos o buenas prácticas a la hora de utilizar ASP.NET MVC que pueden ayudarnos a hacer menos laboriosas algunas tareas.

Suficiente por el momento para comenzar a utilizar este fantástico framework.

, , , , ,

Scott Guthrie, responsable en Microsoft de tecnologías como ASP.NET y Silverlight, acaba de publicar en su blog un documento sobre ASP.NET MVC al que puede resultar interesante echar un vistazo.

Se trata del primer capítulo del libro Professional ASP.NET MVC 1.0, publicado recientemente por la editorial Wrox, donde a modo de tutorial paso a paso se detalla la construcción de una aplicación web completa (llamada NerdDinner) utilizando esta tecnología.

El contenido de este “capítulo” de 185 páginas es realmente completo, comentando todo el proceso de construcción de la aplicación, desde la creación del proyecto en Visual Studio, pasando por la creación del modelo, la base de datos, los controladores y vistas, las master pages, los procesos de autenticación y autorización, las partes AJAX, … hasta las pruebas unitarias y el despliegue de la aplicación.

Encontraréis más información y los enlaces de descarga en la entrada de su blog. Si queréis descargar directamente el PDF podéis hacerlo desde estos enlaces: Libro y Código fuente y Pruebas Unitarias.

Edito 06/05/2009: A partir de ahora el libro también puede consultarse de forma online en la siguiente dirección [Libro Online: Professional ASP.NET MVC 1.0].

, , , , , ,

Ya hemos hablado alguna vez de estructuras de datos en C#. Hoy le toca el turno a un libro gratuito en PDF que trata este mismo tema. El libro en cuestión se llama Data Structures and Algorithms y como su propio nombre indica consta de dos partes principales, en la primera de ellas se discuten multitud de estructuras de datos habituales [y no tan habituales] y se propone una implementación en pseudocódigo para cada una de ellas, y en la segunda se describen varios tipos de algoritmos básicos que pueden resultar interesantes en algunos ámbitos.

Las estruturas de datos tratadas son las siguientes: lista enlazada (linked list), árbol binario de búsqueda (binary search tree), montículo (heap), cola (queue), conjunto (set) y árbol AVL (AVL tree). Además de las estructuras básicas también se describen muchas de sus variantes (como por ejemplo listas doblemente enlazadas, conjuntos ordenados, colas de prioridad…) y las operaciones habituales sobre estas estructuras (inserción, borrado, búsqueda, recorrido…).

Por otro lado, los tipos de algoritmos descritos son éstos: algoritmos de ordenación, algortimos de búsqueda, algoritmos numéricos (test de primalidad, conversiones de base, …) y algoritmos sobre cadenas de caracteres.

En general, me parece un libro bastante bien estructurado con un contenido bien planteado y, aunque se olvida de algunas estructuras de datos y algunos algoritmos básicos bastante habituales, puede servir como referencia a la hora de hacer memoria sobre todos aquellos temas clásicos de algoritmia que aprendimos durante nuestros años de facultad.

, , , , ,

Para comenzar con las entradas sobre inteligencia artificial hoy os paso el enlace a un libro gratuito sobre inteligencia artificial en java. Este libro nos llega de la mano de Mark Watson y trata el tema desde un punto de vista completamente práctico, presentando las distintas herramientas java y recursos disponibles en el ámbito de cada uno de los conceptos tratados.

Los contenidos del libro son los siguientes:

  1. Técnicas de búsqueda
  2. Razonamiento automático con PowerLoom
  3. Web semántica con RDF, SPARQL, Sesame, OWL…
  4. Sistemas expertos con Drools
  5. Algoritmos genéticos
  6. Redes neuronales
  7. Aprendizaje automático con Weka
  8. Procesamiento de lenguaje natural con WordNet, JAWS…
  9. Extracción de información con Open Calais, Lucene…

El libro [en inglés] se encuentra en formato PDF y se distribuye gratis, bajo licencia Creative Commons, desde la siguiente web:

Mark Watson’s Open Content Free Books

Sin duda, un buen recurso al que merece la pena echar un vistazo y tenerlo como buen punto de partida en el uso de algunas herramientas java relacionadas con la inteligencia artificial.

, , , , ,

Introducción a ANTLR v3

Esta entrada forma parte de una serie de artículos dedicados al proyecto FKScript, construcción de un compilador y una máquina virtual para un lenguaje de script con C# y ANTLR, entre los cuales podrás encontrar una descripción detallada de cada módulo, documentación técnica, ejemplos y tutoriales de uso que pueden ser de tu interés. No olvides consultar la página principal de FKScript para más información.

Tomando la definición de su propia web, ANTLR es una herramienta que proporciona un marco de trabajo para la construcción de reconocedores, intérpretes, compiladores y traductores de lenguajes a partir de gramáticas enriquecidas con acciones. En resumen proporciona todo lo necesario para el desarrollo de este tipo de sistemas, entre los más importantes:

  • Construcción de analizadores léxicos.
  • Construcción de analizadores sintácticos.
  • Mecanismos de construcción y recorrido de árboles de sintaxis abstracta (AST).
  • Mecanismos de tratamiento de plantillas.
  • Mecanismos de detección y recuperación de errores.

Como ventajas adicionales que diferencian a ANTLR de otras herramientas similares podemos citar la posibilidad de generar el código de salida en diferentes lenguajes como Java, C, C++, C# o Python, y el hecho de disponer de un entorno de desarrollo propio llamado ANTLRWorks que nos permitirá construir de una forma bastante amigable las gramáticas de entrada a la herramienta, proporcionando representaciones gráficas de las expresiones y árboles generados, e incluyendo un intérprete y depurador propio.

Como recursos para empezar a conocer esta herramienta recomiendo los siguientes:

A medida de avancemos en la construcción de nuestro sistema de scripts trataré de ir comentando muchas de las posibilidades que ofrece ANTLR para el desarrollo de cada módulo, publicando ejemplos y por supuesto los fuentes completos del sistema.

, , , , ,

Esta entrada forma parte de una serie de artículos dedicados al proyecto FKScript, construcción de un compilador y una máquina virtual para un lenguaje de script con C# y ANTLR, entre los cuales podrás encontrar una descripción detallada de cada módulo, documentación técnica, ejemplos y tutoriales de uso que pueden ser de tu interés. No olvides consultar la página principal de FKScript para más información.

Información Proyecto FKScript

Esta página contiene información sobre el documento “Proyecto FKScript – Implementación mediante ANTLR y C# de un compilador y una máquina virtual para un lenguaje de script sencillo“. Puede visitar la página del proyecto para más información.

Introducción al documento

Mis primeros pasos en el mundo de las herramientas de generación de compiladores fueron con Flex y Bison (versiones GNU de Lex y Yacc). Estas herramientas, aunque potentes, resultaban algo tediosas de utilizar tanto por sus características intrínsecas como por el código generado, en lenguaje C. A pesar de todo, mis primeros trabajos con estas herramientas me proporcionaron enormes conocimientos sobre este bonito campo del desarrollo de software, aunque eso sí, pasando por muchas dificultades durante el aprendizaje debido a la falta de documentación en español sobre la generación de procesadores de lenguaje y sobre las herramientas concretas utilizadas en el proceso.

Más tarde, mis comienzos con ANTLR (allá por la versión 2.7) no fueron mejores. Me fascinaba un artilugio que unificara en una sola herramienta todos los procesos de generación de un compilador: el análisis léxico y análisis sintáctico mediante autómatas LL, la generación y recorrido de árboles de sintaxis abstracta (AST) para el análisis semántico, y la generación de código tradicional o mediante plantillas (templates), todo con una sintaxis común y con una integración total entre todos los módulos sin tener que recurrir a herramientas de terceros o desarrolladas ad hoc. Sin embargo, la curva de aprendizaje para ANTLR resultó más pronunciada de lo esperado, ya no por la falta de documentación técnica de referencia (extensa pero en inglés) sino por la falta de documentación práctica, es decir, documentación sobre cómo enfocar el desarrollo de un traductor o compilador con esta nueva herramienta.

Por aquel entonces un compañero de promoción realizó como proyecto fin de carrera un fantástico estudio de la versión 2.7.2 de ANTLR (ANTLR v2), abordando el tema desde un punto de vista completamente práctico, es decir, desarrollando desde cero un compilador para un lenguaje relativamente sencillo aunque bastante completo. Este trabajo resultó ser un recurso inmejorable de información útil sobre ANTLR 2.

Sin embargo, con la llegada de ANTLR v3 todo volvió a cambiar. La documentación de la versión anterior había quedado obsoleta ya que los cambios entre una versión y otra son notables, la documentación pública y gratuita de la versión 3 brillaba por su ausencia (aunque poco a poco se va incrementando en forma de wiki, por supuesto en inglés) y el único documento estructurado con información sobre la herramienta era el libro “The Definitive ANTLR Reference: Building Domain-Specific Languages” del propio autor de ANTLR, Terence Parr. Y por supuesto que recomiendo adquirir el libro a todo aquel que esté realmente interesado en conocer a fondo ANTLR, pero no deja de ser una fuente de información que no está al alcance de todos de forma gratuita como cabría esperar de una herramienta de código libre como es ANTLR (licencia BSD).

Y aquí es precisamente donde pensé que podría aportar mi granito de arena a todo este asunto. Aprovechando un proyecto personal en el que hacía uso de ANTLR v3 para generar el procesador de un pequeño lenguaje de script decidí escribir un pequeño documento sobre el desarrollo de un compilador para un lenguaje aún más pequeño. Un lenguaje sin complicaciones innecesarias, lo más básico posible para no perdernos en explicaciones. Un documento para comenzar a conocer ANTLR 3 y saber cómo empezar a aplicarlo al desarrollo de un compilador y una máquina virtual sencillos utilizando como lenguaje base C#. En definitiva, algo que asiente las bases necesarias para, a partir de ahí, poder seguir profundizando en el tema todo lo que se desee.

Y así nace este documento que aún no sé cómo llamar: libro de ANTLR 3, manual de ANTLR 3, tutorial de ANTLR 3, guía práctica de ANTLR 3… quizá documentación práctica de iniciación a ANTLR 3 con C#.

¿A quiénes está dirigido este tutorial? Pues en principio a cualquiera que quiera conocer los entresijos básicos de un sistema como el que se pretende construir, y que desee utilizar como herramientas de apoyo ANTLR 3 y C#. Sin embargo, aunque al principio del documento se intenta describir una foto del proceso general que siguen estos sistemas, ayudará mucho conocer al menos unos principios básicos de construcción de compiladores y máquinas virtuales. En cuanto a ANTLR v3, en este manual no se describen sus características generales por lo que se recomienda consultar documentación adicional si aún no se ha tenido ningún contacto con la herramienta. Serán de mucha utilidad conocimientos previos sobre otras herramientas de generación de compiladores (como Flex/Bison, Lex/Yacc, JavaCC…), ya que aunque sus principios no coincidan con los de ANTLR, sí que compartirán muchos conceptos comunes.

¿Qué pretendemos construir? Los requerimientos a grandes rasgos del lenguaje de script y la máquina virtual que pretendemos implementar durante esta guía son los siguientes:

  • El programa principal se escribirá en un solo fichero y estará formado por una sola función principal, es decir, no será necesario la implementación de llamadas a funciones internas (aunque no se descarta su inclusión en futuras versiones).
  • Las variables del lenguaje tendrán un tipo declarado de forma explícita y se deberá comprobar en tiempo de compilación que han sido declaradas y que sus tipos concuerdan dentro de una expresión o una asignación. •
  • Deberán existir los siguientes tipos de datos: entero, real, lógico y cadena.
  • El lenguaje deberá proporcionar las instrucciones clásicas: asignaciones, condicionales y bucles.
  • El lenguaje deberá proporcionar las expresiones aritméticas y lógicas básicas.
  • La máquina virtual se debe poder integrar fácilmente con cualquier aplicación que exponga una API, y desde el programa script se podrá interactuar con esta aplicación mediante llamadas a las funciones de esta API.

El sistema se escribirá completamente en C# y estará formado por los siguientes módulos:

  1. Un compilador que transformará el código script a un lenguaje intermedio.
  2. Un ensamblador que generará el fichero binario ejecutable a partir del código intermedio.
  3. Una máquina virtual capaz de ejecutar el fichero generado por el ensamblador.

ANTLR será usado para construir el compilador, que estará formado a su vez por los analizadores léxico y sintáctico, un analizador semántico para el cálculo y comprobación de tipos, y un generador de código a partir del árbol de sintaxis abstracta (AST) construido durante las fases anteriores. Por su parte, tanto el ensamblador como la máquina virtual se escribirán sin utilizar ninguna herramienta de apoyo, dado que son relativamente sencillos de implementar.

Descarga

El documento puede ser libremente descargado y distribuido bajo los términos de la licencia Creative Commons que se expone en el siguiente apartado.

Enlace de descarga: Libro Proyecto FKScript (v0.1) (Formato PDF – 285 Kb)

Licencia

Este trabajo y su código fuente asociado se distribuyen bajo una licencia de Creative Commons.

Tabla de Contenidos

  1. Introducción al Proyecto
  2. Introducción ANTLR
  3. Proceso General FKScript
  4. Análisis Léxico y Sintáctico de FKScript
    1. Análisis léxico
    2. Análisis sintáctico
    3. Recuento y reporte de errores
    4. Construcción del AST
    5. Construcción de la tabla de símbolos
    6. Finalizando el analizador léxico-sintáctico
  5. Análisis Semántico de FKScript
    1. Tareas del análisis semántico
    2. Enriqueciendo los nodos del árbol AST
    3. Implementación del analizador en ANTLR v3
    4. Cálculo y chequeo de tipos
    5. Programa principal
  6. Generación de Código de FKScript
    1. Máquina virtual FKVM
    2. Primeros pasos
    3. Generación de código para literales e identificadores
    4. Generación de código para expresiones aritméticas
    5. Generación de código para expresiones lógicas
    6. Generación de código para asignaciones
    7. Generación de código para instrucciones condicionales y bucles
    8. Generación de código para el programa principal FKIL
    9. Programa principal
  7. Ensamblador de código FKIL (FKASM)
    1. Tareas del ensamblador
    2. Estructuras de datos
    3. Inicialización del ensamblador
    4. Primera pasada del ensamblador
      1. Procesamiento de directivas
      2. Procesamiento de etiquetas
      3. Procesamiento de instrucciones
    5. Segunda pasada del ensamblador
  8. Máquina Virtual de FKScript (FKVM)
    1. Estructura de la máquina virtual
      1. Segmento de código
      2. Registro contador de programa
      3. Pila
      4. Memoria dinámica
      5. Tabla de funciones API
    2. Carga de un programa
    3. Ejecución de un programa
    4. Ejecución de instrucciones
      1. Instrucciones PUSH
      2. Instrucciones LOAD
      3. Instrucciones STORE
      4. Instrucciones aritméticas
      5. Instrucciones de comparación
      6. Instrucciones de salto condicional
      7. Instrucciones de llamada a función externa
    5. Integración con otras aplicaciones
      1. Registro de funciones API
      2. Definición de la API de la aplicación externa
  9. ANEXO I: Especificación del lenguaje FKScript
  10. ANEXO II: Especificación del lenguaje FKIL

Esta entrada forma parte de una serie de artículos dedicados al proyecto FKScript, construcción de un compilador y una máquina virtual para un lenguaje de script con C# y ANTLR, entre los cuales podrás encontrar una descripción detallada de cada módulo, documentación técnica, ejemplos y tutoriales de uso que pueden ser de tu interés. No olvides consultar la página principal de FKScript para más información.

, , , , , , , , , ,

Hace ya algún tiempo pormetí que publicaría la documentación del proyecto FKScript en formato PDF para que pudiera ser descargada facilmente. El trabajo y otras ocupaciones no me han permitido hasta hace muy poco encontrar algo de tiempo para reunir y maquetar toda la información en un sólo documento. Sin embargo, desde hoy mismo disponéis de un primer borrador en PDF de unas 70 páginas para que podáis revisarlo.

He creado una pequeña página con información sobre el documento, la tabla de contenidos y el capítulo de introducción para que todo el mundo sepa qué puede esperar de este libro, tutorial o como queramos llamarlo.

Espero que este documento sea la referencia que pretendía que fuera para todos aquellos que queráis introduciros un poco en el desarrollo de compiladores y máquinas virtuales, y para aquellos que queráis aprender cómo y en qué medida os pueden ayudar herramientas como ANTLR durante el proceso de desarrollo.

Ni que decir tiene que si tenéis propuestas, modificaciones, ampliaciones o habéis encontrado algún error en el texto o los ejemplos no dudéis en contactar conmigo a través de la dirección de correo electrónico que aparece en la información de contacto.

, , , , , , , ,