4'ункторы
Внесение отладочного кода по ходу дела
Почему функции в C++ требуют меньшего количества аргументов
Возникновение функций
В XIX веке работу вычислителей, т. е. компьютеров (computer буквально означает "вычислитель", — прим. перев.) выполняли люди. В особенности это относилось к бухгалтерам и математикам — недаром именно одному из них, Чарльзу Бэббиджу (Charles Babbage) пришла в голову идея использования механических счетных устройств вместо медленного, утомительного и ненадежного вычисления вручную.
В сороковых годах компьютеры работали на вакуумных лампах и рассчитывали траектории ракет. В то время использовались обыкновенные двухпозиционные переключатели, а программирование осуществлялось при помощи перфокарт. Именно на этой стадии прогресс дошел до двоичных чисел и бумажных распечаток.
Фильмы тех лет показывают программистов как математиков в белых халатах, роющихся в кипах листингов с бесконечными колонками двоичных чисел. И эти ранние программисты сотворили маленькое чудо, изобретя мнемонику для двоичных инструкций. Это стало первым шагом в укрупнении языковых конструкций: обозначение двоичных чисел эквивалентными псевдословами. Так из машинного языка произошел язык ассемблера.
На этом процесс не остановился. Следующим шагом были придуманы макросы, призванные упростить написание программ за счет наиболее часто встречающихся фрагментов кода. Макросы (макроопределения) представляют из себя символическое имя, за которым стоит некий логически цельный (как правило) набор инструкций. В тех местах программ, где должны встречаться подобные фрагменты, подставляются их имена, которые при компиляции автоматически подменяются соответствующими последовательностями команд. Макросы и поныне активно используются в ассемблере, а С и C++ также поддерживают макросы посредством директивы препроцессора ftdefine.
Поскольку при использовании макросов происходит простое механическое замещение их имен соответствующими фрагментами кода, то получается, что при таком подходе наиболее популярные макроопределения (которые могут встречаться в крупных программах сотнями) многократно тиражируются в теле программы, приводя к непомерному распуханию исполняемого кода. К счастью, на этой стадии прогресс тоже не остановился. Для решения проблемы достаточно было привязать блоки кода к определенному месту в памяти и обеспечить механизм передачи им управления в нужный момент. Так, собственно, и появились функции.