왜 그렇게 많은 언어가 가치를 지니고 있습니까?
큰 프로그램을 작은 서브 루틴으로 나누는 요점은 서브 루틴에 대해 독립적으로 추론 할 수 있다는 것입니다. 패스 바이 레퍼런스는이 속성을 손상시킵니다. (공유 변경 가능 상태와 마찬가지로)
당신이 항상 값에 의해 전달 된 것 C와 같은 명시적인 포인터 조작이 심지어 언어 (당신은 할 수 있습니다 참조로 전달할하지만 기본 동작이 아니다).
실제로 C는 항상 값으로 전달되며 참조로 전달되지 않습니다. 당신은 어떤 주소를 가지고 그 주소를 전달할 수 있지만, 그 주소는 여전히 값으로 전달 될 것입니다.
이것의 장점은 무엇입니까, 왜 그렇게 많은 언어가 값으로 전달되고 다른 언어 가 참조로 전달 됩니까?
통과 기준을 사용하는 데는 두 가지 주요 이유가 있습니다.
- 여러 반환 값 시뮬레이션
- 능률
개인적으로 # 1은 가짜라고 생각합니다. 거의 항상 잘못된 API 및 / 또는 언어 디자인에 대한 변명입니다.
- 여러 개의 반환 값이 필요한 경우 시뮬레이션하지 말고 지원하는 언어 만 사용하십시오.
여러 반환 값을 튜플과 같은 가벼운 데이터 구조로 패키징하여 여러 반환 값을 시뮬레이션 할 수도 있습니다. 언어가 패턴 일치 또는 파괴 바인딩을 지원하는 경우 특히 효과적입니다. 예 : 루비 :
def foo
# This is actually just a single return value, an array: [1, 2, 3]
return 1, 2, 3
end
# Ruby supports destructuring bind for arrays: a, b, c = [1, 2, 3]
one, two, three = foo
종종 여러 개의 반환 값이 필요하지 않습니다. 예를 들어, 인기있는 패턴 중 하나는 서브 루틴이 오류 코드를 리턴하고 실제 결과는 참조로 다시 쓰여지는 것입니다. 대신 오류가 예상치 않은 경우 예외를 발생 시키거나 Either<Exception, T>
오류가 예상 되는 경우를 반환 해야합니다. 다른 패턴은 작업이 성공했는지 여부를 알려주고 실제 결과를 참조로 리턴하는 부울을 리턴하는 것입니다. 다시 말하지만 실패가 예상치 못한 경우 대신 예외를 처리해야합니다. 예를 들어 사전에서 값을 찾을 때 실패가 예상되는 경우 대신 예외를 리턴해야 Maybe<T>
합니다.
값을 복사 할 필요가 없으므로 참조 별 전달이 값별 전달보다 더 효율적일 수 있습니다.
(확실하지는 않지만 Haskell이 참조로 전달된다는 것을 이해합니다).
아니요, Haskell은 참조로 전달되지 않습니다. 또한 가치를 전달하는 것도 아닙니다. 기준 별 통과 및 값별 통과는 모두 엄격한 평가 전략이지만 Haskell은 엄격하지 않습니다.
사실, 하스켈 사양은 지정하지 않는 어떤 특정 평가 전략을. 대부분의 Hakell 구현은 이름 별 호출과 필요에 따른 호출 (메모와 함께 호출 별 변형)을 사용하지만 표준에서는이를 요구하지 않습니다.
엄격한 언어의 경우에도 참조 언어를 변경하는 경우에만 기능 언어 간의 차이를 관찰 할 수 있으므로 기능 언어의 참조 별 전달 또는 값별 전달을 구분하는 것은 의미가 없습니다. 따라서 구현자는 언어의 의미를 어지럽히 지 않고 둘 사이에서 자유롭게 선택할 수 있습니다.
void acceptEntireProgrammingLanguageByValue(C++);