Wikilivres
frwikibooks
https://fr.wikibooks.org/wiki/Accueil
MediaWiki 1.39.0-wmf.22
first-letter
Média
Spécial
Discussion
Utilisateur
Discussion utilisateur
Wikilivres
Discussion Wikilivres
Fichier
Discussion fichier
MediaWiki
Discussion MediaWiki
Modèle
Discussion modèle
Aide
Discussion aide
Catégorie
Discussion catégorie
Transwiki
Discussion Transwiki
Wikijunior
Discussion Wikijunior
TimedText
TimedText talk
Module
Discussion module
Gadget
Discussion gadget
Définition de gadget
Discussion définition de gadget
Utilisateur:Asylum67
2
9339
683019
49100
2022-08-01T08:13:08Z
Alphama
100324
Alphama a déplacé la page [[Utilisateur:Overmac]] vers [[Utilisateur:Asylum67]] : Page automatiquement déplacée lors du renommage de l’utilisateur « [[Special:CentralAuth/Overmac|Overmac]] » en « [[Special:CentralAuth/Asylum67|Asylum67]] »
wikitext
text/x-wiki
[http://fr.wikipedia.org/wiki/Utilisateur:Overmac Page de l'utilsateur Overmac]
izqi36b165l4tyflf0330qvltcs1ymo
Thalès de Milet/Textes et traductions
0
9403
683013
49547
2022-08-01T04:00:26Z
EmausBot
70429
Robot : correction d’une double redirection vers [[Philosophie/Thalès de Milet/Textes et traductions Ier AEC]]
wikitext
text/x-wiki
#REDIRECTION [[Philosophie/Thalès de Milet/Textes et traductions Ier AEC]]
i53m32uyon84ddq5v2rwjcso1auqker
Structures de données/Pointeurs
0
12594
683014
468377
2022-08-01T07:28:20Z
197.234.221.94
/* Utilisation */
wikitext
text/x-wiki
== Retour sur la gestion des variables en mémoire ==
Pour aborder la notion de pointeur, il convient de revenir sur la notion de variable. Nous devons regarder de plus près ce qu'il se passe au niveau de la machine quand on déclare une variable ou qu'on l'assigne.
Faisons donc un retour sur l'[[architecture des ordinateurs]]. Les variables sont stockées dans une mémoire statique : on peut représenter cette mémoire par un tableau. Chaque ligne de ce tableau est une "case" mémoire c'est à dire une zone où l'on peut stocker une donnée atomique (par exemple un entier). Dans la machine, toutes ces cases sont numérotées sur n bits (dépend de l'architecture de la machine en question). Ce numéro, attribué de façon unique à chaque case identifie la case : c'est l''''adresse mémoire''' de la case.
Pour la suite nous utiliserons une machine 8 bits, bien que les machines PC grand public ([[w:x86|x86]]) sont aujourd'hui (2006) des machines 32 bits, 64 bits pour les plus récentes.
Nous avons donc une mémoire dont l'adresse de chaque octet est codée sur un octet, ce qui nous fait 256 cases numérotées de 0 à 255, 00 à FF en [[w:hexadécimal|hexadécimal]] (qu'on utilisera pour numéroter les cases mémoires)
[[Image:StructDonnees_Memoires_vierge.svg]]
Que se passe-t-il quand on exécute un programme P ? Et bien le système d'exploitation qui exécute P va allouer au programme autant de place que nécessaire dans cette mémoire statique pour que toutes les variables du lexique de P puisse y être stockées. Les cases ainsi réservées seront représentées sur fond gris.
=== Exemple ===
Avec le programme suivant : il s'agit de l'algorithme [[Algorithmique impérative/Inversion de deux variables|inversion de deux variables]] étudié en [[algorithmique impérative]]) :
Algorithme inversion_calcul
Variables
a : entier
b : entier
...
Voici à quoi ressemble notre mémoire statique si notre machine code les entiers sur un octet (une case mémoire). Schéma de la mémoire avec deux cases <code>a</code> et <code>b</code> réservées :
[[Image:StructDonnees_Memoires_inversion_calcul.svg]]
À chaque assignation d'une variable, on affecte le contenu de la case mémoire dont l'adresse est contenu dans la variable. L'identifiant de la variable est en fait une abstraction, derrière l'identifiant d'une variable se cache l'adresse mémoire de son contenu.
== La mémoire dynamique ==
En plus d'allouer à chaque programme une mémoire statique, le système d'exploitation alloue au programme P une mémoire dynamique. Dans notre exemple avec l'inversion de deux variables notre programme n'utilise que la mémoire statique. Nous aurions pu omettre de représenter sur nos schémas cette mémoire.
La mémoire dynamique a les mêmes caractéristiques que le mémoire statique telle que décrite précédemment. Les cases sont numérotées (nous supposerons là encore sur 8 bits : de 00 à FF)
Nous allons apprendre comment utiliser cette mémoire dynamique. Et ce, avec cet outil que sont les '''pointeurs'''.
== Les pointeurs typés ==
Le pointeur est un nouveau [[Algorithmique impérative/Types expressions opérateurs|type]] au même titres que les entiers, les caractères, chaînes de caractères, booléens et autres abordés en [[algorithmique impérative]].
Il convient cependant de distinguer les pointeurs typés des pointeurs non-typés (également appelés génériques). Nous allons d'abord nous pencher sur les premiers et réserver les seconds pour plus tard.
Un pointeur typé indique le type de la donnée qu'il pointe. Il y a donc des pointeurs vers des entiers, des pointeurs vers des caractères, etc. Il convient d'affecter à des variables de types pointeur vers T uniquement des expressions de types pointeur vers T (tout comme on doit assigner à une variable de type entier une expression entière).
=== Spécification ===
On déclare un pointeur vers T (T : un type) comme suit :
Lexique
identifiant_du_pointeur : ^T
On accède à la valeur pointée comme suit :
identifiant_du_pointeur^
Cette expression est donc du type pointé : T
<code>Ecrire(identifiant_du_pointeur)</code> afficherait l'adresse mémoire ou est stockée la donné pointée (souvent en sous la forme hexadécimale) : dans notre cours ce n'est d'aucune utilité.
=== Utilisation ===
Pour stocker des données dans notre mémoire dynamique, il faut réserver l'espace nécessaire.
p est une variable de type pointeur (vers T, un type quelconque : entier...) :
Lexique
p : ^T (* un pointeur vers des données de type T *)
Au lancement du programme, il sera réservé dans la mémoire statique l'espace permettant de stocker ce pointeur. Voici la représentation de la mémoire à cet instant :
[[Image:StructDonnees_Memoires_pointeur_lexi.svg]]
On réserve l'espace nécessaire pour stocker une variable de type T en faisait appel à l'instruction :
new(p)
Voici l'effet produit par new sur la mémoire.
[[Image:StructDonnees_Memoires_pointeur_new.svg]]
Deux choses se sont produites :
* De la mémoire a été réservée pour stocker une donnée de type T (la case pointée est grisée).
* La variable p contient l'adresse mémoire de cet espace réservé (représenté par une flèche).
p contient alors l'adresse de l'espace qui nous pourront utilisé : on peut donc stocker le contenu de t en mémoire dynamique.
Pour utiliser l'espace pointé par p, nous utiliserons l'expression <code>p^</code>
p^:=???
L'espace pointé contient alors la valeur de l'expression qu'on a assigné :
[[Image:StructDonnees_Memoires_pointeur_assignation.svg]]
On peut libérer l'espace : c'est à dire indiquer au système d'exploitation que cette partie de la mémoire dynamique n'est plus utilisée et qu'il peut désormais en faire ce qu'il veut. Pour cela on utilise la procédure « réciproque » de <code>new</code> :
delete(p)
[[Image:StructDonnees_Memoires_pointeur_delete.svg]]
On remarquera qu'après un <code>delete</code> la donnée stockée ainsi que le pointeur restent en mémoire : la seule chose qui change est que l'espace en mémoire dynamique n'est plus réservé. La donnée pointée peut donc être écrasée. La valeur de p^ restera en mémoire tant que le système d'exploitation n'aura pas décidé d'attribuer cet espace. Remarquez que demander au processeur de supprimer les contenus qui ont été stockés serait une perte de temps puisque si cette partie de la mémoire venait à être utilisé, les données serait écrasées de toute façon.
Remarque : l'utilité de ce qui est expliqué dans cette partie « utilisation » peut échapper au lecteur. En effet, cette partie sert seulement à donner les procédures <code>new</code> et <code>delete</code>. Stocker la valeur de t dans la mémoire dynamique n'a aucun intérêt en soi puisque la valeur est déjà dans t. L'important est de comprendre comment (par <code>new</code> et <code>delete</code>) on peut stocker et lire des informations en mémoire dynamique.
=== Exemple avec des entiers ===
Remarque : encore une fois ce programme n'est d'aucune utilité. On pourrait en faire un équivalent sans utiliser de pointeurs. Le but est d'expliquer les mécanismes décrits précédemment.
Algorithme Exemple
Lexique
a : entier
b : entier
p1 : ^entier
p2 : ^entier
Début
a:=1
new(p1) (* on réserve de l'espace pour stocker un entier *)
p1^:=a (* stocke 1 dans la zone mémoire pointée par p1 *)
ecrire(p1^) (* affiche 1 *)
a:=2
ecrire(p1^) (* affiche 1 *)
p2:=p1 (* p2 va pointer la zone mémoire pointée par p1 *)
ecrire(p2^) (* affiche 1 *)
p2^:=3 (* on place 3 dans la zone mémoire pointée par p2 *)
ecrire(p1^) (* affiche 3 *)
delete(p1) (* on libère la zone pointée par p1 et donc la zone pointée par p2 *)
(* a se stade : plus aucune zone mémoire n'est réservée dans la mémoire dynamique *)
new(p1)
new(p2)
p1^:=4
p2^:=p1^+1
ecrire(p2^) (* affiche 5 *)
(* il est d'usage de libérer au maximum la mémoire dynamique : *)
delete(p1)
delete(p2)
Fin
== Les pointeurs génériques ==
Un pointeur générique est un type de pointeur particulier puisqu'il ne donne pas d'information sur ce qu'il pointe. C'est simplement une adresse vers une zone mémoire.
=== Spécification ===
Il suffit de déclarer un pointeur comme suit
Lexique
identifiant_du_pointeur : pointeur
=== Utilisation ===
Les pointeurs typés sont également des adresses mémoires donc on peut assigner les uns aux autres.
Lexique
p : pointeur
p_T : ^T
Ces opérations sont possibles :
p:=p_T
p_T:=t_T
Cependant, on ne peut utiliser les procédures new() et delete() en leur passant un pointeur générique en paramètre. En effet, le type de la donnée pointée étant inconnu le système d'exploitation de peut savoir combien d'espace réservé.
=== Exemple avec des entiers ===
Algorithme exemple
Lexique
p : pointeur
p_entier : ^entier
début
new(p_entier)
p_entier^:=1
p:=p_entier
p_entier:=p
ecrire(p_entier^) (* affiche 1 *)
fin
== Les effets de bord ==
Que se passe-t-il ?
Algorithme bogue
Lexique
p : pointeur
p_entier : ^entier
p_caractere : ^caractere
début
new(p_entier)
p_entier^:=2645
p:=p_entier
p_caractere:=p (* pas de problème : on assigne une adresse mémoire à un pointeur (typé) *)
(* Jusqu'ici aucun problème nous n'avons fait que des opérations permises *)
ecrire(p_caractere^) (* ???? *)
fin
[[Catégorie:Structures de données (livre)]]
8fety6arl4gglvzsm1cd5529caw89vm
Translinguisme/Adverbes
0
39518
683002
675504
2022-07-31T14:44:10Z
CAPTAIN RAJU
65194
([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Spanish cuánto.ogg]] → [[File:Es-cuánto.oga]] [[c:COM:FR#FR4|Criterion 4]] (harmonizing names of file set)
wikitext
text/x-wiki
<noinclude>{{Translinguisme}}</noinclude>
{| class="wikitable sortable"
! français
! allemand
! anglais
! arabe
! chinois
! espagnol
! grec
! hindi
! italien
! japonais
! kotava
! latin
! néerlandais
! portugais
! russe
|-
| oui <br/>[[Media:Fr-oui.ogg|/wi/]]
| ja <br/>[[Media:De-ja.ogg|/jaː/]]
| yes <br/>[[Media:En-us-yes.ogg|/ˈjɛs/]]
| نعم <br/>[[Media:Ar-نعم.ogg|/naʕam/]]
| 是 <br/>[[Media:zh-shì.ogg|shì]]
| si <br/>[[Media:It-sì.ogg|/si/]]
| ναι <br/>/nɛ/
| हाँ <br/>/hãː/
| sì <br/>/si/
| はい <br/>/hai/
| gue <br/>[[Media:gue (avk).wav|/ˈguɛ/]]
| sic(e), hoc ille est <br/>/ˈsik(e)- ɔk 'ille ɛst/
| ja <br/>[[Media:Nl-ja.ogg|/jaː/]]
| sim <br/>[[Media:Pt sim.ogg|/ˈsĩ/]]
| да <br/>[[Media:Ru-да.ogg|/da/]]
|-
| non <br/>[[Media:Fr-non.ogg|/nɔ̃/]]
| nein <br/>[[Media:CPIDL German - Nein.ogg|/naɪ̯n/]]
| no <br/>[[Media:En-us-no.ogg|/noʊ/]]
| ﻻ <br/>[[Media:Alveolar lateral approximant.ogg|/l(a)ː/]]
| 不 <br/>[[Media:zh-bù.ogg|bù]]
| no <br/>/no/
| όχι <br/>/ˈɔçi/
| नहीं <br/>/nəɦĩː/
| no <br/>[[Media:It-no.ogg|/no/]]
| いいえ <br/>/iːe/
| volgue <br/>[[Media:volgue (avk).wav|/vɔlˈguɛ/]]
| non <br/>[[Media:la-cls-non.ogg|/noːn/]]
| nee <br/>[[Media:Nl-nee.ogg|/ne/]]
| não <br/>/nɐ̃w/
| нет <br/>[[Media:Ru нет.ogg|/nʲet/]]
|-
| peut-être <br/>[[Media:Fr-peut-être.ogg|/pøt‿ɛtʁ/]]
| vielleicht <br/>[[Media:De-vielleicht.ogg|/fiˈlaɪçt/]]
| maybe, perhaps, possibly <br/>[[Media:En-us-maybe.ogg|/ˈmeɪbi/]], [[Media:En-us-perhaps.ogg|/pɚˈhæps/]], [[Media:En-us-possibly.ogg|/'pɒsəbli/]]
| ربما <br/>[[Media:Ar-ربما.ogg|/rubːa'maː/]]
| 可能 <br/>[[Media:zh-kěnéng.ogg|kěnéng]]
| acaso, quizá(s), tal vez, a lo mejor <br/>/aˈkaso/, /kiˈθa/, /talˈβes/, /a lo meˈxoɾ/
| ίσως <br/>ísos
| कदाचित <br/>/kada:tʃita/
| forse <br/>[[Media:It-forse.ogg|/ˈfɔrse/]]
| 多分 <br/>/tabun/
| rotir <br/>[[Media:rotir.wav|/rɔˈtir/]]
| forsitane, fortasse <br/>
| wellicht <br/>[[Media:Nl-wellicht.ogg|/ʋɛˈlɪxt/]]
| talvez <br/>/talˈveʃ/
| может быть <br/>[[Media:Ru-может быть.ogg|mojet byt']]
|-
| bien sûr <br/>[[Media:Fr-bien-sûr.ogg|/bjɛ̃ syʁ/]]
| sicher <br/>[[Media:De-sicher.ogg|/ˈzɪçɛr/]]
| of course <br/>/ʌv koʊɹs/
| طبعًا <br/>/tˁabʕɑːn/
| 当然 <br/>[[Media:zh-dāngrán.ogg|dāngrán]]
| claro <br/>/ˈklaɾo/
| φυσικά <br/>/fisiˈka/
| ज़रूर <br/>/zəruːr/
| certo <br/>//
| 当然 <br/>/to:zen/
| arse <br/>[[Media:arse (avk).wav|/ˈarsɛ/]]
| certo <br/>[[Media:la-cls-certo.ogg|/ˈkertoː/]]
| natuurlijk <br/>/nɑˈtyːrlək/
| claro <br/>//
| конечно <br/>[[Media:Ru-конечно.ogg|/kɐˈnʲeʂnə/]]
|-
| où <br/>[[Media:Fr-où.ogg|/u/]]
| wo <br/>[[Media:De-Wo.OGG|/vo/]]
| where <br/>[[Media:En-us-where.ogg|/ˈwɛɚ/]]
| أَيْنَ<br/>/ʔajna/
| 哪儿 <br/>''nǎr''
| donde <br/>[[Media:Es-donde.ogg|/ˈdonde/]]
| πού <br/>/ˈpu/
| कहाँ <br/>/kaɦãː/
| dove <br/>[[Media:It-dove.ogg|/ˈdove/]]
| 何処 <br/>/doko/
| lize <br/>[[Media:lize (avk).wav|/ˈlizɛ/]]
| ubi <br/>[[Media:la-cls-ubi.ogg|/ˈubiː/]]
| waar <br/>[[Media:nl-waar.ogg|/ʋar/]]
| onde <br/>[[Media:Pt-onde.ogg|/ˈõdɨ/]]
| где, куда <br/>[[Media:Ru-где.ogg|/ɡdʲe/]], [[Media:Ru-куда.ogg|/kʊˈda/]]
|-
| quand <br/>[[Media:Fr-Quand.oga|/kɑ̃/]]
| wenn <br/>[[Media:De-wenn2.ogg|/vɛn/]]
| when <br/>[[Media:En-us-when.ogg|/ˈwɛn/]]
| مَتى <br/>/mata/
| 当 <br/>[[Media:zh-dāng.ogg|dāng]]
| cuando <br/>/ˈkwando/
| όταν <br/>/ˈɔtan/
| कब <br/>/kab/
| quando <br/>[[Media:It-quando.ogg|/ˈkwando/]]
| 時 <br/>/toki/
| viele <br/>[[Media:viele.wav|/viˈɛlɛ/]]
| quando <br/>[[Media:la-cls-quando.ogg|/ˈkʷandoː/]]
| wanneer <br/>[[Media:Nl-wanneer.ogg|/ʋɑˈneːr/]]
| quando <br/>/ˈkwɐ̃du/
| когда <br/>[[Media:Ru-когда.ogg|/kʌˈɡda/]]
|-
| comment <br/>[[Media:Fr-comment.ogg|/kɔmɑ̃/]]
| wie <br/>[[Media:De-wie.ogg|/viː/]]
| how <br/>[[Media:en-us-how.ogg|/haʊ/]]
| كيف <br/>[[Media:Ar-كيف.ogg|/kajfa/]]
| 怎么 <br/>[[Media:zh-zěnme.ogg|zěnme]]
| cómo <br/>/ˈkomo/
| πόσο <br/>póso
| कैसे <br/>kaise
| come <br/>[[Media:It-come.ogg|/ˈkome/]]
| どう <br/>/doː/
| kane <br/>[[Media:kane (avk).wav|/ˈkanɛ/]]
| quam <br/>/kwam/
| hoe <br/>[[Media:Nl-hoe.ogg|/ɦu/]]
| como <br/>[[Media:Pt-br-como.ogg|/ˈkomu:/]]
| как <br/>[[Media:Ru-как.ogg|/kak/]]
|-
| pourquoi <br/>[[Media:Fr-Pourquoi.ogg|/puʁkwa/]]
| warum <br/>[[Media:De-Warum.OGG|/ˈvaːʀʊm/]]
| why <br/>[[Media:En-us-why.ogg|/ˈwaɪ/]]
| لماذا <br/>/limaða/
| 为什么 <br/>[[Media:zh-wèishénme.ogg|wèishénme]]
| por qué <br/>/poɾˈke/
| γιατί <br/>/ʝaˈti/
| क्यों <br/>kyoṃ
| perché <br/>[[Media:It-perché.ogg|/perˈke/]]
| 何故 <br/>/naze/
| dume <br/>[[Media:dume (avk).wav|/ˈdumɛ/]]
| cur <br/>/kʊr/
| waarom <br/>[[Media:nl-waarom.ogg|/ʋaːˈrɔm/]]
| por que <br/>/ˌpuɾ ˈke/
| почему <br/>[[Media:Ru-почему.ogg|/pʌtʃimu/]]
|-
| combien <br/>[[Media:Fr-combien.ogg|/kɔ̃bjɛ̃/]]
| wie viel <br/>[[Media:De-wie viel.oga|/viːˈfiːl/]]
| how much <br/>[[Media:En-uk-how much.ogg|/ˈhaʊ ˌmʌtʃ/]]
| كَمْ <br/>/ka:m/
| 几 <br/>[[Media:zh-jǐ.ogg|jǐ]]
| cuánto <br/>[[Media:Es-cuánto.oga|/'kwanto/]]
| πόσο <br/>póso
| कितना <br/>/kitana:/
| quanto <br/>[[Media:It-quanto.ogg|/kwanto/]]
| 幾ら /<br/>/ikɯɾa/
| ote <br/>[[Media:ote (avk).wav|/ˈɔtɛ/]]
| quantum /<br/>[[Media:la-cls-quantum.ogg|/ˈkʷantum/]]
| hoeveel <br/>[[Media:nl-hoeveel.ogg|/ɦuˈveːl/]]
| quanto /ˈkwɐ̃tu/
| сколько <br/>[[Media:Ru-сколько.ogg|/ˈskolʲkə/]]
|-
| plus <br/>[[Media:Fr-plus.ogg|/plys/]]
| mehr <br/>[[Media:De-mehr.ogg|/meːɐ̯/]]
| more <br/>[[Media:En-us-anymore.ogg|/mɔɹ/]]
| أكثر <br/>'ákthar
| 更多 <br/>gèngduō
| más <br/>/ˈmas/
|
|
| più <br/>[[Media:It-più.ogg|/'pju/]]
|
| loon <br/>[[Media:loon (avk).wav|/lɔˈɔn/]]
|
| meer <br/>[[Media:nl-meer.ogg|/mer/]]
| mais <br/>//
| больше <br/>[[Media:Ru-больше.ogg|/'bolʲʂɨ/]]
|-
| moins <br/>[[Media:Fr-de moins en moins.oga|/mwɛ̃/]]
| weniger <br/>[[Media:De-weniger2.ogg|/ˈveːnɪgər/]]
| less <br/>[[Media:En-us-less.ogg|/ˈlɛs/]]
| أقل <br/>'aqall
| 更少 <br/>gèng shǎo
| menos /ˈmenos/
|
| कम <br/>/kam/
| meno <br/>[[Media:It-meno.ogg|/'meno/]]
|
| leon <br/>[[Media:leon (avk).wav|/lɛˈɔn/]]
|
| minder <br/>/ˈmɪndər/
| menos <br/>//
| меньше <br/>[[Media:Ru-меньше.ogg|mén’še]]
|-
| beaucoup <br/>[[Media:LL-Q150 (fra)-GrandCelinien-beaucoup.wav|/boku/]]
| viel <br/>[[Media:De-viel2.ogg|/fiːl/]]
| many
|
| 多 <br/>[[Media:zh-duō.ogg|duō]]
|
|
|
|
|
| jontikon <br/>[[Media:jontikon.wav|/ʒɔntiˈkɔn/]]
|
|
|
|
|-
| très
| sehr
| very
|
|
|
|
|
|
|
| tolke <br/>[[Media:tolke.wav|/ˈtɔlkɛ/]]
|
|
|
|
|-
| trop
| zu <br/>[[Media:De-zu2.ogg|/t͡suː/]]
| too
|
|
|
|
|
|
|
| slikon <br/>[[Media:slikon.wav|/sliˈkɔn/]]
|
|
|
|
|-
| vite
| schnell <br/>[[Media:De-schnell2.ogg|/ʃnɛl/]]
| quickly
|
|
|
|
|
|
|
| kalion <br/>[[Media:kalion.wav|/kaliˈɔn/]]
|
|
|
|
|-
| généralement
| meist <br/>[[Media:De-meist.ogg|/maɪ̯st/]]
| usually
|
|
|
|
|
|
|
| jadion <br/>[[Media:jadion.wav|/ʒadiˈɔn/]]
|
|
|
|
|-
| souvent
| oft <br/>[[Media:De-oft.ogg|/ɔft/]]
| often
|
|
|
|
|
|
|
| jontikviele <br/>[[Media:jontikviele.wav|/ʒɔntikviˈɛlɛ/]]
|
|
|
|
|-
| toujours
| immer <br/>[[Media:De-immer2.ogg|/ˈɪmɐ/]]
| always
|
|
|
|
|
|
|
| kotviele <br/>[[Media:kotviele.wav|/kɔtviˈɛlɛ/]]
|
|
|
|
|-
| jamais
| nie <br/>[[Media:De-nie.ogg|/niː/]]
| never
|
|
|
|
|
|
|
| meviele <br/>[[Media:meviele.wav|/mɛviˈɛlɛ/]]
|
|
|
|
|-
| parfois
| manchmal <br/>[[Media:De-manchmal.ogg|/ˈmançmaːl/]]
| sometimes
|
|
|
|
|
|
|
| dile <br/>[[Media:jontikviele.wav|/ˈdilɛ/]]
|
|
|
|
|-
| maintenant
| jetzt <br/>[[Media:De-jetzt3.ogg|/jɛt͡st/]]
| now
| لآن <br/>/al'aan/
| 今 <br/>jīn
| ahora
| अब <br/>/ab/
| τώρα <br/>/'tɔɾa/
| adesso, ora
| 今 <br/>/ima/
| re <br/>[[Media:re (avk).wav|/rɛ/]]
| nunc
| nu, nou
| agora
| сейчас <br/>''seĭčas''
|-
| avant
| vor <br/>[[Media:De-vor3.ogg|/foːɐ̯/]]
| before
|
|
|
|
|
|
|
| abdi <br/>[[Media:abdion.wav|/abdiˈɔn/]]
|
|
|
|
|-
| après
| nach <br/>[[Media:De-nach2.ogg|/naːx/]]
| after
|
|
|
|
|
|
|
| radimion <br/>[[Media:radimion.wav|/radimiˈɔn/]]
|
|
|
|
|}
{{...}}
== Voir aussi ==
{{Autres projets
|w=Catégorie:Adverbe
|wikt=Catégorie:Adverbes
|v=Catégorie:Adverbes}}
<noinclude>[[Catégorie:Adverbes|*]]</noinclude>
23i55zycttbq8fnyx92nejiru8w0ifl
Fonctionnement d'un ordinateur/Les architectures dataflow
0
69053
683027
679549
2022-08-01T10:39:02Z
Anpanman
56977
typo
wikitext
text/x-wiki
Dans les années 1970 à 1980, les chercheurs tentaient de créer des architectures parallèles sans ''program counter'', ce qui les amena à créer les architectures ''dataflow''. Sur ces architectures, une instruction s’exécute dès que ses opérandes sont disponibles, comme sur les architectures à exécution dans le désordre, sauf que c'est le jeu d'instruction et le compilateur qui s'occupent de la gestion des dépendances. Un programme sur une architecture ''dataflow'' précise les dépendances de données entre instructions. Vu que chaque instruction ne s'exécute que si ses opérandes sont disponibles, détecter la disponibilité des opérandes des instructions est alors primordial, et c'est cette contrainte qui a façonné les architectures ''dataflow''.
==Le modèle de calcul ''dataflow'' théorique==
[[File:Dataflow graph.PNG|vignette|Exemple de graphe dataflow.]]
Un programme conçu pour une architecture ''dataflow'' n'est pas une simple suite d'instruction, mais encode les dépendances entre instructions. Pour cela, chaque instruction indique l'adresse mémoire de toute instruction qui a besoin de son résultat. Pour limiter les dépendances de données au strict minimum, les compilateurs ajoutent une contrainte simple : impossible de modifier la valeur d'une donnée/variable après son initialisation. Avec ces deux contraintes, un programme d'architecture ''dataflow'' est ce qu'on appelle un '''graphe orienté acyclique''', un objet mathématique assez particulier qu'on va décrire assez rapidement.
Pour faire simple, un graphe est un ensemble de points qu'on relie par des flèches. Avec un graphe orienté, les flèches ont un sens. Le terme acyclique signifie qu'il n'y a pas de boucles dans le graphe. Sur les processeurs ''dataflow'', les points du graphe sont les instructions du programme, alors que les flèches entre instructions représentent chacune une dépendance de donnée de type RAW. Deux instructions seront reliées par une flèche si elles ont une dépendance de donnée, et la flèche va de l'instruction qui calcule l'opérande vers celle qui l'utilise. Rien n’empêche à une instruction de manipuler le résultat de plusieurs instructions différentes, mais il n'y a pas de boucles, du fait de l'acyclicité du graphe. Le stockage de ce graphe dépend de l'ordinateur utilisé, mais vous pouvez être certains qu'il est stocké quelque part (même si parfois de manière implicite) dans la mémoire de l'ordinateur et que le processeur l'utilise pour savoir quelles instructions exécuter et dans quel ordre.
{|
|[[File:Singledataflownode.png|vignette|Représentation d'une instruction ''dataflow''.]]
|[[File:Dataflowexpr.png|vignette|upright=0.5|Extrait de code ''dataflow'' (graphe simple) avec plusieurs instructions arithmétiques.]]
|}
===Les instructions d'un programme ''dataflow''===
Les instructions arithmétiques et logiques consomment leurs entrées et fournissent un résultat sans rien faire d'autre : elles sont sans aucun effet de bord. Mine de rien, cela n'est pas le cas sur les autres architectures, où ces instructions peuvent écraser une donnée, modifier des bits de contrôle du registre d'état, lever des exceptions matérielles, etc. Et cela réduit les possibilités de parallélisation, en ajoutant des dépendances avec le registre d'état ou d'autres structures matérielles. Rien de tout cela n'est permis sur les architectures ''dataflow'', afin de garder un maximum d'opportunités de parallélisation.
Outre les instructions normales, on trouve des instructions équivalentes aux instructions de tests et de branchements, appelées ''switch'' et ''merge''. Pour faire simple, les ''merges'' sont des instructions qui effectuent des comparaisons ou des tests et qui fournissent un résultat du style : la propriété testée est vraie (ou fausse). Les ''switch'' quant à eux, sont l'équivalent des instructions de branchements, vues plus haut.
{|
|[[File:Switchdataflownode.png|vignette|Switch.]]
|[[File:Mergedataflownode.png|vignette|Merge.]]
|}
Ces instructions permettent de créer des structures de contrôle usuelles.
{|
|[[File:Conditiondataflow.png|vignette|Code ''dataflow'' avec un IF/ELSE.]]
|[[File:Dataflowwhileloop.png|vignette|upright=1.5|Code ''dataflow'' avec une boucle WHILE.]]
|}
===La gestion de la disponibilité des opérandes===
Pour exécuter un programme ''dataflow'', le processeur a besoin de savoir quelles sont les données disponibles (ainsi que les instructions auxquelles elles sont destinées). Au niveau abstrait, la disponibilité des opérandes peut se voire sur le graphe acyclique qui représente le programme. A tout instant, les opérandes sont localisées sur les flèches du graphe. Associer une opérande/donnée avec une flèche est réalisé en attribuant d'un '''jeton''' à chaque opérande. Le jeton associé à une donnée mémorise l'adresse mémoire de la prochaine instruction à exécuter, c'est à dire l'adresse du prochain nœud du graphe. Qui plus est, le jeton peut aussi éventuellement contenir certains renseignements supplémentaires. Il est stocké en mémoire et va y attendre bien sagement qu'une instruction veuille bien l'utiliser.
Le schéma qui suit montre ce qu'il advient des jetons suite à l’exécution d'une instruction sur un graphe ''dataflow''. Lorsque tous les opérandes d'une instruction sont disponibles, l'instruction consomme les opérandes et fournit un résultat. Les jetons des opérandes sont donc détruits, vu que les opérandes ont été consommées, alors que le résultat se voit attribuer un jeton. L’exécution du programme consiste à propager les jetons à travers le graphe, ce qui se fera suivant les disponibilités des jetons. Pour résumer, exécuter une instruction demande de détecter la disponibilité des opérandes via leurs jetons, ainsi que de créer et détruire les jetons adéquats. Vérifier la disponibilité des opérandes d'une instruction est le rôle d'un circuit spécialisé, comme on le verra plus tard.
[[File:Dataflowfiringnodes.png|centre|vignette|upright=2|Illustration de la propagation des jetons suite à l’exécution d'une instruction sur un graphe dataflow.]]
La détection de la disponibilité des opérandes est primordiale sur les architectures dataflow. Dans ce qui va suivre, on va voir qu'il existe différentes façons de gérer ce jeton, qui peuvent être plus ou moins évoluées suivant l'ordinateur ''dataflow'' utilisé. Le principal problème avec les jetons, c'est qu'ils doivent parfois attendre que leur instruction ait réuni toutes ses opérandes pour être utilisés. Dans pas mal de cas, les jetons n'attendent pas longtemps et un nouveau jeton n'a pas le temps d'arriver entre-temps. Mais il se peut qu'un nouveau jeton arrive avant que le précédent soit consommé. On est alors face à un problème : comment faire pour différencier l'ancienne donnée, qui doit être utilisée dans le calcul à faire, de la donnée du jeton nouveau venu ? La réponse à cette question distingue les architectures ''dataflow'' statiques et dynamiques.
==Les architectures ''dataflow'' statiques==
La première solution est celle utilisée sur les '''architectures dataflow statiques'''. Sur ces architectures, on n'a qu'un seul jeton de disponible pour chaque flèche du graphe ''dataflow'', par construction. Une instruction ne peut pas avoir plusieurs valeurs différentes d'une même opérande en attente, chose qui serait possible avec l'usage de boucles, par exemple. Dit autrement, chaque flèche du graphe ne doit contenir qu'un seul jeton à la fois lors de l’exécution du programme. En raison de cette contrainte, certaines fonctionnalités importantes des langages de programmation fonctionnels ne sont pas implémentables sur ces architectures. Exemples : pas de fonctions de première classe, pas de fonctions réentrantes, ni de récursivité. De plus, les boucles sont systématiquement exécutées en série, itérations après itérations, au lieu d’exécuter des itérations en parallèle quand c'est possible. En effet, une instruction dans une boucle va produire une nouvelle opérande par itération, qui se retrouveront toutes sur la même flèche du graphe ''dataflow'', car produite par la même instruction. Mais la contrainte du un jeton par flèche ne permet qu’une seule opérande, donc une seule itération de la boucle.
===Le codage des instructions===
Une instruction contient, outre son opcode, un espace pour stocker les opérandes (les jetons) et des bits de présence qui indiquent si l'opérande associé est disponible. Les jetons sont donc stockés dans l'instruction et sont mis à jour par réécriture directe de l'instruction en mémoire. De plus, chaque instruction contient l'adresse de l'instruction suivante, celle à laquelle envoyer le résultat. Tout cela ressemble aux entrées des stations de réservation sur les processeurs à exécution dans le désordre, à un détail près : tout est stocké en mémoire, dans la suite de bits qui code l'instruction. Vu qu'une instruction contient ses propres opérandes, on préfère parfois utiliser un autre terme que celui d'instruction et on parle d''''activity template'''.
{|
|[[File:Dataflowsimplestructure.png|centre|vignette|upright=1.5|Illustration du codage de haut niveau d'une instruction sur une architecture dataflow statique. On voit bien que chaque instruction a un espace réservé pour chaque opérande.]]
|[[File:Dataflowiterstructure.png|centre|vignette|upright=1.5|Même chose, mais avec des instructions Switch et Merge.]]
|}
Avec cette technique, il faut empêcher une instruction de fournir un résultat si une autre donnée est en train d'attendre sur la même flèche. Pour empêcher cela, chaque instruction contient un bit qui indique si elle peut calculer un nouveau résultat. Ce bit est appelé le '''jeton d'autorisation'''. Quand une instruction s’exécute, elle prévient les instructions qui ont calculé ses opérandes qu'elle est prête à accepter un nouvel opérande. Les jetons de celles-ci sont mis à jour. Pour que cela fonctionne, chaque instruction doit savoir quelle est la ou les instructions qui la précédent dans l'ordre des dépendances, ce qui implique de mémoriser leurs adresses.
[[File:Représentation d'une instruction en mémoire sur une architecture dataflow.jpg|centre|vignette|upright=2|Représentation d'une instruction en mémoire sur une architecture dataflow.]]
===La microarchitecture d'une architecture ''dataflow'' statique===
Dans les grandes lignes, une architecture ''dataflow'' statique est composée de plusieurs éléments, représentés sur le schéma que vous pouvez voir en dessous. La file d'instructions est une mémoire qui met en attente les instructions dont toutes les données sont prêtes : elle contient leurs adresses, qu'elle peut fournir à l'unité de chargement. L'unité de mise à jour enregistre les résultats des instructions en mémoire et met à jour les bits de présence. Elle vérifie aussi que l'instruction de destination du résultat a tous ses opérandes disponibles et charge celle-ci dans la file d'instructions si c'est le cas.
[[File:Diagramme d'une architecture dataflow statique.jpg|centre|vignette|upright=2|Diagramme d'une architecture dataflow statique.]]
==Les architectures ''dataflow'' dynamiques==
Les '''architectures ''dataflow'' dynamiques''' acceptent plusieurs jetons sur une flèche du graphe ''dataflow''. Mais il faut éviter de confondre les opérandes, il faut garantir que les opérandes soient utilisés dans l'ordre, dans leur ordre d'arrivée. Pour cela, ces architectures associent un ''tag'' à chaque jeton, qui indique leur ordre d’exécution leur ordre d'arrivée sur la flèche du graphe ''dataflow''. Dorénavant, une instruction s’exécute une fois que tous ses opérandes ayant le même tag sont disponibles.
Sur les architectures statiques, les jetons avaient un emplacement pré-réservé dans les instructions mêmes. Mais sur les architectures dynamiques, on ne peut réserver de la place pour les opérandes à l'avance. C'est maintenant aux jetons d'indiquer l'adresse de l'instruction qui doit les manipuler. Les opérandes sont mémorisés à part des instructions, dans des mémoires séparées (en clair, les architectures dynamiques sont de type Harvard). Les opérandes sont mis en attente dans une file d'attente. À chaque ajout d'un opérande dans la file d'attente, le processeur vérifie quels sont les opérandes de la file qui possèdent le même tag et la même adresse d'instruction.
[[Image:Dataflowmanchester.png|centre|vignette|upright=2|Synoptique simplifié de la machine de l'Université de Manchester ([[1981]])]]
La gestion des jetons change du tout au tout. Les jetons contiennent l'opérande, leur ''tag'', et l'adresse de l'instruction de destination, ainsi que le nombre d'opérandes de cette instruction (afin de faciliter la détection de la disponibilité des opérandes de celle-ci). Dès qu'un jeton a été calculé par l'ALU, il est stocké dans la file d'attente des jetons disponibles. Reste à vérifier la disponibilité des opérandes. Si l'instruction a toutes ses opérandes disponibles dans cette file d'attente, il y a juste à les récupérer et à lancer l'instruction. Ainsi, à chaque ajout d'un jeton dans la file d'attente des jetons, on va vérifier quels sont les jetons présents dans cette file qui possèdent le même Tag, afin de charger celle-ci le cas échéant.
[[File:Architecture dataflow dynamique.jpg|centre|vignette|upright=1.5|Architecture dataflow dynamique.]]
Il va de soi que vu les contraintes de fonctionnement de la file d’attente, celle-ci est une mémoire adressable par contenu, et précisément une mémoire associative. Le seul problème (car il y en a un) est que les performances d'une architecture dynamique dépendent fortement de la vitesse de cette mémoire adressable par contenu.
==Les architectures ''Explicit Token Store''==
Les '''architectures Explicit Token-Store''' utilisent une sorte de pile. L'opérande est remplacé par deux choses : un pointeur vers le cadre de pile qui contient la donnée et de quoi localiser l'opérande dans la pile. Elle représente une amélioration assez conséquente des architectures précédentes. Sur ces machines, lorsqu’une fonction ou une boucle s’exécute, elle réserve un cadre de pile et y stocke ses opérandes et ses variables locales. A chaque appel d'une fonction ou à chaque itération d'une boucle, on crée un nouveau cadre pour les opérandes de la dite version. Ainsi, chaque fonction ou itération de boucle pourra avoir son propre jeu d'opérandes et de variables locales, permettant ainsi l'utilisation de fonctions ré-entrantes ou récursives et un déroulage matériel des boucles.
Ces cadres de pile sont localisés par leur adresse mémoire et les instructions ont juste à repérer la position dans le cadre de pile. La différence avec la pile des architectures usuelles tient dans le fait que les cadres de pile ne sont pas contiguës, mais peuvent être dispersées n'importe où et n'importe comment (ou presque) en mémoire. Qui plus est, les cadres de pile ne sont pas organisés avec une politique d'ajout et de retraits de type LIFO. Chaque donnée présente dans un cadre de pile possède des bits de présence, comme toutes les autres données.
Dans ces architectures, la mémoire est encore séparée en deux : une mémoire pour les instructions et une autre pour les cadres de pile. L’organisation est similaire aux architectures dynamiques, à un détail prêt : les cadres de pile sont stockées dans une mémoire tout ce qu'il y a de plus normale, avec des adresses et tout le reste.
==Les architectures ''dataflow'' hybrides==
Les architectures dataflow sont certes très belles et créatives, mais celles-ci souffrent de défauts qui empêchent de les utiliser de façon réellement efficace.
Premièrement, la gestion des jetons et des instructions est compliquée et utilise beaucoup de circuits. La détection de la disponibilité des opérandes d'une instruction est assez coûteuse et prend un certain temps, vu qu'elle est faite avec des mémoires associatives. Or, les mémoires associatives sont redoutablement lentes, ce qui pose de gros problèmes de performances. Le temps d'accès à la mémoire est suffisant pour compenser tous les gains apportés par la parallélisation. Autre problème : la répartition des instructions prêtes sur les différentes unités de calcul prend un certain temps, difficile à amortir. Autre problème : les tags prennent de la mémoire, suffisamment pour devenir un problème. Ensuite, l'immutabilité des variables fait que la gestion des structures de données est laborieuse pour le compilateur et le programmeur, entraîne beaucoup d'allocations mémoires et augmente fortement le nombre de lectures et écritures en mémoire, comparé à un programme impératif.
Et ensuite, le plus gros problème de tous : ces architectures sont limitées par la rapidité de la mémoire RAM principale. La même chose a lieu dans les programmes impératifs sur des architectures normales, à la différence que celles-ci ont des caches et une hiérarchie mémoire, afin d'amortir le coût des accès mémoires. Mais ces techniques ne fonctionnent correctement que lorsque le code exécuté a une bonne localité temporelle et spatiale. Ce qui n'est franchement pas le cas des programmes conçus pour les architectures ''dataflow'' et des programmes fonctionnels en général (à cause de l'immutabilité de variables, d'allocations mémoires fréquentes, des structures de donnée utilisées, etc).
On peut toujours compenser ces défauts en exécutant beaucoup d'instructions en parallèle, mais rares sont les programmes capables d’exécuter un grand nombre d'instructions à exécuter en parallèle. Il faut dire que les dépendances de données sont légion et qu'il n'y a pas de miracles. On ne peut pas toujours trouver suffisamment d'instructions à paralléliser, sauf dans certains programmes, qui résolvent des problèmes particuliers. En conséquence, les ''architectures dataflow'' ont été abandonnées, après pas mal de recherches, en raison de leurs faibles performances. Mais certains chercheurs ont quand même décidé de donner une dernière chance au paradigme ''dataflow'', en le modifiant de façon à le rendre un peu plus impératif.
===Les architectures ''Threaded Dataflow''===
Ainsi sont nées les '''architectures ''Threaded Dataflow''''' ! Sur ces architectures, un programme est découpé en plusieurs blocs d'instructions. À l'intérieur de ces blocs, les instructions s’exécutent les unes à la suite des autres. Par contre, les blocs eux-mêmes seront exécutés dans l'ordre des dépendances de données : un bloc commence son exécution quand tous les opérandes nécessaires à son exécution sont disponibles.
===Les architecture ''Explicit Data Graph Execution''===
Les architectures '''''Explicit Data Graph Execution''''' se basent sur le fonctionnement des compilateurs modernes pour découper un programme procédural ou impératif en blocs de code. Généralement, ceux-ci vont découper un programme en petits morceaux de code qu'on appelle des blocs de base, qui sont souvent délimités par des branchements (ou des destinations de branchements). Ce sont ces blocs de base qui seront exécutés dans l'ordre des dépendances de données. Certaines architectures de ce type ont déjà été inventées, comme les processeurs ''WaveScalar'' et ''TRIPS''.
==Conclusion==
Pour finir, sachez qu'il existe peu de documentation sur le sujet. Il s'agit d'un sujet de recherche assez ancien, et qui est un peu délaissé des dernières années. Quoi qu’il en soit, je recommande la lecture des liens qui suivent, pour se renseigner un peu plus sur le sujet :
* [http://csd.ijs.si/courses/dataflow/index.htm Dataflow Computers].
Quelques liens sur l'architecture ''wavescalar'' :
* [https://homes.cs.washington.edu/~oskin/wavescalar.pdf Wavescalar].
* [https://courses.cs.washington.edu/courses/cse471/07sp/readings/WaveScalarArch.pdf The wavescalar architecture].
<noinclude>
{{NavChapitre | book=Fonctionnement d'un ordinateur
| prev=Les architectures découplées
| prevText=Les architectures découplées
| next=Les architectures pour langages fonctionnels
| nextText=Les architectures pour langages fonctionnels
}}
</noinclude>
6j11mw2mupldniyd57shnicap66kjtf
Neurosciences/Le métabolisme cérébral
0
70529
683000
682981
2022-07-31T13:59:33Z
JackPotte
5426
Révocation des modifications de [[Special:Contributions/196.70.124.200|196.70.124.200]] ([[User talk:196.70.124.200|discussion]]) vers la dernière version créée par [[User:Gilles Mairet|Gilles Mairet]]
wikitext
text/x-wiki
Le cerveau est un organe qui consomme beaucoup d'énergie : près de 20% de la consommation énergétique du corps est de son fait, alors qu'il ne pèse que 2% de son poids ! Il faut dire que faire fonctionner les neurones demande de l'énergie, d'autant que ceux-ci sont actifs. Générer des potentiels d'action demande une certaine énergie, produire des neurotransmetteurs aussi, sans compter l'action des pompes et canaux ioniques de la membrane. Le cerveau utilise la majeure partie de son énergie pour faire fonctionner ses pompes et canaux ioniques, principalement les pompes. Celles-ci vont, pour rappel, pomper certains ions en dehors de la cellule, contre leur gradient de concentration. Cela demande naturellement de l'énergie, pour contrer l'effet de la concentration plus importante dans le milieu extérieur. Chaque pompe va ainsi utiliser une ou plusieurs molécules d'ATP pour faire sortir un ion. Cela ne parait n'être pas grand-chose, mais cela compte pour 50% du métabolisme de base du cerveau !
==Le métabolisme énergétique du cerveau==
Le cerveau est un organe qui consomme beaucoup d'énergie. On estime qu'il est responsable, à lui seul d'environ 25% de la consommation énergétique du corps. Après, la valeur exacte varie beaucoup selon un paquet de paramètres différents. Par exemple, on sait que la consommation énergétique du cerveau dépend de sa température. On estime qu'une réduction de 1°c réduit la consommation énergétique cérébrale de 6 à 5% environ. Cela a d'ailleurs des applications thérapeutiques, dans les cas d'AVC, d'arrêt cardiaque ou d'autres situations similaires où le cerveau manque d'oxygène. Dans ces situations, on refroidit le cerveau pour ralentir son métabolisme. Cela réduit l'apparition de lésions cérébrales, causées par un métabolisme anormal lié au manque d'oxygène. Quoi qu’il en soit, le métabolisme cérébral dépend de bien d'autres paramètres, et il serait inutile d'en faire une liste exhaustive.
===Les sources d'énergie du cerveau===
Les neurones sont comme toutes les cellules : ils brulent des nutriments pour fabriquer de l'énergie, qui est stockée sous forme d'ATP dans la cellule. En temps normal, les nutriments brulés sont des sucres, mais le cerveau peut aussi bruler des dérivés de la désagrégation des graisses ou des protéines si le sucre vient à manquer. Cette combustion des nutriments, implique toute une série de réactions chimiques très compliquées. Ceux qui s'y connaissent en biologie devraient connaitre les notions de fermentation ou de respiration cellulaires, voire le cycle de Krebs. Nous n'allons pas revenir sur ces notions fondamentales de la biologie, mais nous allons remarquer que la combustion des nutriments peut se faire soit en présence d'oxygène, soit sans. Quand les nutriments sont brulés en présence d'oxygène, les réactions chimiques sont des réactions dites de ''respiration cellulaire''. Dans le cas contraire, ce sont des réactions de ''fermentation''. Les neurones sont capables à la fois de respiration cellulaire que de fermentation. Vu que les neurones consomment beaucoup d'énergie, le processus principal est la respiration, ce qui fait que le cerveau a besoin d'oxygène pour fonctionner. Pour résumer, le cerveau a principalement besoin de sucres et d'oxygène, mais il peut consommer des graisses en cas de manque.
====Le glucose et l'oxygène====
En temps normal, le cerveau consomme du sucre par respiration cellulaire, la fermentation étant minimale. Le sucre le plus utilisé par le cerveau est le glucose, du moins en temps normal, mais des molécules similaires au glucose peuvent être utilisées en lieu de place de celui-ci : c'est le cas pour le pyruvate, le mannose et le lactate. Les expériences qui ont montré cela sont assez simples à expliquer. Elles se bornent à comparer la composition du sang entre les artères qui alimentent le cerveau et les veines qui en sortent. Ces mesures montrent alors que le sang est identique entre l'entrée et la sortie, si ce n'est que sa teneur en glucose et en oxygène est plus basse dans les veines que dans les artères, sans compter que sa teneur en dioxyde de carbone augmente.
Les mesures précédentes traduisent le fait que le cerveau utilise ce qu'on appelle la respiration cellulaire aérobie pour produire son énergie : il consomme de l'oxygène et du glucose et produit de l'énergie et du dioxyde de carbone. Cependant, ces mesures montrent que tout l'oxygène n'est pas converti de cette manière. Si tout le glucose était utilisé ainsi, 100 grammes de cerveau devraient consommer 26 millimoles de glucose par minutes. Or, la valeur mesurée est de 31 millimoles par minutes. Il y a donc une petite différence de 4,4 millimoles par minutes, qui est utilisée autrement. Dans le détail, on verra que ce glucose est transformé et stocké dans les astrocytes et les neurones, il est mis en réserve.
====Les lipides et acides gras====
<noinclude>[[File:Ketone bodies.png|vignette|upright=0.5|Structure de l'acétone, de l'acétylacétate et du β-D-hydroxybutyrate.]]</noinclude>
Outre le glucose, les protéines et des dérivés de la désagrégation des graisses peuvent être consommés par le cerveau pour produire de l'énergie. Encore une fois, cette production s'effectue par le biais de la respiration cellulaire aérobie et le cerveau n'est pas le seul à pouvoir faire cela (tous les tissus peuvent brûler des protéines ou des lipides dans le cycle de Krebs). Par contre, le métabolisme cérébral des graisses est différent du métabolisme des autres tissus. En effet, le cerveau ne peut pas bruler les acides gras pour produire de l'énergie, contrairement aux autres tissus. La raison est que les acides gras ne peuvent pas traverser la barrière hémato-encéphalique. En revanche, le cerveau peut bruler les '''corps cétoniques''', des dérivés de la désagrégation des graisses qui peuvent traverser la barrière hémato-encéphalique et alimenter le cerveau en énergie. Parmi les corps cétoniques, deux alimentent le cerveau et le cœur en énergie : l'acétylacétate et le β-D-hydroxybutyrate.
Cependant, la production de corps cétoniques n'arrive que dans des conditions très particulières. Il faut que le corps manque de sucres (glucose) au point que le foie en est réduit à bruler des graisses. Le métabolisme des lipides et acides gras donne alors naissance à des corps cétoniques, par un processus dit de cétogenèse. Par exemple, cela arrive en cas de diabète ou de jeûne : l'alimentation en sucre étant alors inadéquate, le cerveau doit utiliser d'autres voies que la consommation de glucose. Un autre exemple est celui des nouveaux-nés allaités, dont l'alimentation est très riche en lipides et en acides gras. Dans tous les exemples précédents, les réactions chimiques utilisées pour produire de l'énergie à partir de lipides ou de protéines sont les mêmes : les voies métaboliques des nouveaux-nés sont réactivées en cas de jeûne ou de diabète.
===L'hypoxie cérébrale===
Quand l'oxygène vient à manquer, on fait face à une situation d'''hypoxie cérébrale''. Une telle situation arrive notamment lors d'un AVC ou d'un arrêt cardiaque, quand le cerveau n'est plus irrigué par le sang. L'oxygène n'est plus apporté au cerveau, qui réagit pour faire face à la pénurie. Le cerveau a beau avoir une grosse consommation énergétique, il a des réserves très faibles en nutriments. Ce qui fait que l'hypoxie commence à causer des problèmes en quelques minutes, voire quelques secondes. Il se produit alors une cascade de réactions chimiques, qui endommage les neurones et entraine leur mort. Cette cascade se produit en deux étapes : une première étape liée à la carence en oxygène, une autre quand le sang revient dans le cerveau et où l'oxygène revient. Ces deux étapes laissent des dommages cérébraux massifs, qu'il s'agisse du manque d'oxygène ou des dommages de la seconde étape, appelés dommages de re-perfusion.
====La cascade ischémique====
La première étape est une série de réactions chimiques qui s'appelle la '''cascade ischémique''', qui fait suite à un manque d'oxygène. Pour faire simple, le cerveau réagit en passant à des réactions de fermentation pour consommer les sucres. Mais l'usage de la fermentation pose divers problèmes. En premier lieu, elle ne fournit pas assez d'énergie pour les pompes et canaux ioniques. L'équilibre ionique du cerveau est alors perturbé, avec une accumulation d'ions dans ou en dehors des neurones. En second lieu, la fermentation produit des déchets qui sont toxiques pour les neurones. Or, ceux-ci peuvent entrainer des dommages s'ils ne sont pas évacués du cerveau. La majorité des dommages provient, de manière indirecte, du déséquilibre ionique, qui intoxique les neurones de l'intérieur.
Le dysfonctionnement principal est l'arrêt de certaines pompes ioniques, notamment des pompes au potassium, au calcium et au sodium. Cela mène à une ''accumulation de sodium et de calcium dans les neurones''. En premier lieu, le calcium va s'accumuler dans les neurones. Or, le calcium est toxique pour les cellules, ce qui peut forcer l'apoptose des cellules (leur suicide). De plus, ce calcium favorise la libération des neurotransmetteurs, dont le glutamate. Or, le glutamate fait rentrer encore plus de calcium via les récepteurs NMDA et AMPA. Rappelons que c'est pour cela que le glutamate a des propriétés excitotxiques, à savoir qu'il peut exciter les neurones à l'excès, jusqu’à en devenir toxique. Les effets excitotoxiques du glutamate proviennent de là, et ceux-ci s'expriment avec force lors de l'ischémie, bien plus que dans des conditions normales. Limiter les dégâts de la cascade ischémique demande d'agir vite afin de stopper celle-ci avant qu'un trop grand nombre de neurones soient morts. Une autre possibilité serait d'atténuer l'excitotoxicité du glutamate, en utilisant des antagonistes des récepteurs NMDA et AMPA. Mais cette stratégie n'a pas donné de bons résultats dans les études réalisées à l'heure actuelle (mi-2017).
Un autre défaut est que le sodium s'accumule dans les neurones, ce qui en perturbe l'équilibre hydroélectrique (pour les connaisseurs, l'équilibre osmotique). Les raisons à cela sont multiples. Déjà, les pompes ioniques calcium-sodium vont tenter d'évacuer le calcium dans les neurones, mais cela fait rentrer du sodium. De plus, certaines pompes ioniques potassium-sodium vont dysfonctionner, en raison du manque d'ATP, ce qui réduit l'élimination de sodium intraneuronale. Tout cela fait que les neurones tendent à accumuler beaucoup d'ions sodium dans leur cytoplasme. Sans rentrer dans les détails, cela a une conséquence : de l'eau s'accumule dans les neurones, qui gonflent. Il se produit alors un œdème cérébral, qui fait gonfler le cerveau et le compresse sur le crâne. Cette pression entraine des lésions assez graves, si elle est assez intense. Mais nous en reparlerons dans le chapitre sur la pression intracrânienne, qui parlera des œdèmes cérébraux en général.
Enfin, la fermentation produit des déchets métaboliques, les deux principaux étant : le lactate et des ions hydrogène. Les deux sont toxiques pour les neurones, quand ils sont en excès, ce qui est le cas lors d'une hypoxie cérébrale. L'accumulation de lactate est moins problématique que l'accumulation des ions hydrogène. Cette dernière fait que le pH diminue, entraînant une acidose métabolique, perturbant les réactions chimiques cérébrales.
[[File:Cascade ischémique 02.svg|centre|vignette|upright=3.0|Description simplifiée de la cascade ischémique.]]
==Les interactions neurones-astrocytes==
Les molécules dissoutes dans le sang doivent traverser la barrière hémato-encéphalique pour arriver aux neurones. Leur passage à travers celle-ci fait intervenir des molécules appelées ''transporteurs''. Pour rappel, ce sont des "récepteurs" qui permettent à une molécule de passer d'un côté à l'autre d'une membrane cellulaire. Ici, la molécule en question est une molécule sanguine et les membranes sont celles de la barrière hémato-encéphalique. Les transporteurs sont spécialisés, dans le sens où ils ne laissent passer que quelques molécules bien précises et pas les autres. Par exemple, les transporteurs pour le glucose permettent uniquement le passage du glucose, mais pas des autres molécules. Quoi qu’il en soit, les molécules sanguines traversent la barrière hémato-encéphalique, du moins pour celles qui ont un transporteur adapté, mais elles n'arrivent pas directement dans les neurones ou dans le fluide entre les neurones. Rappelons que la barrière hémato-encéphalique est composée de deux couches : un vaisseau sanguin, entouré par des astrocytes. Les transporteurs localisés à la surface des vaisseaux sanguins cérébraux permettent aux molécules de passer dans les astrocytes, qui se chargent ensuite de les redistribuer aux neurones par divers mécanismes. Pour résumer, les molécules traversent la barrière hémato-encéphalique, se retrouvent dans les astrocytes, puis sont transférées aux neurones à la demande. Autant dire que les interactions entre neurones et astrocytes sont très importantes pour le métabolisme cérébral.
Rappelons que les astrocytes n'ont pas beaucoup de transporteurs différents, les principaux étant les transporteurs pour le glucose. L'absence de transporteurs pour de nombreuses molécules/ions empêche la majorité des ions et molécules de traverser les astrocytes et d'atteindre le cerveau. C'est pour cela que la barrière hémato-encéphalique est aussi sélective.
===Le métabolisme du glucose===
Les astrocytes ont un rôle très important dans le métabolisme énergétique des neurones. Pour simplifier, les astrocytes servent de réservoir d'énergie à disposition des neurones : ils captent le glucose sanguin, le mettent en réserve, et le distribuent aux neurones à la demande. Ils servent donc de réservoir d'énergie, dans lequel les neurones alentours peuvent puiser s'ils en ont besoin. À noter que les astrocytes stockent l'énergie non pas sous la forme de glucose, mais dans des molécules de glycogène et de lactate. Rappelons que le glycogène est synthétisé à partir du glucose. Le glycogène se fabrique en liant plusieurs molécules de glucose entre elles, d'une manière extrêmement compacte. C'est la forme sous laquelle les sucres sont stockés dans la plupart des cellules, cette molécule contenant une grande quantité d'énergie dans un volume très petit. Les astrocytes en concentrent de grandes quantités pour répondre aux besoins métaboliques des neurones, ainsi que pour leur fonctionnement. Si le besoin s'en fait sentir, les liaisons de la molécule de glycogène sont brisées par des enzymes, ce qui libère de nombreuses molécules de glucose, de lactate, ou d'autres formes de sucres.
Le transfert du glucose des astrocytes aux neurones peut se faire de diverses manières, mais il se fait principalement sous la forme de lactate. Les astrocytes libèrent du lactate dans le milieu extracellulaire, qui est capté par les neurones. Ce lactate est produit dans les astrocytes par dégradation du glucose et est destiné non au stockage, mais à la consommation immédiate. Dans le détail, le glucose est dégradé en pyruvate, qui est lui-même transformé en lactate. Le lactate est alors envoyé aux neurones, qui synthétisent du pyruvate avec, pyruvate qui est utilisé par la respiration aérobie (cycle de Krebs). On peut préciser que la libération du lactate par les astrocytes est couplée aux besoins des neurones par divers mécanismes. Ce qui veut dire que les astrocytes détectent que les neurones ont besoin d'énergie, et libèrent du lactate selon quand les besoins s'en font sentir. Le premier est que les neurones ont surtout besoin d'énergie, et donc de sucres, après avoir émis des potentiels d'action. Or, les astrocytes mesurent en permanence la quantité de neurotransmetteurs dans le milieu extra-cellulaire : plus il y en a, plus les neurones ont dépensés d'énergie pour les émettre et plus ils ont besoin d'énergie. Pour être plus précis, ils mesurent la quantité de glutamate, non de tous les neurotransmetteurs. Pour résumer, la liaison du glutamate sur les récepteurs astrocytaires va stimuler la libération du lactate dans le milieu extra-cellulaire, qui est ensuite assimilé par les neurones.
Évidemment, le métabolisme du glucose implique l'existence de transporteurs du glucose à la surface des astrocytes et des neurones. Dans l'ensemble des tissus, il existe quatorze transporteurs du glucose différents, qui n'ont pas la même composition chimique et sont de forme différente. Ils sont appelés GLUT-1, GLUT-2, GLUT-3, ..., GLUT-14, GLUT étant l'abréviation de ''GLUcose-Transporter''. Ils ne sont pas spécifiques du glucose, mais peuvent aussi servir de transporteurs à d'autres "sucres". Par exemple, le GLUT-5 sert de transporteur pour le glucose, mais aussi le fructose. D'autres servent de transporteur pour l'urate, le myoinositol et quelques autres molécules. Toujours est-il que l'on peut classer ces transporteurs du glucose en trois grandes catégories, mais seuls ceux de la première sont présents dans le cerveau, à savoir les récepteurs de GLUT-1 à GLUT-4 et le GLUT-14. Le transporteur GLUT1 est surtout présent dans la membrane des astrocytes, de même que le transporteur GLUT2. Le premier est présent dans tous les astrocytes cérébraux, alors que GLUT2 est présent dans certaines astrocytes, localisés dans des aires cérébrales bien précises (hypothalamus et tronc cérébral). Le transporteur GLUT3 est la chasse gardée des neurones.
===Le métabolisme du cholestérol===
Le cholestérol est un lipide intervenant dans de nombreuses fonctions métaboliques du corps, et joue notamment un rôle dans le fonctionnement du cerveau. Il s'agit en effet d'un des composants principaux de la myéline qui entoure les axones (la gaine de myéline). Sachant que plus de la moitié du cerveau est composée de substance blanche, donc de myéline, il n'est pas étonnant que le cerveau soit l'organe le plus riche de tous en cholestérol. Certaines études estiment que près de 20% du cholestérol total est localisé dans le cerveau. De plus, le cholestérol est un composant de la membrane des neurones et des cellules gliales. Plus les axones et dendrites d'un neurone se développent, plus ceux-ci doivent fabriquer de membrane cellulaire pour donner naissance aux axones et dendrites. Pour résumer, les besoins en cholestérol augmentent avec l'apparition de nouvelles synapses et dendrites.
La quantité de cholestérol cérébral reste approximativement constante au cours du temps. Ce n'est que lors de myélinisation du système nerveux que le cholestérol est fortement synthétisé. Lors de ces périodes, la formation des gaines de myéline augmente les besoins en cholestérol, qui ne peuvent être assouvis que par une synthèse importante. Les périodes de développement des synapses/neurones entrainent une forte consommation en cholestérol, les besoins étant alors fortement augmentés. En-dehors de ces périodes où les besoins sont augmentés, la synthèse de cholestérol cérébral est contrebalancée par sa consommation et son élimination. Le métabolisme cérébral du cholestérol est illustré dans le schéma ci-dessous, que je vous invite à regarder avant de lire ce qui va suivre.
[[File:Cerebrosterol.jpg|centre|vignette|upright=2|Métabolisme cérébral du cholestérol.]]
Le cholestérol sanguin n'est pas la source de cholestérol cérébral, vu que le cholestérol sanguin ne traverse pas la barrière hémato-encéphalique. Le cholestérol cérébral est synthétisé par les astrocytes, encore eux, sous la forme d'apolipoprotéines (ApoE). Ces apolipoprotéines sont synthétisées sous une forme immature, avant d'être finalisées par l'action de protéines membranaires de type ABCA. Elles sont ensuite absorbées par les neurones et sont transformées en cholestérol à l'intérieur des neurones, via l'action d'une enzyme.
Le cholestérol des neurones va ensuite être utilisé par le neurone. Il servira notamment dans la fabrication de la membrane du neurone. Rappelons que le neurone ne produit pas sa gaine de myéline, mais que ce sont les oligodendrocytes qui le font, ce qui fait que le choléstérol capté par les neurones ne sert pas à fabriquer la gaine de myéline. Mais l'utilisation principale du cholestérol intra-neuronal est de loin la formation de protéines appelées bêta-amyloides, présentes à la surface des cellules. On peut signaler que cette protéine est impliquée dans la maladie d'Alzheimer, bien que l'on sache mal comment... Rappelons que le cholestérol cérébral est aussi impliqué dans la fabrication de neurostéroïdes, des stéroïdes qui modulent l'action du GABA et du glutamate. Leur fabrication demande une conversion du cholestérol en prégnénolone, qui est elle-même transformée en divers stéroïdes, puis en neurostéroïdes. La conversion du cholestérol en prégnénolone est effectuée par l'enzyme CYP450scc et a lieu dans les mitochondries. Pour cela, le cholestérol est capté un transporteur qui capte le cholestérol cytoplasmique et le fait rentrer dans les mitochondries, à l'intérieur desquelles il s'effectue la transformation.
Il arrive que le cerveau produise un peu plus de cholestérol que demandé. Dans ce cas, le cholestérol produit en excès (non-utilisé par le cerveau) est soit stocké, soit éliminépar diverses voies métaboliques. Seul 1% du cholestérol cérébral est stocké dans les neurones et astrocytes. Il y prend alors la forme de gouttelettes de graisses de petite taille. Ce stockage demande que le cholestérol subisse des modifications chimiques, induites par une enzyme appelée cholesterol acyltransferase 1 (ACAT1/SOAT1).
Les neurones qui contiennent l'enzyme CYP46 peuvent dégrader le cholestérol en excès en une molécule appelée cérébrostérol. Appellation bien plus facile à retenir que le nom scientifique du cérébrostérol, à savoir : 24S-hydroxycholestérol. Ce cérébrostérol est émis dans le milieu-extracellulaire où il est soit éliminé, soit recyclé par les astrocytes. Le cérébrostérol peut traverser la barrière hémato-encéphalique, ce qui lui permet d'être éliminé dans la circulation sanguine. Plus de 2/3 du cérébrostérol est éliminé, le reste étant capté par les astrocytes et recyclé en ApoE.
===Le métabolisme des neurotransmetteurs===
Les astrocytes ne vont pas seulement fournir des nutriments aux neurones : ils vont aussi jouer un grand rôle dans le recyclage de certains neurotransmetteurs, comme le GABA, le glutamate, la glycine, et autres. Dans les faits, ces neurotransmetteurs sont produits à partir respectivement de sérine (glycine) et de glutamine (glutamate et GABA).
Prenons le cas de la sérine et de la glycine comme premier exemple. La sérine est produite dans les astrocytes à partir du glucose, avant d'être envoyé aux neurones. Les neurones vont alors synthétiser de la glycine à partir de cette sérine et l'utiliser comme neurotransmetteur. Après utilisation, la glycine est recapturée par les astrocytes et est alors dégradée en sérine. Et un nouveau cycle recommence : la sérine synthétisée peut alors être utilisée renvoyée aux neurones, et ainsi de suite.
Il en est de même pour le glutamate et le GABA. Ces deux neurotransmetteurs sont recapturés par les astrocytes, qui les dégradent en glutamine. Cette glutamine est alors renvoyée aux neurones, qui pourront re-synthétiser du glutamate et/ou du GABA et les utiliser comme neurotransmetteurs. Il faut noter que le glutamate peut aussi être synthétisé par les astrocytes et les neurones non pas à partir de glutamine, mais à partir d'une molécule produite par le cycle de Krebs (respiration aérobie).
[[File:Major metabolic fluxes in neuron-astrocyte coupling for resting conditions.png|centre|vignette|upright=3.0|Major metabolic fluxes (μmol/g tissue/min) in neuron-astrocyte coupling for resting conditions. The fluxes were calculated with the objective of maximizing the glutamate/glutamine/GABA cycle fluxes between the two cell types with subsequent minimization of Euclidean norm of fluxes, using the uptake rates given in Table 1 as constraints. Thick arrows show uptake and release reactions. Dashed arrows indicate shuttling of metabolites between the two cell types. Only key pathway fluxes are represented here for simplicity. The flux distributions for all the reactions listed in Additional File 1 are given in Additional File 4:Supplementary Table 3. (Description is figure caption from original article).]]
==Les vitamines et le cerveau==
Dans les sections précédentes du chapitre, nous avons surtout parlé de l'alimentation en énergie du cerveau. Mais il ne faut pas oublier que de nombreuses réactions chimiques permettent d'utiliser cette énergie et de la stocker. De plus, certaines réactions métaboliques permettent de synthétiser des neurotransmetteurs, de façonner la paroi des neurones, de contrôler les différences de concentrations en ions dans le neurone, et ainsi de suite. Ces réactions font naturellement appel à de nombreuses enzymes et autres protéines, la plupart étant synthétisées à partir des nutriments, mais aussi à partir de vitamines. Le cerveau est de loin un des plus gros consommateur de vitamines du corps.
D'ailleurs, il faut signaler que le cerveau est naturellement riche en vitamines, celui-ci ayant des réserves assez importantes. C'est notamment le cas pour les vitamines B, qui sont séquestrées dans le cerveau. Aussi, il n'est pas étonnant que leur teneur cérébrale soit largement supérieure à leur concentration sanguine. Par exemple, la concentration en vitamine B9 est près de 4 fois supérieure à la concentration sanguine, de même que la concentration en vitamine B5 et B8 est près de 50 fois plus importante dans le cerveau que dans le sang. Grâce à cela, le cerveau peut survivre à une déficience assez légère et/ou temporaire en vitamines. Cependant, cela n’empêche pas des déficiences en vitamines dans des situations extrêmes, comme un alcoolisme chronique ou un jeune prolongé. Ces déficiences peuvent avoir des conséquences neuropsychiatriques assez importantes, comme nous allons le voir maintenant. Dans ce qui va suivre, nous allons étudier les quatre vitamines les plus importantes pour le cerveau, à savoir les vitamines B1, B6, B9 et B12.
===Les vitamines B9 et B12===
Les vitamines B9 et B12 fonctionnent en tandem dans le corps, un manque de vitamine B12 pouvant être masqué par une complémentation de B9 et réciproquement. Ces cas sont cependant rares, vu que la carence en vitamine B12 ou B9 est exceptionnelle de nos jours. Elle ne touche que les végétariens qui ne se complémentent pas en vitamine B12 (et encore, après quelques mois ou années de ce régime sans complémentation) ou les personnes ayant des problèmes d'absorption des vitamines (anémie de Biermer, usage d'antiacides prolongé, problèmes intestinaux…). La récupération est souvent totale après complémentation en B12 ou B9, mais quelques patients peuvent avoir des séquelles s'ils ne sont pas pris en charge rapidement.
La vitamine B9, aussi appelée acide folique, a un métabolisme assez compliqué et est impliquée dans la réplication de l'ADN ou le métabolisme de certains acides aminés. La voie métabolique qui nous intéresse est cependant assez simple : l'acide folique est absorbé par les intestins, puis est transformé par le foie en acide lévoméfolique (5-méthyl-THF), la forme de vitamine B9 qui est absorbée par le cerveau. Ce métabolite peut traverser la barrière hémato-encéphalique en passant à travers un récepteur spécifique : le récepteur folate-alpha. Des déficits au niveau de ce récepteur peuvent entraîner une '''déficience cérébrale en folate''' dans laquelle seul le cerveau subit un déficit en B9, alors que le reste du corps a une alimentation vitaminique normale. Les symptômes sont une hypotonie, des crises épileptiques et un retard mental/psychomoteur. Sa cause principale est une maladie génétique très rare, liée à une mutation du gène FOLR1, le gène qui code pour le récepteur cérébral du folate. Une autre cause est la présence dans le sang d'anticorps qui visent ce récepteur, ce qui est une maladie auto-immune extrêmement rare.
La carence en vitamine B12 entraîne un '''syndrome neuro-anémique''', dont le nom traduit ses symptômes : une anémie et des symptômes neuropsychiatriques variés. Pour ce qui est des manifestations psychiatriques, les symptômes vont de symptômes mineurs (troubles du sommeil, dépression) à des symptômes plus graves pouvant aller jusqu’à la démence ou des crises psychotiques. Le symptôme neurologique le plus grave est une démyélinisation du système nerveux dont les symptômes sont semblables à la sclérose en plaque, qui peut toucher la moelle épinière, les nerfs et/ou le cerveau. L'atteinte des nerfs périphériques fait que ceux-ci perdent leur gaine de myéline, donnant des polynévrites assez marquées. L'atteinte médullaire touche essentiellement le faisceau pyramidal ainsi que les cordons antérieurs (système des colonnes dorsales). L’atteinte du faisceau pyramidal et des nerfs moteurs se traduit par l'apparition de troubles moteurs tels qu’une paralysie, une spasticité, un défaut de coordination motrice ou autre. L'atteinte des nerfs sensitifs et des colonnes dorsales médullaires est la cause de troubles sensitifs variés : douleurs dans les extrémités, picotements, sensations de décharges électriques, et cætera.
===La vitamine B6===
Nous avons vu il y a quelques chapitres que la vitamine B6 est primordiale dans la synthèse de la sérotonine et de la dopamine, du GABA et de la mélatonine. Pour rappel, la vitamine B6 est une coenzyme associée à plusieurs enzymes. Elle active l'enzyme ''dopa-décarboxylase'', qui dégrade le 5-HT est transformé en sérotonine et la L-DOPA en dopamine. C'est aussi la coenzyme de la GAD, qui dégrade le glutamate en GABA.
La vitamine B6 existe sous plusieurs formes différentes, mais seules trois d'entre elles entrent dans le cerveau : le pyridoxal, la pyridoxine et la pyridoxamine. Ce sont des formes inactives, qui demandent à être phosphatées pour devenir des formes actives de la vitamine B6, à savoir du phosphate de pyridoxal, du phosphate de pyridoxine ou du phosphate de pyridoxamine. Dans le cerveau, les formes inactives de B6 sont transformées en phosphate de pyridoxal par deux enzymes : la PK et la PNPO (''Pyridoxine 5'-phosphate oxidase''). Le phosphate de pyridoxal intervient ensuite dans la dégradation de la lysine et de la proline (deux acides aminés), via deux voies métaboliques différentes dans laquelle de nombreuses enzymes interviennent. Dans ce réseau métabolique, divers troubles peuvent survenir.
La plus fréquente, la ''carence en vitamine B6'' perturbe le fonctionnement global du cerveau. Une déficience en vitamine B6 entraine donc une baisse de production des neurotransmetteurs cités plus haut, qui touche préférentiellement la synthèse du GABA et de la sérotonine. La baisse de GABA induite se traduit par une hausse de l'activité électrique des neurones, avec deux conséquences principales : un mauvais sommeil et, plus rarement, des crises épileptiques. La baisse de sérotonine et de dopamine se manifeste quant à elle par un état anxio-dépressif et une hausse de l'impulsivité et de la nervosité. La déficience peut aussi se manifester dans le système nerveux périphérique par une inflammation généralisée des nerfs (une polynévrite). À l'inverse, une surdose de vitamine B6 n'entraine pas de symptômes clairs, tant que la surdose n'est pas prolongée. Cependant, une complémentation en B6 prolongée durant plusieurs mois peut engendrer des névrites totalement réversibles avec l'arrêt de la supplémentation.
L''''épilepsie sensible au phosphate de pyridoxal''' est une maladie génétique à transmission autosomique dominante. Elle est causée par une ''déficience en PNPO'', qui touche la synthèse du phosphate de pyrixodal à partir des formes inactives de B6. Avec cette maladie, l'enzyme PNPO n'est pas synthétisée, ce qui fait que la vitamine B6 n'agit plus du tout dans le cerveau. Cela entraine une carence massive en B6 active dans le cerveau. En conséquence, la synthèse des neurotransmetteurs est perturbée et le métabolisme neuronal des acides aminés est perturbé. Le résultat est une encéphalopathie épileptique néonatale, qui survient dès les premières heures de vie du bébé atteint. Elle ne réagit pas aux traitements habituels et n'est soignée que par un traitement à base de phosphate de pyridoxine/pyridoxal. D'autres symptômes peuvent survenir, comme une hypotonie, des troubles respiratoires, des mouvements anormaux, etc.
Similaire à la maladie précédente, l''''épilepsie pyridoxine-dépendante''' est un ensemble de maladies génétiques caractérisées par une encéphalopathie néonatale similaire à la maladie précédente. Les crises épileptiques sont de type myocloniques, avec un tracé typique sur l'EEG. La seule différence est que la maladie est sensible à un traitement à base de pyridoxine, une forme inactive de la B6, là où la précédente a besoin de la forme active de la B6. L'identification de cette maladie est souvent difficile à faire et le diagnostic se fait après administration de vitamine B6 ou un diagnostic génétique. Elle se manifeste très tôt : dans les premiers jours ou mois de vie pour les formes précoces, vers 1 à 3 ans pour les formes tardives. Ce syndrome touche entre une naissance sur 500 000 et une naissance sur 400 000. Ses causes sont nombreuses et de nombreux mutations génétiques peuvent la causer. Dans les grandes lignes, il existe deux sous-syndromes principaux : une forme précoce qui apparait dans les premières heures de vie, et une forme tardive qui apparait vers 1 à 3 ans.
* La forme précoce exprime une épilepsie prénatale dès 20 semaines de gestation. L'épilepsie se manifeste rapidement et toutes les formes de crises épileptiques peuvent survenir : myoclonies, absences, crises toniques, toniques-cloniques. Elle est souvent secondée par de l'irritabilité et une réaction excessive aux stimuli, ainsi que par des malformations cérébrales diverses (hydrocéphalie, malformations du corps calleux, ...). On peut observer des troubles métaboliques généraux, des troubles respiratoires, et bien d'autres symptômes divers. Sans traitements, la maladie entraine un retard mental et divers déficits neurologique et développementaux. La forme précoce la plus fréquente est causée par une mutation qui perturbe la synthèse de l'antiquitine, une enzyme de la voie de dégradation de la lysine.
* Par contraste, la forme tardive apparait avant 3 ans et répond initialement aux médicaments anti-épileptiques, avant que ces traitements cessent de faire effet. L'épilepsie est isolée, avec peu d'autres symptômes neurologiques et une absence de malformations cérébrales.
===La vitamine B1===
La vitamine B1, aussi appelée thiamine, est une vitamine du fameux cycle de Krebs (une série de réactions chimiques qui fournit de l'énergie aux cellules vivantes). Une carence en vitamine B1 entraine une pénurie d'énergie et d'ATP dans les cellules, qui se mettent à dysfonctionner et parfois à mourir. Le système nerveux étant un tissu très gourmand d'un point de vue métabolique, toute carence en vitamine B1 retenti en premier lieu sur le fonctionnement cérébral. Autant dire qu'elle est extrêmement importante pour le système nerveux, des carences pouvant être tout aussi graves que les carences en vitamines B12 ou B6. La carence en thiamine cause un stress métabolique aux neurones, qui cause des dysfonctionnements divers des potentiels d'action, mais qui peut aussi entrainer souvent la mort du neurone par apoptose. De plus, la carence va aussi modifier la recapture du glutamate, entrainant l'apparition d'une excitotoxicité (le glutamate excite les neurones à mort). Beaucoup de neurones dysfonctionnent, quand ils ne meurent rapidement, ce qui cause l'apparition d'une maladie : l''''encéphalopathie de Wernicke'''.
Ses symptômes sont souvent assez clairs, 80% des cas manifestant la triade : défaut de coordination des mouvements (ataxie), paralysie des yeux (ophtalmoplégie) et confusion (delirium). D'autres symptômes peuvent se faire jour, comme une profonde amnésie, une perte de la mémoire à court-terme, une psychose, ou des troubles végétatifs. L'origine de ces symptômes est liée à diverses atteintes du thalamus, de l'hypothalamus et du tronc cérébral. Par exemple, la paralysie oculaire provient d'une atteinte des noyaux des nerfs crâniens oculomoteurs. L"amnésie est quant à elle liée à une atteinte des corps mamillaires de l'hypothalamus. Une carence prolongée en B1 s'observe surtout chez les alcooliques, l'alcool stoppant l'absorption intestinale de la B1.
Chez certains patients, l'encéphalopathie de Wernicke évolue vers des troubles cognitifs permanents. La démence qui en résulte est appelée le '''syndrome de Korsakoff''', du nom de son découvreur. Son symptôme principal est une amnésie assez particulière. Nous allons devoir parler rapidement de l'amnésie, chose qui sera détaillé dans le chapitre sur la mémoire. L'amnésie du syndrome de Krosakoff est une perte de la mémoire à court-terme, avec une incapacité à mémoriser de nouveaux souvenirs ou de nouvelles connaissances. Les savoirs et souvenirs déjà acquis sont relativement préservés, bien que quelques déficits peuvent se voir. L'amnésie porte donc essentiellement sur les acquisitions qui suivent le traumatisme, cette forme d'amnésie étant appelée amnésie antérograde. L'amnésie qui touche les souvenirs d'avant l'apparition du syndrome est appelée amnésie rétrograde. L'amnésie du syndrome de Korsakoff est essentiellement antérograde, bien qu'une faible amnésie rétrograde soit possible. Si amnésie rétrograde il y a, celle-ci ne touche généralement que les souvenirs et savoirs récents, qui datent de quelques mois, années ou décennies avant le syndrome. Outre l'amnésie, divers troubles cognitifs peuvent se manifester, que ce soit des troubles du langage (aphasie), des troubles de la reconnaissance des objets et de la catégorisation (agnosie) ou des troubles intellectuels.
==Les minéraux et le cerveau==
Outre les vitamines, les mal-nommés « minéraux » sont d'une importance capitale pour le fonctionnement normal du cerveau. Les « minéraux » les plus importants sont de loin les ions Calcium, Potassium et Sodium, sans lesquels il ne peut y avoir de potentiels d'action. Leur rôle a déjà été abordé dans le chapitre sur potentiel d'action et nous n'en reparlerons pas ici. Les autres ions que nous allons aborder sont le magnésium, le cuivre, le fer et quelques autres. Vous remarquerez qu'il s'agit d'ions métalliques, à quelques exceptions près.
Tous les ions ont une concentration particulièrement bien régulée, le cerveau disposant de toute une machinerie chimique pour régler leur concentration. Il faut dire que ces ions deviennent toxiques quand ils sont en grandes quantités. C'est notamment le cas des ions métalliques, qui sont impliqués dans des réactions d’oxydoréduction qui créent des molécules « poisons » (des radicaux libres). En temps normal, les produits nocifs de ces réactions sont éliminés ou dégradés par la machinerie cellulaire du cerveau, mais ces processus sont dépassés quand la concentration en ions métalliques devient trop importante. De même, une déficience est nuisible pour les neurones, ces ions servant dans de nombreuses réactions chimiques importantes pour le fonctionnement des neurones.
La concentration en ions du cerveau est sévèrement contrôlée par divers mécanismes, dans lesquels la barrière hémato-encéphalique joue un rôle crucial. Elle protège le cerveau des variations de concentration ionique du sang. Par exemple, prenons le cas où la concentration en sodium du sang augmente, suite à la consommation d'un aliment particulier, d'une réponse hormonale, ou d'un supplément alimentaire. Le cerveau ne va pas être impacté par cette variation, et en sera isolé : la concentration ionique intracérébrale restera la même. C'est grâce à la barrière hémato-encéphalique, qui isole le cerveau des vaisseaux sanguins. L'absorption d'ions dans le cerveau, ou leur excrétion, est réalisée par des canaux ioniques et/ou des transporteurs, qui se trouvent à la surface de la barrière hématoencéphalique. Elles vont se lier aux minéraux ou aux vitamines à absorber et vont les rapatrier dans les astrocytes pour l'absorption. Une partie des ions est perdue dans le liquide céphalorachidien, et est emportée avec lui lors de son excrétion dans le sang.
===Le magnésium===
L'ion magnésium a aussi été vu dans le chapitre sur les récepteurs synaptiques et la plasticité synaptique. Nous avons vu que les récepteurs NMDA du glutamate sont bloqués par un ion magnésium, qui bouche le canal ionique. Du moins, c'est le cas tant que le potentiel du neurone reste inférieur à -60 mV. Si la tension dépasse ce seuil, l'ion Magnésium est éjecté et le canal ionique s'ouvre, excitant le neurone. On devine donc qu'un manque en magnésium se traduit par une hyper-excitabilité neuronale, alors qu'un excès de Magnésium entraine une hypo-excitabilité neuronale. Dans les deux cas, l'atteinte neuronale est diffuse, mais ciblée sur les neurones sensibles au glutamate.
* La déficience en magnésium entraine des symptômes neurologiques qui vont d'une simple asthénie et/ou une faiblesse musculaire, à des symptômes plus sérieux comme des convulsions et plus rarement un coma.
* Pour un excès en magnésium, les symptômes neurologiques sont frustres pour les faibles hypermagnésémies, mais bien plus lourds dans les cas graves. À faible dose en excès, le magnésium entraine une simple léthargie et/ou asthénie. Pour un excès assez fort, elle surtout des symptômes neuromusculaires. Il a, à hautes doses, un effet sur la jonction neuromusculaire similaire à celui du curare. En clair, elle cause une décontraction musculaire, une diminution des réflexes, des paralysies (notamment respiratoires). Dans certains cas extrêmes, on observe une dilatation pupillaire liée à un blocage du système nerveux sympathique.
===Le cuivre===
Le cuivre n'a pas de rôle physiologique clair, y compris au niveau du cerveau. Tout ce que l'on sait est que des excès ou des carences entrainent de nombreux symptômes au niveau du foie, du cerveau et d'autres tissus/organes. Le cuivre est absorbé par l'intestin, passe par le foie et atteint le cerveau. Divers transporteurs permettent au cuivre de traverser la barrière intestinale et la barrière hémato-encéphalique. Chez certaines personnes, ces transporteurs dysfonctionnent, ce qui fait que le cuivre ne rentre pas, ou au contraire s'accumule, dans les tissus. Les maladies liées à l'accumulation de cuivre dans le cerveau se manifestent (entre autres) par des symptômes neurologiques assez francs. Toutes touchent toutes les ganglions de la base, ce qui entraine des symptômes caractéristiques : parkinsonisme, mouvements involontaires anormaux (chorée, tics, dyskinésies, autres), troubles psychiatriques variés, atteinte cognitive.
<noinclude>[[File:Kayser-Fleischer ring.jpg|vignette|Anneau de Kayser-Fleischer, caractéristique de la maladie de Wilson.]]</noinclude>
La '''maladie de Wilson''' est une maladie (en fait, un ensemble de maladies génétiques) qui entraine une accumulation de cuivre dans l'organisme. Les organes les plus touchés sont le foie et le cerveau. Seuls une moitié des patients manifestent ces symptômes neuropsychiatriques. Les autres symptômes sont des problèmes de foie et aux yeux, parfois au cœur et aux reins. Les patients ont presque tous des troubles au foie, notamment une cirrhose, qui peuvent cependant passer inaperçus quand leurs symptômes sont frustres (ictère, fatigue, saignements, hypertension dans la veine porte, ...). Chez certains patients, on observe un anneau brun sur le pourtour des iris et des yeux, quasi-pathognomonique de la maladie. Au niveau cérébral, l'accumulation de cuivre est toxique pour les neurones, qui meurent progressivement. Les symptômes de la maladie traduisent une atteinte des ganglions de la base, qui sont les aires cérébrales les plus touchées par l'accumulation de cuivre.
* Les symptômes neurologiques sont des problèmes d'équilibre (ataxie), un parkinsonisme, des troubles du tonus musculaire (dystonie). Par contre, les troubles sensoriels sont très rares, au point que leur présence signifie pour le médecin qu'il vaut mieux chercher un autre diagnostic. Plus rarement, une épilepsie peut survenir, mais ce n'est pas un symptôme diagnostic.
* Les symptômes psychiatriques sont assez variés, mais sont essentiellement des troubles du comportement : désinhibition, irritabilité extrême, impulsivité, etc. On observe aussi fréquemment des troubles l'humeur (dépression), de l'anxiété. On observe plus rarement une psychose (syndrome regroupant hallucinations, délires, désorganisation de la pensée et troubles du comportement). Il arrive que les patients subissent des troubles cognitifs/intellectuels, qui miment une démence : pertes de mémoire, des troubles de l'idéation (pensée ralentie), et autres.
Si l'excès de cuivre dans le cerveau entraine des maladies, la déficience en cuivre aussi. La '''maladie de Menkes''' est causée par un dysfonctionnement des transporteurs du cuivre, ce qui fait que le cuivre ne pénètre plus dans les tissus. Elle entraine une déficience en cuivre, qui touche notamment le cerveau. Les neurones meurent rapidement, la neurodégénération touchant tout le cerveau. De plus, la myéline ne se forme pas autour des axones. Les patients montrent un manque de tonus musculaire (hypotonie), de l'épilepsie et divers symptômes neurologiques variés. On observe aussi un visage déformé, caractéristique de la maladie, une perte des cheveux, et quelques autres symptômes. Il s'agit d'une maladie grave qui apparait quelques mois après la naissance. Les enfants touchés ne dépassent pas l'âge de 3-5 ans.
===Le fer===
Le fer est utilisé par tous les tissus et toutes les cellules. L'utilisation la plus courante du fer est celle des globules rouges, dont l'hémoglobine est composée en partie de fer. C'est d'ailleurs au fer de l’hème que l’oxygène et le dioxyde de carbone se fixent sur l'hémoglobine. Mais l'utilisation la plus importante par les cellules est la fabrication d'énergie. Les cellules se servent du Fer pour fabriquer de l'énergie sous forme d'ATP. Pour être précis, il sert pour la respiration cellulaire, au niveau de la chaine de transport d'électrons des mitochondries (ce détail aura son importance pour l'ataxie de Friedrich). Et comme toutes les autres cellules, les neurones ont besoin de fer pour fabriquer de l'ATP et survivre.
Le fer est absorbé au niveau de l'intestin, grâce à l'action d'au moins un transporteur. Une fois absorbé, le fer est libéré dans le sang et se lie à une molécule de transport : la transferrine. La transferrine, transportée par le sang, relâche le fer au niveau des tissus qui en ont besoin. L'absorption du fer par l'intestin est assez mauvaise, surtout pour le fer végétal, mais est améliorée en présence de vitamine C. Pour compenser sa faible absorption, l'excrétion du fer est très faible, au point que le fer est quasiment séquestré dans l'organisme une fois absorbé. Mais cela n’empêche pas le corps de gérer au mieux les maigres réserves en fer, pour éviter toute pénurie. Il est parfois stocké au niveau du foie sous la forme de ferritine, une molécule de stockage du fer dans l'organisme. Ce système de stockage hépatique du fer permet à celui-ci de garder constante la teneur en fer du sang : il relâche du fer en cas de manque et en stocke en cas d'excès. De plus, le fer présent dans les cellules est systématiquement recyclé quand elles meurent. En effet, les macrophages, qui avalent et digèrent les cellules mortes, relâchent dans le sang le fer des cellules ainsi phagocytées. Tout cela fait que la carence martiale (la carence en fer) est rare avec une alimentation équilibrée, seules quelques maladies métaboliques ou génétique pouvant causer des manques de fer. L'excès en fer est aussi très rare, l'absorption et le stockage du Fer étant régulé par diverses hormones comme l'hepcidine.
Quoi qu’il en soit, le fer sanguin,lié à la transferrine finit naturellement par arriver au cerveau. Mais pour cela, il doit traverser la barrière hémato-encéphalique, qui régule son entrée dans le système nerveux. Le fer se détache de la transferrine et se fixe sur des transporteurs présents à la surface de la barrière hémato-encéphalique. Le fer traverse alors la barrière et se retrouve dans le cerveau (dans les astrocytes, puis dans les neurones). Précisons que le fer capté par ce transporteur est obligatoirement un ion <math>Fe^{2+}</math> et non les autres formes ioniques (<math>Fe^{3+}</math> ou <math>Fe^{+}</math>). Une fois entré dans le cerveau, le <math>Fe^{2+}</math> est immédiatement oxydé en <math>Fe^{3+}</math> par les astrocytes, avant de se lier à une transferrine intracérébrale. La transferrine se lie à divers récepteurs à la surface des oligodendrocytes et des neurones cérébraux : le fer se détache de la transferrine et rentre dans ces cellules. Le fer s'accumule préférentiellement dans les ganglions de la base et la substance noire (la ''substantia nigra pars compacta'', pour être précis).
Précisons que la transferrine cérébrale est plus efficace que la transferrine sanguine. Là où la transferrine sanguine est saturée à seulement 30% de sa capacité de transport maximale, la transferrine cérébrale atteint presque 100%. Il s'agit pourtant de la même molécule, mais les différences chimiques entre le sang et le tissu cérébral font que... Une conséquence est la transferrine ne peut pas servir de tampon en cas d'excès en fer cérébral, vu qu'elle est déjà chargée au maximum, ce qui rend les neurones très sensibles à une surcharge en fer.
Il arrive que le cerveau se retrouve soit en manque chronique de fer, soit qu'il est surchargé de fer au point où les teneurs atteintes sont toxiques. Les maladies responsables sont des maladies génétiques très rares, regroupées sous le nom de '''''Neurodegeneration with brain iron accumulation''''', abrévié NBIA. L'accumulation touche en priorité les ganglions de la base et le cervelet, à savoir les aires cérébrales les plus chargées en fer. Elle se traduit donc par une symptomatologie caractéristique d'une atteinte des ganglions de la base, à savoir un syndrome parkinsonien ou d'autres mouvements anormaux (chorée, dystonies), parfois couplés à un déclin intellectuel/cognitif. Les mécanismes de l'accumulation du fer dans le cerveau sont multiples et peuvent toucher des molécules très diverses. Les médecins ont identifié une petite dizaine de sous-types de NBIA, chacun se distinguant des autres par le gène muté et les mécanismes de l'accumulation du fer.
{|class="wikitable"
|-
!Type de NBIA
!Gène muté
|-
!Neurodégénération associée à la panthotenate-kinase (PKAN)
|PANK2
|-
!Neurodégénération associée à PLA2G6 (PLAN)
|PLA2G6
|-
!Neurodegeneration associée aux protéines de la membrane mitochondriale (MPAN)
|C19orf12
|-
!Neurodégénération associée à la protéine Beta-Propeller (BPAN)
|WDR45
|-
!FAHN
|FA2H
|-
!Syndrome de Kufor-Rakeb
|ATP13A2
|-
!Neuroferritinopathy
|FTL
|-
!Acéruloplasminémie
|CP
|-
!Syndrome de Woodhouse-Sakati
|DCAF17
|-
!CoPAN
|COASY
|}
: Pour ceux qui veulent en savoir plus sur les NBIA, je conseille la lecture de ce lien : [https://www.nbiadisorders.org/about-nbia/overview-of-nbia-disorders NBIA disorders association]
Mais il existe des maladies qui sont causées non pas par une accumulation de Fer dans le cerveau, mais par des dysfonctionnements plus compliqués à expliquer. L''''ataxie de Friedreich''' est une de ces maladies. Cette maladie est causée par une mutation qui perturbe la fabrication d'une enzyme, la frataxine. Le métabolisme intracellulaire du Fer est perturbé, et plus précisément le métabolisme mitochondrial. Le résultat est que les cellules des tissus fortement consommateurs d'ATP meurent rapidement, les neurones ne faisant pas exception. De plus, la gaine de myéline des neurones se dégrade et finit par disparaitre, sans être remplacée. La maladie démarre aux alentours de l'adolescence et se manifeste principalement par des problèmes d'équilibre et de coordination des mouvements (une ataxie, qui donne son nom à la maladie). Par la suite, on observe des troubles neurologiques moteurs et sensoriels, assez divers, d'apparition progressive. Certains sont causés par une atteinte du cervelet (troubles de l’articulation, des mouvements oculaires), par une atteinte faisceau pyramidal (paralysie, faiblesse musculaire), et/ou par une atteinte de la moelle épinière. Typiquement, le patient a du mal à marcher, perd facilement l'équilibre, a du mal à coordonner ses mouvements. Puis, le patient perd progressivement l'usage de ses bras et de ses jambes, il ressent une faiblesse musculaire envahissante. Parfois, il a du mal à articuler, ses mouvements oculaires sont erratiques. Quand sa moelle épinière et atteinte, sa sensibilité corporelle se dégrade, son sens du toucher et sa proprioception disparaissent. Beaucoup plus rarement, les nerfs optiques et auditifs se démyélinisent, causant perte d'acuité visuelle ou auditive, cécité, surdité, etc. Précisons pour finir que la maladie ne touche pas que le cerveau, mais cause aussi des atteintes cardiaques (très fréquentes), une scoliose ou d'autres déformations osseuses, et parfois un diabète (10-20% des patients).
Pour ceux qui veulent en savoir plus sur le métabolisme cérébral du fer, je conseille la lecture de cet article scientifique, en libre accès sur pubmed :
: [https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3935772/ Brain Iron Homeostasis: From Molecular Mechanisms To Clinical Significance and Therapeutic Opportunities].
<noinclude>
{{NavChapitre | book=Neurosciences
| prev=L'activité électrique du cerveau
| prevText=L'activité électrique du cerveau
| next=La pression intracrânienne
| nextText=La pression intracrânienne
}}{{autocat}}
</noinclude>
ikr855sj6lfv5nsik54hzldpwx2w5mp
Programmation PHP/Symfony/Doctrine
0
71848
683003
678452
2022-07-31T14:52:45Z
JackPotte
5426
/* Repository */
wikitext
text/x-wiki
<noinclude>{{PHP}}</noinclude>
== Installation ==
{{w|Doctrine (ORM)|Doctrine}} est l'ORM par défaut de Symfony. Il utilise {{w|PHP Data Objects|PDO}}. Son langage PHP traduit en SQL est appelé DQL, et utilise le principe de la [[Patrons de conception/Chaîne de responsabilité|chaîne de responsabilité]].
Installation en SF4<ref>https://symfony.com/doc/current/doctrine.html</ref> :
composer require symfony/orm-pack
composer require symfony/maker-bundle --dev
Renseigner l'accès au SGBD dans le .env :
DATABASE_URL="mysql://mon_login:mon_mot_de_passe@127.0.0.1:3306/ma_base"
Ensuite la base de données doit être créée avec :
php bin/console doctrine:database:create
{{todo|Différences avec :
* composer require doctrine/orm
* composer require doctrine/doctrine-bundle
}}
== Commandes Doctrine ==
Exemples de commandes :
<syntaxhighlight lang=bash>
php bin/console doctrine:query:sql "SELECT * FROM ma_table"
php bin/console doctrine:query:sql "$(< mon_fichier.sql)"
php bin/console doctrine:cache:clear-metadata
php bin/console doctrine:cache:clear-query
php bin/console doctrine:cache:clear-result
</syntaxhighlight>
== Entity ==
Une entité est une classe PHP associée à une table de la base de données. Elle est composée d'un attribut par colonne, et de leurs {{wt|getter}}s et {{wt|setter}}s respectifs. Pour en générer une :
php bin/console generate:doctrine:entity
Cette association est définie par des annotations Doctrine. Pour vérifier les annotations :
php bin/console doctrine:schema:validate
=== Exemple ===
Voici par exemple plusieurs types d'attributs :
<syntaxhighlight lang=php>
/**
* @ORM\Entity
* @ORM\Table(name="word")
*/
class Word
{
/**
* @ORM\Id
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @ORM\Column(name="spelling", type="string", length=255, nullable=false)
*/
private $spelling;
/**
* @ORM\Column(name="pronunciation", type="string", length=255, nullable=true)
*/
private $pronunciation;
/**
* @var Language
*
* @ORM\ManyToOne(targetEntity="Language", inversedBy="words")
* @ORM\JoinColumn(name="language_id", referencedColumnName="id")
*/
protected $language;
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="Homophon", mappedBy="word", cascade={"persist", "remove"})
*/
private $homophons;
public function __construct()
{
$this->homophons = new ArrayCollection();
}
public function setSpelling($p)
{
$this->spelling = $p;
return $this;
}
public function getSpelling()
{
return $this->spelling;
}
public function setPronunciation($p)
{
$this->pronunciation = $p;
return $this;
}
public function getPronunciation()
{
return $this->pronunciation;
}
public function setLanguage($l)
{
$this->language = $l;
return $this;
}
public function getLanguage()
{
return $this->language;
}
public function addHomophons($homophon)
{
if (!$this->homophons->contains($homophon)) {
$this->homophons->add($homophon);
$homophon->setWord($this);
}
return $this;
}
}
</syntaxhighlight>
On voit ici que la table "word" possède trois champs : "id" (clé primaire), "pronunciation" (chaine de caractère) et "language_id" (clé étrangère vers la table "language"). Doctrine stockera automatiquement l'id de la table "language" dans la troisième colonne quand on associera une entité "Language" à une "Word" avec <code>$word->setLanguage($language)</code>.
Le quatrième attribut permet juste de récupérer les enregistrements de la table "homophon" ayant une clé étrangère pointant vers "word".
Par ailleurs, en relation "OneToMany", c'est toujours l'entité ciblée par le "Many" qui définit la relation car elle contient la clé étrangère. Elle contient donc l'attribut "inversedBy=", alors que celle ciblée par "One" contient "mappedBy=". Elle contient aussi une deuxième annotation <code>@ORM\JoinColumn</code> mentionnant la clé étrangère en base de données (et pas en PHP).
{{attention|Dans les relations *toMany :
* il faut initialiser l'attribut dans le constructeur en <code>ArrayCollection()</code>.
* on peut avoir une méthode ->set(ArrayCollection) mais le plus souvent on utilise ->add(un seul élément)
* cette méthode add() doit idéalement contenir le set() de l'entité cible vers la courante (pour ne pas avoir à l'ajouter après chaque appel).
}}
NB : par défaut la longueur des types "string" est 255, on peut l'écraser ou la retirer avec <code>length=0</code><ref>https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/types.html#string</ref>. Le type "text" par contre n'a pas de limite.
{{remarque|1=L'annotation <code>@ORM\Table(name="word")</code> était facultative dans cet exemple, car le nom de la table peut être déduit du nom de l'entité.}}
L'annotation code>@ORM\Table</code> peut servir à définir des clés composites :
<syntaxhighlight lang=php>
* @ORM\Table(uniqueConstraints={
* @ORM\UniqueConstraint(name="spelling-pronunciation", columns={"spelling", "pronunciation"})
* })
</syntaxhighlight>
=== ArrayCollection ===
Cet objet itérable peut être converti en tableau avec ->toArray().
Pour le trier :
* Dans une entité : <syntaxhighlight lang=php inline>@ORM\OrderBy({"sort_order" = "ASC"})</syntaxhighlight>
* Sinon, instancier un critère :
<syntaxhighlight lang=php>
$sort = new Criteria(null, ['slug' => Criteria::ASC]);
$services = $maCollection->matching($sort);
</syntaxhighlight>
=== GeneratedValue ===
L'annotation ''GeneratedValue'' peut valoir "AUTO", "SEQUENCE", "TABLE", "IDENTITY", "NONE", "UUID", "CUSTOM".
{{attention|
Dans le cas du CUSTOM, un setId() réaliser avant le persist() sera écrasé par la génération d'un nouvel ID<ref>https://stackoverflow.com/questions/31594338/overriding-default-identifier-generation-strategy-has-no-effect-on-associations</ref>. Ce nouvel ID peut être écrasé à son tour, mais si l'entité possède des liens vers d'autres, c'est l'ID custom qui est utilisé comme clé (on a alors une erreur '' Integrity constraint violation'' puisque la clé générée n'est pas retenue). Pour éviter cela (par exemple dans des tests automatiques), il faut désactiver la génération à la volée :
<syntaxhighlight lang=php>
$metadata = $this->em->getClassMetadata(get_class($entity));
$metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE);
$metadata->setIdGenerator(new AssignedGenerator());
$entity->setId(static::TEST_ID);
</syntaxhighlight>
}}
=== Triggers ===
Les opérations en cascade sont définies sous deux formes d'annotations :
* <code>cascade={"persist", "remove"}</code> : au niveau ORM.
* <code>onDelete="CASCADE"</code> : au niveau base de données.
=== Concepts avancés ===
Pour utiliser une entité depuis une autre, alors qu'elles n'ont pas de liaison SQL, il existe l'interface ObjectManagerAware<ref>https://www.doctrine-project.org/api/persistence/1.0/Doctrine/Common/Persistence/ObjectManagerAware.html</ref>.
{{attention|Les types des attributs peuvent être quelque peu différents du SGBD<ref>https://www.doctrine-project.org/projects/doctrine-dbal/en/2.8/reference/types.html#mapping-matrix</ref>.}}
{{attention|Dans le cas de jointure vers une entité d'un autre espace de nom (par exemple une table d'une autre base), il faut indiquer son namespace complet dans l'annotation Doctrine (car elle ne tient pas compte des "use").}}
L'autojointure est appelé ''self-referencing association mapping'' par Doctrine<ref>https://www.doctrine-project.org/projects/doctrine-orm/en/2.8/reference/association-mapping.html#many-to-many-self-referencing</ref>).
=== Héritage ===
Une entité peut hériter d'une classe si celle-ci contient l'annotation suivante<ref>https://www.doctrine-project.org/projects/doctrine-orm/en/2.8/reference/inheritance-mapping.html</ref> :
<syntaxhighlight lang=php>
/** @MappedSuperclass */
class MyEntityParent
...
</syntaxhighlight>
== EntityManager ==
L'EntityManager (em) est l'objet qui synchronise les entités avec la base de données. Une application doit en avoir un par base de données, définis dans doctrine.yaml.
Il possède trois méthodes pour cela :
* persist() : prépare un INSERT SQL (rattache une entité à un entity manager).
* remove() : prépare un DELETE SQL.
* flush() : exécute le code SQL préparé.
Il existe aussi les méthodes suivantes :
* merge() : fusionne une entité absent de l'em dedans.
* refresh() : rafraichit l'entité PHP à partir de la base de données. C'est utile par exemple pour tenir compte des résultats d'un trigger ''after insert'' sur le SGBD. Exemple si le trigger ajoute une date de création après le persist, à écraser par <code>$createdDate</code> :
<syntaxhighlight lang=php>
$entity = new MyEntity();
$em->persist($entity);
$em->flush($entity);
// Trigger SGBD déclenché ici en parallèle
$em->refresh($entity);
$entity->setCreatedDate($createdDate);
$em->flush($entity);
</syntaxhighlight>
== Repository ==
On appelle "repository" les classes PHP qui contiennent les requêtes pour la base de données. Elles héritent de <code>Doctrine\ORM\EntityRepository</code>. Chacune permet de récupérer une entité associée en base de données. Les repo doivent donc être nommés ''NomDeLEntitéRepository''.
{{remarque|D'un point de vue architectural, avant d'instancier une nouvelle entité, on utilise généralement le repository pour savoir si son enregistrement existe en base ou si on doit le créer. Dans ce deuxième cas, la bonne pratique en {{wt|DDD}} est d'utiliser une Factory pour faire le new de l'entité, mais aussi pour les new de son agrégat si elle est le nœud racine. Par exemple une <code>CarFactory</code> fera un <code>new Car()</code> mais aussi créera et lui associera ses composants : <code>new Motor()</code>...}}
{{remarque|Il est possible de préciser le nom du repository d'une entité dans cette dernière :
<syntaxhighlight lang=php>
@ORM\Entity(repositoryClass="App\Repository\WordRepository")
</syntaxhighlight>
}}
=== SQL ===
==== Depuis Doctrine ====
<syntaxhighlight lang=php>
$rsm = new ResultSetMapping();
$this->_em->createNativeQuery('call my_stored_procedure', $rsm)->getResult();
</syntaxhighlight>
==== Sans Doctrine ====
Pour exécuter du SQL natif dans Symfony sans Doctrine, il faut créer un service de connexion, par exemple qui appelle PDO en utilisant les identifiants du .env, puis l'injecter dans les repos (dans chaque constructeur ou par une classe mère commune) :
<syntaxhighlight lang=php>
return $this->connection->fetchAll($sql);
</syntaxhighlight>
Depuis un repository Doctrine, tout ceci est déjà fait et les deux techniques sont disponibles :
1. Par l'attribut ''entity manager'' (''em'', ou ''_em'' pour les anciennes versions) hérité de la classe mère (le "use" permettra ici d'appeler des constantes pour paramétrer le résultat) :
<syntaxhighlight lang=php>
use Doctrine\DBAL\Connection;
...
$statement = $this->_em->getConnection()->executeQuery($sql);
$statement->fetchAll(\PDO::FETCH_KEY_PAIR);
$statement->closeCursor();
$this->_em->getConnection()->close();
return $statement;
</syntaxhighlight>
2. En injectant le service de connexion dans le constructeur (<code>'@database_connection'</code>) :
<syntaxhighlight lang=php>
use Doctrine\DBAL\Connection;
...
return $this->dbalConnection->fetchAll($sql);
</syntaxhighlight>
=== DQL ===
==== Méthodes magiques ====
Doctrine peut ensuite générer des requêtes SQL à partir du nom d'une méthode PHP appelée mais non écrite dans les repository (car ils en héritent). Ex :
* <code>$repo->find($id)</code> : cherche par la clé primaire définie dans l'entité.
* <code>$repo->findAll()</code> : récupère tous les enregistrements (sans clause <code>WHERE</code>).
* <code>$repo->findById($id)</code> : engendre automatiquement un <code>SELECT * WHERE id = $id</code> dans la table associée au repo.
* <code>$repo->findBy(['lastname' => $lastname, 'firstname' => $firstname])</code> engendre automatiquement un <code>SELECT * WHERE lastname = $lastname AND firstname = $firstname</code>.
* <code>$repo->findOneById($id)</code> : engendre automatiquement un <code>SELECT * WHERE id = $id LIMIT 1</code>.
* <code>$repo->findOneBy(['lastname' => $lastname, 'firstname' => $firstname])</code> : engendre automatiquement un <code>SELECT * WHERE lastname = $lastname AND firstname = $firstname LIMIT 1</code>.
{{attention|Lors des tests unitaires PHPUnit, il est probable qu'une erreur survienne sur l'inexistence de méthode "<code>findById</code>" pour le mock du repository (du fait qu'elle est magique). Il vaut donc mieux utiliser <code>findBy()</code>.
}}
Par ailleurs, on peut compléter les requêtes avec des paramètres supplémentaires. Ex :
<syntaxhighlight lang=php>
$repo->findBy(
['lastname' => $lastname], // where
['lastname' => 'ASC'], // order by
10, // limit
0, // offset
);
</syntaxhighlight>
==== QueryBuilder ====
Les méthodes des repos font appel <code>createQueryBuilder()</code> :
<syntaxhighlight lang=php>
public function findAllWithCalculus()
{
return $this->createQueryBuilder('mon_entité')
->where('id < 3')
->getQuery()
->getResult()
;
}
</syntaxhighlight>
Pour éviter le <code>SELECT *</code> dans cet exemple, on peut y ajouter la méthode <code>->select()</code>.
Pour afficher la requête SQL générée par le DQL, remplacer "->getResult()" par "->getQuery()".
===== Jointures =====
Quand deux entités ne sont pas reliées entre elles, on peut tout de même lancer une jointure en DQL :
<syntaxhighlight lang=php>
use Doctrine\ORM\Query\Expr\Join;
...
->join('AcmeCategoryBundle:Category', 'c', Expr\Join::WITH, 'v.id = c.id')
</syntaxhighlight>
===== Résultats =====
Doctrine renvoie des objets avec leurs méthodes (get pas set) avec getResult, ou un tableau avec getArrayResult, ou 2D avec getScalar.
* <code>getResult()</code> renvoie un objet ArrayCollection, pour rechercher dedans : <code>->contains()</code>.
===== Cache =====
Doctrine propose trois caches pour ses requêtes : celui de métadonnées, de requête et de résultats. Il faut d'abord définir les pools dans cache.yaml :
<syntaxhighlight lang=yaml>
framework:
cache:
pools:
doctrine.query_cache_pool:
adapter: cache.app
doctrine.result_cache_pool:
adapter: cache.app
doctrine.system_cache_pool:
adapter: cache.system
</syntaxhighlight>
Puis dans doctrine.yaml, les utiliser :
<syntaxhighlight lang=yaml>
doctrine:
orm:
metadata_cache_driver:
type: pool
pool: doctrine.system_cache_pool
query_cache_driver:
type: pool
pool: doctrine.system_cache_pool
result_cache_driver:
type: pool
pool: doctrine.result_cache_pool
</syntaxhighlight>
Enfin, définir le cache pour chaque query builder de chaque repository :
<syntaxhighlight lang=php>
$query
->useQueryCache($hasQueryCache)
->setQueryCacheLifetime($lifetime)
->enableResultCache($lifetime)
;
</syntaxhighlight>
==== Injection de dépendances ====
Les repository DQL deoivent ''ServiceEntityRepository'' :
<syntaxhighlight lang=php>
namespace App\Repository;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
class WordRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Word::class);
}
}
</syntaxhighlight>
Mais parfois on souhaite injecter un service dans un repository. Pour ce faire il y a plusieurs solutions :
* Étendre une classe qui étend ''ServiceEntityRepository''.
* Le redéfinir dans services.yaml.
* Utiliser un trait.
== Patrons à copier-coller ==
{{todo|
* Connexion à chaque SGBD Doctrine : MSSQL + GUI Linux, MariaDB, Webdis, MySQL
* Fonctions injectées avec $qb->expr()
* transactional()
}}
== Transactions ==
Pour garantir d'intégrité d'une transaction<ref>https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/transactions-and-concurrency.html#approach-2-explicitly</ref> :
<syntaxhighlight lang=php>
$connection = $this->entityManager->getConnection();
$connection->beginTransaction();
try {
$this->persist($myEntity);
$this->flush();
$connection->commit();
} catch (Exception $e) {
$connection->rollBack();
throw $e;
}
</syntaxhighlight>
== Évènements ==
Pour ajouter des triggers sur la mise à jour d'une table, ajouter l'annotation suivante dans son entité : <code>@ORM\HasLifecycleCallbacks()</code>. Voici les évènements utilisables ensuite :
=== prePersist ===
Se produit avant la persistance d'une entité.
=== postPersist ===
Se produit après la persistance d'une entité.
=== postFlush ===
Se produit après la sauvegarde d'une entité.
=== preFlush ===
Se produit avant la sauvegarde d'une entité.
{{attention|
* Dans cet évènement, les attributs en lazy loading de l'entité flushée s'ils sont appelés, sont issus de la base de données et donc correspondent aux données écrasées (et pas aux nouvelles flushées).
* Si on flush l'entité qui déclenche cet évènement il faut penser à un dispositif anti-boucle infinie (ex : variable d'instance).
* Dans le cas d'un new sur une entité, le persist ne suffit pas pour préparer sa sauvegarde. Il faut alors appeler <code>$unitOfWork->computeChangeSet($classMetadata, $entity)</code><ref>https://stackoverflow.com/questions/37831828/symfony-onflush-doctrine-listener</ref>.
}}
== Migrations ==
Pour modifier la base de données avec une commande, par exemple pour ajouter une colonne à une table ou modifier une procédure stockée, il existe une bibliothèque qui s'installe comme suit :
<syntaxhighlight lang=bash>
composer require doctrine/doctrine-migrations-bundle
</syntaxhighlight>
=== Création ===
Ensuite, on peut créer un squelette de "migration" :
<syntaxhighlight lang=bash>
php bin/console doctrine:migrations:generate
</syntaxhighlight>
Cette classe comporte une méthode "up()" qui réalise la modification en SQL ou DQL, et une "down()" censée faire l'inverse à des fins de rollback. De plus, on ne peut pas lancer deux fois de suite le "up()" sans un "down()" entre les deux (une table nommée <code>migration_versions</code> enregistre leur succession).
==== Exemple SQL ====
<syntaxhighlight lang=php>
final class Version20210719125146 extends AbstractMigration
{
public function up(Schema $schema) : void
{
$this->connection->fetchAll('SHOW DATABASES;');
$this->addSql(<<<SQL
CREATE TABLE ma_table(ma_colonne VARCHAR(255) NOT NULL);
SQL);
}
public function down(Schema $schema) : void
{
$this->addSql('DROP TABLE ma_table');
}
}
</syntaxhighlight>
==== Exemple DQL ====
<syntaxhighlight lang=php>
final class Version20210719125146 extends AbstractMigration
{
public function up(Schema $schema) : void
{
$table = $schema->createTable('ma_table');
$table->addColumn('ma_colonne', 'string');
}
public function down(Schema $schema) : void
{
$schema->dropTable('ma_table');
}
}
</syntaxhighlight>
==== Exemple PHP ====
<syntaxhighlight lang=php>
final class Version20210719125146 extends AbstractMigration implements ContainerAwareInterface
{
use ContainerAwareTrait;
public function up(Schema $schema) : void
{
$em = $this->container->get('doctrine.orm.entity_manager');
$monEntite = new MonEntite();
$em->persist($monEntite);
$em->flush();
}
}
</syntaxhighlight>
{{attention|Cette technique est déconseillée car les entités peuvent évoluer indépendamment de la migration. Mais elle peut s'avérer utile pour stocker des données dépendantes de l'environnement.}}
{{attention|<code>$this->containergetParameter()</code> ne fonctionne pas sur la valeur du paramètre quand elle doit être remplacée par une variable d'environnement. Par exemple <code>$_SERVER['SUBAPI_URI']</code> renvoie la variable d'environnement et <code>$this->containergetParameter('env(SUBAPI_URI)')</code> sa valeur par défaut (définie dans services.yaml).}}
=== Exécution ===
La commande suivante exécute toutes les migrations qui n'ont pas encore été lancées dans une base :
<syntaxhighlight lang=bash>
php bin/console doctrine:migrations:migrate
</syntaxhighlight>
Sinon, on peut les exécuter une par une selon le paramètre, avec la partie variable du nom du fichier de la classe (timestamp) :
<syntaxhighlight lang=bash>
php bin/console doctrine:migrations:execute --up 20170321095644
# ou si "migrations_paths" dans doctrine_migrations.yaml contient le namespace :
php bin/console doctrine:migrations:execute --up "App\Migrations\Version20170321095644"
# ou encore :
php bin/console doctrine:migrations:execute --up App\\Migrations\\Version20170321095644
</syntaxhighlight>
Pour le rollback :
<syntaxhighlight lang=bash>
php bin/console doctrine:migrations:execute --down 20170321095644
</syntaxhighlight>
Pour éviter que Doctrine pose des questions durant les migrations, ajouter <code>--no-interaction</code> (ou <code>-n</code>).
Pour voir le code SQL au lieu de l'exécuter : <code>--write-sql</code>.
==== Sur plusieurs bases de données ====
Pour exécuter sur plusieurs bases :
<syntaxhighlight lang=bash>
php bin/console doctrine:migrations:migrate --em=em1 --configuration=src/DoctrineMigrations/Base1/migrations.yaml
php bin/console doctrine:migrations:migrate --em=em2 --configuration=src/DoctrineMigrations/Base2/migrations.yaml
</syntaxhighlight>
Avec des migrations.yaml de type :
<syntaxhighlight lang=bash>
name: 'Doctrine Migrations base 1'
migrations_namespace: 'App\DoctrineMigrations\Base1'
migrations_directory: 'src/DoctrineMigrations/Base1'
table_name: 'migration_versions'
# custom_template: 'src/DoctrineMigrations/migration.tpl'
</syntaxhighlight>
=== Synchronisation ===
==== Vers le code ====
Pour créer la migration permettant de parvenir à la base de données actuelle :
<syntaxhighlight lang=bash>
php bin/console doctrine:migrations:diff
</syntaxhighlight>
==== Vers la base ====
À contrario, pour mettre à jour la BDD à partir des entités :
<syntaxhighlight lang=bash>
php bin/console doctrine:schema:update --force
</syntaxhighlight>
Pour le prévoir dans une migration :
<syntaxhighlight lang=bash>
php bin/console doctrine:schema:update --dump-sql
</syntaxhighlight>
== Fixtures ==
Il existe plusieurs bibliothèques pour créer des {{wt|fixture}}s, dont une de Doctrine<ref>https://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html</ref> :
<syntaxhighlight lang=bash>
composer require --dev orm-fixtures
</syntaxhighlight>
Pour charger les fixtures du code dans la base :
<syntaxhighlight lang=bash>
php bin/console doctrine:fixtures:load -n
</syntaxhighlight>
== Types de champ ==
La liste des types de champ Doctrine se trouve dans <code>Doctrine\DBAL\Types</code>. Toutefois, il est possible d'en créer des nouveaux pour définir des comportements particuliers quand on lit ou écrit en base.
Par exemple on peut étendre <code>JsonType</code> pour surcharger le type JSON par défaut afin de lui faire faire <code>json_encode($value, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)</code> automatiquement.
Ou encore, pour y stocker du code de configuration désérialisé dans une colonne<ref>https://speakerdeck.com/lyrixx/doctrine-objet-type-et-colonne-json?slide=23</ref>.
== Critique ==
# Il faut revenir en SQL si les performances sont limites (ex : un million de lignes avec jointures).
# Si les valeurs d'une table jointe n'apparaissent pas tout le temps, vérifier que le {{wt|lazy loading}} est contourné par au choix :
## Avant l'appel null, un <code>ObjetJoint->get()</code>.
## Dans l'entité, un <code>@ManyToOne(…, fetch="EAGER")</code>.
## Dans le repository, un <code>$this->queryBuilder->addSelect()</code>.
# Pas de HAVING MAX car il n'est pas connu lors de la construction dans la chaine de responsabilité
# Pas de FULL OUTER JOIN ou RIGHT JOIN (que "leftJoin" et "innerJoin")
# Attention aux <code>$this->queryBuilder->setMaxResults()</code> et <code>$this->queryBuilder->setFirstResult()</code> en cas de jointure, car elles ne conservent que le nombre d'enregistrements de la première table (à l'instar du <code>LIMIT</code> SQL). La solution consiste à ajouter un paginateur<ref>https://stackoverflow.com/questions/50199102/setmaxresults-does-not-works-fine-when-doctrine-query-has-join/50203939</ref>.
# L'annotation @ORM/JOIN TABLE crée une table vide et ne permet pas d'y placer des fixtures lors de sa construction.
# Pas de hints.
# Bug des <code>UNION ALL</code> quand on joint deux entités non liées dans le repo.
== Références ==
{{Références}}
2a0fl01yoaoldyh6639nvfjtzuh929a
Mathc initiation/Fichiers h : c74
0
77890
683025
682987
2022-08-01T09:55:01Z
Xhungab
23827
modification mineure
wikitext
text/x-wiki
[[Catégorie:Mathc initiation (livre)]]
:
[[Mathc initiation/a08| Sommaire]]
:
----{{Partie{{{type|}}}|Intégrer les fonctions élémentaires (Sympson)|fond={{{fond|}}<nowiki>}</nowiki>}}
:
En mathématiques, l'intégration est le fait de calculer une intégrale. C'est aussi une des deux branches du calcul infinitésimal, appelée également calcul intégral, l'autre étant le calcul différentiel..[https://fr.wikipedia.org/wiki/Int%C3%A9gration_(math%C3%A9matiques)]
:
<br>
Copier la bibliothèque dans votre répertoire de travail :
* [[Mathc initiation/Fichiers h : c74a1|x_hfile.h ............ Déclaration des fichiers h]]
* [[Mathc initiation/Fichiers h : c74a2|x_def.h .............. Les utilitaires]]
* [[Mathc initiation/Fichiers h : c74a3|x_symp.h ......... L'algorithme pour la méthode sympson]]
:
<br>
{| class="wikitable"
|+ Calculer les intégrales élémentaires
|+ ***
|+ Pour d'autres méthodes voir les applications ci-dessous :
|+ ***
|+ [[Mathc initiation/Fichiers h : c77be|sin(x)**2]] ..... [[Mathc initiation/Fichiers h : c77da|sin(x)sin(y)]] .....
[[Mathc initiation/Fichiers h : c77bd|cos(x)sin(x)]]
|+ [[Mathc initiation/Fichiers h : c78fx|sinh(x)**2]] ..... [[Mathc initiation/Fichiers h : c78gx|sinh(x)sinh(y)]] ..... [[Mathc initiation/Fichiers h : c78dd|cosh(x)sinh(x)]]
|+ [[Mathc initiation/Fichiers h : c77dg|cos(x)**m sin(x)**n]] ..... [[Mathc initiation/Fichiers h : c77di|sin(x)**m]]
|+ [[Mathc initiation/Fichiers h : c78dg|cosh(x)**m sinh(x)**n]] ..... [[Mathc initiation/Fichiers h : c77di|sinh(x)**m]]
|+ [[Mathc initiation/Fichiers h : c78dh|sqrt(a**2-x**2)]]
|-
! Fonctions trigonométriques : !! Fonctions trigonométriques hyperbolique:
|-
||
* .
* .
* [[Mathc initiation/Fichiers h : c74b01|fa.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c01|c1a.c : ..... "sec(x)";]]
* [[Mathc initiation/Fichiers h : c74b02|fb.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c02|c1b.c : ..... "csc(x)";]]
* [[Mathc initiation/Fichiers h : c74b03|fc.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c03|c1c.c : ..... "tan(x)";]]
* [[Mathc initiation/Fichiers h : c74b04|fd.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c04|c1d.c : ..... "cot(x)";]]
* [[Mathc initiation/Fichiers h : c71b03|fc.h ]] : <...............> [[Mathc initiation/Fichiers c : c71c03|c1c.c :
..... "asin(x)";]]
* [[Mathc initiation/Fichiers h : c71b04|fd.h ]] : <...............> [[Mathc initiation/Fichiers c : c71c04|c1d.c :
..... "acos(x)";]]
* [[Mathc initiation/Fichiers h : c71b02|fb.h ]] : <...............> [[Mathc initiation/Fichiers c : c71c02|c1b.c :
..... "atan(x)";]]
* [[Mathc initiation/Fichiers h : c79a|fa.h ]] : <...............> [[Mathc initiation/Fichiers c : c79a|c1a.c :
..... "sec(x)**2";]]
* [[Mathc initiation/Fichiers h : c79b|fb.h ]] : <...............> [[Mathc initiation/Fichiers c : c79b|c1b.c :
..... "csc(x)**2";]]
* [[Mathc initiation/Fichiers h : c79c|fc.h ]] : <...............> [[Mathc initiation/Fichiers c : c79c|c1c.c :
..... "sec(x)tan(x)";]]
* [[Mathc initiation/Fichiers h : c79d|fd.h ]] : <...............> [[Mathc initiation/Fichiers c : c79d|c1d.c :
..... "csc(x)cot(x)";]]
* [[Mathc initiation/Fichiers h : c79i|fi.h ]] : <................> [[Mathc initiation/Fichiers c : c79i|c1i.c :
...... "1/sqrt(1-x**2)";]]
* [[Mathc initiation/Fichiers h : c79j|fj.h ]] : <................> [[Mathc initiation/Fichiers c : c79j|c1j.c :
...... "1/(x**2+1)";]]
* [[Mathc initiation/Fichiers h : c79k|fk.h ]] : <...............> [[Mathc initiation/Fichiers c : c79k|c1k.c :
..... "1/(x sqrt(x**2-1))";]]
||
* [[Mathc initiation/Fichiers h : c74b07|fg.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c07|c1g.c : ..... "sinh(x)";]]
* [[Mathc initiation/Fichiers h : c74b08|fh.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c08|c1h.c : ..... "cosh(x)";]]
* [[Mathc initiation/Fichiers h : c74b09|fi.h ]] : <................> [[Mathc initiation/Fichiers c : c74c09|c1i.c : ...... "sech(x)";]]
* [[Mathc initiation/Fichiers h : c74b10|fj.h ]] : <................> [[Mathc initiation/Fichiers c : c74c10|c1j.c : ...... "csch(x)";]]
* [[Mathc initiation/Fichiers h : c74b05|fe.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c05|c1e.c : ..... "tanh(x)";]]
* [[Mathc initiation/Fichiers h : c74b06|ff.h ]] : <................> [[Mathc initiation/Fichiers c : c74c06|c1f.c : ...... "coth(x)";]]
* [[Mathc initiation/Fichiers h : c71b06|fe.h ]] <................> [[Mathc initiation/Fichiers c : c71c06|c1e.c : ...... "asinh(x)";]]
* [[Mathc initiation/Fichiers h : c71b07|ff.h ]] <.................> [[Mathc initiation/Fichiers c : c71c07|c1f.c : ....... "acosh(x)";]]
* [[Mathc initiation/Fichiers h : c71b08|fg.h ]] <................> [[Mathc initiation/Fichiers c : c71c08|c1g.c : ...... "atanh(x)";]]
* [[Mathc initiation/Fichiers h : c79e|fe.h ]] : <...............> [[Mathc initiation/Fichiers c : c79e|c1e.c :
..... "sech(x)**2";]]
* [[Mathc initiation/Fichiers h : c79f|ff.h ]] : <................> [[Mathc initiation/Fichiers c : c79f|c1f.c :
...... "csch(x)**2";]]
* [[Mathc initiation/Fichiers h : c79g|fg.h ]] : <...............> [[Mathc initiation/Fichiers c : c79g|c1g.c :
..... "sech(x)*tanh(x)";]]
* [[Mathc initiation/Fichiers h : c79h|fh.h ]] : <...............> [[Mathc initiation/Fichiers c : c79h|c1h.c :
..... "csch(x)*coth(x)";]]
* [[Mathc initiation/Fichiers h : c79l|fl.h ]] : <................> [[Mathc initiation/Fichiers c : c79l|c1l.c :
...... "1/sqrt(1+x**2)";]]
* [[Mathc initiation/Fichiers h : c79m|fm.h ]] : <..............> [[Mathc initiation/Fichiers c : c79m|c1m.c :
.... "1/(1-x**2)";]]
* [[Mathc initiation/Fichiers h : c79n|fn.h ]] : <...............> [[Mathc initiation/Fichiers c : c79n|c1n.c :
..... "-1/(x sqrt(1-x**2))";]]
|}
{| class="wikitable"
|+ Pour d'autres méthodes voir les applications ci-dessous :
|+ ***
|+ [[Mathc initiation/Fichiers c : c71c05|ln(x)**n]]
|-
! Fonctions exponentielles : !! Fonctions logarithmes :
|-
||
*.
||
* [[Mathc initiation/Fichiers h : c71b01|fa.h ]] <................> [[Mathc initiation/Fichiers c : c71c01|c1a.c : ...... "ln(x)";]]
|}
<br>
----
{{AutoCat}}
p49hg8dg1aok86fs8wu15pchq0pg563
683026
683025
2022-08-01T09:55:53Z
Xhungab
23827
modification mineure
wikitext
text/x-wiki
[[Catégorie:Mathc initiation (livre)]]
:
[[Mathc initiation/a08| Sommaire]]
:
----{{Partie{{{type|}}}|Intégrer les fonctions élémentaires (Sympson)|fond={{{fond|}}<nowiki>}</nowiki>}}
:
En mathématiques, l'intégration est le fait de calculer une intégrale. C'est aussi une des deux branches du calcul infinitésimal, appelée également calcul intégral, l'autre étant le calcul différentiel..[https://fr.wikipedia.org/wiki/Int%C3%A9gration_(math%C3%A9matiques)]
:
<br>
Copier la bibliothèque dans votre répertoire de travail :
* [[Mathc initiation/Fichiers h : c74a1|x_hfile.h ............ Déclaration des fichiers h]]
* [[Mathc initiation/Fichiers h : c74a2|x_def.h .............. Les utilitaires]]
* [[Mathc initiation/Fichiers h : c74a3|x_symp.h ......... L'algorithme pour la méthode sympson]]
:
<br>
{| class="wikitable"
|+ Calculer les intégrales élémentaires
|+ ***
|+ Pour d'autres méthodes voir les applications ci-dessous :
|+ ***
|+ [[Mathc initiation/Fichiers h : c77be|sin(x)**2]] ..... [[Mathc initiation/Fichiers h : c77da|sin(x)sin(y)]] .....
[[Mathc initiation/Fichiers h : c77bd|cos(x)sin(x)]]
|+ [[Mathc initiation/Fichiers h : c78fx|sinh(x)**2]] ..... [[Mathc initiation/Fichiers h : c78gx|sinh(x)sinh(y)]] ..... [[Mathc initiation/Fichiers h : c78dd|cosh(x)sinh(x)]]
|+ [[Mathc initiation/Fichiers h : c77dg|cos(x)**m sin(x)**n]] ..... [[Mathc initiation/Fichiers h : c77di|sin(x)**m]]
|+ [[Mathc initiation/Fichiers h : c78dg|cosh(x)**m sinh(x)**n]] ..... [[Mathc initiation/Fichiers h : c78di|sinh(x)**m]]
|+ [[Mathc initiation/Fichiers h : c77dh|sqrt(a**2-x**2)]]
|-
! Fonctions trigonométriques : !! Fonctions trigonométriques hyperbolique:
|-
||
* .
* .
* [[Mathc initiation/Fichiers h : c74b01|fa.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c01|c1a.c : ..... "sec(x)";]]
* [[Mathc initiation/Fichiers h : c74b02|fb.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c02|c1b.c : ..... "csc(x)";]]
* [[Mathc initiation/Fichiers h : c74b03|fc.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c03|c1c.c : ..... "tan(x)";]]
* [[Mathc initiation/Fichiers h : c74b04|fd.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c04|c1d.c : ..... "cot(x)";]]
* [[Mathc initiation/Fichiers h : c71b03|fc.h ]] : <...............> [[Mathc initiation/Fichiers c : c71c03|c1c.c :
..... "asin(x)";]]
* [[Mathc initiation/Fichiers h : c71b04|fd.h ]] : <...............> [[Mathc initiation/Fichiers c : c71c04|c1d.c :
..... "acos(x)";]]
* [[Mathc initiation/Fichiers h : c71b02|fb.h ]] : <...............> [[Mathc initiation/Fichiers c : c71c02|c1b.c :
..... "atan(x)";]]
* [[Mathc initiation/Fichiers h : c79a|fa.h ]] : <...............> [[Mathc initiation/Fichiers c : c79a|c1a.c :
..... "sec(x)**2";]]
* [[Mathc initiation/Fichiers h : c79b|fb.h ]] : <...............> [[Mathc initiation/Fichiers c : c79b|c1b.c :
..... "csc(x)**2";]]
* [[Mathc initiation/Fichiers h : c79c|fc.h ]] : <...............> [[Mathc initiation/Fichiers c : c79c|c1c.c :
..... "sec(x)tan(x)";]]
* [[Mathc initiation/Fichiers h : c79d|fd.h ]] : <...............> [[Mathc initiation/Fichiers c : c79d|c1d.c :
..... "csc(x)cot(x)";]]
* [[Mathc initiation/Fichiers h : c79i|fi.h ]] : <................> [[Mathc initiation/Fichiers c : c79i|c1i.c :
...... "1/sqrt(1-x**2)";]]
* [[Mathc initiation/Fichiers h : c79j|fj.h ]] : <................> [[Mathc initiation/Fichiers c : c79j|c1j.c :
...... "1/(x**2+1)";]]
* [[Mathc initiation/Fichiers h : c79k|fk.h ]] : <...............> [[Mathc initiation/Fichiers c : c79k|c1k.c :
..... "1/(x sqrt(x**2-1))";]]
||
* [[Mathc initiation/Fichiers h : c74b07|fg.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c07|c1g.c : ..... "sinh(x)";]]
* [[Mathc initiation/Fichiers h : c74b08|fh.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c08|c1h.c : ..... "cosh(x)";]]
* [[Mathc initiation/Fichiers h : c74b09|fi.h ]] : <................> [[Mathc initiation/Fichiers c : c74c09|c1i.c : ...... "sech(x)";]]
* [[Mathc initiation/Fichiers h : c74b10|fj.h ]] : <................> [[Mathc initiation/Fichiers c : c74c10|c1j.c : ...... "csch(x)";]]
* [[Mathc initiation/Fichiers h : c74b05|fe.h ]] : <...............> [[Mathc initiation/Fichiers c : c74c05|c1e.c : ..... "tanh(x)";]]
* [[Mathc initiation/Fichiers h : c74b06|ff.h ]] : <................> [[Mathc initiation/Fichiers c : c74c06|c1f.c : ...... "coth(x)";]]
* [[Mathc initiation/Fichiers h : c71b06|fe.h ]] <................> [[Mathc initiation/Fichiers c : c71c06|c1e.c : ...... "asinh(x)";]]
* [[Mathc initiation/Fichiers h : c71b07|ff.h ]] <.................> [[Mathc initiation/Fichiers c : c71c07|c1f.c : ....... "acosh(x)";]]
* [[Mathc initiation/Fichiers h : c71b08|fg.h ]] <................> [[Mathc initiation/Fichiers c : c71c08|c1g.c : ...... "atanh(x)";]]
* [[Mathc initiation/Fichiers h : c79e|fe.h ]] : <...............> [[Mathc initiation/Fichiers c : c79e|c1e.c :
..... "sech(x)**2";]]
* [[Mathc initiation/Fichiers h : c79f|ff.h ]] : <................> [[Mathc initiation/Fichiers c : c79f|c1f.c :
...... "csch(x)**2";]]
* [[Mathc initiation/Fichiers h : c79g|fg.h ]] : <...............> [[Mathc initiation/Fichiers c : c79g|c1g.c :
..... "sech(x)*tanh(x)";]]
* [[Mathc initiation/Fichiers h : c79h|fh.h ]] : <...............> [[Mathc initiation/Fichiers c : c79h|c1h.c :
..... "csch(x)*coth(x)";]]
* [[Mathc initiation/Fichiers h : c79l|fl.h ]] : <................> [[Mathc initiation/Fichiers c : c79l|c1l.c :
...... "1/sqrt(1+x**2)";]]
* [[Mathc initiation/Fichiers h : c79m|fm.h ]] : <..............> [[Mathc initiation/Fichiers c : c79m|c1m.c :
.... "1/(1-x**2)";]]
* [[Mathc initiation/Fichiers h : c79n|fn.h ]] : <...............> [[Mathc initiation/Fichiers c : c79n|c1n.c :
..... "-1/(x sqrt(1-x**2))";]]
|}
{| class="wikitable"
|+ Pour d'autres méthodes voir les applications ci-dessous :
|+ ***
|+ [[Mathc initiation/Fichiers c : c71c05|ln(x)**n]]
|-
! Fonctions exponentielles : !! Fonctions logarithmes :
|-
||
*.
||
* [[Mathc initiation/Fichiers h : c71b01|fa.h ]] <................> [[Mathc initiation/Fichiers c : c71c01|c1a.c : ...... "ln(x)";]]
|}
<br>
----
{{AutoCat}}
r0jcz4xco6yh4lkat5yy6i0cuoyifx6
Mathc initiation/a78
0
78505
683015
682932
2022-08-01T07:40:44Z
Xhungab
23827
modification mineure
wikitext
text/x-wiki
__NOTOC__
[[Catégorie:Mathc initiation (livre)]]
:
:
[[Mathc initiation/a79| Sommaire]]
----{{Partie{{{type|}}}|La trigonométrie hyperbolique|fond={{{fond|}}<nowiki>}</nowiki>}}
:
En mathématiques, on appelle fonctions hyperboliques les fonctions cosinus hyperbolique, sinus hyperbolique et tangente hyperbolique... [https://fr.wikipedia.org/wiki/Fonction_hyperbolique Wikipédia]
:
<br>
Copier la bibliothèque dans votre répertoire de travail :
* [[Mathc initiation/Fichiers h : c78a1|x_hfile.h ............. Déclaration des fichiers h]]
* [[Mathc initiation/Fichiers h : c78a2|x_def.h .............. Déclaration des utilitaires]]
* [[Mathc initiation/Fichiers h : c78a5|Liste des équations étudiées]]
** [[Mathc initiation/Fichiers h : c78a3|Liste des fonctions trigonométriques hyperbolique du c]]
* [[Mathc initiation/Fichiers h : c78de|Les formes : ]]
** '''cosh(x)**2-sinh(x)**2''' = 1
* [[Mathc initiation/Fichiers h : c78bs|Les formes : ]]
** '''sinh(x+y)''' = cosh(x) sinh(y) + sinh(x) cosh(y)
* [[Mathc initiation/Fichiers h : c78dd|Les formes : ]]
** '''sinh(2x)''' = 2 cosh(x) sinh(x)
* [[Mathc initiation/Fichiers h : c78fx|Les formes :]]
** '''sinh(x)**2''' = 1/2 cosh(2x) + 1/2
* [[Mathc initiation/Fichiers h : c78gx|Les formes :]]
** '''sinh(x)sinh(y)''' = 1/2 [cosh(x+y) - cosh(x-y)]
* [[Mathc initiation/Fichiers h : c78hx|Les formes : ]]
** '''sinh(x)+sinh(y)''' = 2 sinh( (x+y)/2 ) cosh( (x-y)/2 )
* [[Mathc initiation/Fichiers h : c78dc|Les formes : ]]
** '''sinh(acosh(x))''' = sqrt(x**2 -1)
* [[Mathc initiation/Fichiers h : c78dg|Application : ]]
** '''cosh(x)**m sinh(x)**n'''
* [[Mathc initiation/Fichiers h : c78di|Application : ]]
** '''sinh(x)**n'''
:
----
{{AutoCat}}
5yogak4urozek9y5pzy0wgs0ayxtvj8
Mathc initiation/Fichiers h : c77di
0
78782
683004
682988
2022-07-31T21:04:06Z
Xhungab
23827
modification mineure
wikitext
text/x-wiki
[[Catégorie:Mathc initiation (livre)]]
:
:
[[Mathc initiation/a77| Sommaire]] .. ou ... [[Mathc initiation/Fichiers h : c74|Les intégrales]]
:
:
----{{Partie{{{type|}}}|Application sin(x)**2|fond={{{fond|}}<nowiki>}</nowiki>}}
:
Nous allons voir ici quelques applications des identités trigonométriques vue précédemment. Revenez sur ces pages après avoir étudier les intégrales.
:
<br>
* [[Mathc initiation/Fichiers c : c77di1|Étude de : <........> sin(x)**n]]
* [[Mathc initiation/Fichiers c : c77di2|Étude de : <........> cos(x)**n]]
* [[Mathc initiation/Fichiers c : c77di3|Étude de : <........> sec(x)**n]]
----
{{AutoCat}}
e35jfjszkd4x30ngj1oqnslo2j81g2f
683006
683004
2022-07-31T21:28:39Z
Xhungab
23827
modification mineure
wikitext
text/x-wiki
[[Catégorie:Mathc initiation (livre)]]
:
:
[[Mathc initiation/a77| Sommaire]] .. ou ... [[Mathc initiation/Fichiers h : c74|Les intégrales]]
:
:
----{{Partie{{{type|}}}|Application sin(x)**2|fond={{{fond|}}<nowiki>}</nowiki>}}
:
Nous allons voir ici quelques applications des identités trigonométriques vue précédemment. Revenez sur ces pages après avoir étudier les intégrales.
:
<br>
* [[Mathc initiation/Fichiers c : c77di1|Étude de : <........> sin(x)**n]]
* [[Mathc initiation/Fichiers c : c77di2|Étude de : <........> cos(x)**n]]
* [[Mathc initiation/Fichiers c : c77di3|Étude de : <........> sec(x)**n]]
* [[Mathc initiation/Fichiers c : c77di4|Étude de : <........> csc(x)**n]]
----
{{AutoCat}}
dobunzwpi3sazpyi7avtlh3bc6yoqaa
683008
683006
2022-07-31T22:37:35Z
Xhungab
23827
modification mineure
wikitext
text/x-wiki
[[Catégorie:Mathc initiation (livre)]]
:
:
[[Mathc initiation/a77| Sommaire]] .. ou ... [[Mathc initiation/Fichiers h : c74|Les intégrales]]
:
:
----{{Partie{{{type|}}}|Application sin(x)**2|fond={{{fond|}}<nowiki>}</nowiki>}}
:
Nous allons voir ici quelques applications des identités trigonométriques vue précédemment. Revenez sur ces pages après avoir étudier les intégrales.
:
<br>
* [[Mathc initiation/Fichiers c : c77di1|Étude de : <........> sin(x)**n]]
* [[Mathc initiation/Fichiers c : c77di2|Étude de : <........> cos(x)**n]]
* [[Mathc initiation/Fichiers c : c77di3|Étude de : <........> sec(x)**n]]
* [[Mathc initiation/Fichiers c : c77di4|Étude de : <........> csc(x)**n]]
* [[Mathc initiation/Fichiers c : c77di5|Étude de : <........> tan(x)**n]]
----
{{AutoCat}}
parlzqnyvf5i50246npzcoy9mflm25s
683010
683008
2022-07-31T22:49:14Z
Xhungab
23827
modification mineure
wikitext
text/x-wiki
[[Catégorie:Mathc initiation (livre)]]
:
:
[[Mathc initiation/a77| Sommaire]] .. ou ... [[Mathc initiation/Fichiers h : c74|Les intégrales]]
:
:
----{{Partie{{{type|}}}|Application sin(x)**2|fond={{{fond|}}<nowiki>}</nowiki>}}
:
Nous allons voir ici quelques applications des identités trigonométriques vue précédemment. Revenez sur ces pages après avoir étudier les intégrales.
:
<br>
* [[Mathc initiation/Fichiers c : c77di1|Étude de : <........> sin(x)**n]]
* [[Mathc initiation/Fichiers c : c77di2|Étude de : <........> cos(x)**n]]
* [[Mathc initiation/Fichiers c : c77di3|Étude de : <........> sec(x)**n]]
* [[Mathc initiation/Fichiers c : c77di4|Étude de : <........> csc(x)**n]]
* [[Mathc initiation/Fichiers c : c77di5|Étude de : <........> tan(x)**n]]
* [[Mathc initiation/Fichiers c : c77di5|Étude de : <........> cot(x)**n]]
----
{{AutoCat}}
tkwguvj6d8osjr5xtumdsew49vd7cqh
683011
683010
2022-07-31T22:49:29Z
Xhungab
23827
modification mineure
wikitext
text/x-wiki
[[Catégorie:Mathc initiation (livre)]]
:
:
[[Mathc initiation/a77| Sommaire]] .. ou ... [[Mathc initiation/Fichiers h : c74|Les intégrales]]
:
:
----{{Partie{{{type|}}}|Application sin(x)**2|fond={{{fond|}}<nowiki>}</nowiki>}}
:
Nous allons voir ici quelques applications des identités trigonométriques vue précédemment. Revenez sur ces pages après avoir étudier les intégrales.
:
<br>
* [[Mathc initiation/Fichiers c : c77di1|Étude de : <........> sin(x)**n]]
* [[Mathc initiation/Fichiers c : c77di2|Étude de : <........> cos(x)**n]]
* [[Mathc initiation/Fichiers c : c77di3|Étude de : <........> sec(x)**n]]
* [[Mathc initiation/Fichiers c : c77di4|Étude de : <........> csc(x)**n]]
* [[Mathc initiation/Fichiers c : c77di5|Étude de : <........> tan(x)**n]]
* [[Mathc initiation/Fichiers c : c77di6|Étude de : <........> cot(x)**n]]
----
{{AutoCat}}
j5ns5c4jtry69sqbsq1d4ob874jfinv
Discussion utilisateur:196.70.124.200
3
78785
683001
2022-07-31T13:59:40Z
JackPotte
5426
Page créée avec « {{subst:Test 1}}~~~~ »
wikitext
text/x-wiki
{|class="WSerieH" class="plainlinks" id="vandale" align="center" style="width:100%;margin-bottom:2em;border:1px solid #8888aa;border-right-width:2px;border-bottom-width:2px;background-color:#f7f8ff;padding:5px;text-align:justify"
|-
|[[Image:Nuvola apps important.svg|64px|Arrêtez de vandaliser Wikilivres !]]
|Bonjour {{BASEPAGENAME}},
Vous avez découvert combien il est facile de modifier Wikilivres. Votre modification a été '''annulée''' en raison de son caractère non constructif. Merci de ne pas réitérer ce genre de contribution. Visitez la [[Aide:Accueil|page d’aide]] afin d’en apprendre plus ou le [[Wikilivres:bac à sable|bac à sable]] afin de faire des tests.
|}
[[Catégorie:Vandales avertis]][[Utilisateur:JackPotte|JackPotte]] ([[Discussion utilisateur:JackPotte|<span style="color:#FF6600">$</span>♠]]) 31 juillet 2022 à 15:59 (CEST)
nwa6pzuf8vk1ik80ygxhcc54mxl5uj8
Mathc initiation/Fichiers c : c77di3
0
78786
683005
2022-07-31T21:06:00Z
Xhungab
23827
modification mineure
wikitext
text/x-wiki
[[Catégorie:Mathc initiation (livre)]]
[[Mathc initiation/Fichiers h : c77di| Sommaire]]
'''Calculons la primitive :'''
<syntaxhighlight lang="dos">
/
Calculer la primitive de | sec(x)**n dx
/
Utilisons l'intégration par partie
u = ... dv = ...
du = ... v = ...
/ /
| u dv = u v - | v du
/ /
/
| sec(x)**n dx =
/
u = sec(x)**(n-2) dv = sec(x)**2 dx
du = (n-2) sec(x)**(n-3) sec(x)tan(x) dx v = tan(x)
(udv) (u*v) (v*du)
/ /
| sec(x)**n dx = sec(x)**(n-2) * tan(x) - | tan(x) * (n-2) sec(x)**(n-3) sec(x) tan(x) dx
/ /
/ /
| sec(x)**n dx = sec(x)**(n-2) * tan(x) - (n-2) | tan(x)**2 sec(x)**(n-2) dx
/ /
tan(x)**2 = (sec(x)**2 - 1)
/ /
| sec(x)**n dx = sec(x)**(n-2) * tan(x) - (n-2) | (sec(x)**2 - 1) sec(x)**(n-2) dx
/ /
/ /
| sec(x)**n dx = sec(x)**(n-2) * tan(x) - (n-2) | (sec(x)**n - sec(x)**(n-2)) dx
/ /
/ / /
| sec(x)**n dx = sec(x)**(n-2) * tan(x) - (n-2) | sec(x)**n dx + (n-2) | sec(x)**(n-2) dx
/ / /
/ / /
| sec(x)**n dx + (n-2) | sec(x)**n dx = (n-1) | sec(x)**n dx
/ / /
/ /
(n-1) | sec(x)**n dx = sec(x)**(n-2) * tan(x) + (n-2) | sec(x)**(n-2) dx
/ /
/ 1 (n-2) /
| sec(x)**n dx = ----- sec(x)**(n-2) * tan(x) + ----- | sec(x)**(n-2) dx
/ (n-1) (n-1) /
</syntaxhighlight>
{{AutoCat}}
s56nusff09cswjlm1ujbmz7xfdm69eb
Mathc initiation/Fichiers c : c77di4
0
78787
683007
2022-07-31T21:28:59Z
Xhungab
23827
modification mineure
wikitext
text/x-wiki
[[Catégorie:Mathc initiation (livre)]]
[[Mathc initiation/Fichiers h : c77di| Sommaire]]
'''Calculons la primitive :'''
<syntaxhighlight lang="dos">
/
Calculer la primitive de | csc(x)**n dx
/
Utilisons l'intégration par partie
u = ... dv = ...
du = ... v = ...
/ /
| u dv = u v - | v du
/ /
/
| csc(x)**n dx =
/
u = csc(x)**(n-2) dv = csc(x)**2 dx
du = (n-2) csc(x)**(n-3) (-cot(x)csc(x)) dx v = (-cot(x))
(udv) (u*v) (v*du)
/ /
| csc(x)**n dx = csc(x)**(n-2) * (-cot(x)) - | (-cot(x)) * (n-2) csc(x)**(n-3) (-cot(x)csc(x)) dx
/ /
/ /
| csc(x)**n dx = - csc(x)**(n-2) cot(x) - (n-2) | cot(x)**2 csc(x)**(n-2) dx
/ /
cot(x)**2 = (csc(x)**2 - 1)
/ /
| csc(x)**n dx = - csc(x)**(n-2) cot(x) - (n-2) | (csc(x)**2 - 1) csc(x)**(n-2) dx
/ /
/ /
| csc(x)**n dx = - csc(x)**(n-2) cot(x) - (n-2) | (csc(x)**n - csc(x)**(n-2)) dx
/ /
/ / /
| csc(x)**n dx = - csc(x)**(n-2) cot(x) - (n-2) | (csc(x)**n dx + (n-2) | csc(x)**(n-2)) dx
/ / /
/ / /
| csc(x)**n dx + (n-2) | csc(x)**n dx = (n-1) | csc(x)**n dx
/ / /
/ /
(n-1) | csc(x)**n dx = - csc(x)**(n-2) cot(x) + (n-2) | csc(x)**(n-2)) dx
/ /
/ 1 (n-2) /
| csc(x)**n dx = (-) ----- csc(x)**(n-2) cot(x) + ----- | csc(x)**(n-2)) dx
/ (n-1) (n-1) /
</syntaxhighlight>
{{AutoCat}}
6n0zf0o1335ppdwslui657rnj1ockab
Mathc initiation/Fichiers c : c77di5
0
78788
683009
2022-07-31T22:39:27Z
Xhungab
23827
modification mineure
wikitext
text/x-wiki
[[Catégorie:Mathc initiation (livre)]]
[[Mathc initiation/Fichiers h : c77di| Sommaire]]
'''Calculons la primitive :'''
<syntaxhighlight lang="dos">
/
Calculer la primitive de | tan(x)**n dx
/
/ /
| tan(x)**n dx = | tan(x)**(n-2) tan(x)**2 dx
/ /
tan(x)**2 = (sec(x)**2 - 1)
/
| tan(x)**(n-2) (sec(x)**2 - 1) dx
/
/
| (tan(x)**(n-2)sec(x)**2 - tan(x)**(n-2)) dx
/
/ /
| tan(x)**(n-2)sec(x)**2 dx - | tan(x)**(n-2) dx
/ /
^
|
u = tan(x)
du = sec(x)**2 dx
/ /
| u**(n-2) du - | tan(x)**(n-2) dx
/ /
/
1/(n-1) u**(n-1) - | tan(x)**(n-2) dx
/
/ 1 /
| tan(x)**n dx = ----- (tan(x)**(n-1) - | tan(x)**(n-2) dx
/ (n-1) /
</syntaxhighlight>
{{AutoCat}}
3vjj31ao2lszrbsleb9dsktspproge4
Mathc initiation/Fichiers c : c77di6
0
78789
683012
2022-07-31T22:54:02Z
Xhungab
23827
modification mineure
wikitext
text/x-wiki
[[Catégorie:Mathc initiation (livre)]]
[[Mathc initiation/Fichiers h : c77di| Sommaire]]
'''Calculons la primitive :'''
<syntaxhighlight lang="dos">
/
Calculer la primitive de | cot(x)**n dx
/
/ /
| cot(x)**n dx = | cot(x)**(n-2) cot(x)**2 dx
/ /
cot(x)**2 = (csc(x)**2 - 1)
/
| cot(x)**(n-2) (csc(x)**2 - 1) dx
/
/
| (cot(x)**(n-2)csc(x)**2 - cot(x)**(n-2)) dx
/
/ /
| cot(x)**(n-2)csc(x)**2 dx - | cot(x)**(n-2) dx
/ /
^
|
u = cot(x)
du = (-csc(x)**2) dx
(-) du = csc(x)**2 dx
/ /
(-)| u**(n-2) du - | cot(x)**(n-2) dx
/ /
/
(-) 1/(n-1) u**(n-1) - | cot(x)**(n-2) dx
/
/ 1 /
| cot(x)**n dx = (-) ----- (cot(x)**(n-1) - | cot(x)**(n-2) dx
/ (n-1) /
</syntaxhighlight>
{{AutoCat}}
82o38b5tx0qhymq56sqwb61zncpz4bd
Mathc initiation/Fichiers h : c78di
0
78790
683016
2022-08-01T07:43:07Z
Xhungab
23827
modification mineure
wikitext
text/x-wiki
[[Catégorie:Mathc initiation (livre)]]
:
:
[[Mathc initiation/a78| Sommaire]] .. ou ... [[Mathc initiation/Fichiers h : c74|Les intégrales]]
:
:
----{{Partie{{{type|}}}|Application sinh(x)**2|fond={{{fond|}}<nowiki>}</nowiki>}}
:
Nous allons voir ici quelques applications des identités trigonométriques hyperbolique vue précédemment. Revenez sur ces pages après avoir étudier les intégrales.
:
<br>
* [[Mathc initiation/Fichiers c : c78di1|Étude de : <........> sinh(x)**n]]
* [[Mathc initiation/Fichiers c : c78di2|Étude de : <........> cosh(x)**n]]
* [[Mathc initiation/Fichiers c : c78di3|Étude de : <........> sech(x)**n]]
* [[Mathc initiation/Fichiers c : c78di4|Étude de : <........> csch(x)**n]]
* [[Mathc initiation/Fichiers c : c78di5|Étude de : <........> tanh(x)**n]]
* [[Mathc initiation/Fichiers c : c78di6|Étude de : <........> coth(x)**n]]
----
{{AutoCat}}
6osnh1vqb61achs8kaxa3yi7fwq9dms
Mathc initiation/Fichiers c : c78di1
0
78791
683017
2022-08-01T07:44:54Z
Xhungab
23827
modification mineure
wikitext
text/x-wiki
[[Catégorie:Mathc initiation (livre)]]
[[Mathc initiation/Fichiers h : c78di| Sommaire]]
'''Calculons la primitive :'''
<syntaxhighlight lang="dos">
/
Calculer la primitive de | sinh(x)**n dx
/
Utilisons l'intégration par partie
u = ... dv = ...
du = ... v = ...
/ /
| u dv = u v - | v du
/ /
/
| sinh(x)**n dx =
/
u = sinh(x)**(n-1) dv = sinh(x) dx
du = (n-1) sinh(x)**(n-2) cosh(x) dx v = cosh(x)
(udv) (u*v) (v*du)
/ /
| sinh(x)**n dx = sinh(x)**(n-1) * cosh(x) - | cosh(x) * (n-1) sinh(x)**(n-2) cosh(x) dx
/ /
/ /
| sinh(x)**n dx = sinh(x)**(n-1) cosh(x) - (n-1) | cosh(x)**2 sinh(x)**(n-2) dx
/ /
cosh(x)**2 = (1+sinh(x)**2)
/ /
| sinh(x)**n dx = sinh(x)**(n-1) cosh(x) - (n-1) | ((1+sinh(x)**2) sinh(x)**(n-2) dx
/ /
/ /
| sinh(x)**n dx = sinh(x)**(n-1) cosh(x) - (n-1) | (sinh(x)**(n-2) + sinh(x)**n) dx
/ /
/ / /
| sinh(x)**n dx = sinh(x)**(n-1) cosh(x) - (n-1) | sinh(x)**(n-2) dx - (n-1) | sinh(x)**n dx
/ / /
/ / / /
| sinh(x)**n dx = sinh(x)**(n-1) cosh(x) - (n-1) | sinh(x)**(n-2) dx - n |sinh(x)**n dx + |sinh(x)**n dx
/ / / /
/ /
n | sinh(x)**n dx = sinh(x)**(n-1) cosh(x) - (n-1) | sinh(x)**(n-2) dx
/ /
/ 1 (n-1) /
| sinh(x)**n dx = -- sinh(x)**(n-1) cosh(x) (-) ----- | sin(x)**(n-2) dx
/ n n /
</syntaxhighlight>
{{AutoCat}}
akeu0w14vrvdetdbzfbgbzp0eimfiv3
Mathc initiation/Fichiers c : c78di2
0
78792
683018
2022-08-01T08:03:59Z
Xhungab
23827
modification mineure
wikitext
text/x-wiki
[[Catégorie:Mathc initiation (livre)]]
[[Mathc initiation/Fichiers h : c78di| Sommaire]]
'''Calculons la primitive :'''
<syntaxhighlight lang="dos">
/
Calculer la primitive de | cosh(x)**n dx
/
Utilisons l'intégration par partie
u = ... dv = ...
du = ... v = ...
/ /
| u dv = u v - | v du
/ /
/
| cosh(x)**n dx =
/
u = cosh(x)**(n-1) dv = cosh(x) dx
du = (n-1) cosh(x)**(n-2) sinh(x) dx v = sinh(x)
(u dv) (u*v) (v*du)
/ /
| cosh(x)**n dx = cosh(x)**(n-1) * sinh(x) - | sinh(x) * (n-1) cos(x)**(n-2) sin(x) dx
/ /
/ /
| cosh(x)**n dx = cosh(x)**(n-1) sinh(x) - (n-1) | sinh(x)**2 cos(x)**(n-2) dx
/ /
sinh(x)**2 = (cosh(x)**2 - 1)
/ /
| cosh(x)**n dx = cosh(x)**(n-1) sinh(x) - (n-1) | (cosh(x)**2 - 1) cosh(x)**(n-2) dx
/ /
/ /
| cosh(x)**n dx = cosh(x)**(n-1) sinh(x) - (n-1) | (cosh(x)**n - cosh(x)**(n-2)) dx
/ /
/ / /
| cosh(x)**n dx = cosh(x)**(n-1) sinh(x) - (n-1) | cosh(x)**n dx + (n-1) | cosh(x)**(n-2) dx
/ / /
/ /
n | cosh(x)**n dx = cosh(x)**(n-1) sinh(x) + (n-1) | cosh(x)**(n-2) dx
/ /
/ 1 (n-1) /
| cosh(x)**n dx = --- cosh(x)**(n-1) sinh(x) + ----- | cosh(x)**(n-2) dx
/ n n /
</syntaxhighlight>
{{AutoCat}}
2f5x6tea9utdiyx5ksipp1f408if60k
Utilisateur:Overmac
2
78793
683020
2022-08-01T08:13:08Z
Alphama
100324
Alphama a déplacé la page [[Utilisateur:Overmac]] vers [[Utilisateur:Asylum67]] : Page automatiquement déplacée lors du renommage de l’utilisateur « [[Special:CentralAuth/Overmac|Overmac]] » en « [[Special:CentralAuth/Asylum67|Asylum67]] »
wikitext
text/x-wiki
#REDIRECTION [[Utilisateur:Asylum67]]
hrch6b3nftu7zp53mvu7pi927x3nml6
Mathc initiation/Fichiers c : c78di3
0
78794
683021
2022-08-01T08:46:35Z
Xhungab
23827
modification mineure
wikitext
text/x-wiki
[[Catégorie:Mathc initiation (livre)]]
[[Mathc initiation/Fichiers h : c78di| Sommaire]]
'''Calculons la primitive :'''
<syntaxhighlight lang="dos">
/
Calculer la primitive de | sec(x)**n dx
/
Utilisons l'intégration par partie
u = ... dv = ...
du = ... v = ...
/ /
| u dv = u v - | v du
/ /
/
| sech(x)**n dx =
/
u = sech(x)**(n-2) dv = sech(x)**2 dx
du = (n-2) sech(x)**(n-3) (-tanh(x)sech(x)) dx v = tanh(x)
(udv) (u*v) (v*du)
/ /
| sech(x)**n dx = sech(x)**(n-2) * tanh(x) - | tanh(x) * (n-2) sech(x)**(n-3) (-tanh(x)sech(x)) dx
/ /
/ /
| sech(x)**n dx = sech(x)**(n-2) tanh(x) + (n-2) | tanh(x)**2 sech(x)**(n-2) dx
/ /
tanh(x)**2 = (1-sech(x)**2)
/ /
| sech(x)**n dx = sech(x)**(n-2) tanh(x) + (n-2) | (1-sech(x)**2) sech(x)**(n-2) dx
/ /
/ /
| sech(x)**n dx = sech(x)**(n-2) tanh(x) + (n-2) | (sech(x)**(n-2) - sech(x)**n) dx
/ /
/ / /
| sech(x)**n dx = sech(x)**(n-2) tanh(x) + (n-2) | (sech(x)**(n-2) - (n-2) | sech(x)**n) dx
/ / /
/ /
(n-1) | sech(x)**n dx = sech(x)**(n-2) tanh(x) + (n-2) | sech(x)**(n-2) dx
/ /
/ 1 (n-2) /
| sech(x)**n dx = ----- sech(x)**(n-2) tanh(x) + ----- | sech(x)**(n-2) dx
/ (n-1) (n-1) /
</syntaxhighlight>
{{AutoCat}}
rx3kid357w5s4hobjvoj0vb8b9izef0
Mathc initiation/Fichiers c : c78di4
0
78795
683022
2022-08-01T09:04:47Z
Xhungab
23827
modification mineure
wikitext
text/x-wiki
[[Catégorie:Mathc initiation (livre)]]
[[Mathc initiation/Fichiers h : c78di| Sommaire]]
'''Calculons la primitive :'''
<syntaxhighlight lang="dos">
/
Calculer la primitive de | csch(x)**n dx
/
Utilisons l'intégration par partie
u = ... dv = ...
du = ... v = ...
/ /
| u dv = u v - | v du
/ /
/
| csch(x)**n dx =
/
u = csch(x)**(n-2) dv = csch(x)**2 dx
du = (n-2) csch(x)**(n-3) (-coth(x)csch(x)) dx v = (-coth(x))
(udv) (u*v) (v*du)
/ /
| csch(x)**n dx = csch(x)**(n-2) * (-coth(x)) - | (-coth(x)) * (n-2) csch(x)**(n-3) (-coth(x)csch(x)) dx
/ /
/ /
| csch(x)**n dx = - csch(x)**(n-2) coth(x) - (n-2) | coth(x)**2 csch(x)**(n-2) dx
/ /
coth(x)**2= (1+csch(x)**2)
/ /
| csch(x)**n dx = - csch(x)**(n-2) coth(x) - (n-2) | (1+csch(x)**2) csch(x)**(n-2) dx
/ /
/ /
| csch(x)**n dx = - csch(x)**(n-2) coth(x) - (n-2) | (csch(x)**(n-2) + csch(x)**n) dx
/ /
/ / /
| csch(x)**n dx = - csch(x)**(n-2) coth(x) - (n-2) | (csch(x)**(n-2) - (n-2) | csch(x)**n) dx
/ / /
/ /
(n-1) | csch(x)**n dx = - csch(x)**(n-2) coth(x) - (n-2) | csc(x)**(n-2)) dx
/ /
/ 1 (n-2) /
| csch(x)**n dx = (-) ----- csch(x)**(n-2) coth(x) - ----- | csch(x)**(n-2)) dx
/ (n-1) (n-1) /
</syntaxhighlight>
{{AutoCat}}
ebw8ptyfh14tej3axbp091mkq55is4a
Mathc initiation/Fichiers c : c78di5
0
78796
683023
2022-08-01T09:30:51Z
Xhungab
23827
modification mineure
wikitext
text/x-wiki
[[Catégorie:Mathc initiation (livre)]]
[[Mathc initiation/Fichiers h : c78di| Sommaire]]
'''Calculons la primitive :'''
<syntaxhighlight lang="dos">
/
Calculer la primitive de | tanh(x)**n dx
/
/ /
| tanh(x)**n dx = | tanh(x)**(n-2) tanh(x)**2 dx
/ /
tanh(x)**2 = (1-sech(x)**2)
/
| tanh(x)**(n-2) (1-sech(x)**2) dx
/
/
| (tanh(x)**(n-2) - tanh(x)**(n-2)sech(x)**2) dx
/
/ /
| tanh(x)**(n-2) dx - | tanh(x)**(n-2)sech(x)**2 dx
/ /
^
|
u = tanh(x)
du = sech(x)**2 dx
/ /
| tanh(x)**(n-2) dx - | u**(n-2) du
/ /
/
| tanh(x)**(n-2) dx - 1/(n-1) u**(n-1)
/
/ / 1
| tanh(x)**n dx = | tanh(x)**(n-2) dx - ----- tanh(x)**(n-1)
/ / (n-1)
/ 1 /
| tanh(x)**n dx = (-) ----- tanh(x)**(n-1) + | tanh(x)**(n-2) dx
/ (n-1) /
</syntaxhighlight>
{{AutoCat}}
7kbzvpajbwkdf3tvknhkgjg37mjtwc4
Mathc initiation/Fichiers c : c78di6
0
78797
683024
2022-08-01T09:51:40Z
Xhungab
23827
modification mineure
wikitext
text/x-wiki
[[Catégorie:Mathc initiation (livre)]]
[[Mathc initiation/Fichiers h : c78di| Sommaire]]
'''Calculons la primitive :'''
<syntaxhighlight lang="dos">
/
Calculer la primitive de | coth(x)**n dx
/
/ /
| coth(x)**n dx = | coth(x)**(n-2) coth(x)**2 dx
/ /
coth(x)**2 = (1+csch(x)**2)
/
| coth(x)**(n-2) (1+csch(x)**2) dx
/
/
|(coth(x)**(n-2) + coth(x)**(n-2)csch(x)**2) dx
/
/ /
| coth(x)**(n-2) dx + | coth(x)**(n-2)csch(x)**2) dx
/ /
^
|
u = coth(x)
du = (-csch(x)**2) dx
(-) du = csch(x)**2 dx
/ /
| coth(x)**(n-2) dx - | u**(n-2) du
/ /
/
| coth(x)**(n-2) dx - 1/(n-1) u**(n-1)
/
/
| coth(x)**(n-2) dx - 1/(n-1) coth**(n-1)
/
/ 1 /
| coth(x)**n dx = (-) ----- coth**(n-1) + | (coth(x)**(n-2) dx
/ (n-1) /
</syntaxhighlight>
{{AutoCat}}
l3cc44yeftr9gn7hqoyq0bu16yfx27n