Dipende dalle lingue, cosa puoi fare con loro
- hai bisogno di fare una distinzione
- c'è una distinzione nella sintassi, o è solo comodità, quando si parla di codice
AFAIK, in Basic, se chiami qualcosa, che non restituisce nulla, ma esegue un lavoro con effetti collaterali, come la stampa, scrivi su file o cambia una variabile globale, è stata chiamata una procedura.
Se restituisce qualcosa, è stata chiamata una funzione.
In un linguaggio OOP come Java raramente ho incontrato il termine "funzione", ma "metodo", ed è stato insegnato che le funzioni sono cose che sono globali e possono essere chiamate da tutti.
Nella scala funzionale e in linguaggio OOP, un metodo non è chiamato funzione, ma puoi passare una cosa del genere a un altro metodo, e quindi diventa una funzione.
Una subroutine è una routine, che viene chiamata da un'altra routine, a quanto mi risulta.
In sintesi, non penso che ci sia una definizione concisa su tutte le lingue e più su paradigmi. Devi considerare la cultura specifica in cui ti trovi, se usi questi termini, forse dovresti introdurre prima la tua definizione.