Oui et non. Cela dépend des contraintes que vous souhaitez respecter et des conditions préalables nécessaires pour exécuter votre algorithme.
Idéalement, un algorithme est une recette abstraite qui définit étape par étape comment faire quelque chose. Les algorithmes ont été définis comme tels dans le but de reproductibilité, et d'automatisation ultérieure. Les algorithmes proviennent de lambda-calcul, vous pouvez donc facilement voir pourquoi ils sont créés de cette manière. Cette définition est la plus courante, mais les algorithmes modernes peuvent être non séquentiels (pas étape par étape, comme les algorithmes concurrents, ou logiques comme ceux utilisant l'unification), non linéaires (algorithmes stochastiques) ou tout simplement étranges (quantiques) algorithmes), mais je vais passer cela.
Ainsi, idéalement, un algorithme devrait être aussi abstrait que possible sans comptabiliser aucun matériel.
Mais, comme avec tout système, vous devez définir certains axiomes , non seulement pour obtenir un système cohérent, mais aussi pour gagner du temps. Par exemple, la plupart des algorithmes supposent, au moins implicitement, qu'ils sont définis sur une machine Von-Neumann. Si ce n'était pas le cas, ils devraient définir explicitement chaque partie du système sur laquelle ils doivent être exécutés (car cela est nécessaire pour reproduire la recette, c'est une sorte de condition préalable). De plus, les algorithmes s'appuient souvent sur des commandes courantes telles que write () sans les définir complètement.
Une autre raison pour laquelle les algorithmes ne sont pas si abstraits de l'architecture matérielle, c'est lorsque vous devez respecter certaines contraintes .
Supposons que vous travaillez sur des systèmes embarqués, alors vous ne pouvez probablement pas compter sur la même quantité de ressources que vous avez sur les postes de travail. L'une des ressources les plus restreintes est probablement la mémoire. Cependant, la plupart des algorithmes tendent à optimiser la complexité temporelle (vitesse d'exécution sur CPU), pas la complexité mémoire (quantité de mémoire nécessaire pour travailler sur les données). Pour ces systèmes, des algorithmes optimisés en mémoire ont été conçus où les algorithmes non optimisés en mémoire échoueraient ou fonctionneraient beaucoup plus lentement. En fait, les systèmes embarqués ne sont pas la seule cible des algorithmes efficaces en mémoire: par exemple, il existe des algorithmes sans cache qui adaptent leur traitement pour utiliser efficacement le cache CPU. Autre exemple: certains algorithmes d'apprentissage automatique pour les mégadonnées sont conçus pourapprentissage incrémentiel ou informatique hors cœur pour traiter une énorme quantité de données bien plus volumineuses que la mémoire disponible sur n'importe quel ordinateur, etc.
Il existe également des algorithmes qui n'optimisent pas une partie spécifique de l'ordinateur, mais une norme qui dépend de l'architecture matérielle. Par exemple, les données numériques qui nécessitent une précision sont stockées dans float ou double, qui sont par nature limitées en raison des limites matérielles. Le problème est que des calculs complexes peuvent conduire à des arrondis, et plus vous effectuez de calculs sur des nombres arrondis, plus vous dérivez. C'est ce qu'on appelle une interférence catastrophique . Certaines applications nécessitent une précision critique, même au prix d'une pire complexité. Pour ce type d'applications, des algorithmes qui optimisent leur calcul pour réduire ou supprimer les interférences catastrophiques ont été réalisés.
Ainsi, la conception d'un algorithme peut également être un compromis entre abstraction et contraintes.
En fin de compte, nous pouvons dire qu'un algorithme est aussi abstrait que sa cible et que ses besoins (architecturaux) préconditionnels . Plus l'objectif visé est précis, plus il s'appuiera probablement sur l'architecture matérielle.
Quelques mots clés associés qui pourraient vous intéresser: