This commit is contained in:
Oscar Plaisant 2024-04-02 02:31:02 +02:00
parent 5521650337
commit 342e212d7c
3 changed files with 50 additions and 78 deletions

View File

@ -5,12 +5,12 @@
{ {
"id": 2, "id": 2,
"name": "memoire-L3", "name": "memoire-L3",
"lastUpdate": 1712011619721 "lastUpdate": 1712015799076
}, },
{ {
"id": 1, "id": 1,
"name": "Ma bibliothèque", "name": "Ma bibliothèque",
"lastUpdate": 1712011619734 "lastUpdate": 1712015799085
} }
], ],
"renderCitations": true, "renderCitations": true,

View File

@ -16,6 +16,7 @@
{"id":"floydParadigmsProgramming1979a","author":[{"family":"Floyd","given":"Robert W"}],"citation-key":"floydParadigmsProgramming1979a","issue":"8","issued":{"date-parts":[["1979"]]},"language":"en","source":"Zotero","title":"The paradigms of programming","type":"article-journal","volume":"22"}, {"id":"floydParadigmsProgramming1979a","author":[{"family":"Floyd","given":"Robert W"}],"citation-key":"floydParadigmsProgramming1979a","issue":"8","issued":{"date-parts":[["1979"]]},"language":"en","source":"Zotero","title":"The paradigms of programming","type":"article-journal","volume":"22"},
{"id":"FonctionOrdreSuperieur2023","abstract":"En mathématiques et en informatique, les fonctions d'ordre supérieur sont des fonctions qui ont au moins une des propriétés suivantes :\n\nelles prennent une ou plusieurs fonctions en entrée ;\nelles renvoient une fonction.En mathématiques, on les appelle des opérateurs ou des fonctionnelles.\nL'opérateur de dérivation en calcul infinitésimal est un exemple classique, car elle associe une fonction (la dérivée) à une autre fonction (la fonction que l'on dérive).\nDans le lambda-calcul non typé, toutes les fonctions sont d'ordre supérieur. Dans le lambda-calcul typé, dont la plupart des langages de programmation fonctionnels sont issus, les fonctions d'ordre supérieur sont généralement celles dont le type contient\nplus d'une flèche (Flèches dans la programmation fonctionnelle).\nEn programmation fonctionnelle, les fonctions d'ordre supérieur qui retournent d'autres fonctions sont dites curryfiées.\nLa fonction map présente dans de nombreux langages de programmation fonctionnelle est un exemple de fonction d'ordre supérieur. Elle prend une fonction f comme argument, et retourne une nouvelle fonction qui prend une liste comme argument et applique f à chaque élément. Un autre exemple très courant est celui d'une fonction de tri qui prend en argument une fonction de comparaison ; on sépare ainsi l'algorithme de tri de la comparaison des éléments à trier.\nD'autres exemples de fonction d'ordre supérieur sont la composition de fonctions et l'intégration.","accessed":{"date-parts":[["2024",3,31]]},"citation-key":"FonctionOrdreSuperieur2023","container-title":"Wikipédia","issued":{"date-parts":[["2023",6,22]]},"language":"fr","license":"Creative Commons Attribution-ShareAlike License","note":"Page Version ID: 205383055","source":"Wikipedia","title":"Fonction d'ordre supérieur","type":"entry-encyclopedia","URL":"https://fr.wikipedia.org/w/index.php?title=Fonction_d%27ordre_sup%C3%A9rieur&oldid=205383055"}, {"id":"FonctionOrdreSuperieur2023","abstract":"En mathématiques et en informatique, les fonctions d'ordre supérieur sont des fonctions qui ont au moins une des propriétés suivantes :\n\nelles prennent une ou plusieurs fonctions en entrée ;\nelles renvoient une fonction.En mathématiques, on les appelle des opérateurs ou des fonctionnelles.\nL'opérateur de dérivation en calcul infinitésimal est un exemple classique, car elle associe une fonction (la dérivée) à une autre fonction (la fonction que l'on dérive).\nDans le lambda-calcul non typé, toutes les fonctions sont d'ordre supérieur. Dans le lambda-calcul typé, dont la plupart des langages de programmation fonctionnels sont issus, les fonctions d'ordre supérieur sont généralement celles dont le type contient\nplus d'une flèche (Flèches dans la programmation fonctionnelle).\nEn programmation fonctionnelle, les fonctions d'ordre supérieur qui retournent d'autres fonctions sont dites curryfiées.\nLa fonction map présente dans de nombreux langages de programmation fonctionnelle est un exemple de fonction d'ordre supérieur. Elle prend une fonction f comme argument, et retourne une nouvelle fonction qui prend une liste comme argument et applique f à chaque élément. Un autre exemple très courant est celui d'une fonction de tri qui prend en argument une fonction de comparaison ; on sépare ainsi l'algorithme de tri de la comparaison des éléments à trier.\nD'autres exemples de fonction d'ordre supérieur sont la composition de fonctions et l'intégration.","accessed":{"date-parts":[["2024",3,31]]},"citation-key":"FonctionOrdreSuperieur2023","container-title":"Wikipédia","issued":{"date-parts":[["2023",6,22]]},"language":"fr","license":"Creative Commons Attribution-ShareAlike License","note":"Page Version ID: 205383055","source":"Wikipedia","title":"Fonction d'ordre supérieur","type":"entry-encyclopedia","URL":"https://fr.wikipedia.org/w/index.php?title=Fonction_d%27ordre_sup%C3%A9rieur&oldid=205383055"},
{"id":"FunctionComputerProgramming2024","abstract":"In computer programming, a function, subprogram, procedure, method, routine or subroutine is a callable unit that has a well-defined behavior and can be invoked by other software units to exhibit that behavior.\nCallable units provide a powerful programming tool. The primary purpose is to allow for the decomposition of a large and/or complicated problem into chunks that have relatively low cognitive load and to assign the chunks meaningful names (unless they are anonymous). Judicious application can reduce the cost of developing and maintaining software, while increasing its quality and reliability.Callable units are present at multiple levels of abstraction in the programming environment. For example, a programmer may write a function in source code that is compiled to machine code that implements similar semantics. There is a callable unit in the source code and an associated one in the machine code, but they are different kinds of callable units with different implications and features.","accessed":{"date-parts":[["2024",4,1]]},"citation-key":"FunctionComputerProgramming2024","container-title":"Wikipedia","issued":{"date-parts":[["2024",2,26]]},"language":"en","license":"Creative Commons Attribution-ShareAlike License","note":"Page Version ID: 1210403496","source":"Wikipedia","title":"Function (computer programming)","type":"entry-encyclopedia","URL":"https://en.wikipedia.org/w/index.php?title=Function_(computer_programming)&oldid=1210403496"}, {"id":"FunctionComputerProgramming2024","abstract":"In computer programming, a function, subprogram, procedure, method, routine or subroutine is a callable unit that has a well-defined behavior and can be invoked by other software units to exhibit that behavior.\nCallable units provide a powerful programming tool. The primary purpose is to allow for the decomposition of a large and/or complicated problem into chunks that have relatively low cognitive load and to assign the chunks meaningful names (unless they are anonymous). Judicious application can reduce the cost of developing and maintaining software, while increasing its quality and reliability.Callable units are present at multiple levels of abstraction in the programming environment. For example, a programmer may write a function in source code that is compiled to machine code that implements similar semantics. There is a callable unit in the source code and an associated one in the machine code, but they are different kinds of callable units with different implications and features.","accessed":{"date-parts":[["2024",4,1]]},"citation-key":"FunctionComputerProgramming2024","container-title":"Wikipedia","issued":{"date-parts":[["2024",2,26]]},"language":"en","license":"Creative Commons Attribution-ShareAlike License","note":"Page Version ID: 1210403496","source":"Wikipedia","title":"Function (computer programming)","type":"entry-encyclopedia","URL":"https://en.wikipedia.org/w/index.php?title=Function_(computer_programming)&oldid=1210403496"},
{"id":"Gcode2023","abstract":"G-code (also RS-274) is the most widely used computer numerical control (CNC) and 3D printing programming language. It is used mainly in computer-aided manufacturing to control automated machine tools, as well as for 3D-printer slicer applications. The G stands for geometry. G-code has many variants.\nG-code instructions are provided to a machine controller (industrial computer) that tells the motors where to move, how fast to move, and what path to follow. The two most common situations are that, within a machine tool such as a lathe or mill, a cutting tool is moved according to these instructions through a toolpath cutting away material to leave only the finished workpiece and/or an unfinished workpiece is precisely positioned in any of up to nine axes around the three dimensions relative to a toolpath and, either or both can move relative to each other. The same concept also extends to noncutting tools such as forming or burnishing tools, photoplotting, additive methods such as 3D printing, and measuring instruments.","accessed":{"date-parts":[["2024",4,1]]},"citation-key":"Gcode2023","container-title":"Wikipedia","issued":{"date-parts":[["2023",12,28]]},"language":"en","license":"Creative Commons Attribution-ShareAlike License","note":"Page Version ID: 1192191622","source":"Wikipedia","title":"G-code","type":"entry-encyclopedia","URL":"https://en.wikipedia.org/w/index.php?title=G-code&oldid=1192191622"},
{"id":"GrammaireNonContextuelle2023","abstract":"En linguistique et en informatique théorique, une grammaire algébrique, ou grammaire non contextuelle, aussi appelée grammaire hors-contexte ou grammaire « context-free » est une grammaire formelle dans laquelle chaque règle de production est de la forme\n\nX→α{\\displaystyle X\\to \\alpha }où X{\\displaystyle X} est un symbole non terminal et α{\\displaystyle \\alpha } est une chaîne composée de terminaux et/ou de non-terminaux. Le terme « non contextuel » provient du fait qu'un non terminal X{\\displaystyle X} peut être remplacé par α{\\displaystyle \\alpha }, sans tenir compte du contexte où il apparaît. Un langage formel est non contextuel (ou hors contexte, ou encore algébrique) s'il existe une grammaire non contextuelle qui l'engendre.\nPar opposition est contextuelle une règle de la forme\nc +X→c+α{\\displaystyle c~+X\\to c+\\alpha }\nen raison de la partie gauche de la règle qui stipule un contexte pour X. Une telle règle signifie que X, dans le cas (contexte) où il est précédé du symbole terminal c{\\displaystyle c} et du littéral +{\\displaystyle +}, peut être remplacé par α{\\displaystyle \\alpha }.\nAinsi, dans une grammaire non contextuelle, un symbole non terminal est toujours seul dans la partie gauche de toute règle, ce qui signifie que son environnement syntaxique (ou contexte) n'est pas considéré.\nLes grammaires algébriques sont suffisamment puissantes pour décrire la partie principale de la syntaxe de la plupart des langages de programmation, avec au besoin quelques extensions. La forme de Backus-Naur est la notation la plus communément utilisée pour décrire une grammaire non contextuelle décrivant un langage de programmation. Dans la hiérarchie de Chomsky, ces grammaires sont de type 2.\nSi on trouve plusieurs termes pour nommer une grammaire algébrique, c'est que le terme anglais « context-free » est malcommode à traduire. Tous les termes donnés plus haut sont employés et équivalents.","accessed":{"date-parts":[["2024",3,31]]},"citation-key":"GrammaireNonContextuelle2023","container-title":"Wikipédia","issued":{"date-parts":[["2023",12,11]]},"language":"fr","license":"Creative Commons Attribution-ShareAlike License","note":"Page Version ID: 210452959","source":"Wikipedia","title":"Grammaire non contextuelle","type":"entry-encyclopedia","URL":"https://fr.wikipedia.org/w/index.php?title=Grammaire_non_contextuelle&oldid=210452959"}, {"id":"GrammaireNonContextuelle2023","abstract":"En linguistique et en informatique théorique, une grammaire algébrique, ou grammaire non contextuelle, aussi appelée grammaire hors-contexte ou grammaire « context-free » est une grammaire formelle dans laquelle chaque règle de production est de la forme\n\nX→α{\\displaystyle X\\to \\alpha }où X{\\displaystyle X} est un symbole non terminal et α{\\displaystyle \\alpha } est une chaîne composée de terminaux et/ou de non-terminaux. Le terme « non contextuel » provient du fait qu'un non terminal X{\\displaystyle X} peut être remplacé par α{\\displaystyle \\alpha }, sans tenir compte du contexte où il apparaît. Un langage formel est non contextuel (ou hors contexte, ou encore algébrique) s'il existe une grammaire non contextuelle qui l'engendre.\nPar opposition est contextuelle une règle de la forme\nc +X→c+α{\\displaystyle c~+X\\to c+\\alpha }\nen raison de la partie gauche de la règle qui stipule un contexte pour X. Une telle règle signifie que X, dans le cas (contexte) où il est précédé du symbole terminal c{\\displaystyle c} et du littéral +{\\displaystyle +}, peut être remplacé par α{\\displaystyle \\alpha }.\nAinsi, dans une grammaire non contextuelle, un symbole non terminal est toujours seul dans la partie gauche de toute règle, ce qui signifie que son environnement syntaxique (ou contexte) n'est pas considéré.\nLes grammaires algébriques sont suffisamment puissantes pour décrire la partie principale de la syntaxe de la plupart des langages de programmation, avec au besoin quelques extensions. La forme de Backus-Naur est la notation la plus communément utilisée pour décrire une grammaire non contextuelle décrivant un langage de programmation. Dans la hiérarchie de Chomsky, ces grammaires sont de type 2.\nSi on trouve plusieurs termes pour nommer une grammaire algébrique, c'est que le terme anglais « context-free » est malcommode à traduire. Tous les termes donnés plus haut sont employés et équivalents.","accessed":{"date-parts":[["2024",3,31]]},"citation-key":"GrammaireNonContextuelle2023","container-title":"Wikipédia","issued":{"date-parts":[["2023",12,11]]},"language":"fr","license":"Creative Commons Attribution-ShareAlike License","note":"Page Version ID: 210452959","source":"Wikipedia","title":"Grammaire non contextuelle","type":"entry-encyclopedia","URL":"https://fr.wikipedia.org/w/index.php?title=Grammaire_non_contextuelle&oldid=210452959"},
{"id":"HierarchieChomsky2023","abstract":"En informatique théorique, en théorie des langages, et en calculabilité, la hiérarchie de Chomsky (parfois appelée hiérarchie de Chomsky-Schützenberger) est une classification des grammaires formelles (et par extension, des langages formels respectifs engendrés par les grammaires), esquissée par Noam Chomsky en 1956, et décrite de façon formelle en 1959.","accessed":{"date-parts":[["2024",3,31]]},"citation-key":"HierarchieChomsky2023","container-title":"Wikipédia","issued":{"date-parts":[["2023",12,7]]},"language":"fr","license":"Creative Commons Attribution-ShareAlike License","note":"Page Version ID: 210331079","source":"Wikipedia","title":"Hiérarchie de Chomsky","type":"entry-encyclopedia","URL":"https://fr.wikipedia.org/w/index.php?title=Hi%C3%A9rarchie_de_Chomsky&oldid=210331079"}, {"id":"HierarchieChomsky2023","abstract":"En informatique théorique, en théorie des langages, et en calculabilité, la hiérarchie de Chomsky (parfois appelée hiérarchie de Chomsky-Schützenberger) est une classification des grammaires formelles (et par extension, des langages formels respectifs engendrés par les grammaires), esquissée par Noam Chomsky en 1956, et décrite de façon formelle en 1959.","accessed":{"date-parts":[["2024",3,31]]},"citation-key":"HierarchieChomsky2023","container-title":"Wikipédia","issued":{"date-parts":[["2023",12,7]]},"language":"fr","license":"Creative Commons Attribution-ShareAlike License","note":"Page Version ID: 210331079","source":"Wikipedia","title":"Hiérarchie de Chomsky","type":"entry-encyclopedia","URL":"https://fr.wikipedia.org/w/index.php?title=Hi%C3%A9rarchie_de_Chomsky&oldid=210331079"},
{"id":"hofmannWhatPureFunctional2010","abstract":"Given an ML function f : (int->int)->int how can we rigorously specify that f is pure, i.e., produces no side-effects other than those arising from calling its functional argument? We show that existing methods based on preservation of invariants and relational parametricity are insufficient for this purpose and thus define a new notion that captures purity in the sense that for any functional F that is pure in this sense there exists a corresponding question-answer strategy. This research is motivated by an attempt to prove algorithms correct that take such supposedly pure functionals as input and apply them to stateful arguments in order to inspect intensional aspects of their behaviour.","author":[{"family":"Hofmann","given":"Martin"},{"family":"Karbyshev","given":"Aleksandr"},{"family":"Seidl","given":"Helmut"}],"citation-key":"hofmannWhatPureFunctional2010","container-title":"Automata, Languages and Programming","DOI":"10.1007/978-3-642-14162-1_17","editor":[{"family":"Abramsky","given":"Samson"},{"family":"Gavoille","given":"Cyril"},{"family":"Kirchner","given":"Claude"},{"family":"Meyer auf der Heide","given":"Friedhelm"},{"family":"Spirakis","given":"Paul G."}],"event-place":"Berlin, Heidelberg","ISBN":"978-3-642-14162-1","issued":{"date-parts":[["2010"]]},"language":"en","page":"199-210","publisher":"Springer","publisher-place":"Berlin, Heidelberg","source":"Springer Link","title":"What Is a Pure Functional?","type":"paper-conference"}, {"id":"hofmannWhatPureFunctional2010","abstract":"Given an ML function f : (int->int)->int how can we rigorously specify that f is pure, i.e., produces no side-effects other than those arising from calling its functional argument? We show that existing methods based on preservation of invariants and relational parametricity are insufficient for this purpose and thus define a new notion that captures purity in the sense that for any functional F that is pure in this sense there exists a corresponding question-answer strategy. This research is motivated by an attempt to prove algorithms correct that take such supposedly pure functionals as input and apply them to stateful arguments in order to inspect intensional aspects of their behaviour.","author":[{"family":"Hofmann","given":"Martin"},{"family":"Karbyshev","given":"Aleksandr"},{"family":"Seidl","given":"Helmut"}],"citation-key":"hofmannWhatPureFunctional2010","container-title":"Automata, Languages and Programming","DOI":"10.1007/978-3-642-14162-1_17","editor":[{"family":"Abramsky","given":"Samson"},{"family":"Gavoille","given":"Cyril"},{"family":"Kirchner","given":"Claude"},{"family":"Meyer auf der Heide","given":"Friedhelm"},{"family":"Spirakis","given":"Paul G."}],"event-place":"Berlin, Heidelberg","ISBN":"978-3-642-14162-1","issued":{"date-parts":[["2010"]]},"language":"en","page":"199-210","publisher":"Springer","publisher-place":"Berlin, Heidelberg","source":"Springer Link","title":"What Is a Pure Functional?","type":"paper-conference"},
@ -31,5 +32,6 @@
{"id":"StructuredProgrammingWikipedia","accessed":{"date-parts":[["2024",4,1]]},"citation-key":"StructuredProgrammingWikipedia","title":"Structured programming - Wikipedia","type":"webpage","URL":"https://en.wikipedia.org/wiki/Structured_programming?oldformat=true"}, {"id":"StructuredProgrammingWikipedia","accessed":{"date-parts":[["2024",4,1]]},"citation-key":"StructuredProgrammingWikipedia","title":"Structured programming - Wikipedia","type":"webpage","URL":"https://en.wikipedia.org/wiki/Structured_programming?oldformat=true"},
{"id":"StructuresDonneesEnregistrements","accessed":{"date-parts":[["2024",3,28]]},"citation-key":"StructuresDonneesEnregistrements","language":"fr","title":"Structures de données/Enregistrements — Wikilivres","type":"webpage","URL":"https://fr.wikibooks.org/wiki/Structures_de_donn%C3%A9es/Enregistrements"}, {"id":"StructuresDonneesEnregistrements","accessed":{"date-parts":[["2024",3,28]]},"citation-key":"StructuresDonneesEnregistrements","language":"fr","title":"Structures de données/Enregistrements — Wikilivres","type":"webpage","URL":"https://fr.wikibooks.org/wiki/Structures_de_donn%C3%A9es/Enregistrements"},
{"id":"TaxonomiePrincipauxParadigmes","accessed":{"date-parts":[["2024",4,1]]},"citation-key":"TaxonomiePrincipauxParadigmes","title":"Une taxonomie des principaux paradigmes de programmation","type":"webpage","URL":"https://www.info.ucl.ac.be/~pvr/paradigmes.html"}, {"id":"TaxonomiePrincipauxParadigmes","accessed":{"date-parts":[["2024",4,1]]},"citation-key":"TaxonomiePrincipauxParadigmes","title":"Une taxonomie des principaux paradigmes de programmation","type":"webpage","URL":"https://www.info.ucl.ac.be/~pvr/paradigmes.html"},
{"id":"toalProgrammingParadigms","accessed":{"date-parts":[["2024",3,29]]},"author":[{"family":"Toal","given":"Ray"}],"citation-key":"toalProgrammingParadigms","title":"Programming Paradigms","type":"webpage","URL":"https://cs.lmu.edu/~ray/notes/paradigms/"} {"id":"toalProgrammingParadigms","accessed":{"date-parts":[["2024",3,29]]},"author":[{"family":"Toal","given":"Ray"}],"citation-key":"toalProgrammingParadigms","title":"Programming Paradigms","type":"webpage","URL":"https://cs.lmu.edu/~ray/notes/paradigms/"},
{"id":"WikiwandTuringcomplet2017","abstract":"En informatique et en logique, un système formel est dit complet au sens de Turing ou Turing-complet sil possède un pouvoir expressif au moins équivalent à celui des machines de Turing. Dans un tel système, il est donc possible de programmer n'importe quelle machine de Turing.","accessed":{"date-parts":[["2024",4,1]]},"citation-key":"WikiwandTuringcomplet2017","container-title":"Wikiwand","issued":{"date-parts":[["2017",2,2]]},"title":"Wikiwand - Turing-complet","type":"webpage","URL":"https://www.wikiwand.com/fr/Turing-complet"}
] ]

View File

@ -154,23 +154,19 @@ La puissance d'expression (ou expressivité) d'un langage est la quantité et la
On distingue deux sens du terme. D'un côté, l'expressivité théorique, qui se concentre sur la possibilité théorique d'exprimer une idée dans un langage, indépendamment de la difficulté pour exprimer cette idée. De l'autre côté, l'expressivité pratique, qui se concentre sur la concision et la facilité d'expression de ces idées [^24]. On distingue deux sens du terme. D'un côté, l'expressivité théorique, qui se concentre sur la possibilité théorique d'exprimer une idée dans un langage, indépendamment de la difficulté pour exprimer cette idée. De l'autre côté, l'expressivité pratique, qui se concentre sur la concision et la facilité d'expression de ces idées [^24].
### Au sens formel ### Expressivité au sens formel
La puissance d'expression au sens formel (ou expressivité formelle) est mesurée en regardant l'ensemble des idées qu'un langage peut exprimer. La puissance d'expression au sens formel (ou expressivité formelle) est mesurée en regardant l'ensemble des idées qu'un langage peut exprimer.
Ce concept d'expressivité formelle est surtout utile en mathématiques ou en informatique théorique (notamment dans la théorie des langages formels) [^25] Ce concept d'expressivité formelle est surtout utile en mathématiques ou en informatique théorique (notamment dans la théorie des langages formels) [^25]
Pour un langage de programmation, Pour un langage de programmation, il est presque indispensable d'être aussi expressif qu'une machine de Turing (Turing-complets) (ou un autre modèle de calcul équivalent), car cela est la condition nécessaire et suffisante pour qu'il puisse exprimer les problèmes calculables (par définition).
> [!cite]+ [Expressive power (computer science)](zotero://select/groups/5383243/items/L9WYV33P) - [Page ](zotero://open-pdf/groups/5383243/items/Q9KCGU98?annotation=MCRWAN6W) Il existe tout de même des langages qui n'ont pas la même expressivité formelle.
> For example, the Web Ontology Language expression language profile (OWL2 EL) lacks ideas (such as negation) that can be expressed in OWL2 RL (rule language). OWL2 EL may therefore be said to have less expressive power than OWL2 RL. These restrictions allow for more efficient (polynomial time) reasoning in OWL2 EL than in OWL2 RL. So OWL2 EL trades some expressive power for more efficient reasoning (processing of the knowledge representation language). On peut notamment citer les langages de description de données, dont le but est de représenter des données organisées (par exemple, les langages XML, JSON, YAML...), ou bien les langages de description d'ontologies, qui servent à représenter de façon informatique certains types d'ontologie. Notamment, OWL2 EL et OWL2 RL sont deux langages de description d'ontologies qui n'ont pas la même expressivité formelle : OWL2 EL n'implémente pas certains concepts qui peuvent pourtant être exprimés dans OWL2 RL [^26].
> ^MCRWAN6WaQ9KCGU98g5383243
![[expressivité théorique]]
Cependant, ces langages ne sont généralement pas qualifiés de "langages de programmation", puisqu'ils sont incapables d'exprimer un programme (c'est-à-dire des instructions exécutables), mais expriment seulement des données.
Tous les paradigmes sont équivalent puisqu'ils sont tous turing-complets Il existe également des langages de programmation qui ne sont pas turing-complets (par exemple, le langage G-code, dans certaines implémentations [^28]), mais ces langages ne sont pas utilisés pour résoudre des problèmes de programmation : ils sont utilisés à des fins théoriques, ou pour des applications particulières (par exemple, le langage G-code est utilisé pour commander des machines à commande numérique [^27]).
en fait non :
- nuance : les langages descriptifs (XML, HTML, JSON...)
- languages de markup : non turing-complets mais intéressants quand même
### Au sens commun ### Au sens commun
@ -179,21 +175,11 @@ en fait non :
### compromis expressivité vs analysabilité ### compromis expressivité vs analysabilité
Plus un langage est expressif, plus il est complexe de l'analyser mathématiquement. Plus un langage est expressif, plus il est complexe de l'analyser mathématiquement.
- expressivité théorique : plus un formalisme peut exprimer d'idées, plus il est complexes de démontrer des théorèmes sur ce formalisme Plus un langage est puissant expressivement au sens formel, plus il devient difficile (et impossible) de démontrer certains théorèmes sur ce formalisme [^29].
- en général : plus un formalisme est complexe, plus les problèmes de décision sont durs à résoudre, voir indécidables Cela est vrai également pour l'expressivité au sens commun : "le fait d'éviter certaines techniques peut permettre de rendre plus aisée la démonstration de théorèmes sur la correction d'un programme -- ou simplement la compréhension de son fonctionnement -- sans limiter la généralité du langage de programmation." [@ParadigmeProgrammation2023].
- exemple : si un langage est turing-complet, alors le problème de l'arrêt est indécidable sur ce langage On peut voir ce compromis dans le cadre
> [!cite]+ [Paradigme (programmation)](zotero://select/groups/5383243/items/U2XUNF8V) - [Page ](zotero://open-pdf/groups/5383243/items/PYQD2DCX?annotation=LMVQE7BZ) C'est pourquoi certaines fonctionnalités, certains paradigmes, devraient être utilisés uniquement si cela est nécessaire [^30].
> Cependant, le fait déviter certaines techniques peut permettre de rendre plus aisée la démonstration de théorèmes sur la correction dun programme — ou simplement la compréhension de son fonctionnement — sans limiter la généralité du langage de programmation.
> ^LMVQE7BZaPYQD2DCXg5383243
> [!cite]+ [Expressive power (computer science)](zotero://select/groups/5383243/items/L9WYV33P) - [Page ](zotero://open-pdf/groups/5383243/items/Q9KCGU98?annotation=T3UDRGGG)
> The design of languages and formalisms involves a trade-off between expressive power and analyzability. The more a formalism can express, the harder it becomes to understand what instances of the formalism say. Decision problems become harder to answer or completely undecidable.
>
> > [!note] Notes
> > design d'un langage => compromis entre expressivité et analysabilité.
> > formalisme peut exprimer + de concepts => ses instances deviennent + dures à analyser (les problèmes de décision devienent plus complexes, voire indécidables)
> ^T3UDRGGGaQ9KCGU98g5383243
#### Exemple de compromis : automates et grammaires #### Exemple de compromis : automates et grammaires
@ -205,63 +191,23 @@ Plus un langage est expressif, plus il est complexe de l'analyser mathématiquem
- le problème qui demande si un mot est reconnu par un automate à pile est décidable - le problème qui demande si un mot est reconnu par un automate à pile est décidable
- le problème qui demande si un mot est reconnu par une machine de Turing est indécidable - le problème qui demande si un mot est reconnu par une machine de Turing est indécidable
On voit donc que les machines de Turing sont un formalisme plus expressif (certains concepts exprimés par des machines de Turing ne sont pas exprimables par des automates à pile) mais que certains problèmes deviennent indécidables sur ce formalisme (alors qu'ils le sont sur les automates à pile). Les automates à pile et les machines de Turing forment un exemple de compromis entre analysabilité et expressivité formelle.
Les automates à pile reconnaissent les langages non contextuels [^31]. Les machines de Turing reconnaissent les langages contextuels [^32].
Or, les langages non contextuels sont strictement inclus dans les langages récursivement énumérables [^33] .
On peut donc conclure que les machines de Turing ont un pouvoir d'expression formel supérieur à celui des automates à pile.
> [!cite]+ [Hiérarchie de Chomsky](zotero://select/groups/5383243/items/SWVUNZNM) - [Page ](zotero://open-pdf/groups/5383243/items/GTNGMUQL?annotation=Z2Q99QE4) Cependant, si on pose le problème de l'appartenance d'un mot à un langage donné.
> Les langages produits, appelés langages contextuels ou sensibles au contexte, sont exactement ceux reconnus par une machine de Turing non déterministe à mémoire linéairement bornée, appelés couramment automates linéairement bornés. Ce problème est décidable pour tous les langages non contextuels [^34].
> Pourtant, ce problème est indécidable pour les machines de Turing [^35].
> > [!note] Notes
> > les grammaires contextuelles sont reconnues exactement par les automates linéairement bornés (machines de Turing non déterministe à mémoire linéairement bornée)
> ^Z2Q99QE4aGTNGMUQLg5383243
> [!cite]+ [Hiérarchie de Chomsky](zotero://select/groups/5383243/items/SWVUNZNM) - [Page ](zotero://open-pdf/groups/5383243/items/GTNGMUQL?annotation=2Q8JY698) On voit donc que les machines de Turing sont un formalisme plus expressif (certains concepts exprimés par des machines de Turing ne sont pas exprimables par des automates à pile) mais moins analysable (certains problèmes sont décidables sur les automates à pile, mais pas sur les machines de Turing).
> Ces grammaires engendrent exactement les langages algébriques, appelés aussi langages hors contexte, langages acontextuels, ou langages non contextuels. Ils sont reconnus par un automate à pile.
>
> > [!note] Notes
> > en parlant des grammaires non-contextuelles
> ^2Q8JY698aGTNGMUQLg5383243
> [!cite]+ [Hiérarchie de Chomsky](zotero://select/groups/5383243/items/SWVUNZNM) - [Page ](zotero://open-pdf/groups/5383243/items/GTNGMUQL?annotation=SL7UL6CY)
> La classe des langages rationnels (type 3) est incluse strictement dans la classe des langages algébriques (type 2).
> La classe des langages contextuels (type 1) est incluse strictement dans la classe des langages récursivement énumérables (type 0).
> L'inclusion de la classe des langages algébriques (type 2) dans la classe des langages contextuels (type 1) doit être précisée car un langage contextuel ne contient jamais le mot vide ε. L'énoncé exact est :
> Un langage algébrique ne contenant pas le mot vide est un langage contextuel
> ou, de manière équivalente :
> Un langage algébrique est un langage contextuel éventuellement augmenté du mot vide.
>
> > [!note] Notes
> > implique que les grammaires non-contextuelles on moins d'expressivité que les grammaires contextuelles.
> ^SL7UL6CYaGTNGMUQLg5383243
> [!cite]+ [Automate à pile](zotero://select/groups/5383243/items/7X5UDIRY) - [Page ](zotero://open-pdf/groups/5383243/items/WAETBZDG?annotation=DMXNL4GE)
> le problème de l'appartenance d'un mot à un langage algébrique est décidable : il existe un algorithme qui, étant donnés la description d'une grammaire non contextuelle et un mot, répond en temps fini à la question de l'appartenance de ce mot au langage défini par cette grammaire (plus précisément, on peut le tester en un temps $O(n^{3})$ pour un mot de longueur n, grâce à l'algorithme CYK).
> ^DMXNL4GEaWAETBZDGg5383243
## contre la distinction entre les paradigmes
La dinstinction entre les différents paradigmes n'est pas toujours claire : beaucoup de langages sont [[Remplissage du plan de L3#les langages multi-paradigmes|multi-paradigmes]], et certains paradigmes peuvent être utilisés dans presque tous les langages (par exemple, la programmation structurée *ref*)
### Les paradigmes sont des courants de pensée
Certains auteurs considèrent que les paradigmes ne sont pas fondamentalement différents (voir : [[Remplissage du plan de L3#Au sens formel|puissance d'expression > au sens formel]]), mais plutôt que les paradigmes sont des courants de pensée, des traditions dans la programmation, rattachées à des communautés (souvent autour d'un ou plusieurs languages de programmation, par exemple LISP pour la programmation fonctionnelle, ou APL pour la programmation matricielle).
### Les paradigmes sont tous équivalents
Greg Michaelson critique la distinction des paradigmes, en expliquant que, lorsqu'on les analyse profondément, les paradigmes sont en fait proche entre-eux .
> [!cite]+ [The paradigms of programming](zotero://select/groups/5383243/items/Y8NDFJ8W) - [Page 2](zotero://open-pdf/groups/5383243/items/WWITR642?page=2&annotation=AK2234X5)
> In computer science, one sees several such communities, each speaking its own language and using its own paradigms. In fact, programming languages typically encourage use of some paradigms and discourage others.
> ^AK2234X5aWWITR642g5383243p2
> [!cite]+ [Programming Paradigms, Turing Completeness and Computational Thinking](zotero://select/groups/5383243/items/VJLTFRRX) - [Page 41](zotero://open-pdf/groups/5383243/items/6YJZLPLZ?page=1&annotation=V8VHK9N2)
> Furthermore, it is not at all clear how programming paradigms are to be characterised and differentiated. Indeed, on closer inspection, apparently disparate programming paradigms are very strongly connected. Rather, they should be viewed as different traditions of a unitary Computer Science paradigm composed of programming languages which are all Turing Complete, complemented by methodologies which may all be subsumed by Computational Thinking.
>
> > [!note] Notes
> > il n'y a pas de différence claire entre les paradigmes
> > les paradigmes devraient plutôt être vus comme différentes traditions, sur un même paradigme : l'informatique, composée de langages tous Turing completes.
> ^V8VHK9N2a6YJZLPLZg5383243p1
# Paradigmes dans l'apprentissages # Paradigmes dans l'apprentissages
## avantages de la diversité ## avantages de la diversité
- pour apprendre, il est mieux d'apprendre plusieurs langages - pour apprendre, il est mieux d'apprendre plusieurs langages
- car il en existe plusieurs - car il en existe plusieurs
- car le fait de connaître différentes approches de la programmation permet de mieux résoudre de nouveaux problèmes - car le fait de connaître différentes approches de la programmation permet de mieux résoudre de nouveaux problèmes
@ -306,6 +252,9 @@ Greg Michaelson critique la distinction des paradigmes, en expliquant que, lorsq
# Paradigmes pour la résolution de problèmes # Paradigmes pour la résolution de problèmes
## diversité des approches ## diversité des approches
- langages particuliers (comme abordés dans [[Remplissage du plan de L3#Expressivité au sens formel]])
- permettent de répondre à un besoin spécifique
La diversité est utile, de nouveaux paradigmes apportent de nouvelles façons de voir. La diversité est utile, de nouveaux paradigmes apportent de nouvelles façons de voir.
Langages multi-paradigmes Langages multi-paradigmes
> [!cite] [Programming Paradigms for Dummies: What Every Programmer Should Know](zotero://select/groups/5383243/items/673TMQRT) - [Page 10](zotero://open-pdf/groups/5383243/items/P4L4LCJZ?page=2&annotation=4YR7745Q) > [!cite] [Programming Paradigms for Dummies: What Every Programmer Should Know](zotero://select/groups/5383243/items/673TMQRT) - [Page 10](zotero://open-pdf/groups/5383243/items/P4L4LCJZ?page=2&annotation=4YR7745Q)
@ -332,6 +281,15 @@ Notamment :
De la même manière, connaître un langage de programmation ne permet pas de savoir immédiatement résoudre tous les problèmes que l'on peut rencontrer. Par exemple, la syntaxe des langages similaires à LISP est très simple et peut être apprise en quelques heures pour certains dialectes. Cependant, connaître la syntaxe complête et le fonctionnement de LISP ne permettra pas de résoudre tout problème : il est également nécessaire d'être capable de "faire le lien" entre un problème et un langage. C'est ce lien que les paradigmes de programmation permettent de faire, soit en donnant explicitement une méthode pour le faire (comme la [[paradigme programmation structurée|programmation structurée]]), soit en définissant comment le programmeur doit voir les programmes, soit en implémentant certaines fonctionnalités utiles pour gérer certains problèmes. De la même manière, connaître un langage de programmation ne permet pas de savoir immédiatement résoudre tous les problèmes que l'on peut rencontrer. Par exemple, la syntaxe des langages similaires à LISP est très simple et peut être apprise en quelques heures pour certains dialectes. Cependant, connaître la syntaxe complête et le fonctionnement de LISP ne permettra pas de résoudre tout problème : il est également nécessaire d'être capable de "faire le lien" entre un problème et un langage. C'est ce lien que les paradigmes de programmation permettent de faire, soit en donnant explicitement une méthode pour le faire (comme la [[paradigme programmation structurée|programmation structurée]]), soit en définissant comment le programmeur doit voir les programmes, soit en implémentant certaines fonctionnalités utiles pour gérer certains problèmes.
# !!!! contre la distinction entre les paradigmes !!!!
note: cette section pourrait être en ouverture
La dinstinction entre les différents paradigmes n'est pas toujours claire : beaucoup de langages sont [[Remplissage du plan de L3#les langages multi-paradigmes|multi-paradigmes]], et certains paradigmes peuvent être utilisés dans presque tous les langages (par exemple, la programmation structurée *ref*)
Certains auteurs considèrent que les paradigmes ne sont pas fondamentalement différents (voir : [[Remplissage du plan de L3#Au sens formel|puissance d'expression > au sens formel]]), mais plutôt que les paradigmes sont des courants de pensée, des traditions dans la programmation, rattachées à des communautés [^36].
Greg Michaelson critique la distinction des paradigmes, en expliquant que, lorsqu'on les analyse profondément, les paradigmes sont en fait proche entre-eux [^37].
[^1]: "The contrast between function and procedure is a reflection of the general distinction between describing properties of things and describing how to do things, or, as it is sometimes referred to, the distinction between declarative knowledge and imperative knowledge. In mathematics we are usually concerned with declarative (what is) descriptions, whereas in computer science we are usually concerned with imperative (how to) descriptions." [@abelsonStructureInterpretationComputer1996, p.28] [^1]: "The contrast between function and procedure is a reflection of the general distinction between describing properties of things and describing how to do things, or, as it is sometimes referred to, the distinction between declarative knowledge and imperative knowledge. In mathematics we are usually concerned with declarative (what is) descriptions, whereas in computer science we are usually concerned with imperative (how to) descriptions." [@abelsonStructureInterpretationComputer1996, p.28]
@ -358,4 +316,16 @@ De la même manière, connaître un langage de programmation ne permet pas de sa
[^22]: "In computer science, the expressive power (also called expressiveness or expressivity) of a language is the breadth of ideas that can be represented and communicated in that language." [@ExpressivePowerComputer2023] [^22]: "In computer science, the expressive power (also called expressiveness or expressivity) of a language is the breadth of ideas that can be represented and communicated in that language." [@ExpressivePowerComputer2023]
[^23]: "The more expressive a language is, the greater the variety and quantity of ideas it can be used to represent" [@ExpressivePowerComputer2023] [^23]: "The more expressive a language is, the greater the variety and quantity of ideas it can be used to represent" [@ExpressivePowerComputer2023]
[^24]: "The term expressive power may be used with a range of meaning. It may mean a measure of the ideas expressible in that language: regardless of ease (theoretical expressivity); concisely and readily (practical expressivity)" [@ExpressivePowerComputer2023] [^24]: "The term expressive power may be used with a range of meaning. It may mean a measure of the ideas expressible in that language: regardless of ease (theoretical expressivity); concisely and readily (practical expressivity)" [@ExpressivePowerComputer2023]
[^25]: "The first sense dominates in areas of mathematics and logic that deal with the formal description of languages and their meaning, such as formal language theory, mathematical logic and process algebra" [@ExpressivePowerComputer2023] [^25]: "The first sense dominates in areas of mathematics and logic that deal with the formal description of languages and their meaning, such as formal language theory, mathematical logic and process algebra" [@ExpressivePowerComputer2023]
[^26]: "For example, the Web Ontology Language expression language profile (OWL2 EL) lacks ideas (such as negation) that can be expressed in OWL2 RL (rule language). OWL2 EL may therefore be said to have less expressive power than OWL2 RL. These restrictions allow for more efficient (polynomial time) reasoning in OWL2 EL than in OWL2 RL. So OWL2 EL trades some expressive power for more efficient reasoning (processing of the knowledge representation language)." [@ExpressivePowerComputer2023]
[^27]: "G-code (also RS-274) is the most widely used computer numerical control (CNC) and 3D printing programming language. It is used mainly in computer-aided manufacturing to control automated machine tools, as well as for 3D-printer slicer applications. The G stands for geometry. G-code has many variants." [@Gcode2023]
[^28]: "G-code began as a limited language that lacked constructs such as loops, conditional operators, and programmer-declared variables with natural-word-including names (or the expressions in which to use them). It was unable to encode logic but was just a way to "connect the dots" where the programmer figured out many of the dots' locations longhand." [@Gcode2023]
[^29]: "The design of languages and formalisms involves a trade-off between expressive power and analyzability. The more a formalism can express, the harder it becomes to understand what instances of the formalism say. Decision problems become harder to answer or completely undecidable." [@ExpressivePowerComputer2023]
[^30]: "We conclude that observable nondeterminism should be supported only if its expressive power is needed." [@royProgrammingParadigmsDummies, p.14]
[^31]: "[...] les langages algébriques, appelés aussi langages hors contexte, langages acontextuels, ou langages non contextuels. Ils sont reconnus par un automate à pile." [@HierarchieChomsky2023]
[^32]: "Les langages [...] contextuels ou sensibles au contexte, sont exactement ceux reconnus par une machine de Turing non déterministe à mémoire linéairement bornée, appelés couramment automates linéairement bornés." [@HierarchieChomsky2023]
[^33]: "La classe des langages contextuels (type 1) est incluse strictement dans la classe des langages récursivement énumérables (type 0). L'inclusion de la classe des langages algébriques (type 2) dans la classe des langages contextuels (type 1) doit être précisée car un langage contextuel ne contient jamais le mot vide ε. L'énoncé exact est : Un langage algébrique ne contenant pas le mot vide est un langage contextuel ou, de manière équivalente : Un langage algébrique est un langage contextuel éventuellement augmenté du mot vide." [@HierarchieChomsky2023]
[^34]: "Le problème de l'appartenance d'un mot à un langage algébrique est décidable : il existe un algorithme qui, étant donnés la description d'une grammaire non contextuelle et un mot, répond en temps fini à la question de l'appartenance de ce mot au langage défini par cette grammaire (plus précisément, on peut le tester en un temps $O(n^{3})$ pour un mot de longueur n, grâce à l'algorithme CYK)." [@AutomatePile2021]
[^35]: "Le problème de l'appartenance d'un mot à un langage de cette classe [la classe des langages récursivement énumérables] est indécidable." [@HierarchieChomsky2023]
[^36]: "In computer science, one sees several such communities, each speaking its own language and using its own paradigms. In fact, programming languages typically encourage use of some paradigms and discourage others." [@floydParadigmsProgramming1979a, p.2]
[^37]: "Furthermore, it is not at all clear how programming paradigms are to be characterised and differentiated. Indeed, on closer inspection, apparently disparate programming paradigms are very strongly connected. Rather, they should be viewed as different traditions of a unitary Computer Science paradigm composed of programming languages which are all Turing Complete, complemented by methodologies which may all be subsumed by Computational Thinking." [@michaelsonProgrammingParadigmsTuring2020, p.41]