sábado, enero 19, 2008

Lenguajes Innovadores

Hace poco leí un post de febuiles sobre lenguajes de programación innovadores. Cuando estaba comentando me di cuenta que tenía tanto que decir al respecto que en vez de ensuciar la pagina de él con un enoooorme comentario decidí mas bien escribir todo un post respuesta.

Decir:

# C++: Objetos con velocidad, sin alejarme mucho de C.
# Java: Objetos por todos lados, escalabilidad. Puedo confiar en el para grandes deployments.
# C#: ¿Integración con plataformas Microsoft?

Puede ser cierto, pero injusto cuando se dice que se trata de solo ésto y que en realidad no hay innovación. Para entender como cada lenguaje fué innovador hay que tener en mente el contexto y las ideas de sus creadores.

Respecto al contexto, C++ comenzó a desarrollarse en el 1979 y mas que parecerse a C buscaba compatibilidad (i.e) poder compilar codigo C en un compilador de C++. Pese a que la compatibilidad no es del 100%, esa tampoco era el objetivo. C++ pretendia mejorar la seguridad de tipos de C y hacer mas fácil el manejo de memoria (new en vez de malloc).

Si se hace un comparativo con el ejemplo simple de recorrer una colección con otros lenguajes (Digamos Ruby, Python) o un lenguaje funcional tal vez uno diga "C++ es verbose" o "que horrible no hacer fácilmente recorridos de colecciones".

Pero creo que tengo dos argumentos para decir porque pasa ésto.

1) C++ es mas viejo!?? obvio. Uno lo compara con lenguajes que tuvieron años de experiencias aprendidas de otros lenguajes y obviamente el resultado de dicha comparación resulta injusto. Python y Ruby fueron creados o empezaron su creación en 1993 y 1991 respectivamente. Pareciera que 10-15 años no es mucho pero en la computación si lo és. Uno se devuelve 10 desde la creación de C++ y en esa época ¡No se había hecho el primer estándar de C! era la época de programar en Assembler en una PDP. Si comparamos un salto de éste tipo es comprensible que tome 10-15 años pasar de hacer un for a un n.times{}.

2) C++ si brinda opciones para esos horribles for. Es solo cuestión de mirar algorithm de la STL. Hay construcciones for_each, transform, accumulate. Y si uno se sale del estándar se encuentra uno con Boost. Lambda expresiones, expresiones regulares y muchas otras cosas útiles.

# Innovación en C++

Del Primer lenguaje que tuve conocimiento que tuviera Templates fue C++. Probablemente no haya sido el primero. Sin embargo los templates de C++ sin importar si fueron una idea prestada permitieron:

1) Una nueva forma de Metaprogramación, código genérico. Incluso una vez vi como usar templates para hacer precálculo en compilación.
2) Los templates de C++ lograron ser una valiosa influencia para lenguajes como C# y Java.
3) STL. Una, IMHO, de las mejores librerías para manejar colecciones.

No puedo hablar mucho porque tengo que confesarlo, no se casi de C++.

# Innovación en Java

Siempre hay taaantas cosas malas para decir de Java, pero a veces unas cuantas buenas.

Un lenguaje de programación no es solo las estructuras sintácticas y semanticas... sino la implementación misma.

Mas que el compile once, run everywhere estan los desarrollos en la JVM que lo hicieron posible. Java mostró que la interpretación a nivel de Byte Code puede llegar a ser muy MUY rápida. Java hizo desarrollos importantes en Garbage Collection y una vez le escuché a un profesor que uno de estos desarrollos permitió incluso usar Java para algunas tareas de tiempo real.

La JVM permitió que se hicieran otro montón de lenguajes y re-implementaciones que aprovechan lo anterior. Scala, JRuby y Jython. En este sentido, la mera implementación de una VM eficiente como lo es la JVM resultó innovador.

# Innovación en C#

Nunca he programado en C# pero hay varias cosas innovadoras que leí en msdn de C# 3.0 y los ejemplos son sacados precisamente de ahí.

1. Query expressions.

Son expresiones integradas del lenguaje para hacer lo que uno hace usualmente con SQL.

cosas como éstas son posibles:

 
from c in customers
group c by c.Country into g
select new { Country = g.Key, CustCount = g.Count() }


Lo bacano es que he visto usar estas expresiones con simples arreglos y vectores. No solo con tablas o clases extrañas.

2. Otra forma de Lambda-exprs

No siempre se tiene que hacer algo nuevo... a veces basta con hacer distinto algo que ya se hace de una forma.

 
x => x + 1
//O también
x => { return x + 1; }


3. Inferencia de tipos.

Creo que no hay nada que decir al respecto.

3 comentarios:

febuiles dijo...

>> Si comparamos un salto de éste tipo es comprensible que tome 10-15 años pasar de hacer un for a un n.times{}.

Como resalté en el post, estos comentarios lo hice gracias a un libro de patrones para Smalltalk, lenguaje que fue desarrollado desde los 70s, y sin embargo, tiene construcciones tipo: "1 to: 10 do: algo". El for_each de C++ es un chiste (crear la colección de STL está bien, pero necesito un iterador ("iterator") y dos VectorIt o algo así para asignar begin() y end(). Después sí puedo usar for_each. Boost obviamente no lo cubro, no es parte del lenguaje.


El equivalente a templates de C++ ya existían en Smalltalk y Lisp, al igual que la metaprogramación (y en tiempo de ejecución de todo el programa, ST es dinámico). Sobre si STL es o no una gran librería, no lo dudo, pero al igual que la máquina virtual de Java, estoy contando innovaciones _del lenguaje en sí_.

>> Mas que el compile once, run everywhere.

Sabemos que esto no es del todo cierto.

Por otro lado, la JVM _sí_ tiene muchas cosas a resaltar, lo dije en el mismo post y no lo pongo en duda, pero esto lo muestra Java como plataforma y no como lenguaje de programación. El equivalente en el mundo de MS sería decir que el C# es un lenguaje innovador porque el CLR permite correr IronPython o IronRuby.

>> 1. Query expressions.

No se que tan viejo sea el concepto para C# ya que fue oficialmente lanzado hace dos meses. Sin embargo, como dice Sriram Krishnan de Microsoft, "Take a look at C# 2.0 anonymous delegates or Linq - they bring to millions of programmers what was once only available to Lispers"[1]. Linq seguramente es más completo (Krishnan lo dice), pero no he visto querys que no sean sobre sacar datos de un objeto (cosa que también existía ya, dynamic finders en Ruby).

>> 2. Otra forma de Lambda-exprs

Si me estas diciendo que te gusta más la segunda forma de hacerlo, tenemos un problema :)

Sabemos que las lamda expresiones no son nuevas, y además, se ve horrible con el return (que ya se podía hacer en Python). [2]


>> 3. Inferencia de tipos.
>> Creo que no hay nada que decir al respecto.

Obviamente, ni siquiera está soportada en C# a menos que contemos los casos en los que se usan l-expresiones :). El día que pueda hacer "a = Object.SomeMethod()" sin haber declarado de que tipo era "a" estaremos hablando para decir como esto viene siendo hecho desde hace años también, sea ya por Smalltalk, Lisp, Haskell o F# como bien lo me dijiste.

De nuevo, no quise decir que estos lenguajes fuesen malos, solamente quiero decir que no tienen nada innovador para los nuevos creadores de lenguajes de programación. Probablemente lleven muchas cosas al main-stream (después de dos años la mayoría de programadores de Java no saben que su lenguaje tiene construcciones for each), pero de ahí a que veamos al próximo creador de lenguajes diciendo "Mi lenguaje X está muy basado C#/Java/C++" (a menos que el creador sea Digital Mars[3]), creo que podemos seguir tranquilos de la vida.

[1] http://blogs.msdn.com/sriram/archive/2006/01/15/lisp_is_sin.aspx. Tambien está este articulo, hablando un poco de Linq y Smalltalk http://www.cincomsmalltalk.com/blog/blogView?showComments=true&entry=3318571155

[2] Esto lo hago basandome en que lo nuevo es la segunda forma de hacerlo. Sí es al revés entonces lo único que hicieron fue arreglarlo para que parecieran lambdas de Python o Haskell.

[3] D de Digital Mars obviamente está muy basado en C/C++/Objective C. Sin embargo, la mayoría de cosas nuevas que trae son simplemente para arreglar errores de sus antecesores.

PD: Ahi disculpas lo largo, no se ser conciso :(

diegoeche dijo...

jejeje... gracias por la inmediata respuesta. Hay una discusión importante y es "que es, que no es un lenguaje de programación" Pienso que las librerías del estandar son de hecho parte del lenguaje. Que sea parte del "Built-in" o no... se vuelve hasta filosófico.

lo de inferencia de tipos es lo que mire por encima acá.
http://msdn2.microsoft.com/en-us/library/bb308966.aspx#csharp3.0overview_topic10
pero en serio... no me llama la atencion C# y como dije, nunca lo he utilizado.

Lo de los templates de Lisp y Smalltalk, la verdad no los conozco, pero se que los Generics Java estuvieron inspirados en Templates de C++ y ese era mi punto.

Te concedo algo... Si hablamos de "los lenguajes mas influyentes de la historia" obviamente no creo que las primeras posiciones sean para Java o C#... Fortran, Lisp fueron los padres de lo imperativo y funcional... Smaltalk del "message passing" y otro monton de cosas.

Me atrevería a decir que hay una razón técnica para que C++ no poseyera mas azucar sintactica para control de flujo y eso es el asunto de compatibilidad con C. La idea era no alejarse mucho de C.

Al final estan los dos tipos de lenguajes de programacion, de los que todos se quejan y los que nadie usa :)

febuiles dijo...

>> Hay una discusión importante y es "que es, que no es un lenguaje de programación" Pienso que las librerías del estandar son de hecho parte del lenguaje. Que sea parte del "Built-in" o no... se vuelve hasta filosófico.

Yo no le veo lo filosofico. STL es parte de cualquir compilador de C++, Boost no. Boost lo que hace en muchos casos es emular comportamiento de otros lenguajes en C++, ya que C++ solo no es capaz.

>> Generics Java estuvieron inspirados en Templates de C++ y ese era mi punto.

Esto es cierto, pero de nuevo, no tienen nada de nuevo, son solo un tipo polimorfico (generico suena mejor) que en tiempo de compilacion (en Java) es reemplazado por el tipo definitivo. La implementación en Java es muy criticada por esto.

>> Me atrevería a decir que hay una razón técnica para que C++ no poseyera mas azucar sintactica para control de flujo y eso es el asunto de compatibilidad con C. La idea era no alejarse mucho de C.

Claro, aquí se centra mi critica, y lo mismo paso con Java y C#. Por querer ser como C o C++, relegaron un monton de cosas utiles que hoy en día apenas estan viniendo a adicionar.

>> Al final estan los dos tipos de lenguajes de programacion, de los que todos se quejan y los que nadie usa :)

Esta es la frase mas cierta en la historia de la progrmación :-)