<?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>Codingly &#187; Cecil.Decompiler</title>
	<atom:link href="http://codingly.com/tag/cecildecompiler/feed/" rel="self" type="application/rss+xml" />
	<link>http://codingly.com</link>
	<description>Par Romain Verdier</description>
	<lastBuildDate>Thu, 24 May 2012 09:10:53 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='codingly.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/62c090a2ec42be744d871177bd874854?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Codingly &#187; Cecil.Decompiler</title>
		<link>http://codingly.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://codingly.com/osd.xml" title="Codingly" />
	<atom:link rel='hub' href='http://codingly.com/?pushpress=hub'/>
		<item>
		<title>Cecil.Decompiler : Un décompilateur .NET OpenSource</title>
		<link>http://codingly.com/2008/12/16/cecildecompiler-un-decompilateur-net-opensource/</link>
		<comments>http://codingly.com/2008/12/16/cecildecompiler-un-decompilateur-net-opensource/#comments</comments>
		<pubDate>Tue, 16 Dec 2008 22:23:30 +0000</pubDate>
		<dc:creator>Romain Verdier</dc:creator>
				<category><![CDATA[Posts]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Annonce]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Cecil.Decompiler]]></category>
		<category><![CDATA[Expression Tree]]></category>

		<guid isPermaLink="false">http://codingly.com/?p=450</guid>
		<description><![CDATA[Jean-Baptiste Evain vient de l&#8217;annoncer sur son blog : il travaille actuellement sur un nouveau projet particulièrement ambitieux appelé Cecil.Decompiler. Comme son nom l&#8217;indique, il s&#8217;agit d&#8217;un décompilateur .NET basé sur Mono.Cecil (du même auteur) qui permettait déjà de manipuler le langage intermédiaire du CLR. Quelques jours avant l&#8217;annonce officielle, Jb a organisé un Code [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codingly.com&#038;blog=3510695&#038;post=450&#038;subd=romainverdier&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Jean-Baptiste Evain <a href="http://evain.net/blog/articles/2008/12/15/cecil-decompiler">vient de l&#8217;annoncer</a> sur son blog : il travaille actuellement sur un nouveau projet particulièrement ambitieux appelé Cecil.Decompiler. Comme son nom l&#8217;indique, il s&#8217;agit d&#8217;un décompilateur .NET basé sur <a href="http://www.mono-project.com/Cecil">Mono.Cecil</a> (du même auteur) qui permettait déjà de manipuler le langage intermédiaire du CLR.</p>
<p>Quelques jours avant l&#8217;annonce officielle, Jb a organisé un <a href="http://evain.net/blog/articles/2008/12/16/decompiler-codecamp">Code Camp</a> en Ardèche (près de Lyon) en invitant quelques personnes à travailler avec lui sur ce decompiler. L&#8217;idée était avant tout de passer un bon moment, de <strike>faire avancer</strike> découvrir le projet, mais aussi d&#8217;intéresser et d&#8217;encourager d&#8217;éventuels futurs contributeurs à rejoindre l&#8217;initiative.</p>
<p>Comme j&#8217;ai eu la chance de faire partie des petits privilégiés, je vais essayer de vous livrer mes impressions à chaud.<br />
<span id="more-450"></span><br />
Déjà, belle surprise en recevant le mail d&#8217;invitation de Jb&#8230; Nous ne nous étions croisé qu&#8217;une soirée, à Paris, lorsqu&#8217;il était <a href="http://codingly.com/2008/11/05/altnet-en-france-mono-a-paris-pour-la-7eme-rencontre/">venu présenter Mono</a> en novembre pour une de nos réunions ALT.NET. Dans un milieu où le copinage reste bien présent, ce genre de proposition dénote bien une certaine ouverture d&#8217;esprit, et un fort degré de coolitude. Merci. <a href="http://strangelights.com/blog/">Robert Pickering</a> faisait aussi partie des invités mais à part lui (et Jb, donc) je ne connaissais personne. Ce fut l&#8217;occasion de faire la connaissance de <a href="http://patricelamarche.net/">Patrice Lamarche</a>, <a href="http://batswirl.com/">Mathieu Szablowski</a>, <a href="http://evilznet.com/">Vincent Bourdon</a>, et <a href="http://sebastien.lebreton.free.fr/blog/">Sébastien Lebreton</a> (auteur de réflexil). Sept personnes en tout ; soit un petit comité.</p>
<p><img src="http://romainverdier.files.wordpress.com/2008/12/codecamp2.jpg?w=720" alt="codecamp2" title="codecamp2"   class="alignnone size-full wp-image-462" /></p>
<p>Je vous avouerai que j&#8217;étais un peu impressionné à l&#8217;idée de devoir rejoindre tout ce beau monde pour travailler sur un projet de cette envergure, dont la complexité moyenne dépasse quand même celle d&#8217;une application de gestion classique&#8230; Mais l&#8217;ambiance était excellente d&#8217;une part, et le sujet carrément intéressant d&#8217;autre part.</p>
<p>Ca ne suffit pas pour faire oublier qu&#8217;on est en train de faire du pair programming avec un mec de l&#8217;équipe Mono, mais ça aide un peu. En tout cas, ça fait vraiment plaisir de participer à un projet aussi motivant, avec des gens dont la simple proximité rend moins con. J&#8217;aurais aimé pouvoir travailler en pair avec tout le monde, mais j&#8217;ai principalement codé avec Jb et Rob. Et tout seul aussi, hein. Je n&#8217;ai pas envie de rentrer dans les détails techniques aujourd&#8217;hui, mais en gros, j&#8217;ai principalement travaillé sur la partie &#8220;décompilation C#&#8221;, et plus particulièrement sur les étapes de transformation de l&#8217;arbre syntaxique visant à faire apparaitre les structures de haut niveau du langage.</p>
<p>Le decompiler lit le code intermédiaire, en infère un <a href="http://en.wikipedia.org/wiki/Control_flow_graph">Control Flow Graph</a>, puis un <a href="http://en.wikipedia.org/wiki/Abstract_syntax_tree">AST</a> assez brut dans lequel, par exemple, toutes les pre/post-tested loops sont modélisées sous la forme de statements while/do-while. Selon le langage, et selon la version du langage, il faudra ensuite exécuter une série d&#8217;analyses et de transformations sur cet arbre afin de reconnaitre les constructions spécifiques. Par exemple, et <em>au hasard</em>, le foreach.</p>
<p>Dans un <a href="http://codingly.com/2008/04/28/le-mot-cle-yield-et-les-iterateurs-en-c/">vieux post</a>, j&#8217;expliquais que le foreach en C# était syntaxiquement équivalent à :</p>
<p><pre class="brush: csharp;">
IEnumerator&lt;Jambon&gt; enumerator = jambons.GetEnumerator();
try
{
	while( enumerator.MoveNext())
	{
		Jambon jambon = enumerator.Current;
		// Manger le jambon, miam, etc.
	}
}
finally
{
	IDisposable disposableEnumerator = enumerator as IDisposable;
	if(disposableEnumerator != null)
	{
		disposableEnumerator.Dispose();
	}
}
</pre></p>
<p>C&#8217;est donc le pattern qu&#8217;il faut identifier dans l&#8217;arbre, à quelques subtilités près. Ca m&#8217;a pris 3 bons jours, et c&#8217;est loin d&#8217;être terminé si on veut gérer tous les edge cases, allez donc savoir pourquoi. J&#8217;ai aussi travaillé avec Jb sur une implémentation sympa d&#8217;un &#8220;pattern matching du pauvre&#8221; en C#, joyeusement supprimée depuis&#8230; On cherche quelque chose de mieux. Mais ça permettait d&#8217;écrire des trucs rigolos du genre :</p>
<p><pre class="brush: csharp;">
// Création du pattern
var matcher = Pattern.Match&lt;Expression&gt;()
					 .Is&lt;MethodInvocationExpression&gt;()
                     .Select(mie =&gt; mie.Method)
                     .Is&lt;MethodReferenceExpression&gt;()
                     .Tag(() =&gt; method_key, mre =&gt; mre.Method)
                     .Tag(() =&gt; target_key, mre =&gt; mre.Target);

// Compilation du pattern matcher pour récupérer un delegate qui pourra être mis en cache
// et invoqué avec de bonnes performances
var methodInvocationMatcher = matcher.Compile&lt;Func&lt;MatchResult, Expression, bool&gt;&gt; ();

// Exécution du pattern matching : on obtient un MatchResult
var result = Pattern.Run (MethodInvocationMatcher, expression);

// On peut maintenant, en cas de succès, travailler avec les valeurs qui ont été tagguée
// lors du pattern matching, si elles ont été trouvées
if (result.Success)
{
	Expression targetExpression;
    if (result.TryGetValue(target_key, out targetExpression))
    {
		// ...
	}

	MethodReference methodReference;
	if (result.TryGetValue(method_key, out methodReference))
	{
		// ...
	}
}
</pre></p>
<p>Le code du matcher pouvait être généré dynamiquement via <code>System.Reflection.Emit</code>, puis compilé pour obtenir un delegate capable d&#8217;être exécuté sans ruiner les perfs. Ca peut <a href="http://codingly.com/2008/05/06/continuer-loptimisation-avec-la-lightweight-code-generation-lcg/">vous rappeler quelque chose</a>&#8230; mais l&#8217;idée n&#8217;était pas de moi !</p>
<p>J&#8217;ai également eu l&#8217;opportunité de travailler avec Rob pour réaliser une version F# du matcher capable de détecter les foreach à titre d&#8217;essai. Pas vraiment l&#8217;initiation idéale à F# pour un profane comme moi, mais heureusement Rob a gardé le clavier durant la session. Ce fut pour moi l&#8217;occasion d&#8217;avoir un bon aperçu de la puissance du langage en matière de pattern matching et de tester rapidement pour la première fois l&#8217;intérop C#/F#.</p>
<p><img src="http://romainverdier.files.wordpress.com/2008/12/codecamp1.jpg?w=720" alt="codecamp1" title="codecamp1"   class="alignright size-full wp-image-463" /><br />
Le projet en lui-même est à mon sens prometteur. Ce n&#8217;est pas juste un Reflector-bis. Il s&#8217;agit d&#8217;un framework de décompilation, libre et open source, qui peut être embarqué n&#8217;importe où. Ca ouvre pas mal de perspectives pour ceux qui travaillent sur des outils d&#8217;analyse statique de code par exemple. Jason Bock, auteur de CIL Programming avec lequel j&#8217;ai été méchant par le passé, va même jusqu&#8217;à trouver <a href="http://www.jasonbock.net/JB/Default.aspx?blog=entry.850a91e9249c4d388f1ca4a3e64dfed4">Cecil.Decompiler et sa licence MIT/X11 rassurants</a> dans la mesure où la visibilité sur le devenir de Reflector est compromise.</p>
<p>Je ne suis pas sûr de vouloir crier hourra pour ça, mais ce dont je suis sûr, c&#8217;est que pouvoir disposer d&#8217;un décompilateur .NET open source, managé, qui repose sur une base solide, c&#8217;est tout bon. Si on considère en plus que Sébastien est déjà lancé à fond sur la réalisation d&#8217;une interface pour exploiter Cecil.Decompiler, dont le modèle d&#8217;extensibilité devrait être plus souple que celui de Reflector, c&#8217;est encore plus alléchant.</p>
<p>Quoi qu&#8217;il en soit, le decompiler en est à ses débuts. Il reste vraiment beaucoup de choses à faire, et ce à plusieurs niveaux :</p>
<ul>
<li>Core</li>
<li>Support des langages : C#, VB, F#, etc.</li>
<li>Interface, plugins</li>
</ul>
<p>Mais au moins, vous savez à présent que le projet existe.</p>
<br />Publié dans Posts Tagged: .NET, Annonce, C#, Cecil.Decompiler, Expression Tree <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/romainverdier.wordpress.com/450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/romainverdier.wordpress.com/450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/romainverdier.wordpress.com/450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/romainverdier.wordpress.com/450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/romainverdier.wordpress.com/450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/romainverdier.wordpress.com/450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/romainverdier.wordpress.com/450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/romainverdier.wordpress.com/450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/romainverdier.wordpress.com/450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/romainverdier.wordpress.com/450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/romainverdier.wordpress.com/450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/romainverdier.wordpress.com/450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/romainverdier.wordpress.com/450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/romainverdier.wordpress.com/450/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=codingly.com&#038;blog=3510695&#038;post=450&#038;subd=romainverdier&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://codingly.com/2008/12/16/cecildecompiler-un-decompilateur-net-opensource/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cb0ee4bde49708f4be24a02a5d59e52e?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">Romain</media:title>
		</media:content>

		<media:content url="http://romainverdier.files.wordpress.com/2008/12/codecamp2.jpg" medium="image">
			<media:title type="html">codecamp2</media:title>
		</media:content>

		<media:content url="http://romainverdier.files.wordpress.com/2008/12/codecamp1.jpg" medium="image">
			<media:title type="html">codecamp1</media:title>
		</media:content>
	</item>
	</channel>
</rss>
