Vado con una risposta diversa qui: praticamente, non c'è davvero alcuna differenza , con la leggera eccezione che "metodo" di solito si riferisce a una subroutine associata a un oggetto in lingue OO.
I termini "procedura, funzione, subroutine, sottoprogramma e metodo" significano veramente la stessa cosa: un sottoprogramma chiamabile all'interno di un programma più ampio. Ma è difficile trovare una definizione che raccolga tutti gli usi varianti di questi termini, perché non vengono utilizzati in modo coerente tra linguaggi di programmazione o paradigmi.
Potresti dire che una funzione restituisce un valore. Bene, la seguente funzione C non restituisce un valore:
void f() { return; }
... ma dubito che troveresti qualcuno che lo chiamerebbe una procedura.
Certo, in Pascal, le procedure non restituiscono valori e valori restituiti da funzioni, ma questo è solo un riflesso del modo in cui Pascal è stato progettato. In Fortran, una funzione restituisce un valore e una subroutine restituisce più valori. Eppure niente 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, inclusi C, Fortran e Pascal, solo uno dei quali utilizza effettivamente il termine "procedura" per indicare qualsiasi cosa.
Quindi niente di tutto ciò è veramente coerente. L'unica eccezione è probabilmente "metodo", che sembra essere usato 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" piuttosto che metodo, (anche se il termine "metodo" si è insinuato nel vernacolo C ++ tra i programmatori.)
Il punto è che nulla di tutto ciò è veramente coerente. Riflette semplicemente la terminologia utilizzata da qualunque lingua sia di moda in quel momento.