Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2022-06-28T22:15:56+02:00Les derniers messages parus sur le forum de Zeste de Savoir.Comment créer un langage de programmation., message #2438662022-06-28T22:15:56+02:00Karnaj/@Karnajhttps://zestedesavoir.com/forums/sujet/16338/comment-creer-un-langage-de-programmation/?page=1#p243866<p>Salut,</p>
<p>En soi, un langage c’est juste des mots auxquels on donne un sens et qui permettent de former des phrases (qui doivent être conformes à une grammaire qu’on a également donnée). Donc créer un langage de programmation, c’est juste créer des mots et une grammaire et leur donner un sens… C’est même pas la peine de toucher à un ordi pour ça !</p>
<p>Je dis ça un peu en rigolant, mais c’est une étape importante (et intéressante) et il y a notamment de la recherche en informatique sur ce sujet (allez, on va par exemple citer <a href="https://zestedesavoir.com/billets/2181/pourquoi-la-recherche-en-langage-de-programmation/">ce billet</a>), par exemple pour créer des langages de programmation avec des « bonnes » propriétés et de bonnes fonctionnalités. Si cet aspect t’intéresse, il te faudra creuser un peu dans la théorie, regarder ce qui se fait du côté de la sémantique des langages de programmation, etc.</p>
<p>Une fois que tu as ton langage, tu voudras peut-être l’implémenter. Et là encore, tu as plusieurs étapes, mais les autres ont déjà traité tout ça plus haut. Personnellement, faire de l’analyse lexicale et tout, c’est pas un truc qui m’attire trop (même si écrire un parser est une expérience intéressante), mais faire l’étape d’interprétation/de compilation m’intéresse déjà plus, on peut faire des optimisations, on peut « s’amuser » à vérifier que ce qu’on fait est bien correct (allez, on va citer <a href="https://zestedesavoir.com/articles/3758/ecrire-des-programmes-prouves-corrects-avec-coq/">ça</a> cette fois), etc. </p>
<p>Pour commencer plutôt tranquillement sur les deux notions, tu peux écrire un programme pour gérer des expressions arithmétiques. Parser un <code>2 + (3 + 2 x 4)</code> c’est pas si simple que ça au début. Ensuite, tu pourras rajouter de la complexité en rajoutant des variables, donc traiter un code de ce genre.</p>
<div class="hljs-code-div hljs-code-text"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span></div><pre><code class="hljs language-text">X = 3
2 + (3 + 2 x X)
</code></pre></div>
<p>On a déjà un bon petit projet avec ça, n’est-ce-pas ? Pour la suite, je vais cette fois citer <a href="https://zestedesavoir.com/tutoriels/1148/introduction-a-lemulation-console/">ça</a> que tu pourras également suivre et que tu trouveras certainement intéressant.</p>Comment créer un langage de programmation., message #2438652022-06-28T20:54:16+02:00Moté/@Mot%C3%A9https://zestedesavoir.com/forums/sujet/16338/comment-creer-un-langage-de-programmation/?page=1#p243865<p>Il y a là plein de tutos, si jamais : <a href="https://github.com/codecrafters-io/build-your-own-x#build-your-own-programming-language">https://github.com/codecrafters-io/build-your-own-x#build-your-own-programming-language</a></p>Comment créer un langage de programmation., message #2438602022-06-28T18:41:56+02:00Fantasio/@Fantasiohttps://zestedesavoir.com/forums/sujet/16338/comment-creer-un-langage-de-programmation/?page=1#p243860<p>Peut être le meilleur conseil serait de commencer par des petits tutoriels, ça te permettrait de sentir les différents problèmes à petite échelle pour construire une compréhension du système.</p>
<p>Tes questions sont tres abstraites et il y a beaucoup d’approches avant d’aboutir concrètement à un compilateur ou interpréteur, je pense que toucher à des systèmes existants te permettrait de clarifier ta vision du problème <img src="/static/smileys/svg/smile.svg" alt=":)" class="smiley"> </p>Comment créer un langage de programmation., message #2438582022-06-28T18:31:56+02:00adri1/@adri1https://zestedesavoir.com/forums/sujet/16338/comment-creer-un-langage-de-programmation/?page=1#p243858<blockquote>
<p>Oui, j’ai conscience que mes questions, du moins certaines parraisent naïves comme tu l’as dis plus haut mais, une fois de plus, comme tu l’as énoncé au début de ta réponse, "donc il y a bien des gens […] et les questions qui se posent sont rapidement assez subtiles…". Je pense que ma questions rentre dans ce cas de figure. La question de la grammaire ou de l’architecture que pourrait avoir mon avoir mon code sont des questions qui à contrario de votre interprétation, on toute leur importance à mes yeux.</p>
</blockquote>
<p>Sans vouloir te vexer, je parlais de gens qui ont littéralement des doctorats en poche et qui font de la recherche (au sens académique du terme, pas une recherche Google) sur ce sujet en réfléchissant sur des questions connexes dont tu (et moi aussi d’ailleurs) ignores même l’existence. Je ne doute absolument pas que tu trouves ces questions de design d’un langage importantes et intéressantes (et c’est très bien d’être curieux !), mon message tenait plutôt à souligner que pouvoir les aborder sereinement demande un peu (beaucoup) plus de bagage en informatique que celui que l’on peut inférer que tu as d’après certaines de tes questions.</p>
<blockquote>
<p>Pour finir, vous n’avez pas réellement répondu à l’une de mes questions qui vous demandait si la grammaire de mon langage se trouverai dans le même répertoire que celui du compilateur. Par là j’entend, "Est-ce que ces deux choses sont suffisament différentes pour être développé chacunes de leur côté ou bien son elles justement complémentaire et méritent d’être développé dans un même ensemble, de sorte que lorsque il parraitra sur GitHub, il y ai le tout".</p>
</blockquote>
<p>Rien ne t’empêche d’avoir ton parseur sur gitlab, ta grammaire sur bitbucket, et le reste du compilateur sur Github si tu as envie, mais étant donné qu’ils ont besoin de se parler de toute façon, ces composants vont dépendre les uns des autres. En pratique, tu as intérêt à garder tout ensemble jusqu’à ce que certain composants deviennent trop gros. Comme tu parles d’implémenter ça en Rust, lorsqu’un des composants devient trop gros, tu peux utiliser la notion de workspace pour séparer les composants dans des crates différentes au sein du même dépôt Git. C’est ce que fait <a href="https://github.com/rust-lang/rust">Rust lui-même</a> (note que la stdlib de Rust est aussi dans le même dépôt!). Mais tu as le temps de voir venir avant d’avoir un projet assez gros pour en arriver à ces considérations.</p>Comment créer un langage de programmation., message #2438572022-06-28T18:22:26+02:00NightProg/@NightProghttps://zestedesavoir.com/forums/sujet/16338/comment-creer-un-langage-de-programmation/?page=1#p243857<blockquote>
<p> Rust sera mon prochain car </p>
</blockquote>
<p>bon je te conseille ce cours alors : <a href="https://doc.rust-lang.org/book/">rust book</a></p>
<blockquote>
<p>si la grammaire de mon langage se trouverai dans le même répertoire que celui du compilateur</p>
</blockquote>
<p>oui dans le meme repo / project</p>
<p>tu peux regarder celui de Rust , ou de Python(c’est un interpreteur mais ce sera la meme chose pour le compilateur)</p>Comment créer un langage de programmation., message #2438562022-06-28T18:17:51+02:00Lokasku/@Lokaskuhttps://zestedesavoir.com/forums/sujet/16338/comment-creer-un-langage-de-programmation/?page=1#p243856<p>Merci Fantasio et Adri1,</p>
<p>Je répond à tes intérogations <a href="/@Adri1" rel="nofollow" class="ping ping-link">@<span class="ping-username">Adri1</span></a>:</p>
<blockquote>
<p>quel sont tes connaissances générales en programmation ?</p>
</blockquote>
<p>Je programme beaucoup avec des technologies webs tel que Django et je maîtrise les langages PHP, <em>(HTML et CSS)</em> et le SQL. Je fais aussi beaucoup de Python et j’ai de maigres connaisances en C++ <em>(très maigre)</em> et JavaScript. Rust sera mon prochain car il me permettra nottament de développer un langage de programmation, et bien d’autres choses pour lesquels je vous épargnerai les détails, du moins, jusqu’à ce que ça se retrouve au coeur d’une de mes futurs questions que je viendrai poser ici.</p>
<blockquote>
<p>J’ai l’impression que tu as les yeux un peu plus gros que le ventre parce qu’il y a un fort contraste de difficulté entre par exemple ta question sur le PATH et celles sur le design d’une syntaxe et d’une sémantique pour un langage…</p>
</blockquote>
<p>Oui, j’ai conscience que mes questions, du moins certaines parraisent naïves comme tu l’as dis plus haut mais, une fois de plus, comme tu l’as énoncé au début de ta réponse, "<em>donc il y a bien des gens […] et les questions qui se posent sont rapidement assez subtiles…</em>". Je pense que ma questions rentre dans ce cas de figure. La question de la grammaire ou de l’architecture que pourrait avoir mon avoir mon code sont des questions qui à contrario de votre interprétation, on toute leur importance à mes yeux.</p>
<p>Pour finir, vous n’avez pas réellement répondu à l’une de mes questions qui vous demandait si la grammaire de mon langage se trouverai dans le même répertoire que celui du compilateur. Par là j’entend, <em>"Est-ce que ces deux choses sont suffisament différentes pour être développé chacunes de leur côté ou bien son elles justement complémentaire et méritent d’être développé dans un même ensemble, de sorte que lorsque il parraitra sur GitHub, il y ai le tout"</em>.</p>
<p>Cordialement, b4b4.</p>Comment créer un langage de programmation., message #2438552022-06-28T18:14:20+02:00NightProg/@NightProghttps://zestedesavoir.com/forums/sujet/16338/comment-creer-un-langage-de-programmation/?page=1#p243855<p>je tiens a rajouter mais ca peut paraître evident : faut aussi bien maitrises le langage de programmation dont tu creer le compilateur. Si tu n’as pas les competences requis dans ce langage Ca ne servira a rien si tu veux faire un bon compilateur, il faudra connaitre aussi le langage dans ton compilateur dans lequel passe. Ce que tu peux faire aussi c’est justement créer un compilateur pour s’améliorer mais je ne te garantirai rien si tu réussira a faire un compilateur d’un langage complet et maintenable </p>Comment créer un langage de programmation., message #2438512022-06-28T17:32:15+02:00adri1/@adri1https://zestedesavoir.com/forums/sujet/16338/comment-creer-un-langage-de-programmation/?page=1#p243851<p>Salut,</p>
<blockquote>
<p>LLVM est un framework pour compilateur qui attend le front-end et qui s’occupe du back-end (génération du code intermédiaire, optimisation de ce dernier et génération du code).</p>
</blockquote>
<p>Pour corriger un peu ça, LLVM pourrait plutôt être vu comme un langage assembleur de haut niveau. C’est un peu un oxymore, mais l’idée est littéralement d’exposer un langage plutôt proche de la machine mais qui abstrait l’architecture concrete. En pratique, les compilateurs qui s’appuient sur LLVM (Rust que tu as mentionné mais aussi par example clang) passent par plusieurs représentations intermédiaires du code qui sont optimisées jusqu’à passer la main à LLVM qui s’occupe de la dernière couche entre la représentation qu’elle accepte jusqu’au langage machine ciblé. LLVM est un acronyme pour <em>low level virtual machine</em>, c’est une couche faiblement (par rapport à un langage typique) abstraite par rapport au matériel ciblé.</p>
<p>Pour ce qui est de la conception d’un langage, c’est un domaine de recherche actif (donc il y a bien des gens qui se posent la question et planchent dessus, et les questions qui se posent sont rapidement assez subtiles…). Clairement la question de la conception des langages de programmation a encore plein de sous-questions qui sont complètement ouvertes !</p>
<blockquote>
<p>Lors de la création du langage, doit on prévoir deux répertoires distincts pour le compilateur et le langage en lui même (syntaxe, sémantique) ?</p>
</blockquote>
<p>La question est un peu étrange. Tu vas classiquement avoir cinq grosses étapes assez distinctes lors de la compilation d’un programme :</p>
<ul>
<li>la tokenization : tu lis ton fichier d’entrée et tu le transformes en une succession d’objets qui ont un sens logique pour ton langage (exemple, transformer <code>let a = 4;</code> en une suite de tokens du genre <code>[Keyword(let), Ident(a), Equal, LiteralInteger(4), Semicolon]</code>) ;</li>
<li>une analyse syntaxique pour transformer la liste de tokens en une représentation interne selon la grammaire de ton langage (une grammaire est un truc qui donne un sens à des suites de tokens, typiquement la suite de tokens précédente pourrait être remplacée par une liste d’instructions du genre <code>[Declare(a), Assign(a, Integer(5))]</code> (c’est très naïf comme exemple bien sûr) ;</li>
<li>une analyse sémantique pour vérifier que le code écrit a du sens en plus d’être grammaticalement valable (genre tu n’utilises pas une variable avant de l’avoir déclarée et initialisée) ;</li>
<li>plein d’optimisations, avec potentiellement plusieurs représentations internes successives ;</li>
<li>la génération de code machine (là par exemple Rust s’appuie sur LLVM, GCC a son implémentation, certains langages comme Python ou Java visent une machine virtuelle plutôt que du matériel, etc).</li>
</ul>
<p>Ces étapes sont assez indépendantes les une des autres, donc en général on va avoir tendance à les isoler dans leur propre répertoires mais ça c’est une question d’organisation du code assez orthogonale à celle du design d’un langage.</p>
<blockquote>
<p>Lorsque mon langage sera créé, pour exécuter un programme écrit en mon langage je vais devoir utiliser mon compilateur, mais comment ? Je dois avoir créé une commande attendant le nom d’un fichier pour que mon compilateur le compile ? Et si c’est le cas, je dois ajouter le mot clé de mon compilateur au PATH ?</p>
</blockquote>
<p>Ça aussi c’est une considération assez orthogonale, et c’est le soucis de l’utilisateur du langage plutôt que de son développeur. Mais en effet tu vas classiquement avoir un exécutable qui sera appelé en lui filant des fichiers sources.</p>
<blockquote>
<p>Pour créer le front-end du compilateur qui accompagnera mon langage, vers quelle ressource je peux me tourner pour apprendre à en créer un?</p>
</blockquote>
<p>Il y a "write yourself a scheme" qui est une bonne introduction au problème.</p>
<p>Cela dit certaines de tes questions sont relativement "naïves" par rapport à d’autres, du coup quel sont tes connaissances générales en programmation ? J’ai l’impression que tu as les yeux un peu plus gros que le ventre parce qu’il y a un fort contraste de difficulté entre par exemple ta question sur le PATH et celles sur le design d’une syntaxe et d’une sémantique pour un langage…</p>Comment créer un langage de programmation., message #2438492022-06-28T17:11:37+02:00Fantasio/@Fantasiohttps://zestedesavoir.com/forums/sujet/16338/comment-creer-un-langage-de-programmation/?page=1#p243849<p>Salut,</p>
<p>Ta question est en effet très vaste <img src="/static/smileys/svg/heureux.svg" alt=":D" class="smiley"> </p>
<p>Comme tu commences à le sentir, il y a deux très grandes parties dans la création d’un langage :</p>
<ul>
<li>comment concevoir un langage (chercher programming language theory sur Google pour trouver des ressources - il y en a beaucoup, mais c’est assez compliqué de trouver des bonnes introductions. Certaines universités mettent leurs cours en ligne)</li>
<li>comment exécuter un programme sur une machine (en gros compilé ou interprété).</li>
</ul>
<p>Donc tu commences par écrire une grammaire pour décrire la syntaxe de ton langage.
Ensuite tu as besoin d’un frontend (tokenizer/parser). C’est considéré "la plus simple" car automatisable. Il existe de nombreux framework pour générer des parseurs de grammaires (yacc ou flex par exemple).
Ensuite tu dois écrire soit un backend, soit un interpréteur, qui sert à transformer la représentation de ton programme en actions concrètes.
On dirait presque que c’est simple comme ça, mais ça devient rapidement très long et très compliqué selon ce que tu veux faire <img src="/static/smileys/svg/heureux.svg" alt=":D" class="smiley"> en cherchant "Compiler tutorial" tu trouves pas mal de ressources pour voir à quoi ça ressemble en pratique sur des exemples simples.</p>
<p>J’espere que j’ai répondu à tes questions,</p>Comment créer un langage de programmation., message #2438482022-06-28T15:54:06+02:00Lokasku/@Lokaskuhttps://zestedesavoir.com/forums/sujet/16338/comment-creer-un-langage-de-programmation/?page=1#p243848<p>Salutation <img src="/static/smileys/svg/hihi.svg" alt="^^" class="smiley"> ,</p>
<p>La question du "comment créer un langage de programmation" trotte dans ma tête depuis belle lurettes et je me suis récemment décidé à en comprendre le fonctionnement, puis à en créer un. Je ne suis pour l’instant qu’à l’étape de la compréhension.</p>
<p>J’ai premièrement cherché à apprendre quelles étaient les langages existants et leurs utilités, puis les paradigmes et enfin les compilateurs. En étudiant le sujet des langages existants, j’ai remarqué que certain d’on Rust avait utilisé "LLVM" pour créer leur compilateur, j’ai donc fais mes recherches et j’en tire la conclusion que : <em>LLVM est un framework pour compilateur qui attend le front-end et qui s’occupe du back-end (génération du code intermédiaire, optimisation de ce dernier et génération du code).</em></p>
<p>Toutefois, créer un compilateur ne suffit pas à créer un langage de programmation. C’est pourquoi j’ai approfondie mes recherches et le résultat de ces dernières est prévisible : il faut créer sa syntaxe et son mode de fonctionnement (implémentation de la création de fonction, de classe si le paradigme comporte l’orienté objet, de la déclaration de fonction, de module, de boucles, etc.)</p>
<p>Et à propos de ça, je n’ai rien trouvé de concret, c’est comme ci jamais personne ne s’était posé cette question. Je m’en remet par conséquent à vous pour répondre aux questions suivantes :</p>
<blockquote>
<p> <strong>1.</strong> Lors de la création du langage, doit on prévoir deux répertoires distincts pour le compilateur et le langage en lui même (syntaxe, sémantique) ?</p>
</blockquote>
<blockquote>
<p><strong>2.</strong> Si un répertoire comportant la sémantique et la syntaxe doit belle et bien exister, à quoi ressemblerait son architecture et comment programmer une syntaxe / sémantique ? </p>
</blockquote>
<blockquote>
<p><strong>3.</strong> Pour créer le front-end du compilateur qui accompagnera mon langage, vers quelle ressource je peux me tourner pour apprendre à en créer un?</p>
</blockquote>
<blockquote>
<p> <strong> 4.</strong> Lorsque mon langage sera créé, pour exécuter un programme écrit en mon langage je vais devoir utiliser mon compilateur, mais comment ? Je dois avoir créé une commande attendant le nom d’un fichier pour que mon compilateur le compile ? Et si c’est le cas, je dois ajouter le mot clé de mon compilateur au PATH ?</p>
</blockquote>
<p>Cordialement,
b4b4.</p>Une fois imbriquée, la sémantique d'une balise header est-elle compromise ?, message #1888132018-09-08T20:08:47+02:00RandomConsoleCowboy/@RandomConsoleCowboyhttps://zestedesavoir.com/forums/sujet/11278/une-fois-imbriquee-la-semantique-dune-balise-header-est-elle-compromise/?page=1#p188813<p>Génial, merci !</p>Une fois imbriquée, la sémantique d'une balise header est-elle compromise ?, message #1888042018-09-08T18:33:50+02:00cepus/@cepushttps://zestedesavoir.com/forums/sujet/11278/une-fois-imbriquee-la-semantique-dune-balise-header-est-elle-compromise/?page=1#p188804<ul>
<li>Non, aucun problème. Note que chaque crawler en fait ce qu’il souhaite, eux n’ont pas à suivre de spec.</li>
<li>Oui.</li>
</ul>
<p><img src="/static/smileys/smile.png" alt=":)" class="smiley"></p>Une fois imbriquée, la sémantique d'une balise header est-elle compromise ?, message #1888032018-09-08T18:17:27+02:00RandomConsoleCowboy/@RandomConsoleCowboyhttps://zestedesavoir.com/forums/sujet/11278/une-fois-imbriquee-la-semantique-dune-balise-header-est-elle-compromise/?page=1#p188803<p>Bonjour !</p>
<p>Dans l’exemple suivant (ligne 7):</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-html"><span class="hljs-tag"><<span class="hljs-name">article</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"media"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"media-left"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">figure</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"image is-128x128"</span>></span><span class="hljs-tag"><<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/static/images/rust-logo.png"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"The Rust logo!"</span>></span><span class="hljs-tag"></<span class="hljs-name">figure</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"media-content"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"content"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">header</span>></span>
<span class="hljs-tag"><<span class="hljs-name">h2</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"title"</span>></span>Title<span class="hljs-tag"></<span class="hljs-name">h2</span>></span>
<span class="hljs-tag"><<span class="hljs-name">h3</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"subtitle"</span>></span>Subtitle<span class="hljs-tag"></<span class="hljs-name">h3</span>></span>
<span class="hljs-tag"></<span class="hljs-name">header</span>></span>
<span class="hljs-tag"><<span class="hljs-name">p</span>></span>Pug est un template engine génial !<span class="hljs-tag"></<span class="hljs-name">p</span>></span>
<span class="hljs-tag"><<span class="hljs-name">footer</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"field is-grouped is-grouped-multiline"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"control"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"tags has-addons"</span>></span><span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"tag is-dark"</span>></span>Auteur<span class="hljs-tag"></<span class="hljs-name">span</span>></span><span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"tag is-warning"</span>></span>Songbird<span class="hljs-tag"></<span class="hljs-name">span</span>></span><span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"control"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"tags has-addons"</span>></span><span class="hljs-tag"><<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"tag is-dark"</span>></span>Publié le<span class="hljs-tag"></<span class="hljs-name">span</span>></span><span class="hljs-tag"><<span class="hljs-name">time</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"tag is-warning"</span>></span>7 Septembre 2018<span class="hljs-tag"></<span class="hljs-name">time</span>></span><span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"></<span class="hljs-name">footer</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"></<span class="hljs-name">div</span>></span>
<span class="hljs-tag"></<span class="hljs-name">article</span>></span>
</code></pre></div>
<p>Est-ce que la sémantique de la balise <code>header</code> est compromise (pour un moteur de recherche, j’entends), et ne sera donc pas prise en compte comme la partie "méta" de la balise <code>article</code>, à cause de son imbrication dans des balises <code>div</code> ?</p>
<p>Techniquement, les balises <code>div</code> ne signifient rien, mais sont-elles ignorées au point de ne pas prendre en compte l’imbrication de balises logiques ?</p>Hésitation sémantique de valeur ou d'entité, message #947422016-01-17T13:06:46+01:00El Poulpos/@El%20Poulposhttps://zestedesavoir.com/forums/sujet/5134/hesitation-semantique-de-valeur-ou-dentite/?page=1#p94742<p>ok, je vais voir de ce pas ce tuto.<br>
En tout cas merci de m'avoir éclairé sur ce point <img alt=":)" src="/static/smileys/smile.png"> .</p>Hésitation sémantique de valeur ou d'entité, message #947392016-01-17T12:46:04+01:00Freedom/@Freedomhttps://zestedesavoir.com/forums/sujet/5134/hesitation-semantique-de-valeur-ou-dentite/?page=1#p94739<p>Oui, c'est bien une sémantique de valeur qu'il considère<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>, il aurait en effet pu le dire plus clairement par contre.</p>
<p>C'est le point de départ : on veut manipuler ensemble plusieurs objets différents à sémantique de valeur, comment faire ? Le premier problème, le slicing, est traité en passant par des pointeurs. Ensuite vient les problèmes de la citation de mon message précédent.</p>
<p>Si c'est une introduction aux pointeurs intelligents que tu veux, je ne suis pas convaincu que l'approche de Loic dans cette article soit la meilleur (il choisit de traiter un cas non couvert par les pointeurs du standard comme exemple).</p>
<p>Le <a href="https://zestedesavoir.com/tutoriels/460/simplifier-la-gestion-de-la-memoire-en-c-avec-raii/">tuto publié sur ce site à propos du RAII</a> me semble avoir une meilleur approche du problème.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>L'article expose une solution technique, les classes pourraient s'appeler <em>A</em> et <em>B</em>, ça ne change rien. <a class="footnote-backref" href="#fnref-1" title="Retourner au texte de la note 1">↩</a></p>
</li>
</ol>
</div>Hésitation sémantique de valeur ou d'entité, message #947322016-01-17T12:28:46+01:00gbdivers/@gbdivershttps://zestedesavoir.com/forums/sujet/5134/hesitation-semantique-de-valeur-ou-dentite/?page=1#p94732<p>Il y a une phrase importante :</p>
<blockquote>
<p>On veut manipuler des formes mathématiques, des cercles, des rectangles… <strong>Dans le monde idéal</strong>, on écrirait du code comme ça :</p>
</blockquote>
<p>Cela signifie que l'on aimerait bien que ce soit des sémantiques de valeur, dans l'idéal.</p>
<p>Si tu regardes mon code précédent, tu peux remarquer que j'ai un peu triché sur l'exemple avec la sémantique de valeur : je n'ai pas utilisé de tableau. Imagine maintenant avec ce même exemple que je pose la question "si on a une liste de formes, comment trouver celle qui a la plus grande surface ?".</p>
<p>On peut continuer à "tricher" et utiliser 2 tableaux pour circle et rectangle, trouver le plus grand de chaque puis trouver le plus grand entre le plus grand cercle ou le plus grand rectangle.</p>
<p>Mais si tu as plus de forme, tu devras probablement faire un héritage, ajouter du polymorphisme… et passer à une sémantique d'entité.</p>
<p>Et c'est malheureusement ce qui arrive avec le code de Loïc. Il aimerait que ce soit des valeurs, mais par contrainte technique, cela devient des entités.</p>
<p>Un peu plus loin, il écrit :</p>
<blockquote>
<p>Les problèmes sont multiples : On doit désormais s'occuper de désallouer correctement ce qui a été alloué (ce que je n'ai pas fait ici), de plus, <strong>on a sans forcément le vouloir une sémantique d'entité, alors qu'initialement on avait une sémantique de valeur</strong>. Ainsi, la deuxième partie du code modifie aussi le contenu de v, ce qui n'était pas le cas dans la version précédente.</p>
<p>Nous sommes dans le cas où l'on utilise des pointeurs alors que <strong>l'on souhaite manipuler des données ayant une sémantique de valeur</strong>, uniquement <strong>parce que l'on veut du polymorphisme</strong>.</p>
</blockquote>
<p>Donc tu as bien compris, c'est bien une sémantique d'entité dans ce code, même si conceptuellement, on aimerait que ce soit des valeurs.</p>Hésitation sémantique de valeur ou d'entité, message #947292016-01-17T12:25:34+01:00El Poulpos/@El%20Poulposhttps://zestedesavoir.com/forums/sujet/5134/hesitation-semantique-de-valeur-ou-dentite/?page=1#p94729<p>Oui sauf que ma question était : Est ce vraiment une sémantique de valeur que l'on avait au début puisque dans son code de départ : il affichait des formes et utilisait l'héritage.(cf code de mon premier message).</p>Hésitation sémantique de valeur ou d'entité, message #947252016-01-17T12:08:55+01:00Freedom/@Freedomhttps://zestedesavoir.com/forums/sujet/5134/hesitation-semantique-de-valeur-ou-dentite/?page=1#p94725<p>Le code que tu cites vient d'une partie introductive, il y a en effet un problème de sémantique que cette partie veut exposer :</p>
<blockquote>
<p>Les problèmes sont multiples : On doit désormais s'occuper de désallouer correctement ce qui a été alloué (ce que je n'ai pas fait ici), de plus, <strong>on a sans forcément le vouloir une sémantique d'entité, alors qu'initialement on avait une sémantique de valeur</strong>. Ainsi, la deuxième partie du code modifie aussi le contenu de v, ce qui n'était pas le cas dans la version précédente.</p>
</blockquote>Hésitation sémantique de valeur ou d'entité, message #947122016-01-17T10:52:50+01:00El Poulpos/@El%20Poulposhttps://zestedesavoir.com/forums/sujet/5134/hesitation-semantique-de-valeur-ou-dentite/?page=1#p94712<p>Je pense avoir compris ,dans ton premier exemple Rectangle et Circle représentent des surfaces et donc peuvent être considérées comme une sémantique de valeur.(si j'ai bien compris)<br>
Voilà le lien de l'article gbdivers :<a href="http://loic-joly.developpez.com/tutoriels/cpp/smart-pointers/">Article</a>.
PS : désolé si j'ai mis un peu de temps à répondre ^^.</p>Hésitation sémantique de valeur ou d'entité, message #945662016-01-16T17:33:36+01:00gbdivers/@gbdivershttps://zestedesavoir.com/forums/sujet/5134/hesitation-semantique-de-valeur-ou-dentite/?page=1#p94566<p>Il faudrait voir l'article en question, il y a peut être une confusion/imprécision ?</p>
<p>Il faut faire la distinction entre le concept mathématique (la valeur) et une "instance" particulière (le fait d'appeler tes classes "Circle" et "Rectangle" ne veut pas dire que cela représente un cercle et un rectangle).</p>
<p>Si tu veux par exemple comparer deux surfaces, tu pourrais écrire :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3</pre></div></td><td class="code"><div class="codehilite"><pre><span class="n">Circle</span> <span class="nf">c</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span> <span class="c1">// x, y, r</span>
<span class="n">Rectangle</span> <span class="nf">r1</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">);</span> <span class="c1">// x, y, w, h</span>
<span class="kt">bool</span> <span class="n">b</span> <span class="o">=</span> <span class="n">has_same_surface</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">r1</span><span class="p">);</span>
</pre></div>
</td></tr></table>
<p>Si tu crées une seconde variable r2 :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3</pre></div></td><td class="code"><div class="codehilite"><pre><span class="n">Rectangle</span> <span class="nf">r2</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">);</span> <span class="c1">// x, y, w, h</span>
<span class="kt">bool</span> <span class="n">b</span> <span class="o">=</span> <span class="n">has_same_surface</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">r2</span><span class="p">);</span>
<span class="n">r1</span> <span class="o">==</span> <span class="n">r2</span><span class="p">;</span>
</pre></div>
</td></tr></table>
<p>r1 et r2 représente bien la même chose, peu importe que cela correspondent à des objets différents en mémoire.</p>
<p>Maintenant, si on prend des shapes, que l'utilisateur peut cliquer et déplacer à la souris :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5</pre></div></td><td class="code"><div class="codehilite"><pre><span class="n">vector</span><span class="o"><</span><span class="n">Shape</span><span class="o">></span> <span class="n">shapes</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">Rectangle</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">),</span>
<span class="n">Rectangle</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span>
<span class="p">};</span>
<span class="n">shapes</span><span class="p">.</span><span class="n">draw</span><span class="p">();</span>
</pre></div>
</td></tr></table>
<p>Même si tes 2 rectangles sont au même endroit, ce sont bien 2 "choses" différentes pour l'utilisateur. L'une est au dessus de l'autre, si l'utilisateur clique en (5, 5), il ne va sélectionner que le rectangle qui est au dessus et il ne déplacera qu'un seul rectangle.</p>
<p>Dans le premier cas, peu importe l'instance en particulier que l'on prend en compte, le résultat est le même (c'est une valeur). Dans le second cas, chaque instance est identifiable et différente des autres (c'est une entité).</p>
<p>Probablement que le mieux est de renommer tes types, par exemple RectangleShape et CircleShape, pour bien montrer qu'il ne s'agit pas des concepts "rectangle" et "cercle", mais d'entités.</p>Hésitation sémantique de valeur ou d'entité, message #945652016-01-16T17:31:22+01:00El Poulpos/@El%20Poulposhttps://zestedesavoir.com/forums/sujet/5134/hesitation-semantique-de-valeur-ou-dentite/?page=1#p94565<p>ok ,merci pour vos réponses .Donc selon toi Ksass`Peuk ici c'est une sémantique d'entité ?</p>