Je vais avec une réponse différente ici: pratiquement, il n'y a vraiment aucune différence , à la légère exception que "méthode" se réfère généralement à un sous-programme associé à un objet dans les langages OO.
Les termes "procédure, fonction, sous-programme, sous-programme et méthode" signifient vraiment la même chose: un sous-programme appelable dans un programme plus vaste. Mais il est difficile de trouver une définition qui capture toutes les variantes d'utilisation de ces termes, car ils ne sont pas utilisés de manière uniforme dans les langages de programmation ou les paradigmes.
Vous pourriez dire qu'une fonction renvoie une valeur. Eh bien, la fonction C suivante ne renvoie pas de valeur:
void f() { return; }
... mais je doute que vous trouviez quelqu'un qui pourrait appeler cela une procédure.
Bien sûr, en Pascal, les procédures ne renvoient pas de valeurs et les fonctions renvoient des valeurs, mais cela reflète simplement la façon dont Pascal a été conçu. En Fortran, une fonction renvoie une valeur et un sous-programme renvoie plusieurs valeurs. Pourtant, rien de tout cela ne nous permet vraiment de proposer une définition "universelle" de ces termes.
En fait, le terme "programmation procédurale" désigne toute une classe de langages, notamment le C, le Fortran et le Pascal, dont un seul utilise le terme "procédure" pour signifier n'importe quoi.
Donc, rien de tout cela n’est vraiment cohérent. La seule exception est probablement "méthode", qui semble être utilisée presque entièrement avec les langages OO, en référence à une fonction associée à un objet. Même si cela n’est pas toujours cohérent. C ++, par exemple, utilise généralement le terme "fonction membre" plutôt que le terme méthode (même si le terme "méthode" est entré dans la langue vernaculaire C ++ parmi les programmeurs).
Le fait est que rien de tout cela n’est vraiment cohérent. Cela reflète simplement la terminologie employée par les langues en vogue à l’époque.