<?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 &#187; Langage</title>
	<atom:link href="https://blog.developpez.com/grimly/category/lang/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>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>
