web-dev-qa-db-fra.com

Comment fonctionnent les ordinateurs?

C'est presque gênant de demander ... J'ai un diplôme en informatique (et un deuxième en cours). Je travaille en tant que développeur .NET à temps plein depuis près de cinq ans. Je semble généralement compétent dans ce que je fais.

Mais je ne sais pas comment fonctionnent les ordinateurs!

S'il vous plaît, mettez-moi à nu une seconde. Un rapide Google de "Comment fonctionne un ordinateur" donnera beaucoup de résultats, mais j'ai eu du mal à en trouver un qui répondait vraiment à ce que je cherchais. Je me rends compte que c'est une énorme, énorme question, donc vraiment, si vous pouvez juste me donner quelques mots-clés ou une direction.

Je sais qu'il y a des composants .... l'alimentation, la carte mère, le ram, le CPU, etc ... et j'ai une "idée générale" de ce qu'ils font. Mais je ne comprends vraiment pas comment vous passez d'une ligne de code comme Console.Readline() dans .NET (ou Java ou C++) et que vous l'avez réellement faire des trucs.

Bien sûr, je suis vaguement au courant de MSIL (dans le cas de .NET), et que de la magie se produit avec le compilateur JIT et qu'il se transforme en code natif (je pense). On me dit Java est similaire, et C++ supprime l'étape intermédiaire.

J'ai fait un assemblage mainframe, c'était il y a quelques années maintenant. Je me souviens qu'il y avait des instructions et des registres de CPU, et j'ai écrit du code .... et puis de la magie s'est produite .... et mon programme fonctionnait (ou plantait). D'après ce que je comprends, un "émulateur" simulerait ce qui se passe lorsque vous appelez une instruction et mettrait à jour les registres du processeur; mais qu'est-ce qui fait que ces instructions fonctionnent comme elles le font?

Cela se transforme-t-il en une question électronique et non en une question "informatique"? Je suppose qu'il n'y a aucune raison pratique pour moi de comprendre cela, mais je pense que je devrais pouvoir le faire.

(Oui, c'est ce qui se passe lorsque vous passez une journée avec un petit enfant. Cela leur prend environ 10 minutes et cinq itérations de demander "Pourquoi?" Pour que vous réalisiez ce que vous ne savez pas)

59
Rob P.

Je vais commencer par le niveau le plus bas qui pourrait être pertinent (je peux commencer par un niveau encore plus bas, mais ils sont probablement bien trop peu pertinents), en commençant par l'atome, l'électricité, les transistors, les portes logiques et les circuits intégrés (puce/CPU ) et se termine à l'Assemblée (je suppose que vous connaissez les niveaux supérieurs).

Au début

Atom

Atom est une structure composée d'électrons, de protons et de neutrons (eux-mêmes composés de particules élémentaires ). La partie la plus intéressante de atom pour les ordinateurs et l'électronique est le électrons parce que l'électron est mobile (c'est-à-dire qu'il peut se déplacer relativement facilement, contrairement aux protons et neutrons qui sont plus difficiles à déplacer) et ils peuvent flotter librement sans être maintenus à l'intérieur d'un atome.

Habituellement, chaque atome a un nombre égal de protons et d'électrons, nous appelons cet état "neutre". En l'occurrence, il est possible pour un atom de perdre ou de gagner des électrons supplémentaires. On dit que les atomes dans cet état déséquilibré sont "chargés positivement" atom (plus de protons que d'électrons) et "chargés négativement" atom (plus d'électrons que de protons) respectivement.

Les électrons sont inconstructibles et indestructibles (ce n'est pas le cas en mécanique quantique, mais ce n'est pas pertinent pour notre propos); donc si un atom perd un électron, un autre atom à proximité devait recevoir les électrons supplémentaires ou l'électron devait être libéré dans un électron flottant libre, à l'inverse puisque l'électron est inconstructible, pour gagner un électron supplémentaire, un atom a dû le retirer des atomes voisins ou d'un électron flottant librement. La mécanique des électrons est telle que s'il y a un atom chargé négativement près d'un atome chargé positivement, alors certains électrons migreront jusqu'à ce que les deux atomes aient la même charge.

Électricité

électricité est juste un flux d'électrons d'une zone avec un nombre très élevé d'atomes chargés négativement vers une zone avec un nombre très élevé d'atomes chargés positivement. Certaines réactions chimiques peuvent créer une situation où nous avons un nœud avec beaucoup d'atomes chargés négativement (appelé "anode"), et un autre nœud avec beaucoup d'atomes chargés positivement (appelé "cathode"). Si nous connectons deux nœuds de charge opposée avec un fil, des masses d'électrons circuleront de l'anode à la cathode, et ce flux est ce que nous appelons le "courant électrique".

Tous les fils ne peuvent pas transmettre les électrons aussi facilement, les électrons circulent beaucoup plus facilement dans les matériaux "conducteurs" que dans les matériaux "résistants". Un matériau "conducteur" a une faible résistance électrique (par exemple des fils de cuivre dans les câbles) et un matériau "résistant" a une résistance électrique élevée (par exemple une isolation de câble en caoutchouc). Certains matériaux intéressants sont appelés semi-conducteurs (par exemple les silicones), car ils peuvent modifier facilement leur résistance, dans certaines conditions, un semi-conducteur peut agir comme conducteur et dans d'autres conditions, il peut se transformer en résistance.

L'électricité préfère toujours traverser le matériau avec le moins de résistance, donc si une cathode et une anode sont connectées avec deux fils, l'un ayant une résistance très élevée et l'autre avec une résistance très faible, la majorité des électrons traversera le câble à faible résistance et presque aucun ne traverse le matériau à haute résistance.

Le Moyen Age

Commutateurs et transistors

Les interrupteurs/bascules sont comme vos interrupteurs d'éclairage ordinaires, un interrupteur peut être placé entre deux morceaux de fil pour couper et/ou rétablir le flux d'électricité. Les transistors fonctionnent exactement comme un interrupteur d'éclairage, sauf qu'au lieu de connecter et de déconnecter physiquement les fils, un transistor connecte/déconnecte le flux électrique en modifiant sa résistance selon qu'il y a de l'électricité dans le nœud de base et, comme vous l'avez peut-être déjà deviné/sais, les transistors sont fabriqués à partir de semi-conducteurs parce que nous pouvons altérer les semi-conducteurs pour devenir soit une résistance, soit un conducteur pour connecter ou déconnecter les courants électriques.

Un type commun de transistor, le NPN Bipolar Junction Transistor (BJT), a trois nœuds: "base", "collecteur" et "émetteur". Dans un BJT NPN, l'électricité ne peut circuler du nœud "émetteur" vers le nœud "collecteur" que lorsque le nœud "de base" est chargé. Lorsque le nœud de base n'est pas chargé, pratiquement aucun électron ne peut traverser et lorsque le nœud de base est chargé, les électrons peuvent circuler entre l'émetteur et le collecteur.

Le comportement d'un transistor

(Je vous suggère fortement de lire ceci avant de continuer, car cela peut mieux expliquer que moi avec des graphiques interactifs)

Disons que nous avons un transistor connecté à une source électrique à sa base et à son collecteur, puis nous câblons un câble de sortie près de son collecteur (voir la figure 3 dans http://www.spsu.edu/cs/faculty/bbrown/web_lectures/transistors / ).

Lorsque nous n'appliquons de l'électricité ni à une base ni à un collecteur, aucune électricité ne peut circuler du tout, car il n'y a pas d'électricité pour parler:

B   C  |  E   O
0   0  |  0   0

Lorsque nous appliquons de l'électricité au collecteur mais pas à la base, l'électricité ne peut pas circuler vers l'émetteur car la base devient un matériau à haute résistance, donc l'électricité s'échappe vers le fil de sortie:

B   C  |  E   O
0   1  |  0   1

Lorsque nous appliquons de l'électricité à la base mais pas au collecteur, aucune électricité ne peut également circuler car il n'y a pas de différence de charge entre le collecteur et l'émetteur:

B   C  |  E   O
1   0  |  0   0

Lorsque nous appliquons de l'électricité à la base et au collecteur, nous obtenons de l'électricité qui traverse le transistor, mais comme le transistor a maintenant une résistance plus faible que le fil de sortie, presque aucune électricité ne circule à travers le fil de sortie:

B   C  |  E   O
1   1  |  1   O

Des portes logiques

Lorsque nous connectons l'émetteur d'un transistor (E1) au collecteur d'un autre transistor (C2), puis nous connectons une sortie près de la base du premier transistor (O) (voir la figure 4 dans http: // www .spsu.edu/cs/faculty/bbrown/web_lectures/transistors / ), alors quelque chose d'intéressant se produit. Disons également que nous appliquons toujours de l'électricité au collecteur du premier transistor (C1) et donc nous ne jouons qu'avec les nœuds de base des transistors (B1, B2):

B1   B2   C1   E1/C2  |  E2   O
----------------------+----------
0    0    1    0      |  0    1
0    1    1    0      |  0    1
1    0    1    0      |  0    1
1    1    1    1      |  1    0

Résumons le tableau pour ne voir que B1, B2 et O:

B1   B2  |  O
---------+-----
0    0   |  1
0    1   |  1
1    0   |  1
1    1   |  0

Et voilà , si vous êtes familier avec la logique booléenne et/ou les portes logiques, vous devriez remarquer que c'est précisément la porte NAND. Et si vous connaissez la logique booléenne et/ou les portes logiques, vous savez peut-être aussi qu'une NAND (ainsi que NOR) est fonctionnellement complet , c'est-à-dire en utilisant NAND uniquement, vous pouvez construire toutes les autres logiques portes et le reste des tables de vérité. Dans un autre Word, vous pouvez concevoir une puce informatique entière en utilisant uniquement des portes NAND.

En fait, la plupart des processeurs sont (ou sont-ils utilisés?) Conçus en utilisant NAND uniquement car ils sont moins chers à fabriquer qu'en utilisant une combinaison de NAND, NOR, AND, OR, etc.

Dériver les autres opérateurs booléens de NAND

Je ne décrirais pas comment faire tous les opérateurs booléens, seulement le NOT et la porte AND, vous pouvez trouver le reste ailleurs.

Étant donné un opérateur NAND, nous pouvons alors construire une porte NOT:

Given one input B
O = NAND(B, B)
Output O

Étant donné un opérateur NAND et NOT, nous pouvons alors construire une porte ET:

Given two inputs B1, B2
C = NAND(B1, B2)
O = NOT(C) // or NAND(C,C)
Output O

Nous pouvons construire d'autres portes logiques de la même manière. Étant donné que la porte NAND est fonctionnelle , il est également possible de construire des portes logiques avec plus de 2 entrées et plus de 1 sortie, je ne vais pas discuter de la façon de construire de telles portes logiques ici.

Âge des Lumières

Construire une machine de Turing à partir de portes booléennes

Un CPU n'est qu'une version plus compliquée d'une machine de Turing. Les registres du processeur sont l'état interne de la machine de Turing, et le RAM est la bande d'une machine de Turing.

Une machine de Turing (CPU) peut faire trois choses:

  • lire un 0 ou 1 de la bande (lire une cellule de mémoire depuis la RAM)
  • changer son état interne (changer ses registres)
  • se déplacer vers la gauche ou la droite (lire plusieurs positions dans la RAM)
  • écrire un 0 ou 1 sur la bande (écrire dans une cellule de mémoire sur RAM)

Pour notre objectif, nous construisons Wolfram Turing Machine à 2 états et 3 symboles en utilisant la logique combinatoire (les processeurs modernes utiliseraient un microcode, mais ils sont plus complexes que nécessaire pour notre objectif).

Le tableau d'état de la machine de Turing Wolfram (2,3) est le suivant:

    A       B
0   P1,R,B  P2,L,A
1   P2,L,A  P2,R,B
2   P1,L,A  P0,R,A

Nous voulons recoder la table d'état ci-dessus en tant que table de vérité:

Let I1,I2 be the input from the tape reader (0 = (0,0), 1 = (0,1), 2 = (1,0))
Let O1,O2 be the tape writer (symbol encoding same as I1,I2)
Let M be connected to the machine's motor (0 = move left, 1 = move right)
Let R be the machine's internal state (A = 0, B = 1)
(R(t) is the machine's internal state at timestep t, R(t+1) at timestep t+1)
(Note that we used two input and two outputs since this is a 3-symbol Turing machine.)

      R  0          1
I1,I2
(0,0)    (0,1),1,1  (1,0),0,0
(0,1)    (1,0),0,0  (1,0),1,1
(1,0)    (0,1),0,0  (0,0),1,0

The truth table for the state table above:

I1  I2  R(t) | O1  O2  M   R(t+1)
-------------+--------------------
0   0   0    | 0   1   1   1
0   0   1    | 1   0   0   0
0   1   0    | 1   0   0   0
0   1   1    | 1   0   1   1
1   0   0    | 0   1   0   0
1   0   1    | 0   0   1   0

Je ne vais pas vraiment construire une telle porte logique (je ne sais pas comment la dessiner en SE et ça va probablement être assez énorme), mais puisque nous savons que la porte NAND est fonctionnellement complet , alors nous avons un moyen de trouver une série de portes NAND qui implémenteront cette table de vérité.

Une propriété importante de Turing Machine est qu'il est possible d'émuler un ordinateur à programme stocké en utilisant une machine Turing qui n'a qu'une table d'états fixe. Par conséquent, toute machine de Turing universelle peut lire son programme à partir de la bande (RAM) au lieu d'avoir à coder en dur ses instructions dans la table d'état interne. Dans un autre Word, notre (2,3) machine de Turing peut lire ses instructions à partir des broches I1, I2 (en tant que logiciel) au lieu d'être codée en dur dans l'implémentation de la porte logique (en tant que matériel).

Microcodes

En raison de la complexité croissante des processeurs modernes, il devient extrêmement difficile d'utiliser la logique combinatoire seule pour concevoir un processeur entier. Le CPU moderne est généralement conçu comme un interprète de l'instruction des microcodes; un microcode est un petit programme intégré dans le CPU qui est utilisé par le CPU pour interpréter le code machine réel. Cet interpréteur de microcode lui-même est généralement conçu en utilisant la logique combinatoire.

Registre, cache et RAM

Nous avons oublié quelque chose ci-dessus. Comment se souvient-on de quelque chose? Comment implémentons-nous la bande et la RAM? La réponse se trouve dans un composant électronique appelé condensateur. Un condensateur est comme une batterie rechargeable, si un condensateur est chargé, il conservera des électrons supplémentaires et il peut également renvoyer des électrons vers les circuits.

Pour écrire sur un condensateur, nous remplissons le condensateur d'électrons (écrire 1) ou drainons tous les électrons dans le condensateur jusqu'à ce qu'il soit vide (écrire 0). Pour lire la valeur d'un condensateur, nous essayons de le décharger. Si, lorsque nous essayons de décharger, il n'y a pas d'électricité qui coule, alors le condensateur est vide (lire 0), mais si nous détectons de l'électricité, alors le condensateur doit être chargé (lire 1). Vous remarquerez peut-être que la lecture d'un condensateur vide sa réserve d'électrons, les RAM modernes ont les circuits pour recharger périodiquement le condensateur afin de pouvoir conserver leur mémoire tant qu'il y a de l'électricité.

Il existe plusieurs types de condensateurs utilisés dans un processeur, les registres du processeur et les caches de processeur de niveau supérieur sont fabriqués à l'aide de "condensateurs" à très grande vitesse qui sont en fait construits à partir de transistors (il n'y a donc pratiquement pas de "décalage" pour lire/écrire à partir de eux), ceux-ci sont appelés statiques RAM (SRAM); tandis que la mémoire principale RAM est faite en utilisant une puissance inférieure, mais des condensateurs plus lents et beaucoup moins chers, ceux-ci sont appelés Dynamic RAM (DRAM).

L'horloge

L'horloge est un composant très important d'un CPU. Une horloge est un composant qui "coche" régulièrement pour synchroniser le traitement. Une horloge contient généralement un quartz ou d'autres matériaux avec une période d'oscillation bien connue et relativement constante, et le circuit d'horloge maintient et mesure cette oscillation pour conserver son sens du temps.

Les opérations du processeur sont effectuées entre les tics d'horloge et la lecture/écriture sont effectuées dans les graduations pour garantir que tous les composants se déplacent de manière synchrone et ne se piétinent pas lorsqu'ils sont dans des états intermédiaires. Dans notre (2,3) machine de Turing, entre horloge se déclenche l'électricité passe à travers les portes logiques pour calculer la sortie de l'entrée (I1, I2, R (t)); et dans l'horloge se déclenche, le magnétophone écrit O1, O2 sur la bande, le moteur se déplace en fonction de la valeur de M et l'interne le registre est écrit à partir de la valeur de R (t + 1), puis le lecteur de bande lira la bande actuelle et mettra la charge en I1, I2 et le registre interne sera relu en R (t).

Parler avec des périphériques

Notez comment la (2,3) Turing Machine s'interface avec son moteur. Il s'agit d'une vue très simplifiée de la façon dont un processeur peut s'interfacer avec un matériel arbitraire. Le matériel arbitraire peut écouter ou écrire sur un fil spécifique pour les entrées/sorties. Dans le cas de la (2,3) machine de Turing, son interface avec le moteur n'est qu'un seul fil qui demande au moteur de tourner dans le sens horaire ou antihoraire.

Ce qui n'est pas dit dans cette machine, c'est que le moteur devait avoir une autre "horloge" qui fonctionne en synchronie avec "l'horloge" interne de la machine pour savoir quand démarrer et arrêter de fonctionner, c'est donc un exemple de synchrone transmission de données . L'autre alternative couramment utilisée, la transmission asynchrone utilise un autre fil, appelé ligne d'interruption, pour communiquer les points de synchronisation entre le CPU et le périphérique asynchrone.

L'ère numérique

Code machine et assemblage

Le langage d'assemblage est un mnémonique lisible par l'homme pour les codes machine. Dans le cas le plus simple, il existe un mappage un à un entre l'assembly et le code machine; bien que dans les langages d'assemblage modernes, certaines instructions peuvent correspondre à plusieurs opcodes.

Langage de programmation

Nous le savons tous, n'est-ce pas?


Ouf, enfin terminé, j'ai tapé tout cela en seulement 4 heures, donc je suis sûr qu'il y a une erreur quelque part (je suis principalement programmeur, pas ingénieur électricien ni physicien, donc il peut y avoir plusieurs choses qui sont manifestement erronées). S'il vous plaît, si vous avez trouvé une erreur, n'hésitez pas à donner un @yell ou à le réparer vous-même si vous avez le représentant ou créez une réponse complémentaire.

139
Lie Ryan

De Nand à Tetris en 12 étapes

Je pense que ce sera absolument parfait pour vous:

De Nand à Tetris en 12 étapes

12
Darknight

Si vous avez fait l'assemblage, il ne reste vraiment que deux ou trois couches à comprendre:

  • Portes logiques , c'est ainsi que la logique est implémentée via des électrons en mouvement - ici, cela devient une question électronique
  • Conception du CPU et du système, qui est la façon dont les portes logiques sont composées pour former un CPU et connectées avec RAM et périphériques. Les CPU modernes sont extrêmement complexes, mais pour votre désir de comprendre comment les choses fonctionnent, il devrait être suffisant pour regarder un CPU simple classique comme le Z8 .
  • Microcode , c'est ainsi que les instructions d'assemblage sont interprétées et transformées en actions de niveau matériel des registres et des circuits logiques.

Le dernier (Microcode) est ce qui l'a fait "cliquer" pour moi, car il a comblé l'écart entre l'électronique et le code.

10

Un exemple de programme de cours de premier cycle CS qui explique précisément ce que vous avez demandé peut être trouvé ici (cours IDC.AC.IL CS101) . Il est basé sur ceci MIT Dossier de presse: " Les éléments des systèmes informatiques: Construire un ordinateur moderne à partir des premiers principes ".

7
littleadv

Pour répondre pleinement à cette question, il faudrait un livre entier. Heureusement, quelqu'un a déjà écrit ce livre. Il s'appelle Code: Le langage caché du matériel informatique et des logiciels par Charles Petzold. C'est une lecture très informative et très divertissante.

7
Bill the Lizard

Je recommande vivement Code par Charles Petzold. Le livre est à la fois une leçon d'histoire et un aperçu technique de la construction d'un ordinateur. En commençant par expliquer les commutateurs télégraphiques simples, le livre montre comment fonctionnent les transistors, puis aux portes logiques, ordinateur programmable, à des choses plus complexes. Il est également très bien écrit et pourrait probablement être saisi par quiconque ayant suffisamment de curiosité.

4
Doug T.

Il sera beaucoup trop difficile (et long!) D'énumérer tout ce que vous pourriez avoir besoin de savoir pour acquérir une compréhension suffisante de ce que vous devez savoir. Un livre célèbre qui répond en fait à toutes ces questions est d'Andrew Tanenbaum: Organisation informatique structurée .

Ce livre vous emmène en fait de l'ordinateur physique sur votre bureau jusqu'aux portes logiques et à l'algèbre booléenne, puis montre un exemple d'architecture pour vous guider à travers comment tout se passe réellement dans un tel système.

(Une remarque: c'est très cher car c'est ~ 800 pages. C'est probablement bon juste pour obtenir une version d'occasion ou une édition plus ancienne. Les concepts n'ont pas changé.)

3
Deckard

Eh bien, il faut beaucoup de balles pour dire cela et demander, je suppose.

À peu près le code est de plus en plus réduit à un code de niveau inférieur plus compliqué. Vers le bas jusqu'au niveau d'assemblage avec les registres Push and Move .. etc ...

Ensuite, le matériel prend ce code et agit en conséquence. La plupart du temps, le matériel aura ses propres instructions sur la façon de faire les choses. Il peut donc y avoir une instruction simple comme un Push où un registre (emplacement mémoire) obtient une valeur telle que 1 ou 2 ou autre.

C'est définitivement une question informatique. Et aussi une programmation. Certains programmeurs programment le matériel qui prendra votre code et le fera faire quelque chose bien qu'à un niveau très bas. C'est aussi une question d'électronique.

2
Ross

Bien que je trouve stupéfiant que quelqu'un puisse suivre un cours en CS sans comprendre le matériel, je suppose qu'il est tout à fait possible qu'un cours puisse se concentrer uniquement sur la théorie en tant que branche des mathématiques, plutôt que sur les détails d'ingénierie et de mise en œuvre. Les vénérables conférences SICP (telles qu'elles ont été prononcées dans les années 80) semblaient être ainsi.

Lors de mon cours CS, il y a deux décennies, une édition antérieure de Ordinateurs: de la logique à l'architecture était nécessaire à lire la première année.
Quelque chose comme ça devrait combler les lacunes.

Alternativement, Open Courseware du MIT devrait avoir quelque chose qui vous aidera.

1
njd

Il y a des appareils.

Ensuite, il existe des pilotes de périphériques qui interagissent avec ces périphériques. Partie écrite en C, partie en Assemblage typiquement.

Le système d'exploitation interagit avec le logiciel d'application à une extrémité et les pilotes de périphérique à l'autre pour communiquer avec le matériel réel.

Si vous êtes vraiment intéressé, pourquoi ne pas faire un piratage du noyau Linux pour en savoir plus?

1
Fanatic23

Au cœur des choses, c'est une question électronique, bien que les bases de cela auraient dû être couvertes dans le cours d'enquête pour n'importe quel diplôme CS. Tout le matériel agit en fonction des portes qui y sont programmées au niveau des composants. Ce sont les opérations logiques les plus élémentaires: NOT, AND, OR, XOR, NAND, NOR. Chaque portail a une fonction spécifique:

La porte ET NON prend une valeur d'entrée et produit une valeur de sortie, elle obtient un 0 ou 1 et sort le contraire.

La porte ET prend deux valeurs d'entrée et produit une valeur de sortie, elle obtient n'importe quelle combinaison de 0 et 1 et sort 0 pour toute combinaison sauf deux, pour lesquelles il sort un 1.

La porte OU fonctionne un peu comme la porte ET, mais produira un 1 pour chaque combinaison de 0 et 1 qu'elle obtient sauf deux zéros, pour lesquels elle génère un 0.

La porte XOR est à nouveau similaire aux portes ET et OR, mais elle produira un 0 lorsque les deux entrées sont le même, et un 1 lorsque les deux entrées sont différentes.

La porte ET est l'opposé logique de la porte ET et la porte NI est l'opposé logique de la porte OR.

En d'autres termes, au niveau matériel, tout se résume à la plus élémentaire des expressions logiques binaires. Tout le reste n'est qu'une transition d'un niveau de programmation supérieur à un niveau inférieur jusqu'à ce qu'il atteigne cette dernière couche.

1
MaQleod

Pour la partie sur la transformation d'un programme dans un langage de haut niveau en instructions machine, tout livre de compilation doit remplir la facture. Par exemple le livre du dragon .

Pour la partie "comment sont exécutées les instructions?" Organisation et conception de l'ordinateur: l'interface matérielle/logicielle devrait remplir la facture.

1
AProgrammer