일반적으로 우리 는 프로그래밍 언어 의 기능 이나 절차 에 대해 듣습니다 . 그러나 나는이 용어를 거의 상호 교환 가능하게 사용한다는 것을 알았습니다 (아마도 매우 잘못되었을 수 있습니다).
그래서 내 질문은 :
기능, 목적 및 사용 측면에서 차이점은 무엇입니까?
예를 들어 주시면 감사하겠습니다.
(define (sqrt x) (newtons-method (lambda (y) (- (square y) x)) 1.0))
.
일반적으로 우리 는 프로그래밍 언어 의 기능 이나 절차 에 대해 듣습니다 . 그러나 나는이 용어를 거의 상호 교환 가능하게 사용한다는 것을 알았습니다 (아마도 매우 잘못되었을 수 있습니다).
그래서 내 질문은 :
기능, 목적 및 사용 측면에서 차이점은 무엇입니까?
예를 들어 주시면 감사하겠습니다.
(define (sqrt x) (newtons-method (lambda (y) (- (square y) x)) 1.0))
.
답변:
함수는 값을 반환하고 프로시 저는 명령을 실행합니다.
이름 함수는 수학에서 나옵니다. 입력을 기준으로 값을 계산하는 데 사용됩니다.
프로시 저는 순서대로 실행될 수있는 명령 세트입니다.
대부분의 프로그래밍 언어에서 함수조차도 일련의 명령을 가질 수 있습니다. 따라서 차이는 값을 반환하는 부분에만 있습니다.
그러나 함수를 깨끗하게 유지하려면 (기능 언어 만 살펴보십시오) 함수에 부작용이 없는지 확인해야합니다.
상황에 따라 다릅니다.
파스칼과 같은 언어에서 함수와 프로시 저는 값을 반환하는지 아닌지에 따라 다른 엔티티입니다. 그들은 다르게 행동한다. 언어 구문 (예 : 프로시 저는 양식 문을 호출합니다. 표현식 내에서는 프로 시저 호출을 사용할 수 없습니다. 함수 호출은 문을 구성하지 않습니다. 다른 문에서 사용해야합니다). 따라서 파스칼 품종 프로그래머는 이들을 구별합니다.
C와 같은 언어와 다른 많은 현대 언어에서 이러한 차이는 사라졌습니다. 정적으로 유형이 지정된 언어에서 프로시 저는 재미있는 반환 유형을 가진 함수일뿐입니다. 이것이 아마도 상호 교환 적으로 사용되는 이유 일 것입니다.
기능적 언어에서는 일반적으로 프로 시저와 같은 것은 없습니다. 모든 것이 기능입니다.
C의 예 :
// function
int square( int n ) {
return n * n;
}
// procedure
void display( int n ) {
printf( "The value is %d", n );
}
C 표준은 절차에 대해서만 언급하지 않으며 기능 만 수행합니다.
void function
입니다. Kernighan & Ritchie Ch 1.7 : "C에서 함수는 포트란의 서브 루틴 또는 함수 또는 파스칼의 프로 시저 또는 함수와 같습니다." 다시 말해서 ...이 대답은 틀 렸습니다.
SELECT
DML (뿐만 아니라 INSERT
, UPDATE
, DELETE
기능 만 허용하는 반면, 거기에) 문 SELECT
안에 문을.SELECT
명령문에는 프로 시저를 사용할 수 없지만 명령문에는 함수를 임베드 할 수 있습니다 SELECT
.WHERE
(또는 a HAVING
또는 SELECT
) 블록의 어느 곳에서나 SQL 문에서 사용할 수 없지만 함수는 사용할 수 있습니다.JOIN
다른 테이블과 함께 블록에 사용할 수 있습니다 .JOIN
블록 및 기타 행 집합 작업에 사용할 수 있습니다 .더 엄격하게, 함수 f는 x = y 인 경우 f (x) = f (y)라는 속성을 따릅니다. 즉 , 동일한 인수로 호출 될 때마다 동일한 결과를 계산 하므로 (따라서 상태를 변경하지 않습니다. 체계.)
따라서 rand () 또는 print ( "Hello") 등은 함수가 아니라 절차입니다. sqrt (2.0)는 함수 여야하지만, 호출 횟수와 상관없이 관찰 가능한 효과 나 상태 변경은 없으며 항상 1.41과 일부를 반환합니다.
이것은 잘 알려진 오래된 질문이지만 현대 프로그래밍 언어 연구 및 디자인에 대한 더 많은 통찰력을 공유하고 싶습니다.
전통적으로 ( 구조화 된 프로그래밍 의 의미에서 ) 비공식적으로, 절차 는 "입력"을 가지고 프로그램 가능한 무언가를 수행하기 위해 재사용 가능한 구조적 구조입니다. 프로 시저 내에서 무언가를 수행해야하는 경우 소스 코드로 코딩 된 프로 시저 호출 (일반적으로 표현식의 종류) 및 프로 시저 본문에 제공된 조치 (제공된 )에서 프로 시저에 대한 실제 인수 를 제공 할 수 있습니다. 프로 시저 정의 에서)는 본문에서 사용되는 (형식) 매개 변수 로 인수를 대체하여 실행됩니다 .
함수 했으므로 절차보다 리턴 값은 또한 몸의 "출력"으로 지정 될 수있다. 함수 호출은 구문 적으로 (일반적으로 다른 표현식의 하위 표현식으로) 함수 호출 결과를 사용할 수 있다는 점을 제외하고 프로 시저 호출과 다소 비슷합니다.
전통적으로 함수 호출이 아닌 프로 시저 호출은 출력에 관심이 없어야 함을 나타 내기 위해 사용되며 호출이 작동하지 않는 것을 피하기 위해서는 부작용 이 있어야 하므로 명령 프로그래밍 패러다임을 강조합니다 . Pascal과 같은 많은 전통적인 프로그래밍 언어는 이러한 의도적 인 스타일 차이를 구별하기 위해 "프로 시저"와 "기능"을 모두 제공합니다.
(위에서 언급 한 "입력"과 "출력"은 함수의 구문 특성에 따라 단순화 된 개념입니다. 많은 언어는 참조 / 공유를 통해 매개 변수에 인수를 전달하여 사용자가 호출 중에 인수로 인코딩 된 정보를 전달할 수 있도록 지원합니다. 이러한 매개 변수는 "입력 / 출력 매개 변수"라고도합니다.이 기능은 호출에 전달되는 객체의 특성을 기반으로하며 이는 프로 시저 / 함수 기능의 속성과 직교합니다.)
그러나 함수 호출의 결과가 필요하지 않은 경우 (적어도 논리적으로) 무시할 수 있으며 함수 정의 / 함수 호출은 이런 방식으로 프로 시저 정의 / 프로 시저 호출과 일치해야합니다. C, C ++ 및 Java와 같은 ALGOL과 같은 언어는 모두 이러한 방식으로 "함수"의 기능을 제공합니다. 결과 유형 void
을 전통적인 프로 시저처럼 보이는 특수한 경우의 함수로 인코딩하여 "절차의 기능을 제공 할 필요가 없습니다. "별도로. 이것은 언어 디자인에 약간의 팽창을 방지합니다.
SICP가 언급되었으므로 R n RS에 의해 지정된 Scheme 언어 에서 프로시 저는 계산 결과를 반환하거나 반환하지 않아도됩니다. 이것은 전통적인 "기능"(결과 반환)과 "절차"(아무 반환)의 결합으로, 많은 ALGOL과 유사한 언어의 "기능"개념과 본질적으로 동일합니다 (실제로 호출하기 전에 피연산자). 그러나 SRFI-96 과 같은 규범적인 문서에서도 구식 차이가 여전히 발생합니다 .
나는 발산의 정확한 이유에 대해 많이 알지 못하지만, 경험 한 것처럼 언어 디자이너는 요즘 사양 부풀림없이 더 행복해질 것 같습니다. 즉, 독립형 기능인 "프로 시저"는 필요하지 않습니다. void
유형 과 같은 기술 은 부작용을 강조해야하는 용도를 표시하기에 이미 충분합니다. 이것은 수십 년 이상 동안 인기가있는 C 유사 언어에 대한 경험이있는 사용자에게도 더 자연 스럽습니다. 또한 "프로 시저"가 실제로 "기능"인 R n RS 와 같은 경우에는 당황하지 않습니다.
이론적 으로는 함수 호출 결과의 유형 으로 지정된 단위 유형 으로 함수를 지정하여 결과가 특별 함을 표시 할 수 있습니다. 이것은 전통적인 절차 (통화 결과에 관심이없는)를 다른 절차와 구별합니다. 언어 디자인에는 다양한 스타일이 있습니다.
#inert
)도 작동한다.void
ALGOL과 유사한 언어 의 유형은이 기술의 예입니다. ISO C11 _Noreturn
은 이와 유사하지만 더 미묘합니다.수학에서 파생 된 전통적인 개념으로, 대부분의 사람들이 알지 못하는 수많은 흑 마법 이 있습니다. 엄밀히 말하면 수학 책에 따라 모든 것을 명확하게 알 수는 없습니다. CS 서적도 큰 도움이되지 않을 수 있습니다.
프로그래밍 언어와 관련하여 몇 가지주의 사항이 있습니다.
{{{}}, {}}
...) 일부 제한된 상황 외에 .내부 프로 시저에서는 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
함수는 값을 반환하고 프로시 저는 명령을 실행합니다.
이름 함수는 수학에서 나옵니다. 입력을 기준으로 값을 계산하는 데 사용됩니다.
프로시 저는 순서대로 실행될 수있는 명령 세트입니다.
대부분의 프로그래밍 언어에서 함수조차도 일련의 명령을 가질 수 있습니다. 따라서 차이는 값을 반환하는 부분에만 있습니다.
그러나 함수를 깨끗하게 유지하려면 (기능 언어 만 살펴보십시오) 함수에 부작용이 없는지 확인해야합니다.
나는이 답변의 대부분에서 계속해서보고있는 무언가로 이의를 제기합니다. 함수를 함수로 만드는 것은 값을 반환한다는 것입니다.
함수는 값을 반환하는 오래된 방법이 아닙니다. 그렇지 않습니다 : 메소드가 실제 함수가 되려면 항상 특정 입력이 주어지면 동일한 값을 반환해야합니다. 함수가 아닌 메소드의 예는 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
그 비유는 괜찮지 만 컴퓨터 프로그램을 다룰 때 모든 것이 추상화라는 것을 고려할 때 세분화됩니다. 따라서 기계에 대한 레시피의 경우와 달리 우리는 추상화 인 두 가지를 비교합니다. 똑같은 것일 수도 있습니다. 그리고 나는 그것들이 (모든 의도와 목적을 위해) 같은 것이라고 주장합니다.
С # / 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.");
}
절차 : 1. 절차 는 매개 변수화 된 계산을 정의하는 문장의 모음입니다. 2. 절차는 값을 반환 할 수 없습니다.
3. 프로시 저는 함수에서 호출 할 수 없습니다.
함수 1. 함수는 구조적으로 프로 시저와 비슷하지만 수학 함수에 대한 의미 론적으로 모델링됩니다. 2. 값을 반환 할 수 있습니다. 3. 프로 시저에서 함수를 호출 할 수 있습니다.
프로 시저와 함수는 모두 서브 루틴이며, 프로 시저와 함수의 유일한 차이점은 프로 시저가 여러 값 (또는 적어도 할 수있는)을 반환하는 반면 함수는 하나의 값만 반환 할 수 있다는 것입니다. 일부 프로그래밍 언어는 이러한 규칙을 따르지 않지만 이는 실제 정의입니다.
return
아무것도 없습니다 . 부작용에 대해 이야기하고 있습니다 (언어가 허용하는 경우).