Каковы конкретные значения терминов: функции, методы, процедуры и подпрограммы?


11

Мне интересно, каковы конкретные различия в терминологии, которую мы используем для группировки связанных частей кода. Я иногда видел термины, используемые взаимозаменяемо: во многих ОО-языках даже используется ключевое слово «функция» для определения метода. (Почему?)

Если вы хотите быть точным, каковы конкретные значения каждого? Или это просто то, что каждый язык выбирает, чтобы называть это?


Мне известны только два языка, которые используют functionметоды: JavaScript и PHP. Оба используют одно и то же ключевое слово для не-методов (свободных функций), и в случае JavaScript на самом деле нет различия между функциями и методами, по крайней мере, не на уровне языка.

Примеры: в VB.Net Subесть Functionбез возвращаемого значения. У Pythonвас может быть функция, которая не является частью какого-либо класса, поэтому это не метод. Вы также можете объявлять функции внутри функций, и вы можете делать это и в C #. Иногда они имеют разные названия по той же причине, что и яблоки и ананасы: потому что они разные.
Работа

Что вы нашли до сих пор, что заставляет вас думать, что есть расхождение?
JeffO

Ответы:


20
  • подпрограмма, подпрограмма
    "подпрограмма", вероятно, происходит из ассемблера. Некоторые процессоры содержат инструкции для поддержки подпрограмм как способа организации кода и повторного использования общих разделов кода. Например, процессор 6502 имел инструкции JSR (переход к подпрограмме) и RTS (возврат из подпрограммы). Я помню, что он также широко использовался в структурном программировании, в котором программа представляет собой иерархию блоков кода, которые иногда назывались подпрограммами или подпрограммами. ИМО, это наиболее общие термины для некоторой единицы кода, которой временно передается управление для выполнения данной задачи.

  • функция, процедура
    Они часто используются взаимозаменяемо, но в некоторых языках есть различие. В Паскале функция - это подпрограмма, которая возвращает значение, а процедура - это подпрограмма, которая не возвращает. В C и связанных языках каждая подпрограмма имеет тип возвращаемого значения (даже если он есть void), поэтому нет никаких различий.

  • Метод, функция-член
    Это два имени для одной и той же вещи - по сути, функции, связанной с данным классом или объектом.

  • оператор
    Каждый язык имеет набор встроенных операторов. В некоторых языках, таких как C ++, операторы - это функции, которые могут быть переопределены (то есть заменены) и / или перегружены (то есть определены для новых типов).

  • анонимная функция
    Это относится к функции без имени. Анонимные функции - это, по сути, блоки кода, которые можно назначать переменным или передавать в качестве параметров для последующего использования, например, в качестве процедуры завершения.

  • закрытие, лямбда-выражение, блок
    Закрытие - это кусок кода, который связан с набором переменных. Я думаю о замыканиях как о анонимных функциях плюс контекст.


4
Не все языки поставляются со встроенными операторами. Некоторые, такие как Scheme и Haskell, просто позволяют вам определять функции с именами вроде '+' или '>> ='. Кроме того, вам, вероятно, следует добавить, что в некоторых языках (например, в Scheme) «function» подразумевает ссылочную прозрачность (например, она всегда возвращает одно и то же значение для одного и того же ввода без побочных эффектов), а процедура - нет. В противном случае отличный ответ.
Тихон Джелвис

Насколько я помню, «операторы» использовались в основном для функций с двумя аргументами. Они были инфиксными (оператор между аргументами:) 2 + 2. Есть небольшие исключения, такие как 1-arg, как ++arg(префикс) или arg++(постфикс). Хотя я не видел много постфиксных операторов ..
Дарек Нендза

-1

Это зависит от языков, что вы можете сделать с ними

  • тебе нужно различие
  • есть ли различие в синтаксисе, или это просто удобство, когда речь идет о коде

AFAIK, в Basic, если вы вызываете что-то, что ничего не возвращает, но выполняет работу с побочными эффектами, такими как печать, запись в файл или изменение глобальной переменной, это называется процедурой.

Если он что-то возвращает, это называется функцией.

В ООП-языке, таком как Java, я редко встречал термин «функция», но «метод», и было сказано, что функции - это вещи, которые являются глобальными и могут быть вызваны каждым.

В функциональной и OOP-языке scala метод не называется функцией, но вы можете передать такую ​​вещь другому методу, и тогда он станет функцией.

Подпрограмма - это подпрограмма, которая, на мой взгляд, вызывается другой подпрограммой.

Таким образом, я не думаю, что есть краткое определение для всех языков и тем более парадигм. Вы должны учитывать конкретную культуру, в которой вы находитесь, если вы используете эти термины - возможно, вам следует сначала ввести свое определение.


-1

Я бы сказал, что в зависимости от контекста все эти слова могут означать одно и то же или совершенно разные вещи, например, то, что написал Калеб (но есть и другие, то есть языки, где операторы являются первоклассными функциями и т. Д.). Таким образом, трудно дать конкретное определение, и разумно не принимать слишком много, если контекст (язык программирования) не известен.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.