문제

왜 어떤 언어를 구분하는 방법을 반환하는 값과하지 않는 방법?

즉에서 오라클의 PL/SQL,는 곳의 주요 차이점은 기능 및 절차는 기능 값을 반환해야 합니고,절차해야합하지 않습니다.

마찬가지로 대한되지 않는 언어는,왜?


편집:내가 찾는 관련 질문할 수 있는 관심사를 읽는 사람들이 질문:

도움이 되었습니까?

해결책

기 때문에 원본 개념들을 컴퓨터 과학의 이론과 실기,기능 및 서브루틴했다 거의 없습니다.

프로그램은 일반적으로 첫 번째는 언어로 구현되는 이들 모두 보여 주었 차이가 있습니다.(초기 LISP 했다는 다소 반대하는 역할도 하지만,그것은 작은 영향이 외부의 학계).

에서 다음의 전통 수학이(CS 아직도 부분에서 60)함수들만 볼 수 있으로 캡슐화의 매개 변수화 수학적 계산을 전적으로 의도를 반환하는 값으로 더 큰 표현이다.할 수 있는 이것을"bare"(F=방위(초))는 단순히 사소한 사용하는 경우.

서브루틴,다른 한편으로 볼 수 있었던 방법으로 이름을 그룹의 문장에게 가서 말할 수 없어요 몇 가지 효과가 있다.매개변수에 큰 도움이 그들의 유용성과 유일한 이유는 그들이 사용된 매개 변수 값 그래서 그들은 보고서의 상태에 의존하지 않고 글로벌 변수입니다.

그래서,그들은 정말이 없었다는 개념적 연결,이외의 캡슐화하고 매개 변수입니다.

진짜 문제는 다음과 같습니다."어떻게 그렇게 많은 개발자들이 와서 그들을 보으로 동일합니까?"

그리고 대답하는 C.

때 K+R 는 원래 디자인 자신의 높은 수준의 매크로 어셈블러 유형의 언어를 PDP-11 일(수 있습에서 시작 PDP-8?), 그들이 없었다는 망상의 하드웨어다.거의 모든""독특한 기능의 언어를 반영하는 것이었 PDP 기계 언어링(볼 i++-나).하나는 실현 기능 및 서브 루틴이 될 수 있(고 항상이었다)구현에서 동일하게 PDP 것을 제외하고자 그냥 무시 반환 값(R0[R1])에 대한 서브 루틴.

따라서 태어나 무효인 후에는 C 언어를 촬영했을 통해 전 세계의 프로그래밍 오해는 이 HW/OS 구현에 유물(그러나 진정한 거의 모든 후속 플랫폼다)언어와 같은 의미입니다.

다른 팁

순수하거나 효과가있는 설정에는 "아무것도 반환하지 않는"방법이 부작용에만 유용하기 때문에 차이가 있습니다.

이것은 표현과 진술 사이의 구별과 유사하며, 이는 언어를 정리하고 일반적으로 불만적인 프로그램의 클래스를 제거 할 수 있습니다 (물론 C가하지 않는 이유)).

한 가지 예를 들어 표현과 진술을 명확하게 구별 할 때 if(x = 3), 반대로 if(x == 3) 구문 적으로 부정확합니다 (표현식이 예상되는 진술을 사용하는 경우)은 유형 오류가 아니라 (부울이 예상되는 정수를 사용하는 경우). 이것은 또한 허용하지 않는 이점이 있습니다 if(x = true) 이는 과제가 오른쪽 피연산자의 값을 갖는 표현 인 상황에서 유형 기반 규칙에 의해 허용됩니다.

Monads와 함께 효과를 캡슐화하는 언어에서 중요한 차이점은 다음 사이의 것입니다.

  • 반환하는 기능 () 순수한 기능이며 쓸모없는 빈 값을 반환 할 수 있습니다. () 또는 분기
  • 반환하는 기능 IO () (또는 다른 모나드의 단위) IO (또는 어느 쪽) Monad의 효과를 제외하고 "결과"가없는 기능인

2 살짜리 질문에 대답하는 실례, 특히 내 언어 펠릭스에 고유 한 무언가로 실례합니다. http://felix-lang.org 그러나 여기에 어쨌든 :)

펠릭스에서는 기능과 절차가 기본적으로 다르며 절차에 부작용이 있고 진술서에서 호출되는 것은 단지 부작용이없고 표현식에 사용되는 반면 (Felix는 기능이있는 생성기도 가지고 있기 때문에 기능에 사용됩니다. 부작용 .. :)

아니요, 실행 모델은 기본적으로 성능의 이유로 기본적으로 다르지만 완전히 다릅니다. 모델은 다음과 같습니다.

  • 함수는 기계 스택에 반환 주소와 반환 값도 넣습니다.
  • 절차는 힙에 링크 된 목록을 사용합니다. 절차 코드는 평평하며 기계 스택을 사용하지 않습니다.

이것은 일반적으로 비효율적이므로 왜 그렇게합니까? 답은 : Felix 절차는 모두 잠재적으로 공동 경로 (섬유)입니다. 채널에 액세스하여 다른 절차로 제어를 전환 할 수 있습니다. 이것은 통제 교환을 유발합니다.

  • 성능의 이유로 Control Exchange에서 기계 스택을 복사하는 것은 옵션이 아닙니다.
  • 메모리 관리 이유 스와핑 스택 포인터도 옵션이 아닙니다.

OS는 일반적으로 스레드에 대한 스택 포인터를 스왑으로, 합리적으로 빠르지 만 선형 주소 시스템에 근본적인 문제가 있습니다. 스택의 최대 크기를 엄청나게 작은 값으로 제한하거나 스레드 수를 엄청나게 제한해야합니다. 작은 가치. 32 비트 기계에는이 솔루션을 고려할 수있는 주소 공간이 충분하지 않습니다. 64 비트 머신에서 스택 스왑 핑은 더 많은 잠재력을 가지고 있지만 물론 사용자 요구는 항상 출시 된 지 3 일 후에 하드웨어에 대한 하드웨어로 성장합니다. :) :)

Felix는 힙 기반 스택으로 단일 포인터를 교환하므로 컨텍스트 스위치는 맹목적으로 빠르며 주소 공간이 거의 낭비되지 않습니다. 물론 비용은 절차 호출에 대한 힙 할당입니다.

컴파일러에서, 이론적 모델의 많은 아키텍처는 "as-if"기준으로 최적화되므로 실제 성능과 구현은 이론 모델과는 상당히 다를 수 있습니다. 컴파일러가 말할 수 없다는 것을 증명할 수 있습니다. 차이 .. 여가와 함께 커피 한 잔을 만들 기회를 거부하는 것 외에 :)

따라서 여기에는 기능과 절차가 다르게 취급 될 수있는 이유에 대한 답이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top