Назад На главную Вперед

Процедуры и функции.


   
В своем рассказе я очень часто буду говорить о процедурах и функциях. Чтобы не было никаких недомолвок, давайте расставим все точки над i, хотя философы утверждают, что всего сложнее исправить именно эту точку.
   В старые времена специалисты говорили: чтобы не нарушать логическую целостность программы нужно ее части, которые могут вызываться не один раз, выделять в отдельные блоки, организовывать подпрограммки и обращаться к ним по мере необходимости.
   В ассемблере есть для этого специальная конструкция Call - ret. А в других языках программирования для этого использовали Goto, который сейчас очень сильно ругают за нарушение им той самой структурной целостности.
   На помощь пришли процедуры и функции. Сначала о процедурах. Нет не о медицинских, а о программистских. Это все тот же блок (кусок) программы, который представляет собой логически законченную структуру, выполняет какакое-либо действие и может вызываться в программе неоднократно.  Берут блок выделяют его, дают ему имя и вызывают его, ставшего процедурой по присвоенному ему имени. Вот и все хитрости.
    Почему ее стали так называть? Да кто ж его знает, ведь в BASIC они до сих пор так и обозначаются SUB от Subroutine - подпрограмма.
   А что же функция? В отличии от процедуры, результатом работы которой обычно является выполнение чего либо: записал, вывел, подсчитал; функция еще из начал алгебры вычисляла какое то значение исходя из ее аргументов. То есть принято считать, что функция всегда возвращает программе, которая ее вызывает какое то значение. Ну чего тут не понять? Имеем угол - получаем его синус. Передаем функции строку символов, а она нам возвращает число, которое этими символами записано.
   В старом, добром, строгом, педантичном Паскале так оно и было. А "лихой" парень Си сказал: каждый, кто что то сделал, должен сообщить о результатах своей работы. В Си нет процедур, одни функции.
   Но на то он и "лихой", в его функциях могут отсутствовать, как аргументы, то есть исходные параметры так и возвращаемый результат. Нет, возвращать то функция что то должна, но в ней оговаривается, что вернет она void: то есть неопределенный тип, не мышонка, не лягушку. Вот тебе и функция.
   А Паскаль разве хуже, он тоже начал "выпендриваться". Если при вызове процедуры ее параметр объявить, как Var - (переменная), то после отработки процедуры этим параметром можно воспользоваться, то есть он может быть результатом работы процедуры. Значит процедура вернет нам после своей работы какое то значение. И что же тогда ее отличает от функции? И потом, кто запретил нам использовать как в процедурах так и в функциях глобальные переменные с которыми можем делать вообще что захотим. Короче полная неразбериха. Все чаще и чаще процедуры и функции опять называют подпрограммами и, наверное, это правильно.
 


Другая информатика. (C) Публикация на draginf.ru. При использовании материалов ссылка на сайт обязательна.