Conceptes de base
Machines de Turing
Une machine de Turing est un modèle mathématique théorique inventé par Alan Turing en 1936. Elle est considérée comme l'un des premiers modèles de calcul, et est souvent utilisée pour illustrer les concepts de la théorie de la calculabilité.
Le fonctionnement d'une machine de Turing est relativement simple. Elle se compose d'un ruban infini divisé en cases, sur lequel sont inscrits des symboles. Un mécanisme de lecture/écriture (la tête de lecture/écriture) peut se déplacer le long du ruban, lire les symboles et en écrire de nouveaux. La machine possède également un état interne qui détermine sa réponse à un symbole donné.
Lorsque la machine est allumée, elle commence par lire le symbole se trouvant sous la tête de lecture/écriture. En fonction de l'état interne de la machine et du symbole lu, elle effectue une opération spécifique, telle que changer le symbole sur le ruban, déplacer la tête de lecture/écriture vers la gauche ou la droite, ou passer à un nouvel état interne.
La machine de Turing est un modèle de calcul universel, ce qui signifie qu'elle peut effectuer n'importe quel calcul qui peut être décrit de manière algorithmique. En théorie, toute fonction calculable peut être exprimée en tant que machine de Turing.
Le modèle de la machine de Turing a également conduit à la création de l'architecture de von Neumann, qui est la base des ordinateurs modernes. L'architecture de von Neumann utilise une mémoire à accès aléatoire pour stocker les programmes et les données, et une unité centrale de traitement (CPU) qui peut exécuter des instructions sur ces données.
Enfin, la machine de Turing a également des implications en théorie de la complexité. Les problèmes qui peuvent être résolus par une machine de Turing en un temps polynomial sont considérés comme faisant partie de la classe P, tandis que les problèmes qui nécessitent un temps exponentiel ou plus pour être résolus sont considérés comme faisant partie de la classe NP. La théorie de la complexité est essentielle pour comprendre les limites de la résolution de problèmes informatiques, notamment dans les domaines de la cryptographie et de la sécurité.
en résumé, Alan Turing au delà d'avoir cassé l'un des sytèmes de cryptographie les plus performant de l'histoire et permis par ses actions la victoire des alliés pendant la seconde guerre mondiale, a inventé les concepts qui régissent encore aujourd'hui toutes les machines modernes.
Un film biopic 'Imitation Game' retrace l'histoire d'Alan turing, de son importance pendant la guerre à la fin de sa vie.
Si ça peut vous interresser de voir de manière un peu romancer l'histoire de ce génie, je ne peux que vous encourager à aller le voir.
Fonctionnement et application
Quelques décénnies aprés la création de la machine de turing, un ordinateur, ça reste un ensemble de machine qui communique entre elles et occupe une place assez conséquente, pour une utilitée discutable vu la compléxité de fonctionnement.
On part du principe que saisir des calculs mathématiques en binaire sans forcément être capable de lire/comprendre le résultat c'est pénible, d'où la création des applications et du métier de développeur. Mais les bienfait de l'industrie moderne ayant réussie à bien améliorer tout ça, on va essayer de voir comment ça fonctionne.
Un ordinateur moderne doit être visualiser comme un empilement de couche :
Premier niveau : Hardware
Je ne vais pas faire une liste exhaustive des différents composants moderner constituant un PC.
En ce qui concerne le développement il y en a que trois qui nous interresse :
- le CPU : on va parler de coeurs physique et virtuel (un coeurs physique peut représenter pluseirus coeurs virtuels, on peut aussi parler de thread), grossiérement un thread, c'est une tête de lecture de la machine de Turing, donc c'est la capacité à réaliser une opération mathématique. Si j'ai 8 thread, je peux réaliser 8 opérations mathématiques en parallèle.
- la RAM : On parle aussi de mémoire vive, c'est une partie du ruban infini de la machine de turing. Le proncipe c'est que l'état de ce ruban n'est conservé que tant que la machine est allumée, par contre les temps d'accés et de manipulation sur cette partie du ruban est beaucoup plus rapide.
- Le disque dur : l'autre partie du ruban de la machine de turing, celle-ci quant à elle reste dans le même état même en cas d'arret de la machine. On va retourver deux familles les HDD (Hard Disk Drive) et les SSD (Solid State Drive), l'un est bien plus rapide que l'autre et se rapproche de plus en plus des perfromances que 'lon connait avec la mémoire vive.
Deuxième niveau : OS
l'OS (Operating System) c'est ce qui va rendre utilisable une machine de turing et l'intéraction avec les différents composants.
Il va agir comme un traducteur entre vos application et les composant de l'ordinateur. Il va prendre sur lui la gestion de la mémoire, le stockage de fichiers, ...
Historiquement on part d'un noyau commun UNIX qui à ensuite dévie sur les divers OS que l'on connait : Windows (même ne vient pas directement d'UNIX), Linux, Mac OS.
En ce qui nous concerne on va se cantonner au Linux moderne. Un linux c'est avant tout un noyau, c'est un ensemble de fonctionnalité communes à tous les linux, puis chaque distribution va embarquer différents paquets additionnels.
On retrouve deux grandes familles de distributions :
- Debian
- Red Hat / Fedora
Grossièrement toutes les autres distributions vont être des dérivés avec plus ou moins de paquets additionnels.
Exemple :
- Ubuntu : Debian avec un certain nombre de paquet de base installé comme par exemple nano.
- Kali : Debian qui utilise KDE à la place de gnome ou unity et qui embarque tout un tas d'application d'attaque de logiciel.
Il faut voir une distribution linux comme un ensemble de LEGO, on va retrouver certains LEGO chez tout le monde puis chacun va embarquer un peu ce qu'il veut.
Veremes utilise essentiellement Ubuntu qui dérive de Debian (que l'on peut utiliser aussi), cechoix est fait en fonction des préférence d'AWS qui préconise Ubuntu et est donc plus rapide sur les sortie de correctif et le suivi des nouvelles versions.
Lors des installations il faut favoriser les version LTS (Long term support) et si possible la dernière.
Dernier niveau : Librairies, API et applications
Pour développer on va se retoruver à utiliser certains composant développer par des tiers.
Par exemple en C/C++ on va régulièrement utiliser des librairies dynamique pour s'économiser de la production de code et profiter d'un fils ocnducteur unique, massivement utilisé et donc plus robuste.
On peut aussi utiliser des API, SDK, ou même des exécutables.
Par exemple si je reste dans le cas de nos application, on va configurer un WebServer HTTP Apache, qui va lancer l'exécutable de PHP pour aller lancer le code API, ce qui va provoquer des actions de la machine pour produire un résultat.