Vado con una risposta diversa qui: praticamente parlando, non c'è davvero alcuna differenza , con la leggera eccezione che "metodo" di solito si riferisce a una subroutine associata a un oggetto nei linguaggi OO.
I termini "procedura, funzione, sottoprogramma, sottoprogramma e metodo" significano davvero la stessa cosa: un sottoprogramma richiamabile all'interno di un programma più ampio. Ma è difficile trovare una definizione che catturi tutti gli usi varianti di questi termini, perché non sono usati coerentemente in linguaggi di programmazione o paradigmi.
Si potrebbe dire che una funzione restituisce un valore. Bene, la seguente funzione C non restituisce un valore:
void f() { return; }
... ma dubito che troverai qualcuno che lo definirebbe una procedura.
Certo, in Pascal, le procedure non restituiscono valori e le funzioni restituiscono valori, ma questo è semplicemente un riflesso di come Pascal è stato progettato. In Fortran, una funzione restituisce un valore e una subroutine restituisce più valori. Eppure nulla di tutto ciò ci consente davvero di trovare una definizione "universale" per questi termini.
In effetti, il termine "programmazione procedurale" si riferisce a un'intera classe di linguaggi, tra cui C, Fortran e Pascal, solo uno dei quali utilizza effettivamente il termine "procedura" per indicare qualsiasi cosa.
Quindi nulla di tutto ciò è veramente coerente. L'unica eccezione è probabilmente il "metodo", che sembra essere utilizzato quasi interamente con i linguaggi OO, facendo riferimento a una funzione associata a un oggetto. Anche se, anche questo non è sempre coerente. Il C ++, ad esempio, di solito usa il termine "funzione membro" anziché il metodo (anche se il termine "metodo" si è insinuato nel volgare C ++ tra i programmatori).
Il punto è che nulla di tutto ciò è veramente coerente. Riflette semplicemente la terminologia utilizzata da qualunque lingua sia in voga in quel momento.