<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>.NET o no .NET, esa es la cuestión : lenguajes, escariotrop&amp;#237;as gimn&amp;#233;sicas, interop</title><link>http://geeks.ms/blogs/rfog/archive/tags/lenguajes/escariotrop_26002300_237_3B00_as+gimn_26002300_233_3B00_sicas/interop/default.aspx</link><description>Etiquetas: lenguajes, escariotrop&amp;#237;as gimn&amp;#233;sicas, interop</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Sobre delegados, closures, punteros y la falacia del puntero loco</title><link>http://geeks.ms/blogs/rfog/archive/2010/07/30/sobre-delegados-closures-punteros-y-la-falacia-del-puntero-loco.aspx</link><pubDate>Fri, 30 Jul 2010 10:45:20 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:180059</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=180059</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=180059</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2010/07/30/sobre-delegados-closures-punteros-y-la-falacia-del-puntero-loco.aspx#comments</comments><description>&lt;p align="justify"&gt;Leía esta mañana –mientras se carga una serie de gráficos en mi actual proyecto- el blog de &lt;a href="http://geeks.ms/blogs/mposadas/"&gt;Marino Posadas&lt;/a&gt; que, aunque publica poco, publica bien, y me he quedado más que estupefacto con lo que nos ha contado. He de matizar que en ningún momento dudo de la palabra de Marino, y es por eso por lo que me ha llamado tanto la atención de lo que nos ha contado.&lt;/p&gt;  &lt;p align="justify"&gt;Antes de seguir aquí lo mejor es que leáis su &lt;a href="http://geeks.ms/blogs/mposadas/archive/2010/07/28/anders-191-por-qu-233-creaste-los-delegados.aspx?CommentPosted=true#commentmessage"&gt;entrada&lt;/a&gt;, y volváis a esta.&lt;/p&gt;  &lt;p align="justify"&gt;***&lt;/p&gt;  &lt;p align="justify"&gt;El primer malentendido sobre el texto nos lo ha solucionado el propio Marino en los comentarios: no, Anders no se tiró seis meses para &lt;i&gt;inventar&lt;/i&gt; los delegados, sino que estuvo tal tiempo creando el .NET, y durante el cual salió la idea del delegado. Haremos la vista gorda e ignoraremos el hecho de que en Delphi (y C++ Builder) el propio Anders ya tenía algo así.&lt;/p&gt;  &lt;p align="justify"&gt;Además, siempre he dicho que el delegado es el paso siguiente al puntero a función y/o función de retrollamada (o &lt;i&gt;callback&lt;/i&gt;, como le se suele citar habitualmente). Eso también queda fuera de toda discusión.&lt;/p&gt;  &lt;p align="justify"&gt;Cuenta Marino que Anders primero analizó que una mayoría de las BSOD en Windows venían a cuenta de drivers defectuosos, y que otra &lt;i&gt;mayoría&lt;/i&gt; venía causada por una variación sobre un mismo tema: el moldeo o &lt;i&gt;casting&lt;/i&gt; incorrecto de punteros a función, algo que es bastante común en el desarrollo de sistemas.&lt;/p&gt;  &lt;p align="justify"&gt;Por lo tanto, para acabar con el segundo problema, decidió implementar los delegados en .NET. Aquí tenemos la primera falacia de todas, y encima autocontenida. Es decir, los delegados están en .NET, pero no en la creación de drivers, ni en la de software de sistemas, que se sigue haciendo en C++, así que solución, nada de nada.&lt;/p&gt;  &lt;p align="justify"&gt;Claro, a no ser que pensara que el mundo™ iba a abandonar sus millones de líneas de código™ y se iba a pasar derechito al .NET™, acabando en un par de meses con el &lt;i&gt;infierno de los punteros&lt;/i&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Espero que ya se haya dado cuenta de que no, que el .NET está y sirve para lo que está y sirve, y para nada más. Por lo tanto, está claro que &lt;i&gt;no ha acabado con el problema de los punteros locos&lt;/i&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Lo que ha hecho ha sido crear una plataforma de desarrollo en la que se minimiza el problema, pero el código nativo (nuevo y viejo) sigue adoleciendo del mismo. Además, en .NET un delegado vacío, hasta donde llego, lanza una excepción, de igual forma que la ejecución de un puntero a función nulo lanza, también, una excepción, que si eres buen programador, habrás capturado. &lt;/p&gt;  &lt;p align="justify"&gt;***&lt;/p&gt;  &lt;p align="justify"&gt;Vamos ahora a por la segunda falacia. ¿Sabéis qué es en realidad un delegado? Pues un delegado es una clase normal y corriente, pero que está cableada en cierta medida dentro del compilador de C#. De hecho, en C++/CLI podemos usarla como una clase más. Podéis leer algo sobre esto &lt;a href="http://rfog.cmact.com/CppCLI/Eventos_a_la_net.pdf"&gt;aquí&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;¿Y qué hace esa clase? Pues tiene un constructor que viene a recibir un puntero a método o función global. Tiene un método que es el que ejecutará ese puntero recibido. Y tiene una serie de eventos y sobrecarga de operadores que nos permiten la semántica de utilizar “+=” y “-=” para añadir/quitar punteros a función. &lt;/p&gt;  &lt;p align="justify"&gt;Y cuando mandamos ejecutar el delegado, lo que hace es comprobar si el puntero es válido, y si lo es, lo ejecuta. Y si se trata de un delegado &lt;i&gt;multicast&lt;/i&gt;, entonces contiene una &lt;i&gt;bolsa&lt;/i&gt; de punteros a función que va comprobando que sean válidos y ejecutando uno detrás de otro.&lt;/p&gt;  &lt;p align="justify"&gt;Ni más ni menos.&lt;/p&gt;  &lt;p align="justify"&gt;***&lt;/p&gt;  &lt;p align="justify"&gt;Ahora vamos a lo que vamos, que es la tercera falacia y la más importante de todas. ¿Sabíais que con C++ hacer eso mismo es casi trivial? ¿Sabíais que ya está hecho en Boost (no lo he mirado, pero me apuesto un gallifante a que los hay, y seguro que de varios tipos)? ¿Realmente quería Anders acabar con el tema de los problemas con las funciones de retrollamada? No lo creo, ya que si eso realmente hubiera estado en su agenda, lo que se habría hecho es modificar Win32 para que aceptara un objeto de tipo delegado creado con alguna clase de C++, con un operador puntero para C.&lt;/p&gt;  &lt;p align="justify"&gt;Porque niños, hacer eso mismo en C++ no sólo es trivial, sino mucho más directo, ya que podemos sobrecargar el operador de llamada a función y el de puntero, como nos lo demuestran los predicados de la STL… Pero claro, Anders tiene que barrer para casa y expresar las &lt;i&gt;genialidades&lt;/i&gt; de .NET y C#...&lt;/p&gt;  &lt;p align="justify"&gt;En fin…&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=180059" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/c_2B002B002F00_cli/default.aspx">c++/cli</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/escariotrop_26002300_237_3B00_as+gimn_26002300_233_3B00_sicas/default.aspx">escariotrop&amp;#237;as gimn&amp;#233;sicas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/interop/default.aspx">interop</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/rationale/default.aspx">rationale</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category></item><item><title>No uses goto, que yo lo usaré (III). Ganador[es]</title><link>http://geeks.ms/blogs/rfog/archive/2008/12/10/no-uses-goto-que-yo-lo-usar-233-iii-ganador-es.aspx</link><pubDate>Wed, 10 Dec 2008 11:46:53 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:127040</guid><dc:creator>Rafael Ontivero</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/rsscomments.aspx?PostID=127040</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/rfog/commentapi.aspx?PostID=127040</wfw:comment><comments>http://geeks.ms/blogs/rfog/archive/2008/12/10/no-uses-goto-que-yo-lo-usar-233-iii-ganador-es.aspx#comments</comments><description>&lt;p align="justify"&gt;&lt;/p&gt; &lt;p align="justify"&gt;Bueno, en la &lt;a href="http://geeks.ms/blogs/rfog/archive/2008/11/05/no-uses-goto-que-yo-lo-usar-233-ii-premio-al-que-lo-consiga.aspx"&gt;entrada anterior&lt;/a&gt; lancé un reto. Al principio estuve tentado de declararlo desierto, ya que todos os habéis centrado en la sentencia &lt;i&gt;swtich&lt;/i&gt;, cuya mejor implementación a bajo nivel o bien utiliza gotos a mansalva o bien hace llamadas de tipo &lt;i&gt;call&lt;/i&gt;, y muchas veces combinaciones de las mismas (y para ser justos con todos, ni me acordé cuando puse el reto).  &lt;p align="justify"&gt;Pero una relectura del tema hace que no pueda declararlo desierto, ya que las tres entradas en las que se ha puesto algún ejemplo directo aportan algo nuevo al tema. La de &lt;a href="http://geeks.ms/blogs/luisguerrero/default.aspx"&gt;Luis Guerrero&lt;/a&gt; es demoledora en cuanto a la justificación de los goto, mientras que las de SergioE quizás sea la más “pura” en el sentido de que fuerza un goto con una construcción bastante sencilla. Y la de &lt;a href="http://geeks.ms/blogs/etomas/"&gt;Eduard Tomàs&lt;/a&gt; es interesante porque nos demuestra que el Reflector no es lo que uno espera…  &lt;p align="justify"&gt;De todos modos mi idea no era esa, mi idea era que alguien pudiera demostrar que el compilador de C# va más allá de ser un mero traductor de código fuente a MSIL, que es lo que yo opino y hasta el momento nadie ha conseguido convencerme de lo contrario.  &lt;p align="justify"&gt;Casi estoy pensando en lanzar un nuevo reto a ver si alguien es capaz de encontrar un código que sea convenientemente optimizado por el compilador de C#, pero ciertamente es algo que no vale la pena ya que mañana Microsoft cambiará algo del mismo y lo expuesto no será más que tiempo perdido. Quedémonos, pues, en que el compilador de C# no es muy bueno y que el &lt;i&gt;jitter&lt;/i&gt; no le va muy a la zaga sin ser tan pésimo… aunque suficiente en general para las tareas típicas de .NET.  &lt;p align="justify"&gt;Y por supuesto, no se confundan, a veces el goto es bueno, pero evitémoslo siempre que podamos.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=127040" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/rfog/archive/tags/escariotrop_26002300_237_3B00_as+gimn_26002300_233_3B00_sicas/default.aspx">escariotrop&amp;#237;as gimn&amp;#233;sicas</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/interop/default.aspx">interop</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/rfog/archive/tags/lenguajes/default.aspx">lenguajes</category></item></channel></rss>