Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2017-02-02T23:30:36+01:00Les derniers messages parus sur le forum de Zeste de Savoir.Compilation de Scheme, message #1401422017-02-02T23:30:36+01:00Eusèbe/@Eus%C3%A8behttps://zestedesavoir.com/forums/sujet/7877/compilation-de-scheme/?page=1#p140142<blockquote>
<p>ce langage est toujours enseigné comme langage de référence</p>
</blockquote>
<p>C’est toujours enseigné parce que ça reste difficilement contournable, mais comme « référence », bof : le langage généraliste à la mode, c’est Java ou Python maintenant. Les formations où le C prend cette place sont soit des formations assez orientées électronique ou embarqué, soit des formations où les gens qui décident des programmes ne sont pas informaticiens et ne connaissent de toute façon rien d’autre que le (mauvais) « C/C++ ».</p>
<blockquote>
<p>je pense qu’il s’agit d’un challenge intéressant </p>
</blockquote>
<p>Pas tellement, en fait. Si c’est pour faire du C, il y a un tas de choses plus intéressantes et instructives, et si c’est pour apprendre la compilation, il y a plein d’autres langages qui rendent la tâche plus intéressante. Devoir se concentrer sur la gestion de la mémoire alors qu’on cherche à écrire un compilateur, donc un programme qui effectue des opérations complexes sur des données riches, c’est contre-productif. Alors bien sûr, ça reste possible, mais ce serait une erreur de penser que « c’est plus dur donc j’apprends plus de choses » à la « ce qui ne me tue pas me rend plus fort ».</p>
<blockquote>
<p>(d’autant plus que bon nombre de compilateurs/VM/interpréteurs pour d’autres langages sont écrits en C).</p>
</blockquote>
<p>Les VM, c’est possible, pour deux raisons : d’une part, le format des entrées est en général particulièrement simple (parce que tout le travail de transformation depuis un langage expressif a été fait par la compilation), d’autre part, c’est un programme qui cherche en général explicitement des hautes performances, et pour lequel on veut souvent toucher un peu aux détails de l’architecture qui exécutera le code. Le C n’est probablement pas le langage le plus adapté pour autant, mais c’est un choix qui se comprend déjà plus. Pour les compilateurs, à part les compilateurs C (parce qu’on veut être auto-suffisant), c’est de plus en plus rare. </p>Compilation de Scheme, message #1401242017-02-02T21:39:01+01:00Lalla/@Lallahttps://zestedesavoir.com/forums/sujet/7877/compilation-de-scheme/?page=1#p140124<p>Oui évidemment, le C n’est pas adapté à l’écriture de compilateurs, on est d’accord. Mais puisque ce langage est toujours enseigné comme langage de référence j’aurais pensé qu’à un moment où à un autre quelqu’un d’autre aurait écrit un compilateur de Scheme en C. Visiblement ça n’est pas le cas et bien que je sois d’accord sur l’aspect pratique, je pense qu’il s’agit d’un challenge intéressant (d’autant plus que bon nombre de compilateurs/VM/interpréteurs pour d’autres langages sont écrits en C).</p>Compilation de Scheme, message #1401152017-02-02T20:04:18+01:00Eusèbe/@Eus%C3%A8behttps://zestedesavoir.com/forums/sujet/7877/compilation-de-scheme/?page=1#p140115<blockquote>
<p>Je dois dire que c’est assez perturbant, surtout que le C est l’un des langages les plus utilisés au monde, il n’y a pas de raison que ça n’existe pas du tout.</p>
</blockquote>
<p>Bof, en 2017 c’est utilisé pour de l’embarqué parce qu’il n’y a pas le choix ou pour des raisons historiques. Pour écrire des compilateurs, c’est particulièrement inadapté.</p>Compilation de Scheme, message #1399652017-01-31T19:13:12+01:00minirop/@minirophttps://zestedesavoir.com/forums/sujet/7877/compilation-de-scheme/?page=1#p139965<figure>
<blockquote>
<p>Suis-je le seul masochiste à vouloir tout faire en C ?</p>
</blockquote>
<figcaption><a href="https://zestedesavoir.com/forums/sujet/7877/compilation-de-scheme/?page=1#p139900">Lalla</a></figcaption>
</figure>
<p>Beaucoup de langages essaient d’être auto-suffisant. Et j’ai souvent lu que Scheme était de bons langages pour écrire des compilateurs. Seuls les langages interprétés (Python, ruby, PHP) restent généralement en C-like.</p>Compilation de Scheme, message #1399002017-01-31T11:42:11+01:00Lalla/@Lallahttps://zestedesavoir.com/forums/sujet/7877/compilation-de-scheme/?page=1#p139900<p>Vis à vis du bootstrap, ce qui m’intéresse, c’est pas vraiment le procédé. Je sais ce que c’est et comment m’y prendre. En fait, ce qui m’interpèle c’est que lors que je recherche une implémentation en C d’un langage dérivé de Scheme (ou même d’un Lisp quelconque), je ne trouve jamais un compilateur écrit purement en C et basta. Je finis toujours par avoir un compilateur minimal en C et derrière le vrai compilateur écrit en Scheme. Suis-je le seul masochiste à vouloir tout faire en C ? Je dois dire que c’est assez perturbant, surtout que le C est l’un des langages les plus utilisés au monde, il n’y a pas de raison que ça n’existe pas du tout.</p>
<p>D’accord, je comprends mieux le pourquoi du comment, merci beaucoup. <img alt=":)" src="/static/smileys/smile.png"></p>Compilation de Scheme, message #1398762017-01-31T05:24:21+01:00kelepoc/@kelepochttps://zestedesavoir.com/forums/sujet/7877/compilation-de-scheme/?page=1#p139876<p>Salut.</p>
<p>Un des problèmes du <em>eval</em> est la gestion de l’environnement.
D’abord, il est bon de noter que la norme R5RS ne permet pas au <em>eval</em> d’accéder à l’environnement local. Seul l’environnement global peut être lu (ce <a href="http://stackoverflow.com/a/4999480">post</a> explique pourquoi).
Donc le code que tu montres en exemple est invalide (pour R5R5. Je ne sais pas ce que disent les autres normes, mais c’est surement pareil).</p>
<p>Comme dit Saroupille, tu dois utiliser un système externe pour implémenter le <em>eval</em>.
Tu peux faire appel à un autre compilateur, mais ça peut être difficile parce que tu dois lui transmettre ton environnement global (ça fait un travail, et une dépendance supplémentaire).</p>
<p>L’autre solution est d’embarquer ton propre compilateur/interprète, ça simplifie la gestion de l’environnement. Après tout, c’est ton code donc tu sais comment l’environnement est représenté.</p>
<p>Une autre chose intéressante est que tu peux embarquer ce système uniquement si le programme que tu compiles utilise <em>eval</em>. Dans tous les autres cas, pas besoin de l’intégrer, donc le code généré reste léger.</p>
<p>Pour ta seconde question, non tu peux très bien faire un bootstrap sans utiliser d’autre compilateur ("mini-Scheme" comme tu les appelles).
Dans ce cas tu as deux solutions:</p>
<ol>
<li>Tu conserves et distribues un build de l’ancienne version de ton compilateur qui est utilisé pour construire l’actuelle. Mais conserver un build complet est assez lourd, et si tu génères de l’assembleur (donc le build est en binaire), c’est pas très portable.</li>
<li>Tu écris ton compilateur dans un Scheme standard, et tu utilises un autre compilateur pour construire le tiens. Puis tu utilises la sortie pour compiler à nouveau ton compilateur.
Le problème cette fois est que tu as une dépendance externe (ton compilateur n’est plus auto-suffisant).</li>
</ol>
<p>Donc l’autre solution est d’utiliser un autre petit compilateur qui est très primitif, et pas optimisé (quelques centaines de lignes de code). Tu peux même éviter d’utiliser un GC, eval, les continuations, etc…
Avec ce petit compilateur, tu compiles une version non efficace de ton <em>vrai</em> compilateur.
Puis tu utilises la sortie pour compiler à nouveau ton compilateur pour avoir une version, cette fois, efficace. Et là, tu deviens vraiment auto-suffisant. <img alt=":magicien:" src="/static/smileys/magicien.png"></p>
<p>Donc non tu n’est pas obligé d’utiliser un second petit compilateur, mais c’est bien plus satisfaisant <img alt=":D" src="/static/smileys/heureux.png"></p>Compilation de Scheme, message #1398022017-01-29T17:45:02+01:00Lalla/@Lallahttps://zestedesavoir.com/forums/sujet/7877/compilation-de-scheme/?page=1#p139802<p>Je vois ! Donc typiquement il faudrait que je fasse une bibliothèque de mon compilateur (et un programme qui l’utilise pour compiler des fichiers, ça tombe sous le sens) et que je lie chaque programme contenant un eval à celui-ci ?</p>Compilation de Scheme, message #1397192017-01-28T15:02:34+01:00Saroupille/@Saroupillehttps://zestedesavoir.com/forums/sujet/7877/compilation-de-scheme/?page=1#p139719<p>Lorsque tu compiles un <code>eval</code>, ton compilateur doit avoir accès à un autre compilateur, en l’occurence cela pourrait être le tiens. Et ensuite tu balances le code au compilateur, etc…</p>Compilation de Scheme, message #1396892017-01-28T10:13:07+01:00Lalla/@Lallahttps://zestedesavoir.com/forums/sujet/7877/compilation-de-scheme/?page=1#p139689<p>Bonjour les copains/copines,</p>
<p>je travaille actuellement sur une projet de compilateur pour un langage très fortement inspiré de Scheme écrit en C89 (pour le plaisir/pleurer un bon coup). Autant j’ai une idée assez précise de comment tout va se goupiller, autant je suis assez perdu concernant l’expansion des macros et de la "fonction" <code>eval</code>.</p>
<p>En effet, même si je remplace un appel à une macro par son corps (moyennant des ajustements avec les <em>quotations</em>), je ne vois pas comment je peux compiler un appel à <code>eval</code> puisque celle-ci peut nécessiter des informations disponibles uniquement au <em>runtime</em>. Par exemple, dans le code suivant, mes deux premières lignes de codes devraient être équivalentes, mais à cause du <code>eval</code>, je devrais connaître la valeur de f à la compilation, ce qui n’est pas garanti, comme montré dans le bout de code juste après.</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="p">(</span><span class="nb">eval </span><span class="p">(</span><span class="nb">list </span><span class="ss">'f</span> <span class="mi">5</span><span class="p">))</span>
<span class="p">(</span><span class="nf">f</span> <span class="mi">5</span><span class="p">)</span>
<span class="c1">;; Certes personne ne devrait écrire ça, mais ça illustre bien ce que je veux dire.</span>
<span class="p">(</span><span class="k">let </span><span class="p">((</span><span class="nf">function-name</span> <span class="p">(</span><span class="nf">readline</span><span class="p">)))</span>
<span class="p">(</span><span class="nb">eval </span><span class="p">(</span><span class="nb">list </span><span class="p">(</span><span class="nb">string->symbol </span><span class="nv">function-name</span><span class="p">)</span> <span class="mi">5</span><span class="p">)))</span>
</pre></div>
</td></tr></table></div>
<p>J’aurais donc voulu savoir comment régler ce problème, s’il y a une technique bien connue/définie pour compiler cette fonctionnalité du Scheme.</p>
<p>Par ailleurs, question annexe, j’ai cherché d’autres compilateurs de Scheme écrits en C pour voir comment d’autres font et je ne tombe que sur des compilateurs de "mini-Scheme" servant à bootstrap le vrai compilateur. Est-ce finalement obligé ou est-ce ainsi parce que le Scheme est quand-même bien plus agréable que le C écrire un compilateur ? Si, par hasard, vous connaissez un compilateur de Scheme écrit en C (uniquement en C) qui puisse me servir d’inspiration, il serait gentil de me mettre dans le coup <img alt=":)" src="/static/smileys/smile.png"></p>
<p>Merci beaucoup pour votre lecture et de vos éventuelles réponses.<br>
Lalla.</p>Schemy, message #437632015-02-14T23:37:33+01:00PORN/@PORNhttps://zestedesavoir.com/forums/sujet/2446/schemy/?page=1#p43763<p>Edit Arius : image supprimée</p>Schemy, message #437572015-02-14T23:25:03+01:00cyru/@cyruhttps://zestedesavoir.com/forums/sujet/2446/schemy/?page=1#p43757<p>Salut à tous, je suis étudiant en informatique et pour parfaire mes connaissances en Ocaml, j'ai décidé de me lancer sans grande prétention dans la création d'un interpréteur Scheme. Je le poste en projet car des postes réguliers me forceront à ne pas laisser traîner les choses.</p>
<h3>Schemy</h3>
<p>Le but est de faire un interpréteur pour Scheme mais qui soit tout de même plutôt efficace. Du coup, j'aimerai bien implémenter une transformation en style de passage par continuation (Continuation Passing Style). Au passage, je conseille ce super <a href="http://matt.might.net/articles/">blog</a> sur e sujet. Le plan c'est donc:</p>
<p>Parser –> Transfo en Ast des Sexp –> Desugar –> (forme simple du genre A-normal form?) –> CPS (Continuations …) –> Interpréteur</p>
<p>Le principe étant d'optimiser l'interpréteur pour les scripts (pour la ligne de commande, ce genre de transformations ralentissent plus qu'autre chose).</p>
<p>Dans le meilleur des cas j'aimerai compiler le résultat final vers Java ou C, mais ça, ce sera si j'ai le courage.</p>
<h3>Avancement</h3>
<p>J'ai fait un parseur assez simple avec menhir et ocamllex, maintenant, je vais me lancer dans la transformation des s-expressions en ast. Je poste mon code sur <a href="https://github.com/cyru/mustached-octo-batman">Github</a> pour ceux que ça intéresse.</p>
<p>(Au passage, petite remarque, ça serait pas mal d'avoir dans cette section un sticky sur comment présenter son projet comme il y en avait un sur SDZ, car je doit dire que je ne sait pas exactement quel genre de choses sont indispensables dans la présentation du projet).</p>