В мире программирования многие термины укоренились настолько глубоко, что на первый взгляд их происхождение кажется очевидным. Одним из таких терминов является слово «call» — «вызов», когда речь идет о работе с функциями и подпрограммами. Но откуда взялось именно это выражение? Почему не говорят, например, «запуск» или «активация»? Ответ на этот вопрос не так прост и связан с историческими и техническими аспектами развития вычислительной техники и программирования. Изначально слово «call» в английском языке означает «звать», «приглашать», «вызывать». В человеческом общении «call» часто употребляется, когда мы хотим привлечь чье-то внимание, позвать на помощь или обратиться с просьбой.
Интересно, что в программировании этот термин пришел не напрямую из повседневной речи, а через определенные технические аналогии и образные связи. Одно из первых сравнений — представление вызова функции как приглашение друга. Мы «звоним» функции, она «приходит», выполняет свои задачи и возвращает контроль обратно. Эта аналогия помогает понять, что выполнение функции — это временный переход к отдельной задаче с последующим возвратом к основному процессу. Однако исторические свидетельства указывают на более глубокое происхождение «call» из практики библиотек и систем хранения информации.
В библиотеках книгам присваивают «call numbers» — «номера вызова», которые позволяют быстро найти нужный том на складских полках, зачастую скрытых от посетителей. Таким образом, «call number» — это идентификатор, по которому «вызывают» книгу из хранения. Аналогично, в программировании функция изначально представлялась как подпрограмма, хранящаяся в так называемой библиотеке подпрограмм и «вызываемая» по своему адресу или идентификатору. Первое фиксированное упоминание термина «call number» в смысле библиотеки датируется концом XIX века и связано с деятельностью Мелвила Дьюи — известного библиотекаря, создавшего классификацию документов. Это слово использовалось для обозначения уникального кода, по которому можно было запросить нужную книгу, словно «позвать ее» из хранилища.
Переход этого понятия в компьютеры и программирование начался в середине XX века, когда появились первые вычислительные машины и необходимость в повторном использовании кода. В статье Джона У. Мочли «Preparation of problems for EDVAC-type machines» 1947 года уже упоминается идея применения библиотек подпрограмм. Мочли описывал, как подпрограммы хранятся на магнитных лентах и могут быть «вызваны» по номеру для использования при решении задач. Этот процесс смещал внимание на практическую сторону: «вызов» рассматривался как действие получения нужного фрагмента кода из хранилища и его вставки в исполняемую последовательность.
В середине 1950-х годов, вместе с развитием языков ассемблера и высокоуровневых языков программирования, термин «call» стал еще более употребительным. Так, в документации для MANIAC II, одной из ранних вычислительных машин, «call number» обозначал номер подпрограммы, по которому происходил переход к ее выполнению. Несмотря на то, что в машинных командах все еще использовалось понятие «transfer control» (передача управления), идея вызова ассоциировалась со вызовом конкретного «номера» подпрограммы из библиотеки. Ярким переломным моментом стал язык Fortran II, выпущенный в 1958 году и введший ключевые инструкции CALL и RETURN. Именно здесь слово «call» приобрело смысл, близкий к современному — «вызвать подпрограмму».
CALL стал командой, которую программисты писали в коде для передачи управления на подпрограмму, а RETURN возвращал выполнение обратно. Это не только упростило понимание процесса, но и сделало термин знакомым широкому кругу программистов по всему миру. Однако следует подчеркнуть, что даже в Fortran и в последующих языках раннего экземпляра слово «call» первоначально больше отражало действие обращения к подпрограмме на уровне компиляции и ассемблера — то есть вызов из библиотечного хранилища — а не только динамическую передачу управления во время выполнения программы. Со временем, с развитием значения и понимания, термин расширился и зафиксировался именно как обозначение передачи управления к функции или процедуре во время исполнения программы. Параллельно в других языках программирования, таких как Algol и JOVIAL, появлялась схожая терминология.
В некоторых случаях термин «call» использовался как существительное для обозначения процесса или момента работы процедуры, а в других — как глагол. К 1960-м годам термин уже устоялся как общеупотребительный среди профессионалов и вошел в стандарты документации и обучающих материалов. Интересно также отметить, что более «физический» подход к вызову функций — как к «передаче управления» — первоначально имел большое значение. Сам процесс «перехода» к подпрограмме именно как «передачи» управления, с сохранением состояния и параметров, отражал техническую сложность ранних вычислительных систем. Поэтому использование слова «call» можно рассматривать как метафору для призыва или приглашения отдельного блока к исполнению в рамках общего процесса.
Терминология «call» проникла и в другой жаргон, например, фраза «call stack» (стек вызовов), обозначающая структуру хранения активных вызовов функций во время выполнения программы. Это подчеркивает связь значения слова «call» с механизмами управления программным потоком и памятью. Возвращаясь к современному программированию, смысл слова «call» приобрел универсальность и удобство. Оно закрепилось не только в английском языке, но и в других языках программирования по всему миру, адаптировалось в лексикон русскоязычных специалистов и стало ключевым элементом разговоров о структуре программ, взаимодействии компонентов и управлении процессом. Таким образом, «вызов функции» — это не просто технический термин, а результат длительной исторической и технологической эволюции.
Сначала связанный с использованием книг и библиотек, он перешел в описание обращения к подпрограммам и функций на самых ранних вычислительных устройствах. Позже, с развитием языков программирования, термин получил современное значение, отражающее действия программиста и машины по временному переключению и выполнению определенного кода. Понимание этого происхождения помогает лучше осознавать логику работы компьютеров и той терминологии, которая используется повсеместно в цифровом мире. Это еще один пример того, как человеческий язык и технология взаимосвязаны, обмениваются метафорами и опытом, создавая удобные и живые средства общения между специалистами разных поколений.