<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>The World is mine &#187; c++</title>
	<atom:link href="http://grozeille.com/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://grozeille.com</link>
	<description>Just another Wordpress.com weblog</description>
	<lastBuildDate>Sat, 07 Jan 2012 12:00:31 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='grozeille.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>The World is mine &#187; c++</title>
		<link>http://grozeille.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://grozeille.com/osd.xml" title="The World is mine" />
	<atom:link rel='hub' href='http://grozeille.com/?pushpress=hub'/>
		<item>
		<title>Lire le code source&#8230;</title>
		<link>http://grozeille.com/2010/07/11/lire-le-code-source/</link>
		<comments>http://grozeille.com/2010/07/11/lire-le-code-source/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 09:03:22 +0000</pubDate>
		<dc:creator>Mathias Kluba</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[sourcecode]]></category>

		<guid isPermaLink="false">http://grozeille.com/?p=423</guid>
		<description><![CDATA[&#8230; ce n&#8217;est pas aussi passionnant qu&#8217;un roman, mais c&#8217;est quelque chose que tout développeur devrait pratiquer. Si vous n&#8217;êtes pas convaincu, allez lire ça http://www.skorks.com/2010/05/why-i-love-reading-other-peoples-code-and-you-should-too/ A mes débuts, je &#8220;singeais&#8221; les autres, je copiais/collais du code trouvé sur le Net, sans forcement comprendre tout ce qu&#8217;il faisait. En général, je trouvais ce code sur des forums [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=423&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>&#8230; ce n&#8217;est pas aussi passionnant qu&#8217;un roman, mais c&#8217;est quelque chose que tout développeur devrait pratiquer.</p>
<p>Si vous n&#8217;êtes pas convaincu, allez lire ça <a href="http://www.skorks.com/2010/05/why-i-love-reading-other-peoples-code-and-you-should-too/">http://www.skorks.com/2010/05/why-i-love-reading-other-peoples-code-and-you-should-too/</a></p>
<p>A mes débuts, je &#8220;singeais&#8221; les autres, je copiais/collais du code trouvé sur le Net, sans forcement comprendre tout ce qu&#8217;il faisait.<br />
En général, je trouvais ce code sur des forums comme <a href="http://www.developpez.com/">developpez.com</a>, <a href="http://www.codes-sources.com/">codes-sources</a> ou <a href="http://www.codeproject.com/">The code project</a>.<br />
J&#8217;avoue qu&#8217;aujourd&#8217;hui, je consulte rarement les forums (à part celui de <a href="http://ubuntu-fr.org/">Ubuntu-FR</a>, si vraiment je ne trouve pas l&#8217;info sur leur merveilleux <a href="http://doc.ubuntu-fr.org/">wiki</a>)</p>
<p>Le Web a évolué en 2.0. <a href="http://stackoverflow.com/">Stackoverflow</a> en est un pur produit: c&#8217;est un &#8220;forum&#8221; que je conseille vivement pour trouver des solutions à vos problèmes.</p>
<p>Mais la meilleur façon d&#8217;apprendre, c&#8217;est encore de lire du code, du vrai, du brut.<br />
Il n&#8217;y a pas de honte à ne pas être un &#8220;Shakespeare&#8221; du C#&#8230; certaines personnes écrivent des romans et d&#8217;autres des articles de magazines&#8230; on ne fait pas tous  le même boulot.</p>
<div id="attachment_427" class="wp-caption aligncenter" style="width: 310px"><a href="http://grozeille.files.wordpress.com/2010/07/cpc6128_circles_listing1.gif"><img class="size-medium wp-image-427" title="CPC6128_circles_listing" src="http://grozeille.files.wordpress.com/2010/07/cpc6128_circles_listing1.gif?w=300&#038;h=195" alt="" width="300" height="195" /></a><p class="wp-caption-text">Mon vrai premier &quot;ordinateur&quot; a été un Amstrad CPC 6128, et pour jouer à un jeux... il fallait le coder en recopiant le listing du bouquin!</p></div>
<p>Aujourd&#8217;hui, le Web 2.0 vous offre un outil magique pour lire du code: j&#8217;ai nommé <a href="http://www.google.com/codesearch">http://www.google.com/codesearch</a> !<br />
C&#8217;est devenu un reflex pour moi: quand je ne comprend pas une fonction, au lieux d&#8217;aller consulter la <a href="http://msdn.microsoft.com/en-us/default.aspx">MSDN</a>, je cherche du code qui exploite cette dernière.</p>
<p>A noter que cette magie n&#8217;existerai pas sans l&#8217;émergence de l&#8217;OpenSource. S&#8217;il y avait principalement que <a href="http://sourceforge.net/">Sourceforge</a> au début, vous pouvez maintenant héberger vos projets OpenSource sur de nombreux sites comme <a href="http://code.google.com/">Google Code</a>, <a href="http://github.com/">Github</a>, <a href="http://bitbucket.org/">Bitbucket</a>, <a href="http://www.codeplex.com/">Codeplex</a>, etc.</p>
<p>Bien sûr, les blogs restent une bonne source d&#8217;information. En ce moment vous pouvez y voir pas mal d&#8217;article sur les &#8220;CoRoutine&#8221; avec une utilisation astucieuse du mot clé &#8220;yield&#8221;: <a href="http://www.codinginstinct.com/2010/06/sequential-async-using-coroutines.html">http://www.codinginstinct.com/2010/06/sequential-async-using-coroutines.html</a></p>
<p>Si j&#8217;ai réussie à vous donner envie de lire, je vous conseille de <a href="http://github.com/MarkNijhof/Fohjin">regarder ceci</a>.<br />
J&#8217;ai découvert ce code lors de mon apprentissage de CQRS (cf <a href="http://groups.google.fr/group/parisaltnet/browse_thread/thread/d98d42db4ef3721b">GoogleGroups d&#8217;ALT.Net</a>) et je le trouve très élégant (pas étonnant qu&#8217;on le trouve sur <a href="http://elegantcode.com/">http://elegantcode.com/</a> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</p>
<p>Lire du code provenant d&#8217;autres langages peut aussi vous apporter beaucoup: ne restez pas enfermé dans vos habitudes, et regardez les pratiques des autres. C&#8217;est en cherchant quelque chose sur Google Code Search que je suis tombé sur le code suivant: <a href="http://www.google.com/codesearch/p?hl=en#LH6NMiZyrsw/trunk/src/documentpresenter.vala">http://www.google.com/codesearch/p?hl=en#LH6NMiZyrsw/trunk/src/documentpresenter.vala</a></p>
<p>Ça ressemble à du C#? Mais c&#8217;est du Vala. Le projet est un IDE, avec une architecture MVP (Model Vue Presenter) avec de l&#8217;injection de dépendance etc. Je le trouve très lisible, clair et concis.<br />
Pour ceux qui ne connaissent pas Vala, regarder ici:  <a href="http://live.gnome.org/Vala/QuickIntroForCSharpProgrammers">http://live.gnome.org/Vala/QuickIntroForCSharpProgrammers</a></p>
<p>En parlant d&#8217;autres langages, je vous conseille quand même d&#8217;éviter de lire du <a href="http://en.wikipedia.org/wiki/Brainfuck">Brainfuck</a> <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   je ne veux pas être responsable de votre autisme.</p>
<p>Je n&#8217;ai plus qu&#8217;a vous souhaitez bonne lecture <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Mais allez bronzer un peu quand même :p</p>
<br /> Tagged: <a href='http://grozeille.com/tag/c/'>c++</a>, <a href='http://grozeille.com/tag/opensource/'>opensource</a>, <a href='http://grozeille.com/tag/sourcecode/'>sourcecode</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/grozeille.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/grozeille.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/grozeille.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/grozeille.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/423/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=423&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2010/07/11/lire-le-code-source/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fcf307a3a2899d162cabfd41241f17b9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">grozeille</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2010/07/cpc6128_circles_listing1.gif?w=300" medium="image">
			<media:title type="html">CPC6128_circles_listing</media:title>
		</media:content>
	</item>
		<item>
		<title>Quel langage pour l&#8217;avenir : C#4 ou Oxygene (Delphi)</title>
		<link>http://grozeille.com/2008/11/29/quel-langage-pour-lavenir-c4-ou-oxygene-delphi/</link>
		<comments>http://grozeille.com/2008/11/29/quel-langage-pour-lavenir-c4-ou-oxygene-delphi/#comments</comments>
		<pubDate>Sat, 29 Nov 2008 13:24:50 +0000</pubDate>
		<dc:creator>Mathias Kluba</dc:creator>
				<category><![CDATA[Blabla]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[delphi]]></category>
		<category><![CDATA[oxygene]]></category>

		<guid isPermaLink="false">http://grozeille.wordpress.com/?p=106</guid>
		<description><![CDATA[Suite au post de Romain sur l&#8217;avenir du langage C#, je voulais non seulement répondre, mais en profiter pour parler brièvement d&#8217;un autre langage .Net : Oxygene. C#4 ? Romain a trouvé une citation un peu abusive mais qui m&#8217;est pourtant tout de suite venu à l&#8217;esprit concernant C#4 : The dynamic keyword is going [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=106&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Suite au post de Romain sur <a href="http://codingly.com/2008/11/15/le-futur-de-c/">l&#8217;avenir du langage C#</a>, je voulais non seulement répondre, mais en profiter pour parler brièvement d&#8217;un autre langage .Net : Oxygene.</p>
<h3>C#4 ?</h3>
<p>Romain a trouvé une citation un peu abusive mais qui m&#8217;est pourtant tout de suite venu à l&#8217;esprit concernant C#4 :</p>
<blockquote><p>The dynamic keyword is going be abused so much… C# is on its way to becoming PHP.</p></blockquote>
<p>Pour la petite histoire, je viens de passer 2 jours à coder du Javascript&#8230; coder?? Débuguer surtout!<br />
Je ne sais pas si suis allergique aux langages dynamiques, mais ça me frustre au plus au point de ne pas savoir quel sont les membres que possède un objet, et de devoir le vérifier au <em>Runtime</em>&#8230;<br />
J&#8217;ai passé 2h car j&#8217;ai fait une faute de frappe sur le nom d&#8217;un membre, ce qui ne plante pas, mais comme cela créer dynamiquement un nouveau membre avec ce nouveau nom, j&#8217;ai passé beaucoup de temps à comprendre pourquoi sa valeur était &#8220;null&#8221;.</p>
<p>C&#8217;est pour ça que les aspects &#8220;dynamiques&#8221; me font peur pour la maintenance des futures programmes C#4.<br />
Ceci dit, le mot clé &#8220;var&#8221; existe déjà en C#3, et je n&#8217;ai pas vu quelqu&#8217;un en abuser (<em>d&#8217;ailleurs, est-ce que la nouvelle version de Resharper suggère toujours de remplacer les types par des var ??!!</em>).<br />
Toujours pour diluer mes propos, il est vrai que dans la réalité on a besoin d&#8217;utiliser différents langages pour différents besoin, alors pourquoi ne pas tout réunir en un seul&#8230;<br />
Mais j&#8217;aimerai éviter ça :</p>
<p><a href="http://grozeille.files.wordpress.com/2008/11/photo-4.jpg"><img class="size-medium wp-image-108 alignnone" title="Pétage de cable" src="http://grozeille.files.wordpress.com/2008/11/photo-4.jpg?w=171&#038;h=198" alt="Pétage de cable" width="171" height="198" /></a></p>
<p>Parfois je me dit aussi que &#8220;<em>C# is on its way to becoming C++</em>&#8220;. Je n&#8217;ai pas beaucoup d&#8217;expérience en C++, et de ce fait j&#8217;ai parfois du mal à comprendre certains codes.<br />
Mais j&#8217;ai surtout l&#8217;impression que les possibilités du langage sont tellement nombreuses, qu&#8217;on a pas 2 codes source C++ &#8220;dans la même prose&#8221;, ce qui devient vite difficile à lire. Pouvoir faire 1 chose de 10 manières différentes, n&#8217;est en mon sens pas un bon truc.</p>
<p>Mais en pratique, les nouvelles fonctionnalités de C# ne sont utilisées que par une &#8220;élite&#8221; qui a un besoin très précis. Dans mon travail actuel, les gens ne savent pas encore faire du Linq, et j&#8217;ai l&#8217;impression que je suis le seul a avoir VRAIMENT migrer sur C#3. Donc, avant que quelqu&#8217;un découvre les nouveautés de C#4 et en abuse&#8230;.</p>
<p>Ah, si, il y en a 1&#8230; et c&#8217;est le genre de personne à faire une chose d&#8217;une certaine façon &#8220;juste parce que c&#8217;est possible&#8221;, si vous voyez ce que  je veux dire&#8230; et là, ça devient vraiment dangereux, et on fini par avoir du code incompréhensible car il a détourné une fonctionnalité de son but initial.</p>
<p>Je dois être vieux jeux, mais je préfère parfois la méthode &#8220;classique et lisible&#8221; même si elle est plus verbeuse. Pourtant, je me laisse séduire, et je deviens vite fan des méthodes d&#8217;extension et des expressions lambda. C&#8217;est comme si mes 2 personnalités entraient en conflit quand je me dit :</p>
<pre><pre class="brush: csharp;">
return toto??tata;
// ou
return toto!=null?toto:tata;
// ou
if(toto != null)
return toto;
else
return tata;
</pre></pre>
<p>Il est clair que je préfère la première solution, mais on m&#8217;a défait fait la remarque :</p>
<blockquote><p>euh, tu peux l&#8217;écrire avec le &#8220;if&#8221;, je trouve ça plus lisible.</p></blockquote>
<p>Et oui, il faut aussi s&#8217;adapter au niveau de lecture de l&#8217;équipe.</p>
<p>Mais là, je ne parle que du langage C#, pas des possibilité de la VM ou du Framework. S&#8217;il est possible d&#8217;interagir entre .Net et Javascript, alors je suis aux anges, mais il existe sans doute d&#8217;autres moyens &#8220;peut être plus contraignant&#8221; que d&#8217;ajouter de la dynamicité dans le langage C#. (On génère bien des &#8220;stub&#8221; pour communiquer en COM !)</p>
<p>Mais au finale, je me laisse prendre au jeux, et finalement je suis fan des expressions lamdba, Linq, les méthodes d&#8217;extensions, juste parce que ça s&#8217;écrit plus rapidement et que je suis fainéant.</p>
<h3>Oxygene ?</h3>
<p>Parce que je suis bavard, je voulais en profiter pour parler non pas de C#, mais de <a href="http://en.wikipedia.org/wiki/Chrome_programming_language">Oxygene</a>.</p>
<p><a href="http://grozeille.files.wordpress.com/2008/11/delphiprismscreenshot.png"><img class="alignnone size-medium wp-image-115" title="delphiprismscreenshot" src="http://grozeille.files.wordpress.com/2008/11/delphiprismscreenshot.png?w=300&#038;h=217" alt="delphiprismscreenshot" width="300" height="217" /></a></p>
<p>Un peu d&#8217;histoire : le créateur de <a href="http://fr.wikipedia.org/wiki/Delphi_(langage)">Delphi</a> a aussi été le créateur de C# : <a href="http://en.wikipedia.org/wiki/Anders_Hejlsberg">Anders Hejlsberg<br />
</a>Petit lien car ça ne fait pas de mal : Anders qui parle du <a href="http://channel9.msdn.com/pdc2008/TL16/">future de C#</a> (je sais, tout le monde l&#8217;a déjà vu).<a href="http://en.wikipedia.org/wiki/Anders_Hejlsberg"><br />
</a></p>
<p>J&#8217;ai commencer à coder en Delphi au Lycée <em>(je ne compte pas les années Basic sous AsmstradCPC6128 <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> )</em>.<br />
Delphi était magique à l&#8217;époque : langage <a href="http://en.wikipedia.org/wiki/Object_Pascal">Pascal Objet</a>, IDE avec un puissant Designer pour application Windows, framework riche&#8230;</p>
<p>Puis le monde a évolué : Anders Hejlsberg a quitté Borland pour aller chez Microsoft.<br />
A l&#8217;époque, Microsoft a voulu faire leur propre &#8220;Java&#8221; :<a href="http://en.wikipedia.org/wiki/Visual_J%2B%2B"> J++</a>.<br />
Anders a commencer par travailler la dessus, mais Microsoft est entré en conflit avec Sun concernant ce J++, et c&#8217;est comme ça que .Net naquis.<br />
Anders inventa alors C# pour l&#8217;occasion, et J++ fut porté sous .Net sous le nom de J#.</p>
<p>Les années noirs pour Borland ont commencé, les entreprises se tournant vers Microsoft et .Net.<br />
Mais je suis resté à coder en Delphi 7 dans mon ancienne société, alors que .Net en était déjà à sa V2. Période de ma vie (en tant que codeur) très frustrante: pas de &#8220;foreach&#8221;, pas de &#8220;generics&#8221;, programmation par interface difficile, etc.</p>
<p>Pour Borland, ce fut de pire en pire : ils ont fini par migrer Delphi en .Net, et ont alors inclue le SDK de Microsoft .Net dans leur IDE&#8230; comme si Delphi en tant que langage était mort, et que &#8220;Delphi 2008&#8243; ne servait surtout qu&#8217;à développer en C#. Sans compter les frameworks tel que VCL.Net en conflit avec ceux de .Net comme Winforms.</p>
<p>Je n&#8217;ai pas travaillé avec Delphi 2008, mais je l&#8217;ai un peu testé. Malgré de gros problème de performance, cet IDE était déjà 1000 fois mieux que VisualStudio : refactoring poussé, historique &#8220;à la svn&#8221; à chaque sauvegarde/innactivité d&#8217;un source, Designer plus sympa, etc.</p>
<p>Mais finalement, Borland a laissé son IDE à Codegear et la mort de Delphi semblait proche. C&#8217;est pour cela que mon ancienne société a choisi de passer de Delphi7 à VisualStudio/C#.</p>
<p>Puis, récemment en surfant, j&#8217;ai découvert Oxygene.</p>
<p>Et je me suis dit : &#8220;haha, la résurrection de Delphi?&#8221;<br />
Ce langage est dérivé de Delphi (comme une nouvelle version en quelque sorte), possède toutes (?) les fonctionnalités du langage C#3 comme Linq, etc.<br />
Mais il ajoute aussi son lot de nouveauté que j&#8217;adore :</p>
<ul>
<li>éviter les tests de nullité inutile :</li>
</ul>
<pre><pre class="brush: csharp;">
if(truc.parent != null &amp;&amp; truc.parent.parent != null)
toto = truc.parent.parent;
// devient
toto = truc:parent:parent;
</pre></pre>
<ul>
<li>ne pas choisir entre un &#8220;for&#8221; et un &#8220;foreach&#8221; car on a besoin d&#8217;un compteur</li>
</ul>
<p>Combien de fois ais-je du ajouter un compteur dans un foreach (et risqué d&#8217;oublier le ++) et au final me résigner à utiliser le bon vieux &#8220;for&#8221;. En Oxygene, le foreach peut gérer l&#8217;index :</p>
<pre><pre class="brush: csharp;">
for each u in Users index i do begin
// et on se sert de i
</pre></pre>
<p>Maintenant, Oxygene fait du buzz sur le net&#8230; enfin surtout &#8220;<a href="http://www.remobjects.com/oxygene.aspx">Delphi Prism</a>&#8220;.</p>
<p>Finalement, l&#8217;IDE de Codegear est abandonné, et Delphi Prism s&#8217;intègre à VisualStudio (utilisé comme une application Eclipse RCP).<br />
On retrouve le langage Oxygene, mais aussi un certains nombre de framework pour pouvoir faire des applications multi-plateform à l&#8217;aide de Mono.<br />
Et pour faire plaisir aux ex-Delphi-istes, le package inclue une <a href="http://www.remobjects.com/hydra.aspx">API d&#8217;interoperabilité</a> entre .Net et les applications pure Delphi Win32.<br />
Pour plus d&#8217;infos : <a href="http://www.delphi.org/2008/10/delphi-prism/">http://www.delphi.org/2008/10/delphi-prism/</a></p>
<p>Il ne me reste plus qu&#8217;à tester tout ça <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Est-ce que ça veut dire que je vais abandonné C# pour revenir flirter avec Delphi?</p>
<br /> Tagged: .Net, c++, delphi, oxygene <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/106/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/106/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/106/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/106/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/grozeille.wordpress.com/106/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/grozeille.wordpress.com/106/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/grozeille.wordpress.com/106/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/grozeille.wordpress.com/106/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/106/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/106/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/106/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/106/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/106/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/106/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=106&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2008/11/29/quel-langage-pour-lavenir-c4-ou-oxygene-delphi/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fcf307a3a2899d162cabfd41241f17b9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">grozeille</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2008/11/photo-4.jpg?w=260" medium="image">
			<media:title type="html">Pétage de cable</media:title>
		</media:content>

		<media:content url="http://grozeille.files.wordpress.com/2008/11/delphiprismscreenshot.png?w=300" medium="image">
			<media:title type="html">delphiprismscreenshot</media:title>
		</media:content>
	</item>
		<item>
		<title>Appeler du Java depuis .Net</title>
		<link>http://grozeille.com/2008/05/08/appeler-du-java-depuis-net/</link>
		<comments>http://grozeille.com/2008/05/08/appeler-du-java-depuis-net/#comments</comments>
		<pubDate>Thu, 08 May 2008 18:34:15 +0000</pubDate>
		<dc:creator>Mathias Kluba</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[interop]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jni]]></category>

		<guid isPermaLink="false">http://grozeille.wordpress.com/?p=53</guid>
		<description><![CDATA[Deux mondes s&#8217;affrontent: Java et .Net. Chacun choisi son camp, ou choisi les deux&#8230; moi j&#8217;ai la double nationalité Mais quand les deux mondes doivent alors communiquer? Je fais l&#8217;interprète. Voila le topo: J&#8217;ai une application .Net qui a besoin de manipuler des classes Java, et pour se faire je passe par C++/CLI: comment avoir [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=53&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Deux mondes s&#8217;affrontent: Java et .Net. Chacun choisi son camp, ou choisi les deux&#8230; moi j&#8217;ai la double nationalité <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Mais quand les deux mondes doivent alors communiquer? Je fais l&#8217;interprète. Voila le topo:<br />
J&#8217;ai une application .Net qui a besoin de manipuler des classes Java, et pour se faire je passe par <a href="http://en.wikipedia.org/wiki/C%2B%2B/CLI">C++/CLI</a>: comment avoir un pied dans du .Net et un autre dans du natif C++.<br />
<span id="more-53"></span><br />
L&#8217;avantage de C++/CLI (<a href="http://en.wikipedia.org/wiki/Common_Language_Infrastructure">Common Language Infrastructure</a>) c&#8217;est qu&#8217;on peut mixer du code managé et non-managé. Je peux donc compiler un assembly .Net en C++, qui lui fait appelle à du pure code C++ natif. Ici en l&#8217;occurrence j&#8217;utilise <code>"jni.h"</code> pour communiquer avec la JVM à l&#8217;aide de <code>jvm.dll</code>.</p>
<p>Rentrons dans le vif du sujet: qu&#8217;est-ce que ça donne du coté de mon application C#:<br />
<pre class="brush: csharp;">
// on démarre la JVM avec mes bons arguments
MathiasJniCpp.JVMWrapper.InitJvm(new String[] { &quot;-Djava.class.path=Mathias.Jni.Java.jar&quot; });

// on créer un objet .Net qui wrappe l'objet Java
// en C++/CLI, le destructeur des classes CLI sert de méthode &quot;Dispose&quot;
using (MathiasJniCpp.MyJavaWrapper javaObject = new MathiasJniCpp.MyJavaWrapper())
{
// faire mumuse avec...
javaObject.People = &quot;Mathias&quot;;
Console.WriteLine(javaObject.SayHello());
}

// on libère la JVM
JVMWrapper.ReleaseJvm();
</pre></p>
<p><code>MathiasJniCpp</code> c&#8217;est le namespace de mon assembly c++/cli, j&#8217;en reparlerai plus tard.<br />
On voit que je manipule une classe JVMWrapper qui me permet de charger une JVM (et de la libérer). J&#8217;utilise aussi une classe .Net codé en C++/CLI. En fait, je l&#8217;utilise comme un classe C#, ou VB.net etc. C&#8217;est une classe &#8220;classique&#8221; .Net avec des méthodes et des propriétés.</p>
<p>Point intéressant à souligner: pourquoi utiliser <code>using</code>?<br />
Pour rappelle, il y a des mots-clefs en C# très lié au Framework (comme <code>foreach</code>) et <code>using</code> en fait partie. Il prend les objets qui implémente <code>IDisposable</code> et fait appelle à la méthode <code>Dispose()</code> à la fin du bloque. Comme ça, je suis sûr de libérer la classe du coté JVM quand j&#8217;en ai plus besoin.</p>
<p>Je ne vais pas montrer tout le code, car trop long et <a href="http://www.box.net/shared/ropzl4u80o">disponible ici</a>.<br />
Mais voici un aperçu de la classe C++:<br />
<pre class="brush: cpp;">
#include &quot;jni.h&quot;
public ref class MyJavaWrapper
{
private:
  static jmethodID initMethodId;
  static jclass clazz;
  jobject obj;
public:
  /* initialisation des métadata Java/JNI, à voir plus tard */
  static void initJavaMetadata()
  { ... }

  /* une méthode de notre classe Java que l'on wrappe, expliqué aussi plus tard */
  String^ SayHello(String^ people)
  { ... }

  /* constructeur */
  MyJavaWrapper(void)
  {
    // histoire de récupérer toutes les métadatas nécessaires du coté Java
    MyJavaWrapper::initJavaMetadata();

    // construction d'une instance avec le constructeur par défaut
    this-&gt;obj = JVMWrapper::env-&gt;NewObject(MyJavaWrapper::clazz, MyJavaWrapper::initMethodId);
  }

  /* &quot;destructeur&quot; */
  virtual ~MyJavaWrapper(void)
  {
    JVMWrapper::env-&gt;DeleteLocalRef(this-&gt;obj);
  }
};
</pre><br />
<code>ref class</code> veut dire &#8220;c&#8217;est une classe .Net&#8221;. Mais&#8230; ma classe n&#8217;implémente pas <code>IDisposable</code>!! Et c&#8217;est quoi ce destructeur??<br />
Et oui: le destructeur C++ pour un objet .Net est transformé en la méthode <code>Dispose()</code> et la classe devient alors forcement <code>IDisposable</code>. Pour gérer le <code>finalize</code> <a href="http://dotnet.developpez.com/faq/cppcli/?page=syntaxe#finalizer_vs_destructor">allez voir ici</a>.</p>
<p>Je manipule le membre <code>this-&gt;obj</code> qui est tout simplement un &#8220;pointeur&#8221; sur notre objet java. En fait, c&#8217;est un <code>jobject</code> qui est un type définie dans <code>"jni.h"</code>.<br />
J&#8217;utilise la classe JVMWrapper qui me permet de communiquer avec la JVM, et je lui demande de créer un nouvel objet d&#8217;une certaine classe <code>jclass</code> avec un certain constructeur <code>jmethodID</code> et j&#8217;obtiens ainsi mon <code>jobject</code>.<br />
<em>Étant donnée que la classe et la méthode ne change pas, j&#8217;ai rendu ces données <code>static</code>.</em></p>
<p>Voyons maintenant ce que fait <code>MyJavaWrapper::initJavaMetadata();</code>:<br />
<pre class="brush: cpp;">
/* initialise les metadata du coté Java */
static void initJavaMetadata()
{
  // si les métadata ne sont pas déjà récupérées...
  if(MyJavaWrapper::clazz == NULL)
  {
    MyJavaWrapper::clazz = JVMWrapper::env-&gt;FindClass(&quot;mathias/jni/java/MyJavaClass&quot;);
    MyJavaWrapper::initMethodId = JVMWrapper::env-&gt;GetMethodID(MyJavaWrapper::clazz, &quot;&lt;init&gt;&quot;, &quot;()V&quot;);
  }
}
</pre></p>
<p>C&#8217;est la dedans que j&#8217;obtiens une fois pour toute la représentation de la classe Java <code>mathias.jni.java.MyJavaClass</code> et la représentation de la méthode <code>&lt;init&gt;</code> avec en paramètre <code>()V</code>.<br />
Pour comprend le lien avec la classe, il n&#8217;y a pas trop de problème: c&#8217;est le <a href="http://en.wikipedia.org/wiki/Fully_qualified_name">fully qualified name</a> avec des &#8216;/&#8217; au lieu des &#8216;.&#8217;.<br />
Mais en ce qui concerne la recherche d&#8217;une méthode, ça devient du charabia!!<br />
En fait, <code>&lt;init&gt;</code> est une méthode un peu spéciale: c&#8217;est un constructeur.<br />
Ensuite, on spécifie les arguments du constructeur que l&#8217;on cherche, et la on tombe sur une syntaxe barbare. Dans notre cas, on cherche le constructeur par défaut c&#8217;est à dire qui ne prend pas d&#8217;argument.<br />
Mais pour mieux comprendre la syntaxe barbare, voyons d&#8217;autres exemples de méthodes:<br />
<pre class="brush: cpp;">
JVMWrapper::env-&gt;GetMethodID(MyJavaWrapper::clazz, &quot;setPeople&quot;, &quot;(Ljava/lang/String;)V&quot;);
</pre><br />
Traduction: je cherche la méthode <code>setPeople</code> qui prend un argument de type <code>java.lang.String</code> et qui retourne <code>void</code>.<br />
Un autre exemple:<br />
<pre class="brush: cpp;">
JVMWrapper::env-&gt;GetMethodID(MyJavaWrapper::clazz, &quot;sayHello&quot;, &quot;([Ljava/lang/String;Z;)I&quot;);
</pre><br />
Traduction: je cherche la méthode <code>sayHello</code> qui prend un argument de type <code>java.lang.String[]</code> et un autre de type <code>boolean</code> et qui retourne un type <code>int</code>.</p>
<p>On retrouve cette syntaxe à beaucoup d&#8217;endroits, comme sous <a href="http://grozeille.files.wordpress.com/2008/05/eclipsejni.png">Eclipse</a> par exemple. Pour plus d&#8217;explication voir la <a href="http://java.sun.com/j2se/1.4.2/docs/guide/jni/spec/types.html">documentation officielle</a>.</p>
<p>Si l&#8217;on veut maintenant appeler une méthode Java, on récupère sa représentation tout comme on le fait avec le constructeur, puis on l&#8217;invoque sur notre instance:<br />
<pre class="brush: csharp;">
public ref class MyJavaWrapper
{
private:
  static jmethodID initMethodId;
  static jclass clazz;

  // notre représentation JNI de la méthode &quot;sayHello&quot;
  static jmethodID sayHelloMethodId;

  jobject obj;
public:
  /* initialisation des métadata Java/JNI */
  static void initJavaMetadata()
  { 
    /* initialisation de la classe et du constructeur, comme vu précédemment 
    [...]  */

    // on récupère la représentation de &quot;sayHello&quot;
    JVMWrapper::env-&gt;GetMethodID(MyJavaWrapper::clazz, &quot;sayHello&quot;, &quot;(Ljava/lang/String;)Ljava/lang/String&quot;);
  }

  /* sur l'appelle de cette méthode .Net, on fait appelle à la méthode Java */
  String^ SayHello(String^ people)
  {
    // j'utilise une classe spéciale pour convertir ma String^ .net en natif ou Java
    StringConverter peopleStringConverter(people);
    jstring jPeople = peopleStringConvert.toJava();

    // appelle de la méthode Java, j'ai le droit de caster en jstring car c'est un sous-type de jobject
    jstring jResult = (jstring)JVMWrapper::env-&gt;CallObjectMethod(this-&gt;obj, sayHelloMethodId, jPeople);

    // conversion du type Java en .Net
    StringConverter resultStringConvert(jResult);
    return resultStringConvert.toDotnet();
  }
};
</pre></p>
<p>Voila, maintenant vous savez:</p>
<ul>
<li>obtenir la représentation d&#8217;une classe Java</li>
<li>obtenir la représentation d&#8217;une méthode d&#8217;une classe</li>
<li>créer une instance d&#8217;une classe Java</li>
<li>invoker des méthodes sur une instance</li>
</ul>
<p>En conclusion:<br />
l&#8217;API JNI c&#8217;est un peux comme utiliser la réflection. Ça a donc des conséquences en termes de performance. Pour information, créer 10000 objet en java prend <em>625ms</em>, en pure .net ça donne <em>46ms</em> et en .Net-&gt;JNI-&gt;Java ça donne <em>2.687s</em>.<br />
L&#8217;API JNI peut sembler barbare au début, mais on s&#8217;y fait <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  et puis il y a <a href="http://java.sun.com/j2se/1.4.2/docs/guide/jni/spec/functions.html#wp20949">la doc</a>, alors <a href="http://en.wikipedia.org/wiki/RTFM">RTFM</a> <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>C++/CLI c&#8217;est de la bombe en termes d&#8217;interop. C&#8217;est le pont parfait entre le monde .Net et le natif.<br />
L&#8217;inconvénient c&#8217;est que la syntaxe C++ est lourde. Et elle l&#8217;est d&#8217;autant plus en C++/CLI car il faut y ajouter les spécificités .Net, et il faut aussi distinguer une instance managée et non-managée, et tout ça passe par de nouveau symboles/mots-clefs.<br />
Les conversions de types entre les deux mondes ne sont pas faites implicitement, et il faut souvent jongler pour avoir le bon type. J&#8217;ai par exemple eu des problèmes lors des conversions de String avec JNI: il faut convertir la <code>String^</code> .net en <code>char*</code> natif pour enfin construire une <code>jstring</code>. Les conversions ont été le plus pénible dans l&#8217;histoire.</p>
<p>Enfin, voici le projet complet: <a href="http://www.box.net/shared/ropzl4u80o">Mathias.Jni.CSharp.zip</a><br />
Un petit rappel des liens utiles:</p>
<ul>
<li><a href="http://dotnet.developpez.com/faq/cppcli/">http://dotnet.developpez.com/faq/cppcli/</a></li>
<li><a href="http://java.sun.com/j2se/1.4.2/docs/guide/jni/spec/jniTOC.html">http://java.sun.com/j2se/1.4.2/docs/guide/jni/spec/jniTOC.html</a></li>
</ul>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/grozeille.wordpress.com/53/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/grozeille.wordpress.com/53/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/grozeille.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/grozeille.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/grozeille.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/grozeille.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/grozeille.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/grozeille.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/grozeille.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/grozeille.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/grozeille.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/grozeille.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/grozeille.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/grozeille.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/grozeille.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/grozeille.wordpress.com/53/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grozeille.com&amp;blog=173450&amp;post=53&amp;subd=grozeille&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://grozeille.com/2008/05/08/appeler-du-java-depuis-net/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/fcf307a3a2899d162cabfd41241f17b9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">grozeille</media:title>
		</media:content>
	</item>
	</channel>
</rss>
