lunes, marzo 12, 2007

La importancia de llamarse Bertrand

Para quienes todavía creen que hay algo oscuro, siniestro e inconfesable tras mi recomendación de .NET, he reencontrado este artículo en Internet:
Espero que esos pocos conozcan quién es Bertrand Meyer.

Etiquetas: , ,

3 Comments:

Blogger Alfredo Novoa said...

El problema de .NET es que eso del agnosticismo sobre el lenguaje no es completamente cierto, y está bastante sesgado hacia los lenguajes OO del tipo de Java. Cuando salió la primera versión muchos programadores de lenguajes de script y lenguajes dinámicos protestaron mucho. Con la versión 2.0 (y los métodos dinámicos), se han mejorado bastante las cosas, pero sigue habiendo problemas como la ausencia de tipos dinámicos y las grandes dificultades para descargar ensamblados.

lunes, marzo 12, 2007 4:16:00 p. m.  
Blogger Ian Marteens said...

Admito cierto sesgo (en realidad, no hay mucha libertad en el diseño de Freya... lo cuál también tiene su interés). Pero el mayor sesgo es que sólo hay soporte nativo para la herencia simple, y resulta que sobre el CLR existen compiladores de C++ y Eiffel.

Sobre los lenguajes dinámicos y de script se están diciendo muchas bobadas (no me refiero a nada que se haya dicho aquí, aclaro). He leído alguna defensa de Python por parte de Bruce Eckel, por mencionar alguien conocido, que parece escrita por un novato. Se le asignan propiedades mágicas a algunos recursos de estos lenguajes, y se olvidan los riesgos que introduce la relajación del sistema de tipos.

Con Eiffel, la lección que aprendí es que los únicos sistemas de tipos que estorban son los mal planteados.

ausencia de tipos dinámicos y las grandes dificultades para descargar ensamblados.

Los tipos dinámicos existen en el mismo sentido que existen métodos dinámicos. En realidad, el método dinámico sólo te evita declarar antes el tipo dinámico que lo contiene. Claro, en un lenguaje imperativo tradicional este dinamismo exige conocer bien el ensamblador de la plataforma.

Y por cierto, hablando de Eiffel y el CLR: el sistema de tipos genéricos permite la covariancia y contravariancia de los parámetros genéricos. C# no lo soporta, y es muy posible que se deba a que este recurso exija el uso de runtime checks (como los que existen ahora mismo en los arrays).

Los verdaderos problemas le llegarán a C# y a .NET dentro de tres o cuatro versiones, cuando se acumulen recursos desechados por la llegada de nuevo recursos. Pero eso es inevitable. Si .NET hubiese tenido genericidad en la versión 1.0, por ejemplo, los arrays podrían haber recibido un tratamiento más uniforme: la clase Array sería genérica (como se simula en Freya), y se unificarían los tipos array con los genéricos "cerrados" (instanciados). El propio API de ADO.NET podría ser ligeramente más eficiente: al no existir genéricos en la 1.x, los iteradores de DataRowCollection, DataColumnCollection, etc, etc, devuelven ahora mismo objetos a los que hay que pasar un typecast. Ese va a ser el problema a largo plazo, pero eso le ocurre a .NET y a cualquier otro software parecido. Todo está en que acierten al elegir el momento de hacer limpieza.

---------

Como curiosidad, el CLR soporta métodos globales. Y es curioso que el método CreateGlobals de ModuleBuilder se utilice también para crear zonas de datos inicializados en el ejecutable. Cuando declaras un array estático de más de cuatro elementos, los compiladores crean una de estas zonas y un wrapper para luego inicializar el array sin mucho jaleo. Lo digo porque lo acabo de incorporar a Freya.

lunes, marzo 12, 2007 6:27:00 p. m.  
Blogger Alfredo Novoa said...

A mi no es que me estorbe el sistema de tipos, el problema que tengo es que una vez creado un tipo dinámico, casi no hay forma de deshacerse de él ni de modificarlo.

Los tipos dinámicos existen en el mismo sentido que existen métodos dinámicos. En realidad, el método dinámico sólo te evita declarar antes el tipo dinámico que lo contiene.

Pero si no creas tipos no los tienes, obviamente. Por eso cuando uso DynamicMethod tengo que usar todo el rato tipos primitivos y pasar un montón de parámetros por referencia.

Por otra parte en mi lenguaje un operador (método) puede pertenecer a varios tipos (cosa más que lógica), cosa que tampoco soporta la plataforma de forma nativa.

martes, marzo 13, 2007 1:46:00 p. m.  

Publicar un comentario

<< Home