Un programme qui se compile est sûrement syntaxiquement correct (sinon, le compilateur, y comprend pas)
.
Mais ça ne dit rien de sa correction sémantique
: un programme dont la spécification est de multiplier deux nombres mais qui en réalité les divise peut très bien être compilé et même exécuté. Maintenant, le résultat n'es pas vraiment celui attendu. Ce programme sera syntaxiquement correct, sémantiquement incorrect.
Par contre, un programme syntaxiquement incorrect ne peut pas être sémantiquement correct (puisqu'il n'a pas de sémantique).
Entre les deux, tu peux avoir un programme syntaxiquement correct mais algorithmiquement incorrect (donc a fortiori sémantiquement incorrect).
Par exemple, si tu as une boucle infinie, ça peut compiler, mais ça n'exécutera pas.
Un programme correct doit l'être à tous les niveaux : syntaxe, algorithme, sémantique.
Reste encore à être sûr que le programme est correct pour toutes les données (si certaines données te conduisent à une division par zéro, le programme est correct sur un sous-ensemble du domaine d'application)
.
Reste encore, en plus de la "correction" du programme, à être sûr de son "utilisabilité" sur une machine cible : s'il lui faut 34 téraoctets de mémoire vive ou 3 milliards d'années de calcul pour arriver au bout, ça va être dur
.
Bon, quelqu'un a déjà fait un programme parfaitement correct (il y a des moyens théoriques pour ça) et utilisable ?
(Et on pourrait encore chercher des poils aux oeufs plus loin vu que les langages informatiques ne sont pas "parfaits", (orthogonaux, disent les spécialistes, si je ne dis pas, moi, des bêtises).
Sur ce, je retourne lire Proust, c'est pas toujours correct, même syntaxiquement, mais qu'est-ce que c'est simple, à côté.