<?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>Le blog de SpiceGuid &#187; Langages et techniques de compilation</title>
	<atom:link href="https://blog.developpez.com/damien-guichard/pcategory/langages-et-techniques-de-compilation/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/damien-guichard</link>
	<description></description>
	<lastBuildDate>Mon, 28 May 2012 16:08:44 +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>Les types non-annulables</title>
		<link>https://blog.developpez.com/damien-guichard/p7144/langages-et-techniques-de-compilation/les_types_non_annulables</link>
		<comments>https://blog.developpez.com/damien-guichard/p7144/langages-et-techniques-de-compilation/les_types_non_annulables#comments</comments>
		<pubDate>Sat, 31 Jan 2009 15:53:27 +0000</pubDate>
		<dc:creator><![CDATA[SpiceGuid]]></dc:creator>
				<category><![CDATA[Langages et techniques de compilation]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dans mon précédent billet j&#8217;exposais quelques motivations et quelques objectifs de conception pour un langage natif moderne. Dans ce billet je discute certaines conséquences de la notion de types non-annulables. Des conséquences non évoquées dans le document d&#8217;origine. Une chose après l&#8217;autre Il y a principalement deux aspects pseudo-innovants dans ma conception de base. Je dis pseudo parce qu&#8217;en cherchant bien on trouvera des langages qui implantent l&#8217;un ou les deux aspects en question, je [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Dans mon précédent billet j&rsquo;exposais quelques motivations et quelques objectifs de conception pour <a href="http://damien-guichard.developpez.com/lombric/index.html" target="_blank">un langage natif moderne</a>.</p>
<p>Dans ce billet je discute certaines conséquences de la notion de types non-annulables.<br />
Des conséquences non évoquées dans le document d&rsquo;origine.</p>
<p><span id="more-30"></span></p>
<h3>Une chose après l&rsquo;autre</h3>
<p>Il y a principalement deux aspects pseudo-innovants dans ma conception de base.<br />
Je dis pseudo parce qu&rsquo;en cherchant bien on trouvera des langages qui implantent l&rsquo;un ou les deux aspects en question, je dis innovants parce qu&rsquo;en pratique je ne retrouve ces deux caractéristiques dans aucun langage impératif.  </p>
<p>Ces deux aspects ce sont :</p>
<ul>
<li>les types non-annulables</li>
<li>les classes sous forme d&rsquo;enregistrement dont les champs sont des fonctions</li>
</ul>
<p>Ces deux aspects sont typiques de langages de très haut niveau et viennent même d&rsquo;horizons opposés :</p>
<ul>
<li>les types non-annulables sont réservés aux langages à très fort typage statique, le plus souvent ce sont des stratégies de typage à la <em>Hindley-Milner</em> qui autorisent ce genre de sécurité</li>
<li>au contraire les enregistrement de fonctions sont typiques de langages très dynamiques à la <a href="http://en.wikipedia.org/wiki/Self_(programming_language)" target="_blank">Self</a></li>
</ul>
<p>Alors pourquoi intégrer ces deux aspects dans un langage de bas niveau ?</p>
<p>Tout simplement parce que :</p>
<ul>
<li>les types non-annulables ne sont pas contradictoires avec des manipulations de bas niveau, au contraire ils les permettent tout les sécurisant davantage et ça correspond bien à l&rsquo;objectif premier du langage <em>Lombric</em></li>
<li>les enregistrements de fonctions sont un bon moyen de réconcilier le style procédural et le style POO, c&rsquo;est un pas important vers le second de mes objectifs affichés</li>
</ul>
<p>Cependant, ayant renoncé dans l&rsquo;immédiat à pousser plus loin la conception de l&rsquo;aspect POO, tout naturellement mon attention se reporte sur la bonne réalisation des types non-annulables.</p>
<h3>Qu&rsquo;est-ce qu&rsquo;un type non-annulable ?</h3>
<p>Un type non-annulable est un type pointeur dont les valeurs ne vaudront jamais <strong>null</strong>.<br />
Concrètement, si une valeur est non-annulable alors on ne peut pas lui affecter la valeur <strong>null</strong>.</p>
<p>Bien sûr il est possible de transtyper une valeur annulable en valeur non-annulable, et ceci à l&rsquo;aide d&rsquo;un opérateur de conversion on ne peut plus discret, car la sécurité ne doit pas aller à l&rsquo;encontre de la productivité.<br />
Mais autrement, aucune opération de déréférencement n&rsquo;est possible sur une valeur annulable.<br />
J&rsquo;insiste sur cet aspect du langage car il me paraît fondamental. On ne peut pas affirmer qu&rsquo;un langage est fortement typé et accepter qu&rsquo;il échoue dynamiquement parce qu&rsquo;un certain pointeur ne désigne aucune valeur. Un typage statique fort c&rsquo;est précisément garantir que l&rsquo;exécution n&rsquo;échouera pas pour des raisons aussi banales, et bien que <em>Lombric</em> ne soit pas à l&rsquo;abri de ce genre d&rsquo;erreurs (après tout ça n&rsquo;est qu&rsquo;un langage de bas niveau) il offre néanmoins assez d&rsquo;outils pour en limiter le nombre. Faire autrement serait irresponsable. Bien sûr comme c&rsquo;est un langage de bas niveau il ne va pas jusqu&rsquo;à prohiber les types annulables, il laisse le programmeur libre du choix de ses armes.   </p>
<p>L&rsquo;exemple qui suit vous convaincra sans doute que cette sécurité n&rsquo;est ni trop zélée ni trop spécifique à la POO.<br />
On a déclaré deux variables locales :</p>
<ul>
<li>l&rsquo;une est une variable entière <em>n</em></li>
<li>l&rsquo;autre est une fonction <em>f</em> des entiers vers les entiers</li>
</ul>
<pre>
LOCAL n:LONG
LOCAL f:(LONG)(LONG)
n := f(n)
</pre>
<p>Ce code est-il bien typée ?<br />
La réponse est non.<br />
Ce code n&rsquo;est pas bien typé parce que les types de fonctions sont non-annulables.<br />
Et d&rsquo;ailleurs si ce code était bien typé quelle pourrait bien être la valeur de <em>f</em> ?<br />
Probablement aucune valeur qui soit valide pour l&rsquo;appel de <em>f(n)</em>.</p>
<p>Par contre, étant donné une fonction <em>neg</em> appropriée, le code suivant serait tout à fait valide :</p>
<pre>
LOCAL n:LONG
LOCAL f := neg
n := f(n)
</pre>
<p>Voilà qui nous amène à une première question sur les valeurs non-annulables: comment bien les déclarer ?</p>
<h3>Types non-annulables et déclarations locales</h3>
<p>Le bénéfice évident des types non-annulables c&rsquo;est que (à l&rsquo;extrême, si on n&rsquo;utilise aucun type annulable) on a plus aucune <em>null-pointer-exception</em>.<br />
Cependant il ne faut pas se leurrer, la sûreté ne tombera pas sur vous comme un don du ciel, ce n&rsquo;est pas le langage qui supprime les erreurs, il vous permet seulement de lui intimer l&rsquo;interdiction pour vous de les insérer.<br />
Il vous appartient donc, si vous avez fait ce choix, de prouver au compilateur que vous n&rsquo;annulez jamais vos pointeurs.</p>
<p>En terme d&rsquo;utilisation cela se traduit par les deux interdits suivants :</p>
<ul>
<li>vous ne pouvez pas affecter la valeur <strong>null</strong> à une valeur non-annulable</li>
<li>vous ne pouvez pas affecter une valeur annulable à une valeur non-annulable</li>
</ul>
<p>Le premier point n&rsquo;étant bien sûr qu&rsquo;un cas particulier du deuxième. </p>
<p>En terme de création cela se traduit par les deux possibilités suivantes :</p>
<ul>
<li>l&rsquo;expression <em>NEW un_type</em> renvoie une nouvelle valeur non-annulable de type <em>un_type</em>*</li>
<li>si <em>n</em> est une expression de type non-annulable alors <em>LOCAL m</em> := <em>n</em> déclare une nouvelle variable locale <em>m</em> de même type que l&rsquo;expression <em>n</em></li>
</ul>
<p>À ce propos, le <a href="http://damien-guichard.developpez.com/lombric/index.html" target="_blank">document actuellement en ligne</a> donne à penser qu&rsquo;une déclaration LOCAL ne peut se faire que dans un module ou en-tête du corps d&rsquo;une fonction.</p>
<p>Ce qui motivait initialement ce choix d&rsquo;interdire LOCAL au milieu des corps de fonction c&rsquo;était la possibilité envisagée d&rsquo;une extension de NEW autorisant l&rsquo;allocation dynamique dans la pile.</p>
<p>Dans l&rsquo;idée de cette extension, l&rsquo;expression suivante :</p>
<pre>
NEW LONG COUNT size STACK   
</pre>
<p>aurait pour effet d&rsquo;allouer un tableau d&rsquo;entiers de taille (dynamique) <em>size</em> dans la fenêtre de pile.<br />
Cette extension est envisagebale, cependant elle n&rsquo;est pas compatible avec des déclarations LOCAL au milieu des corps de fonction car ces déclarations allouent elles aussi dans la fenêtre de pile. </p>
<p>Or, à l&rsquo;usage ou en se projetant l&rsquo;usage, il est facile de se convaincre qu&rsquo;il n&rsquo;est pas toujours facile de connaître la valeur d&rsquo;une donnée non-annulable en entrée de la fonction, parfois la valeur adéquate dépendra d&rsquo;une condition ou d&rsquo;un calcul.<br />
De sorte qu&rsquo;il est souhaitable d&rsquo;autoriser LOCAL au milieu des corps de fonction.<br />
En conséquence l&rsquo;implantation de NEW sur la pile exigera des précautions d&rsquo;usage supplémentaires qui restent encore à définir. En particulier, dans le flot d&rsquo;exécution d&rsquo;une même fonction, une déclaration LOCALE ne devra jamais être précédée par une allocation NEW STACK. </p>
<h3>Types non-annulables et résultat d&rsquo;une fonction</h3>
<p>Que faire d&rsquo;une fonction qui doit renvoyer une valeur non-annulable mais qui ne contient pas d&rsquo;instruction RETURN ?<br />
Ou alors qui contient une instruction RETURN mais pas pour tous les flots d&rsquo;exécution possibles.<br />
À l&rsquo;évidence une telle fonction n&rsquo;est pas valide car il n&rsquo;est pas question de renvoyer une valeur par défaut comme <strong>null</strong> par exemple.  </p>
<p>Alors comment valider les fonctions qui renvoient une valeur non-annulable ?</p>
<p>Voici un schéma simple, qui répond à cette question sans avoir à faire une analyse complexe du flot d&rsquo;exécution :</p>
<ul>
<li>soit la fonction se termine par une instruction LOOP qui ne contient pas de BREAK, dans ce cas elle remplira très bien son contrat puisqu&rsquo;elle ne peut pas en sortir autrement que par un RETURN</li>
<li>sinon la fonction devra se terminer par une instruction RETURN</li>
</ul>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les nouvelles du front-end</title>
		<link>https://blog.developpez.com/damien-guichard/p7139/langages-et-techniques-de-compilation/les_nouvelles_du_front_end_1</link>
		<comments>https://blog.developpez.com/damien-guichard/p7139/langages-et-techniques-de-compilation/les_nouvelles_du_front_end_1#comments</comments>
		<pubDate>Thu, 29 Jan 2009 17:37:00 +0000</pubDate>
		<dc:creator><![CDATA[SpiceGuid]]></dc:creator>
				<category><![CDATA[Langages et techniques de compilation]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ce billet inaugure une série que je voudrais consacrer à la spécification et à l&#8217;implantation d&#8217;un (nouveau) langage de bas niveau. Syntaxiquement, ce langage est inspiré de BASIC ou de MODULA, sémantiquement il se veut une modernisation du C c&#8217;est-à-dire avec les mêmes objectifs de libre performance, avec toutefois une attention particulière accordée à la sûreté de l&#8217;ensemble sans toutefois rien renier des opérations de bas niveau. La motivation principale de cette nouvelle conception c&#8217;était [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Ce billet inaugure une série que je voudrais consacrer à la spécification et à l&rsquo;implantation d&rsquo;un (nouveau) langage de bas niveau.</p>
<p>Syntaxiquement, ce langage est inspiré de BASIC ou de MODULA, sémantiquement il se veut une modernisation du C c&rsquo;est-à-dire avec les mêmes objectifs de libre performance, avec toutefois une attention particulière accordée à la sûreté de l&rsquo;ensemble sans toutefois rien renier des opérations de bas niveau.</p>
<p><span id="more-29"></span></p>
<p>La motivation principale de cette nouvelle conception c&rsquo;était le constat que les langages principaux dans la famille des langages natifs (à savoir <em>Pascal</em> et <em>C</em>) sont aujourd&rsquo;hui d&rsquo;une conception qu&rsquo;on pourrait qualifier de datée. Entre-temps le paradigme dominant a changé, des extensions ont été ajoutées, et avec le nouvel engouement pour les caractéristiques inspirées des langages fonctionnels on peut se demander si leur conception d&rsquo;origine est encore d&rsquo;actualité. Bien sûr leur utilisation est encore d&rsquo;actualité, cela je n&rsquo;en doute pas un instant, toutefois il m&rsquo;a paru intéressant d&rsquo;imaginer ce que pourrait être aujourd&rsquo;hui le coeur d&rsquo;un langage de bas niveau, conçu aujourd&rsquo;hui avec en tête le style des programmeurs d&rsquo;aujourd&rsquo;hui tout en préservant les possibilités d&rsquo;hier.</p>
<p>Et j&rsquo;insiste particulièrement sur ce dernier point: ce que je ne cherche pas c&rsquo;est à remplacer les idées d&rsquo;hier par des idées d&rsquo;aujourd&rsquo;hui, je me demande au contraire comment on pourrait (ou comment on aurait du) réconcilier au mieux la puissance du bas niveau avec la productivité du haut niveau. Par réconcilier j&rsquo;entends minimiser au mieux les allers-retours du style procédural vers le style POO, d&rsquo;un côté rogner le moins possible sur la liberté et la performance, d&rsquo;un autre côté rogner le moins possible sur la sécurité et l&rsquo;expressivité.</p>
<p>Il y a quelques temps j&rsquo;avais mis en ligne une <a href="http://damien-guichard.developpez.com/lombric/index.html" target="_blank">ébauche de spécification</a>, surnommée <em>Lombric</em> pour bien rappeler que mon objectif restait un langage de bas niveau (au niveau des pissenlits et même en dessous).<br />
Qu&rsquo;est-ce qu&rsquo;un langage de bas niveau aujourd&rsquo;hui ?<br />
<a href="http://damien-guichard.developpez.com/lombric/index.html" target="_blank">Lombric</a> m&rsquo;avait paru, et me paraît toujours, un bon début de réponse.</p>
<p>À partir de là il y avait deux directions possibles :</p>
<ul>
<li>poursuivre la spécification, notamment la partie orienté-objet</li>
<li>commencer une implantation de la partie procédurale, sans me soucier de la POO</li>
</ul>
<p>Après un temps de réflexion il s&rsquo;est avéré que seule la deuxième option faisait sens.<br />
D&rsquo;abord parce que je ne crois pas au modèle <em>Waterfall</em>, dans mon cas je crois que la bonne spécification est nourrie par la bonne implantation. Il a mille façons de faire une extension POO et seule l&rsquo;expérience du style procédural peut me guider vers le choix le plus respectueux du style traditionnel. Car je ne veux pas que l&rsquo;un supplante l&rsquo;autre, je veux qu&rsquo;ils se renforcent mutuellement.<br />
Ensuite, et c&rsquo;est sans doute la véritable raison, même en se limitant au style procédural un compilateur reste quelque chose de difficile à implanter, c&rsquo;est donc dans un soucis de maîtrise de la complexité que j&rsquo;ai décidé de commencer par la partie &laquo;&nbsp;facile&nbsp;&raquo;.</p>
<p>Laquelle partie facile réserve tout de même son lot de problèmes et de questions, mais j&rsquo;aurai sans doute l&rsquo;occasion de revenir là-dessus dans mes prochains billets.</p>
<p>Pour l&rsquo;instant je vous invite à vous familiariser avec la <a href="http://damien-guichard.developpez.com/lombric/index.html" target="_blank">conception de base du langage</a>, en gardant ces quelques points à l&rsquo;esprit :</p>
<ul>
<li>la syntaxe ne fait pas partie de la conception, c&rsquo;est juste une notation pour parler d&rsquo;une conception, en particulier la syntaxe <strong>n&rsquo;est pas</strong> la partie difficile dans la réalisation d&rsquo;un compilateur</li>
<li>il ne faut pas voir les primitives proposées comme étant complètes ou suffisantes mais seulement comme une proposition de ce qui pourrait consistuer le coeur d&rsquo;un langage autour duquel viendrait se greffer des extensions et/ou des services complémentaires, d&rsquo;une façon qu&rsquo;on souhaite harmonieuse, sans le passif de 30 années de compatibilité</li>
<li>il est prématuré de parler d&rsquo;outils, de caractéristiques ou de fonctionnalités modernes alors que le document ne parle pas de choses aussi basiques que par exemple les nombres flottants</li>
</ul>
<p>Pour finir je n&rsquo;oublie pas l&rsquo;exemple fondamental, que pour l&rsquo;occasion je précipite dans l&rsquo;ère moderne (et néanmoins déjà désuète) de la programmation modulaire :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">MODULE Hello <br />
&nbsp;<br />
IMPORT <br />
&nbsp; Console <br />
&nbsp;<br />
INITIATE <br />
&nbsp; Console.Print(&quot;Hello World!\n&quot;) <br />
ENDMODULE</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
