<?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/"
	>

<channel>
	<title>Grimly : blog</title>
	<atom:link href="https://blog.developpez.com/grimly/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/grimly</link>
	<description></description>
	<lastBuildDate>Thu, 12 Jun 2014 12:53:53 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>ECMAScript : Les générateurs, une fausse bonne idée ?</title>
		<link>https://blog.developpez.com/grimly/js/ecmascript-les-generateurs-une-fausse-bonne-idee</link>
		<comments>https://blog.developpez.com/grimly/js/ecmascript-les-generateurs-une-fausse-bonne-idee#comments</comments>
		<pubDate>Mon, 26 May 2014 16:37:52 +0000</pubDate>
		<dc:creator><![CDATA[Grimly]]></dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/grimly/?p=27</guid>
		<description><![CDATA[Je parcourais récemment les origines du Javascript pour me perfectionner dans ce langage et comprendre un peu plus ce qu&#8217;il s&#8217;est passé avant que je ne commence à développer des sites web (la guerre entre netscape, IE et le W3C). C&#8217;est alors que je suis tombé sur l&#8217;avenir du langage, c&#8217;est à dire ECMAScript 6 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Je parcourais récemment les origines du Javascript pour me perfectionner dans ce langage et comprendre un peu plus ce qu&rsquo;il s&rsquo;est passé avant que je ne commence à développer des sites web (la guerre entre netscape, IE et le W3C). C&rsquo;est alors que je suis tombé sur l&rsquo;avenir du langage, c&rsquo;est à dire ECMAScript 6 &laquo;&nbsp;Harmony&nbsp;&raquo; de nos jours.</p>
<p>J&rsquo;y ai trouvé ce que je pense être l&rsquo;une des idées les plus mal introduites dans un langage informatique, les générateurs.<br />
<span id="more-27"></span><br />
Les générateurs n&rsquo;ont pas été inventés pour Javascript mais existent déjà en PHP 5.5. Il faut alors apprendre ce pourquoi ils ont été réalisés et comment ils ont été implémentés pour comprendre ce qui a été fait dans ECMAScript 6.</p>
<p>En PHP 5.5 nous pouvons maintenant nous abstenir de l&rsquo;instruction &laquo;&nbsp;return&nbsp;&raquo; et utiliser l&rsquo;instruction &laquo;&nbsp;yield&nbsp;&raquo;. La fonction retourne alors un générateur et non une valeur.<br />
Un générateur est un objet dont l&rsquo;idée principale est de fournir une méthode &laquo;&nbsp;next&nbsp;&raquo; pour accéder à des valeurs successives rendues disponibles par l&rsquo;instruction &laquo;&nbsp;yield&nbsp;&raquo;.</p>
<p>Un exemple concret serait l&rsquo;extraction des différents champs d&rsquo;une date à partir d&rsquo;un timestamp. Il existe des fonctions natives pour cela mais imaginons que nous n&rsquo;y avons pas accès.<br />
On souhaite alors retrouver l&rsquo;année, le mois, le jour du mois, le jour dans l&rsquo;année, le jour de la semaine, l&rsquo;heure, les minutes et secondes &#8230; n&rsquo;importe quelle information commune sur la date. Je vais me restreindre aux données horaires pour diminuer la taille des codes présentés.<br />
Si je me retrouve dans l&rsquo;incapacité de créer un générateur, en PHP nous aurions du créer cette fonction :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">function getDateFields($timestamp) {<br />
&nbsp; &nbsp; $result = array();<br />
&nbsp; &nbsp; $result['millisecond'] = $timestamp % 1000;<br />
&nbsp; &nbsp; $timestamp = $timestamp / 1000;<br />
&nbsp; &nbsp; $result['second'] = $timestamp % 60;<br />
&nbsp; &nbsp; $timestamp = $timestamp / 60;<br />
&nbsp; &nbsp; $result['minute'] = $timestamp % 60;<br />
&nbsp; &nbsp; $timestamp = $timestamp / 60;<br />
&nbsp; &nbsp; $result['hour'] = $timestamp % 12;<br />
&nbsp; &nbsp; $result['am/pm'] = $timestamp % 24 &amp;gt;= 12 ? 'pm' : 'am';<br />
&nbsp; &nbsp; $result['hourOfDay'] = $timestamp % 24;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; //...<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; return $result;<br />
}</div></td></tr></tbody></table></div>
<p>Ici nous allouons un tableau de résultats avant de le retourner d&rsquo;un seul coup. Il y a ici une consommation de mémoire induite par le stockage des résultats intermédiaires. Pourtant nous devrions être capable de les consommer sans placer en cache les différents résultats. C&rsquo;est l&rsquo;idée principale des générateurs. Sur des applications plus complexes, ils permettent l&rsquo;accessibilité de résultats intermédiaires et donc une réduction de la consommation mémoire avec peu d&rsquo;efforts.</p>
<p>Avec le mot clé yield, le code si dessus deviens le suivant :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">function getDateFieldsGenerator($timestamp) {<br />
&nbsp; &nbsp; yield array('millisecond' =&amp;gt; $timestamp % 1000);<br />
&nbsp; &nbsp; $timestamp = $timestamp / 1000;<br />
&nbsp; &nbsp; yield array('second' =&amp;gt; $timestamp % 60);<br />
&nbsp; &nbsp; $timestamp = $timestamp / 60;<br />
&nbsp; &nbsp; yield array('minute' =&amp;gt; $timestamp % 60);<br />
&nbsp; &nbsp; $timestamp = $timestamp / 60;<br />
&nbsp; &nbsp; yield array('hour' =&amp;gt; $timestamp % 12);<br />
&nbsp; &nbsp; yield array('am/pm' =&amp;gt; $timestamp % 24 &amp;gt;= 12 ? 'pm' : 'am');<br />
&nbsp; &nbsp; yield array('hourOfDay' =&amp;gt; $timestamp % 24);<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; //...<br />
}</div></td></tr></tbody></table></div>
<p>Le code est très semblable et peux être compris de la même façon. La différence règne dans la consommation mémoire. En effet le moteur PHP ne retourne pas une valeur à l&rsquo;exécution de cette &laquo;&nbsp;fonction&nbsp;&raquo; mais un générateur qui n&rsquo;est autre qu&rsquo;un itérateur sur les résultats indiqués par le mot clé &laquo;&nbsp;yield&nbsp;&raquo;. Entre chaque itération, la fonction est reprise au même endroit jusqu&rsquo;à atteindre le prochain résultat. On arrive aussi à produire une fermeture sur le champ $timestamp car il reste accessible et modifiable avec les itérations successives du générateur. C&rsquo;est un ajout puissant dans PHP car hormis le contexte d&rsquo;un objet ou de paramètres, il n&rsquo;existe pas de fermeture en PHP.</p>
<p>Maintenant il faut comprendre aussi ce qu&rsquo;un générateur n&rsquo;est pas fait pour l&rsquo;itération simple d&rsquo;une structure quelle qui soit. Par exemple si on souhaite itérer sur un tableau, on préfèrera ce code &#8230;</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">function iterateOver($tab) {<br />
&nbsp; &nbsp; return new ArrayIterator($tab);<br />
}</div></td></tr></tbody></table></div>
<p>&#8230; à ce code &#8230;</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">function iterateOver($tab) {<br />
&nbsp; &nbsp; foreach ($tab as $value) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; yeild $value;<br />
&nbsp; &nbsp; }<br />
}</div></td></tr></tbody></table></div>
<p>En javascript, le problème est différent car nous disposons déjà des fermetures et la traduction d&rsquo;un générateur en code javascript est simple.</p>
<p>Avec ECMAScript 6, deux nouveaux mots clés sont introduits dans le langage, &laquo;&nbsp;function*&nbsp;&raquo; (l&rsquo;étoile est importante) et &laquo;&nbsp;yield&nbsp;&raquo;. Le comportement est similaire avec l&rsquo;implémentation de PHP aussi pour implémenter le générateur PHP en JS, nous pourrons écrire ceci :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">function* getDateFields(time) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; //.....<br />
&nbsp; &nbsp; &nbsp; &nbsp; yield { field : 'TIMESTAMP', value : time };<br />
&nbsp; &nbsp; &nbsp; &nbsp; yield { field : 'ERA', value : time = 12 ? 'pm' : 'am' };<br />
&nbsp; &nbsp; &nbsp; &nbsp; date = Math.floor(time / oneDay);<br />
&nbsp; &nbsp; &nbsp; &nbsp; time = posMod(time, oneDay);<br />
&nbsp; &nbsp; &nbsp; &nbsp; yield { field : 'MILLISECOND', value : time % 1000 };<br />
&nbsp; &nbsp; &nbsp; &nbsp; time = Math.floor(time / 1000);<br />
&nbsp; &nbsp; &nbsp; &nbsp; yield { field : 'SECOND', value : time % 60 };<br />
&nbsp; &nbsp; &nbsp; &nbsp; time = Math.floor(time / 60);<br />
&nbsp; &nbsp; &nbsp; &nbsp; yield { field : 'MINUTE', value : time % 60 };<br />
&nbsp; &nbsp; &nbsp; &nbsp; time = Math.floor(time / 60);<br />
&nbsp; &nbsp; &nbsp; &nbsp; yield { field : 'HOUR', value : time % 12 };<br />
&nbsp; &nbsp; &nbsp; &nbsp; yield { field : 'HOUR_OF_DAY', value : time % 24 };<br />
&nbsp; &nbsp; &nbsp; &nbsp; yield { field : 'AM_PM', value : time % 24 &amp;gt;= 12 ? 'pm' : 'am' };<br />
&nbsp; &nbsp; &nbsp; &nbsp; yield { field : 'DAY_OF_WEEK', value : posMod(date + 4, 7) + 1 };<br />
&nbsp; &nbsp; &nbsp; &nbsp; //....<br />
}</div></td></tr></tbody></table></div>
<p>Cependant ceci est un sucre syntaxique repris de PHP pour en réalité représenter ce code :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">function getDateFields(timestamp) {<br />
&nbsp; &nbsp; &nbsp; //...<br />
<br />
&nbsp; &nbsp; &nbsp; var iter = Object.create(null), step;<br />
&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; step = 0;<br />
&nbsp; &nbsp; &nbsp; iter.next = function() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; var res = null;<br />
&nbsp; &nbsp; &nbsp; &nbsp; switch(step) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case 0:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res = { field : 'TIMESTAMP', value : time };<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case 1:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res = { field : 'ERA', value : time = 12 ? 'pm' : 'am' };<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case 2:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; date = Math.floor(time / oneDay);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time = posMod(time, oneDay);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res = { field : 'MILLISECOND', value : time % 1000 };<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case 3:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time = Math.floor(time / 1000);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res = { field : 'SECOND', value : time % 60 };<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case 4:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time = Math.floor(time / 60);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res = { field : 'MINUTE', value : time % 60 };<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case 5:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time = Math.floor(time / 60);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res = { field : 'HOUR', value : time % 12 };<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case 6:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res = { field : 'HOUR_OF_DAY', value : time % 24 };<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case 7:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res = { field : 'AM_PM', value : time % 24 &amp;gt;= 12 ? 'pm' : 'am' };<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case 8:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res = { field : 'DAY_OF_WEEK', value : posMod(date + 4, 7) + 1 };<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //....<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; if (res === null) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return { done : true };<br />
&nbsp; &nbsp; &nbsp; &nbsp; } else {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; step = step + 1;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return { done : false, value : res };<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; return iter;<br />
}</div></td></tr></tbody></table></div>
<p>Le code est tout aussi fonctionnel, clair et certes plus verbeux. Nous n&rsquo;avons qu&rsquo;un gain de verbosité (et encore ce n&rsquo;est qu&rsquo;un switch+case) à ce qui peux être écrit tout aussi simplement.</p>
<p>Le problème est aussi dans la notation de ce générateur, et c&rsquo;est un reproche que je fais aussi à l&rsquo;implémentation PHP, qui est identifié par le mot clé &laquo;&nbsp;function*&nbsp;&raquo;. Pour un débutant sur le langage, cette notation porte fortement à confusion. Si il veux alors comprendre pleinement la notion des fonctions, il ne doit jamais croiser de générateur ou bien il peux alors se retrouver dans la confusion d&rsquo;un sucre syntaxique inutile.</p>
<p>ECMAScript 6 donne de bonnes idées avec le retour des itérateurs, les maps et cette nouvelle notion de promesses mais rajoute un sujet de confusion à travers les générateurs.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Création d&#8217;un langage objet : Problèmes de nommage</title>
		<link>https://blog.developpez.com/grimly/lang/creation-dun-langage-objet-problemes-de-nommage</link>
		<comments>https://blog.developpez.com/grimly/lang/creation-dun-langage-objet-problemes-de-nommage#comments</comments>
		<pubDate>Tue, 15 Apr 2014 18:58:39 +0000</pubDate>
		<dc:creator><![CDATA[Grimly]]></dc:creator>
				<category><![CDATA[Langage]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/grimly/?p=17</guid>
		<description><![CDATA[Bonjour, Alors que je pense aux classes utilitaires qui seraient utilisables au sein du langage que je développe, je me suis heurté à un problème concernant les collisions de noms de méthode. Imaginons dans un premier temps les interfaces suivantes : On peux imaginer une application qui viens simuler un animal tombe sur un aliment. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Bonjour,</p>
<p>Alors que je pense aux classes utilitaires qui seraient utilisables au sein du langage que je développe, je me suis heurté à un problème concernant les collisions de noms de méthode.<br />
<span id="more-17"></span><br />
Imaginons dans un premier temps les interfaces suivantes :<br />
<img src="http://yuml.me/diagram/plain;dir:LR;/class/[Animal|+regarder(aliment:Aliment):VIDE],[Aliment|+getNom():String]" alt="" /></p>
<p>On peux imaginer une application qui viens simuler un animal tombe sur un aliment.</p>
<p>On commence par implémenter deux classes concrètes pour Aliment :<br />
<img src="http://yuml.me/diagram/plain;dir:LR;/class/[Animal|+regarder(aliment:Aliment):VIDE],[Aliment|+getNom():String]^-.-[Carotte|+getNom():String],[Aliment|+getNom():String]^-.-[PommeDeTerre|+getNom():String]" alt="" /></p>
<p>C&rsquo;est alors que ça deviens intéressant. Avec le langage Java, j&rsquo;avais quelques habitudes pour distinguer les implémentations particulières afin d&rsquo;éviter par exemple de créer un BufferedInputStream alors qu&rsquo;on m&rsquo;en donne déjà un lorsque je demande un InputStream.</p>
<p>Je décide alors d&rsquo;utiliser ce comportement pour implémenter un lapin :<br />
<img src="http://yuml.me/diagram/plain;dir:LR;/class/[Animal|+regarder(aliment:Aliment):VIDE]^-.-[Lapin|+regarder(aliment:Aliment):VIDE;+regarder(carotte:Carotte):VIDE],[Aliment|+getNom():String]^-.-[Carotte|+getNom():String],[Aliment|+getNom():String]^-.-[PommeDeTerre|+getNom():String]" alt="" /></p>
<p>Le schéma en soit ne choquerait pas directement un développeur Java qui aurait déjà observé le code de certains constructeurs de quelques classes Java. Pourtant cela me pose un problème conséquent sur la détermination de la méthode à appeler.</p>
<p>Imaginons ce bout de code suivant :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">declare lapin : Lapin;<br />
declare pommeDeTerre : Aliment;<br />
declare carotte : Aliment;<br />
<br />
lapin = new Lapin();<br />
pommeDeTerre = new PommeDeTerre();<br />
carotte = new Carotte();<br />
<br />
lapin.regarder(pommeDeTerre);<br />
lapin.regarder(carotte);</div></td></tr></tbody></table></div>
<p>A la ligne 9, je n&rsquo;ai pas de souci pour déterminer la méthode appelée. &laquo;&nbsp;pommeDeTerre&nbsp;&raquo; n&rsquo;est pas instance de la classe &laquo;&nbsp;Carotte&nbsp;&raquo; et donc par élimination il n&rsquo;y a pas d&rsquo;autres choix que d&rsquo;appeler &laquo;&nbsp;Lapin#regarder(aliment : Aliment):VIDE&nbsp;&raquo;<br />
Par contre c&rsquo;est une toute autre histoire à la ligne 10 où là j&rsquo;ai le choix entre &laquo;&nbsp;Lapin#regarder(aliment : Aliment):VIDE&nbsp;&raquo; et &laquo;&nbsp;Lapin#regarder(carotte : Carotte):VIDE&nbsp;&raquo;. En effet, les deux sont éligibles car &laquo;&nbsp;carotte&nbsp;&raquo; est bien une instance de &laquo;&nbsp;Carotte&nbsp;&raquo; qui hérite de &laquo;&nbsp;Aliment&nbsp;&raquo;. On peux dire qu&rsquo;on prends alors la méthode qui utiliserait le paramètre le plus éloigné dans l&rsquo;arbre d&rsquo;héritage, mais alors dans le cas particulier d&rsquo;une classe générique, que ce passe-t-il si les deux paramètres attendent la même classe ?</p>
<p>La solution la plus simple à mon sens est d&rsquo;interdire la nomination identique de plusieurs méthodes au sein d&rsquo;une même classe comme c&rsquo;est le cas en PHP, mais alors il y aurait à perdre quelques fonctionnalités assez utiles de Java.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Création d&#8217;un langage objet</title>
		<link>https://blog.developpez.com/grimly/lang/creation-dun-langage-objet</link>
		<comments>https://blog.developpez.com/grimly/lang/creation-dun-langage-objet#comments</comments>
		<pubDate>Tue, 15 Apr 2014 18:58:28 +0000</pubDate>
		<dc:creator><![CDATA[Grimly]]></dc:creator>
				<category><![CDATA[Langage]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/grimly/?p=8</guid>
		<description><![CDATA[Bonjour, Je me suis lancé dans la conception d&#8217;un langage objet qui sera ensuite compilé dans d&#8217;autres langages au même titre que Dart et CoffeeScript qui sont compilés en Javascript. Plusieurs problèmes se posent à la création d&#8217;un langage : L&#8217;outil de compilation : Plusieurs choix s&#8217;offrent à moi. Je pourrais tout simplement créer un [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Bonjour,</p>
<p>Je me suis lancé dans la conception d&rsquo;un langage objet qui sera ensuite compilé dans d&rsquo;autres langages au même titre que Dart et CoffeeScript qui sont compilés en Javascript.</p>
<p>Plusieurs problèmes se posent à la création d&rsquo;un langage :<br />
<span id="more-8"></span></p>
<h3>L&rsquo;outil de compilation :</h3>
<p>Plusieurs choix s&rsquo;offrent à moi. Je pourrais tout simplement créer un compilateur avec le couple lex/yacc qui me donnerai un langage cible connu et en rester là. Cependant cela ne me satisfait pas tellement car j&rsquo;aimerais fournir plusieurs langages cibles afin d&rsquo;être utilisable par une jvm, un moteur javascript ou un interpréteur PHP. Créer plusieurs compilateurs pour ces différents outils semble difficile, et c&rsquo;est d&rsquo;ailleurs le cas. Mon choix s&rsquo;oriente vers une compilation en deux temps. D&rsquo;abord un lexxer/parser sera écrit (je ne sais pas encore avec quel outil mais surement un existant), pour produire une série de fichiers xml pré-compilés. Un peu comme le bytecode de Java. Par la suite, une transformation XSL permettra de générer un code dans le langage cible.<br />
Cette compilation en deux temps a quelques avantages. Il permet à un nouveau langage de voir le jour, de générer des fichiers XML validé par les mêmes outils de validations (je pense à des Schémas XSD) pour réutiliser les mêmes transformations XSL afin de produire le code souhaité.</p>
<h3>L&rsquo;environnement :</h3>
<p>Mon objectif est de compiler le même langage vers du javascript, java (ou bytecode) ou même PHP. Mais ces derniers langages n&rsquo;ont que peu de choses en commun. Il n&rsquo;existe pas de Socket avec IE7 pour être utilisé en Javascript, PHP ne sais pas afficher d&rsquo;éléments graphiques, l&rsquo;accessibilité des bases de données est très limitée en javascript (un peu moins en ce moment grâce à Node.js). Aussi il faut prévoir les outils nécessaires afin d&rsquo;accéder à ces éléments graphiques et prendre en compte leur inaccessibilité.</p>
<h3>Le langage :</h3>
<p>Le langage lui même est un problème. Il faut prévoir une grammaire suffisamment robuste pour implémenter toutes les fonctionnalités. On notera par exemple qu&rsquo;il est impossible en javascript de s&rsquo;assurer du typage des paramètres d&rsquo;une fonction de façon native.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
