По-поводу Fortran. Там есть функции (FUNCTION) и подпрограммы (SUBROUTINE). Общий термин - процедура (PROCEDURE). Дык вот, таки функции имеют возвращаемое значение, процедуры - нет.
Любую процедуру (как функцию, так и подпрограмму) можно объявить PURE. Контроль на отсутствие побочных эффектов. Принято объявлять чистыми функции, а подпрограммы использовать для изменения состояния (императивный язык всё-таки).
При такой дисциплине наличие ключевого слова CALL в тексте программы крайне полезно. Позволяет однозначно идентифицировать место, где могут лежать грабельки.
Вот так. Но это, конечно, не вся история.
Чистые функции необходимы, например, для использования во всяких там FORALL и DO CONCURENT. Есть ещё концепция поэлементной функции (ELEMENTAL). Это функция, которая определяется для обычного скалярного аргумента, но может быть применена для массива таких аргументов любой размерности. Такие функции читсые по-умолчанию. То есть ELEMENTAL подразумевает PURE. Хотя в новом стандарте можно заиметь и ELEMENTAL IMPURE функцию. Ещё все стандартные функции чистые.
А с параметрами там тоже интересно. Указывается т.н. намерение (INTENT). Оно может быть IN, OUT и INOUT...