“기능”과“절차”의 차이점은 무엇입니까?


203

일반적으로 우리 는 프로그래밍 언어 의 기능 이나 절차 에 대해 듣습니다 . 그러나 나는이 용어를 거의 상호 교환 가능하게 사용한다는 것을 알았습니다 (아마도 매우 잘못되었을 수 있습니다).

그래서 내 질문은 :

기능, 목적 및 사용 측면에서 차이점은 무엇입니까?

예를 들어 주시면 감사하겠습니다.



6
SICP가이 점을 잘 알고 있다고 생각합니다. 함수는 수학에만 존재하며 지식이 무엇인지 나타냅니다 . 절차는 프로그래밍 언어 (기능적 언어 포함)로 존재하며 지식 방법을 나타냅니다 . 기능 : sqrt (x) = y ^ 2 = x와 같은 y 절차 : (define (sqrt x) (newtons-method (lambda (y) (- (square y) x)) 1.0)).
mk12

답변:


295

함수는 값을 반환하고 프로시 저는 명령을 실행합니다.

이름 함수는 수학에서 나옵니다. 입력을 기준으로 값을 계산하는 데 사용됩니다.

프로시 저는 순서대로 실행될 수있는 명령 세트입니다.

대부분의 프로그래밍 언어에서 함수조차도 일련의 명령을 가질 수 있습니다. 따라서 차이는 값을 반환하는 부분에만 있습니다.

그러나 함수를 깨끗하게 유지하려면 (기능 언어 만 살펴보십시오) 함수에 부작용이 없는지 확인해야합니다.


명령형 (java, c) 또는 선언적 언어 (scala, scheme)에서 부작용을 어떻게 방지 할 수 있습니까?
orlybg

1
@orlybg는 선언적 언어에서 일관성은 언어 구현에서 비롯됩니다. 범위 제한으로 인해 부작용이 발생하지 않습니다. 반면, 명령형 언어는 부작용을 명시 적으로 활용합니다. 부작용이 항상 나쁜 것은 아닙니다.
Tharindu Rusira

나는 다음과 같은 에이다 튜토리얼 (읽고 있어요 goanna.cs.rmit.edu.au/~dale/ada/aln/8_subprograms.html 해당 페이지의 두 번째 단락은 에이다의 절차 파스칼과 유사하다 "로 시작) 프로시 저는 리턴 문을 포함 할 수 있습니다. " 텍스트에 오류가 있습니까? 아니면 return 문을 사용할 수 있지만 값을 반환하지 않는다는 의미입니까?
jviotti

3
파스칼에서 프로 시저에는 리턴 문이없고 함수 만 있습니다. 텍스트에 오류가 있어야합니다. 그러나 프로 시저에는 "exit"문이있을 수 있으며, 인수없이 "return"문으로 작동 할 수 있습니다. 이는 반환 값이 없음을 의미합니다.
Eric Fortier

함수는 입력을 받고 출력 만 반환 할 수 있습니다. 프로 시저 또는 매크로는 입력을 얻을 수 있으며 데이터를 리턴하지 않고 여러 명령문 만 실행합니다. 주요 차이점은 프로 시저가 모든 데이터 유형을 리턴 할 수 없다는 것입니다.
EsmaeelE

42

상황에 따라 다릅니다.

파스칼과 같은 언어에서 함수와 프로시 저는 값을 반환하는지 아닌지에 따라 다른 엔티티입니다. 그들은 다르게 행동한다. 언어 구문 (예 : 프로시 저는 양식 문을 호출합니다. 표현식 내에서는 프로 시저 호출을 사용할 수 없습니다. 함수 호출은 문을 구성하지 않습니다. 다른 문에서 사용해야합니다). 따라서 파스칼 품종 프로그래머는 이들을 구별합니다.

C와 같은 언어와 다른 많은 현대 언어에서 이러한 차이는 사라졌습니다. 정적으로 유형이 지정된 언어에서 프로시 저는 재미있는 반환 유형을 가진 함수일뿐입니다. 이것이 아마도 상호 교환 적으로 사용되는 이유 일 것입니다.

기능적 언어에서는 일반적으로 프로 시저와 같은 것은 없습니다. 모든 것이 기능입니다.


프로그래밍 언어의 문서화는 원하는대로 함수와 프로 시저를 호출 할 수 있습니다. 사람들은 그 이름의 배경이 오래 전에 사라졌기 때문에 어떤 이름이든 받아 들일 수 있기 때문입니다.
Arne Babenhauserheide

18

C의 예 :

// function
int square( int n ) {
   return n * n;
}

// procedure
void display( int n ) {
   printf( "The value is %d", n );
}

C 표준은 절차에 대해서만 언급하지 않으며 기능 만 수행합니다.


4
... C 표준은 절차에 대해서만 언급하지 않고 기능 만 수행합니다. 기능 만 있기 때문입니다. 아무것도 반환하지 않는 함수는 void function입니다. Kernighan & Ritchie Ch 1.7 : "C에서 함수는 포트란의 서브 루틴 또는 함수 또는 파스칼의 프로 시저 또는 함수와 같습니다." 다시 말해서 ...이 대답은 틀 렸습니다.
Mogsdad

8
정답은 틀린 것이 아니며 순수한 기능과 절차의 차이점에 대한 좋은 예입니다. K & R은 모든 서브 루틴을 사물을 단순하게 유지하기위한 "함수"라고 불렀지 만 부작용이있는 서브 루틴은 사실 수학의 정식적인 의미에서 "함수"가 아니라 "절차"입니다. 실제 함수와 프로 시저를 구별하면 C가 더 나은 언어 일 수 있습니다. 이는 정적 분석, 성능 최적화 및 병렬화에 도움이됩니다.
Sam Watkins

12

일반적으로 절차는 일련의 지침입니다.
함수는 동일 할 수 있지만 일반적으로 결과를 반환합니다.


11

다른 곳에서 호출 할 수있는 매개 변수화 된 코드를 나타내는 서브 루틴 또는 서브 프로그램 이라는 용어 가 있습니다.

기능과 절차는 그것들의 구현입니다. 일반적으로 함수는 값을 반환하고 프로시 저는 아무것도 반환하지 않습니다.


6

기본 차이점

  • 함수는 값을 반환해야하지만 저장 프로 시저에서는 선택 사항입니다. 프로시 저는 0 또는 n 값을 반환 할 수 있습니다 .
  • 함수는 입력 매개 변수 만 가질 수있는 반면, 프로시 저는 입력 / 출력 매개 변수를 가질 수 있습니다.
  • 함수의 경우 하나의 입력 매개 변수를 사용해야하지만 저장 프로시 저는 0- n 개의 입력 매개 변수 를 사용할 수 있습니다 .
  • 함수는 프로 시저에서 호출 할 수 있지만 프로시 저는 함수에서 호출 할 수 없습니다.

고급 차이점

  • 프로 시저에서 try-catch 블록으로 예외를 처리 할 수있는 반면 try-catch 블록은 함수에서 사용할 수 없습니다.
  • 트랜잭션 관리는 프로 시저에서 할 수 있지만 기능에서는 할 수 없습니다.

SQL에서 :

  • 프로 시저가 있습니다 SELECTDML (뿐만 아니라 INSERT, UPDATE, DELETE기능 만 허용하는 반면, 거기에) 문 SELECT안에 문을.
  • SELECT명령문에는 프로 시저를 사용할 수 없지만 명령문에는 함수를 임베드 할 수 있습니다 SELECT.
  • 저장 프로시 저는 WHERE(또는 a HAVING또는 SELECT) 블록의 어느 곳에서나 SQL 문에서 사용할 수 없지만 함수는 사용할 수 있습니다.
  • 테이블을 반환하는 함수는 다른 행 집합으로 취급 될 수 있습니다. JOIN다른 테이블과 함께 블록에 사용할 수 있습니다 .
  • 인라인 함수는 매개 변수를 사용하는 뷰로 생각할 수 있으며 JOIN블록 및 기타 행 집합 작업에 사용할 수 있습니다 .

3
이 답변은 언어에 따라 다르지만 질문은 언어에 구애받지 않았습니다. 여기에 언급 된 내용이 일반적인 경우에 모두 해당되는 것은 아니지만 주장하는 언어 나 환경을 명확히하면 도움이됩니다.
Mogsdad

5

더 엄격하게, 함수 f는 x = y 인 경우 f (x) = f (y)라는 속성을 따릅니다. 즉 , 동일한 인수로 호출 될 때마다 동일한 결과를 계산 하므로 (따라서 상태를 변경하지 않습니다. 체계.)

따라서 rand () 또는 print ( "Hello") 등은 함수가 아니라 절차입니다. sqrt (2.0)는 함수 여야하지만, 호출 횟수와 상관없이 관찰 가능한 효과 나 상태 변경은 없으며 항상 1.41과 일부를 반환합니다.


3
이 사용법은 "기능적"프로그래밍의 맥락에서 관련이 있습니다. 서브 프로그램을 "함수"라고하는 많은 (종종 필수) 언어에는이 특성이 필요하지 않습니다.
dmckee --- ex-moderator 고양이

1
프로그래밍 언어에는이 속성이 필요하다고 제안하지 않았습니다. 어쨌든, 어떤 언어로든 엄격한 기능을 작성할 수 있으며, 깨끗한 기능으로 가능한 한 많이 프로그램을 한 다음 몇 가지 주요 절차와 함께 조각을 붙이는 것이 좋은 습관이라고 생각합니다.
Ingo

4

여기서 우리가 언어에 구애받지 않는 경우, 절차는 일반적으로 특정 결과를 신뢰성 있고 dem 등적으로 달성하는 데 필요한 일련의 행동을 지정합니다. 즉, 절차는 기본적으로 알고리즘입니다.

반면에 함수는 더 큰 프로그램 내에서 다소 독립적 인 코드입니다. 다시 말하면 함수는 프로 시저의 구현입니다.


4

이것은 잘 알려진 오래된 질문이지만 현대 프로그래밍 언어 연구 및 디자인에 대한 더 많은 통찰력을 공유하고 싶습니다.

기본 답변

전통적으로 ( 구조화 된 프로그래밍 의 의미에서 ) 비공식적으로, 절차 는 "입력"을 가지고 프로그램 가능한 무언가를 수행하기 위해 재사용 가능한 구조적 구조입니다. 프로 시저 내에서 무언가를 수행해야하는 경우 소스 코드로 코딩 된 프로 시저 호출 (일반적으로 표현식의 종류) 및 프로 시저 본문에 제공된 조치 (제공된 )에서 프로 시저에 대한 실제 인수 를 제공 할 수 있습니다. 프로 시저 정의 에서)는 본문에서 사용되는 (형식) 매개 변수 로 인수를 대체하여 실행됩니다 .

함수 했으므로 절차보다 리턴 값은 또한 몸의 "출력"으로 지정 될 수있다. 함수 호출은 구문 적으로 (일반적으로 다른 표현식의 하위 표현식으로) 함수 호출 결과를 사용할 수 있다는 점을 제외하고 프로 시저 호출과 다소 비슷합니다.

전통적으로 함수 호출이 아닌 프로 시저 호출은 출력에 관심이 없어야 함을 나타 내기 위해 사용되며 호출이 작동하지 않는 것을 피하기 위해서는 부작용 이 있어야 하므로 명령 프로그래밍 패러다임을 강조합니다 . Pascal과 같은 많은 전통적인 프로그래밍 언어는 이러한 의도적 인 스타일 차이를 구별하기 위해 "프로 시저"와 "기능"을 모두 제공합니다.

(위에서 언급 한 "입력"과 "출력"은 함수의 구문 특성에 따라 단순화 된 개념입니다. 많은 언어는 참조 / 공유를 통해 매개 변수에 인수를 전달하여 사용자가 호출 중에 인수로 인코딩 된 정보를 전달할 수 있도록 지원합니다. 이러한 매개 변수는 "입력 / 출력 매개 변수"라고도합니다.이 기능은 호출에 전달되는 객체의 특성을 기반으로하며 이는 프로 시저 / 함수 기능의 속성과 직교합니다.)

그러나 함수 호출의 결과가 필요하지 않은 경우 (적어도 논리적으로) 무시할 수 있으며 함수 정의 / 함수 호출은 이런 방식으로 프로 시저 정의 / 프로 시저 호출과 일치해야합니다. C, C ++ 및 Java와 같은 ALGOL과 같은 언어는 모두 이러한 방식으로 "함수"의 기능을 제공합니다. 결과 유형 void을 전통적인 프로 시저처럼 보이는 특수한 경우의 함수로 인코딩하여 "절차의 기능을 제공 할 필요가 없습니다. "별도로. 이것은 언어 디자인에 약간의 팽창을 방지합니다.

SICP가 언급되었으므로 R n RS에 의해 지정된 Scheme 언어 에서 프로시 저는 계산 결과를 반환하거나 반환하지 않아도됩니다. 이것은 전통적인 "기능"(결과 반환)과 "절차"(아무 반환)의 결합으로, 많은 ALGOL과 유사한 언어의 "기능"개념과 본질적으로 동일합니다 (실제로 호출하기 전에 피연산자). 그러나 SRFI-96 과 같은 규범적인 문서에서도 구식 차이가 여전히 발생합니다 .

나는 발산의 정확한 이유에 대해 많이 알지 못하지만, 경험 한 것처럼 언어 디자이너는 요즘 사양 부풀림없이 더 행복해질 것 같습니다. 즉, 독립형 기능인 "프로 시저"는 필요하지 않습니다. void유형 과 같은 기술 은 부작용을 강조해야하는 용도를 표시하기에 이미 충분합니다. 이것은 수십 년 이상 동안 인기가있는 C 유사 언어에 대한 경험이있는 사용자에게도 더 자연 스럽습니다. 또한 "프로 시저"가 실제로 "기능"인 R n RS 와 같은 경우에는 당황하지 않습니다.

이론적 으로는 함수 호출 결과의 유형 으로 지정된 단위 유형 으로 함수를 지정하여 결과가 특별 함을 표시 할 수 있습니다. 이것은 전통적인 절차 (통화 결과에 관심이없는)를 다른 절차와 구별합니다. 언어 디자인에는 다양한 스타일이 있습니다.

  • R n RS에서와 같이, 관심없는 결과를 "언급되지 않은"값 (언어에서 언급해야하는 경우 지정되지 않은 유형)으로 표시하면 무시해도됩니다.
  • 전용 유닛 타입의 값과 무관 결과를 지정 (예를 들어 커널 의가 #inert)도 작동한다.
  • 해당 유형이 최하위 유형 인 경우 (정말 적으로) 정적으로 확인되고 표현식 유형으로 사용되는 것을 방지 할 수 있습니다. voidALGOL과 유사한 언어 의 유형은이 기술의 예입니다. ISO C11 _Noreturn은 이와 유사하지만 더 미묘합니다.

추가 자료

수학에서 파생 된 전통적인 개념으로, 대부분의 사람들이 알지 못하는 수많은 흑 마법 이 있습니다. 엄밀히 말하면 수학 책에 따라 모든 것을 명확하게 알 수는 없습니다. CS 서적도 큰 도움이되지 않을 수 있습니다.

프로그래밍 언어와 관련하여 몇 가지주의 사항이 있습니다.

  • 다른 수학 분기의 함수가 항상 동일한 의미로 정의되는 것은 아닙니다. 다른 프로그래밍 패러다임의 함수도 상당히 다를 수 있습니다 (때로는 함수 호출의 구문이 비슷하게 보일 수도 있음). 때때로 차이를 일으키는 이유는 동일하지만 때로는 그렇지 않습니다.
    • 수학 함수로 계산을 모델링 한 다음 프로그래밍 언어로 기본 계산 을 구현 하는 것은 관용적 입니다. 무엇을 말하고 있는지 알지 못하는 한, 일대일로 매핑하지 않도록주의하십시오.
  • 모델을 모델링 할 엔티티와 모델을 혼동하지 마십시오.
    • 후자는 전자에 대한 구현 중 하나 일뿐 입니다. 상황 (예 : 관심있는 수학의 분기)에 따라 둘 이상의 선택이있을 수 있습니다.
    • 특히,이 같은 치료 자연수에 "매핑"또는 직교 제품의 하위 집합으로 치료 "기능"에 다소 유사 말도 폰 - 노이만 서수의 인코딩 (의 무리처럼 보이는 {{{}}, {}}...) 일부 제한된 상황 외에 .
  • 수학적으로 함수는 부분적 이거나 총계 일 수 있습니다 . 여기서는 프로그래밍 언어마다 처리 방식이 다릅니다.
    • 일부 함수형 언어는 함수 호출 내의 계산이 항상 유한 한 단계로 종료되도록 보장하기 위해 전체 함수를 존중할 수 있습니다 . 그러나 이것은 본질적으로 Turing-complete가 아니기 때문에 계산 표현력이 약하고 타입 검사의 의미 (총체적 인 것으로 예상 됨) 외에 범용 언어에서는별로 보이지 않습니다.
    • 절차와 기능의 차이가 큰 경우 "전체 절차"가 있어야합니까? 흠 ...
  • 일반 계산프로그래밍 언어의 의미론 (예 : 람다 계산의 람다 추상화) 을 모델링하는 데 사용되는 계산의 함수와 유사한 구문은 피연산자에 대해 다른 평가 전략 을 가질 수 있습니다 .
    • 전통적으로 순수한 기능적 언어 의 표현 평가뿐만 아니라 순수한 미적분의 감소 는 계산 결과를 변경하는 부작용이 없습니다. 결과적으로 피연산자는 함수와 같은 구문의 본문 전에 평가할 필요가 없습니다 ( "동일한 결과"를 정의하는 고정 변수 가 Church-Rosser 속성에 의해 보장 된 β- 등가 와 같은 속성에 의해 유지되기 때문에 ).
    • 그러나 많은 프로그래밍 언어가 식을 평가하는 동안 부작용이있을 수 있습니다. 같은 것을 의미 엄격한 평가 전략 과 실용적 평가 와 같은 비 엄격한 평가 것과 동일하지 않습니다 호출별로 필요 . 구별이 없으면 함수와 같은 (즉, 인수와 함께) 매크로를 (전통적인) 함수와 구별 할 필요가 없기 때문에 이것은 중요합니다. 그러나 이론의 취향에 따라 이것은 여전히 ​​인공물이 될 수 있습니다. 넓은 의미에서 기능 적인 매크로 (특히 위생적인 매크로 ) 불필요한 제한 (구문 단계) 이있는 수학 함수입니다. 제한이 없다면 (일류) 함수형 매크로를 프로 시저로 취급하는 것은 제정신이 아닐 수 있습니다 ...
    • 이 주제에 관심이있는 독자는 최신 추상화를 고려하십시오 .
  • 절차는 일반적으로 전통적인 수학의 범위를 벗어난 것으로 간주됩니다. 그러나 계산 프로그래밍 언어 프로그래밍 시맨틱과 현대 프로그래밍 언어 디자인에는 계산 가능한 프로그래밍 개념과 함께 "호출 가능"특성을 공유하는 관련 개념이 상당히 많이 존재할 수 있습니다. 그중 일부는 프로 시저 / 기능을 구현 / 확장 / 교체하는 데 사용됩니다. 더 미묘한 차이가 있습니다.

3

대부분의 상황에서 함수는 값을 반환하지만 프로시 저는 그렇지 않습니다. 둘 다 동일한 작업을 수행하기 위해 함께 그룹화 된 코드 조각입니다.

함수형 프로그래밍 컨텍스트 (모든 함수가 값을 반환하는 경우)에서 함수는 추상 객체입니다.

f(x)=(1+x)
g(x)=.5*(2+x/2)

여기서 f는 g와 동일한 기능이지만 다른 절차입니다.


3

내부 프로 시저에서는 DML (삽입 / 업데이트 / 삭제) 문을 사용할 수 있지만 내부 함수에서는 DML 문을 사용할 수 없습니다.

프로시 저는 입력 / 출력 매개 변수를 모두 가질 수 있지만 기능은 입력 매개 변수 만 가질 수 있습니다.

저장 프로 시저에서 Try-Catch 블록을 사용할 수 있지만 기능상 Try-Catch 블록을 사용할 수 없습니다.

Select 문에서는 저장 프로 시저를 사용할 수 없지만 기능에서는 Select 문에서 사용할 수 있습니다.

저장 프로시 저는 0 또는 n 개의 값 (최대 1024)을 반환 할 수 있지만 함수는 필수 값인 1 개의 값만 반환 할 수 있습니다.

저장 프로시 저는 함수에서 호출 할 수 없지만 저장 프로 시저에서 함수를 호출 할 수 있습니다.

저장 프로 시저에서 트랜잭션을 사용할 수 있지만 기능상 트랜잭션을 사용할 수 없습니다.

Where / Having / select 섹션의 어디에서나 SQL 문에서 Stored Procedure를 사용할 수는 없지만 In 함수를 사용할 수는 있습니다.

스토어드 프로 시저에 참여할 수 없지만 함수에 참여할 수 있습니다.

자세한 내용은 여기를 클릭하십시오 ... http://dotnet-developers-cafe.blogspot.in/2013/08/difference-between-stored-procedure-and.html


2
이 답변은 언어에 따라 다르지만 질문은 언어에 구애받지 않았습니다. 여기에 언급 된 내용이 일반적인 경우에 모두 해당되는 것은 아니지만 주장하는 언어 나 환경을 명확히하면 도움이됩니다.
Mogsdad

이 답변은 대다수의 프로그래밍 언어에 대해 완전히 틀립니다. 프로 시저에는 입력 매개 변수 만 있고 함수에는 입력 및 출력이 있습니다.
AStopher

2

함수는 값을 반환하고 프로시 저는 명령을 실행합니다.

이름 함수는 수학에서 나옵니다. 입력을 기준으로 값을 계산하는 데 사용됩니다.

프로시 저는 순서대로 실행될 수있는 명령 세트입니다.

대부분의 프로그래밍 언어에서 함수조차도 일련의 명령을 가질 수 있습니다. 따라서 차이는 값을 반환하는 부분에만 있습니다.

그러나 함수를 깨끗하게 유지하려면 (기능 언어 만 살펴보십시오) 함수에 부작용이 없는지 확인해야합니다.


1

함수는 sql 문 내에서 사용할 수 있지만 프로시 저는 sql 문 내에서 사용할 수 없습니다.

Insert, Update 및 Create 문은 함수에 포함될 수 없지만 프로시 저는 이러한 문을 가질 수 있습니다.

프로시 저는 트랜잭션을 지원하지만 기능은 트랜잭션을 지원하지 않습니다.

함수는 하나의 값만 리턴해야하지만 (OUT 변수는 다른 값을 리턴 할 수 있음) 프로시 저는 많은 데이터 세트 및 리턴 값을 리턴합니다.

기능과 절차 모두의 실행 계획이 캐시되므로 두 경우 모두 성능이 동일합니다.


1

나는이 답변의 대부분에서 계속해서보고있는 무언가로 이의를 제기합니다. 함수를 함수로 만드는 것은 값을 반환한다는 것입니다.

함수는 값을 반환하는 오래된 방법이 아닙니다. 그렇지 않습니다 : 메소드가 실제 함수가 되려면 항상 특정 입력이 주어지면 동일한 값을 반환해야합니다. 함수가 아닌 메소드의 예는 random대부분의 언어 에서 메소드입니다. 값을 리턴하더라도 값이 항상 같지는 않기 때문입니다.

따라서 함수는지도와 더 유사합니다 (예 : x -> x'1 차원 함수의 경우). 이것은 실제 함수를 다룰 때 타이밍과 함수가 평가되는 순서가 항상 함수가 아닌 경우가 아니기 때문에 중요하지 않기 때문에 이는 정규 메소드와 함수 사이의 매우 중요한 차이점입니다.

다음은 함수는 아니지만 여전히 값을 반환하는 메서드의 다른 예입니다.

// The following is pseudo code:
g(x) = {
  if (morning()) {
     g = 2 * x;
  }
  else {
   g = x;
  }
  return g;
}

또한 절차가 값을 반환하지 않는다는 개념에 반대합니다. 프로시 저는 함수 나 메소드에 대해 이야기하는 구체적인 방법입니다. 따라서 프로 시저가 정의하거나 구현하는 기본 메소드가 값을 리턴하면 해당 프로 시저가 값을 리턴하는 것을 추측하십시오. SICP 의 다음 스 니펫을 예로 들어 보겠습니다 .

// We can immediately translate this definition into a recursive procedure 
// for computing Fibonacci numbers:

(define (fib n)
  (cond ((= n 0) 0)
        ((= n 1) 1)
        (else (+ (fib (- n 1))
                 (fib (- n 2))))))

최근에 재귀 절차에 대해 들어 보셨습니까? 그들은 재귀 함수 (실제 함수)에 대해 이야기하고 있으며 값을 반환하고 "프로 시저"라는 단어를 사용하고 있습니다. 그렇다면 차이점은 무엇입니까?

함수를 생각하는 또 다른 방법 (위에서 언급 한 의미 외에)은 숫자 1과 같은 이상을 추상적으로 표현한 것입니다. 절차는 그 일의 실제 구현입니다. 나는 개인적으로 그것들이 상호 교환 가능하다고 생각합니다.

(내가 제공하는 링크에서 해당 장을 읽으면 이해하기 어려운 개념이 함수와 절차의 차이가 아니라 프로세스와 절차의 차이라는 것을 알 수 있습니다. 재귀 절차에는 반복 과정?)

절차에 대한 아날로그는 레시피입니다. 예를 들어; make-pies이 기계라고 불리는 기계가 재료 를 가지고 있다고 가정 하고이 기계가를 (fruit, milk, flower, eggs, sugar, heat)반환 한다고 가정합니다 pie.

이 기계의 표현은 다음과 같습니다

make-pies (fruit, milk, flower, eggs, sugar, heat) = {
   return (heat (add fruit (mix eggs flower milk)))
}

물론 파이를 만드는 유일한 방법은 아닙니다.

이 경우 다음을 볼 수 있습니다.

A       function     is to a     machine
as a    procedure    is to a     recipe
as      attributes   are to      ingredients
as      output       is to       product

그 비유는 괜찮지 만 컴퓨터 프로그램을 다룰 때 모든 것이 추상화라는 것을 고려할 때 세분화됩니다. 따라서 기계에 대한 레시피의 경우와 달리 우리는 추상화 인 두 가지를 비교합니다. 똑같은 것일 수도 있습니다. 그리고 나는 그것들이 (모든 의도와 목적을 위해) 같은 것이라고 주장합니다.


2
주어진 인수에 대해 항상 동일한 값을 반환하는 함수를 "순수 함수"라고합니다. 프로 시저와 함수를 구별하는 대부분의 언어에서 함수는 순수 할 필요는 없으며 "함수"라는 용어는 부작용이있을 수 있고 동일한 인수를 가진 연속 호출에서 다른 결과를 리턴 할 수있는 서브 루틴을 나타내는 데 올바르게 사용됩니다. (C와 같은 언어에서는 값을 반환하지 않는 서브 루틴조차도 "함수"라고 부릅니다.)
Keith Thompson

동의, 그래서 나는 단어가 서로 교환 가능하다는 말을 끝내는 이유입니다.
dkinzer

1
예, 그러나 "함수는 단순히 값을 반환하는 오래된 방법이 아닙니다"라고 말하는 것부터 시작 하는 반면, 많은 언어에서 정확히 기능은 무엇입니까?
Keith Thompson

0

db 의 맥락에서 : 저장 프로시 저는 함수가 아닌 사전 컴파일 된 실행 계획입니다.


0

С # / Java의 관점에서 함수 는 특정 값을 리턴하는 코드 블록이지만, 프로시 저는 void (없음) 를 리턴하는 코드 블록입니다 . C # / Java에서 함수와 프로 시저 둘 다 메소드 라고하는 경우가 더 많습니다 .

    //This is a function
    public DateTime GetCurrentDate()
    {
        return DateTime.Now.Date;
    }

    //This is a procedure(always return void)
    public void LogMessage()
    {
        Console.WriteLine("Just an example message.");
    }

-3

절차 : 1. 절차 는 매개 변수화 된 계산을 정의하는 문장의 모음입니다. 2. 절차는 값을 반환 할 수 없습니다.

3. 프로시 저는 함수에서 호출 할 수 없습니다.

함수 1. 함수는 구조적으로 프로 시저와 비슷하지만 수학 함수에 대한 의미 론적으로 모델링됩니다. 2. 값을 반환 할 수 있습니다. 3. 프로 시저에서 함수를 호출 할 수 있습니다.


3. 프로시 저는 함수에서 호출 할 수 없습니다. 이것이 어떤 언어로되어 있습니까? 이 경험이있는 사람은 아무도 없습니다.
Mogsdad

그건 진실이야. 함수에서 프로 시저를 호출하면 함수가 아닙니다. 어떤 언어가 이것을 시행하는지에 관해서는, 그것은 좋은 질문입니다. 기능적 일 수도 있지만 확실하지 않습니다. 순수한 목록은 기능적입니다 (설정이 없습니다 : 측면에 영향을 미치지 않음).하지만 람다가 있으므로 set을 구현할 수 있습니다. set을 사용하지 않는 컴파일러를 작성할 수 있다면 모든 구현을 감지해야합니다. 언어에서 람다를 제거 할 수는 있지만 더 나쁩니다.
ctrl-alt-delor

아, 방금 언어 C ++을 생각했습니다. const 메소드는 const 메소드를 호출 할 수 없습니다 (정확한 컴파일러 검사가 켜져 있어야하고 해결하기 위해 노력하지 않아도됩니다)
ctrl-alt-delor

-7

프로 시저와 함수는 모두 서브 루틴이며, 프로 시저와 함수의 유일한 차이점은 프로 시저가 여러 값 (또는 적어도 할 수있는)을 반환하는 반면 함수는 하나의 값만 반환 할 수 있다는 것입니다. 일부 프로그래밍 언어는 이러한 규칙을 따르지 않지만 이는 실제 정의입니다.


음 .. 아니야. 절차에는 return아무것도 없습니다 . 부작용에 대해 이야기하고 있습니다 (언어가 허용하는 경우).
Mogsdad

프로시 저는 임의의 양의 값을 리턴 할 수 있으며 그 양은 0
user2766296

부작용은 배열이 있고 가장 큰 값을 찾은 함수 또는 프로 시저에 전달하면 배열은 참조로 전달되며 하위 루틴이 실행 된 후 배열이 정렬된다는 사실입니다. sorted는 부작용이며, 반환 된 값은 배열에서 가장 큰 값입니다
user2766296

나는이 답변을 좋아하고, 여러 가지 다운 보우트를 가진 사람들을 좋아합니다. 왜냐하면 어떤면에서는 역설적으로 너무 인기가 있기 때문에 다운 보테를 줄 것입니다. SQL Server의 저장 프로시 저는 결과 집합 ( "여러 값"이라고 함)을 반환하지만 함수는 하나의 값만 반환 할 수 있습니다 (테이블 반환 함수를 만들 수도 있으므로 매우 정확하지는 않습니다).
Ivanzinho
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.