7

우리 모두단락 곱셈과 같은 것이 있습니까?

if (False AND myFunc(a)) then 
... 

if 조건이 참이 될 수있는 방법이 없기 때문에 myFunc() 실행을 방해하지 않는 즉, 논리적 표현에 대한 단락을 알고있다.

내가 같은 일상 대수 방정식에 대한 동등한 존재 여부에 대한 호기심,

result = C*x/y + z 

C=0 경우 첫 번째 항을 평가하는 의미가 없습니다 말한다. xy이 스칼라라면 성능면에서별로 중요하지 않겠지 만 우리가 큰 행렬이고 조작이 비용이 많이 들며 행렬에 적용될 수 있다면 분명히 차이를 만들 것입니다. 물론 if C!=0 문을 써서 극단적 인 경우를 피할 수 있습니다.

제 질문은 그런 기능이 있는지 여부와 유용한 지 여부입니다. 나는 프로그래머가별로 없기 때문에 아마도 나는 어떤 이름 아래서 만난 적이 없다. 그렇다면 나에게 계발하십시오 :)

+1

논리 단락이 기능의 관점에서 중요한 개념이다 기능적 차이가없는 컴파일러 레벨에서의 최적화. 당신이 선택한 언어는 당신이 눈치 채지 않고도 이미 그것을 할 수 있습니다. – deceze

+2

나보다 더 잘 아는 사람은 대답해야하지만, 부서를 단락 시키면 문제가 생길 것이라고 상상해보십시오. 예를 들어, y = 0 일 경우 어떻게됩니까? 누전이 발생하면 실제로 오류 일 때 0을 반환합니다. – Nate

+0

@deceze 산술적 인 단락은 논리적 인 단락과 마찬가지로 최적화를 넘어 기능적으로 차이가있을 수 있습니다. 'result = C * myfunction()'을 고려하십시오. 산술 표현을 단락 시키게하는'C == 0'이라면,'myfunction'은 절대로 호출되지 않으며 부작용이 발생하지 않습니다 (논리적 인 단락과 마찬가지로). –

답변

6

: 게으른 평가, 비 엄격한 평가, 필요에 의해 호출, 몇 가지 이름 실제로 훨씬 더 강력 여기 곱셈을 피하고보다 그곳에.

평가 모델이 엄격하지 않은 Haskell 또는 Frege과 같은 프로그래밍 언어가 있습니다. 거기, 당신의 "단락"곱셈 연산자를 쓰기 아주 쉬운 것입니다 예를 들어, 당신은 뭔가를 쓸 수있다 : "산술 단락은"동안

infixl 7 `*?`  -- tell compiler that ?* is a left associative infix operator 
        -- with precedence 7 (like the normal *) 

0 *? x = 0   -- do not evaluate x 
y *? x = y * x  -- fall back to standard multiplication 
+0

고마워! 몇 가지 후속 질문에도 답변 할 수 있습니다. – Verge

1

데이터가 크거나 복잡하고 조작에 비용이 많이 드는 경우, 조작의 구현은 값 비싼 조작을 수행하기 전에 적절한 단축키 점검을 수행해야합니다. 이것은 연산자의 구현에 대한 내부 세부 사항입니다 (예 : 행렬 *).하지만 실제로는 곱셈이라는 언어 개념과는 아무런 관련이 없으며 계산 방법을 작성하는 데 거의 영향을 미치지 않아야합니다.

얘기하는 개념은 다른 이름으로 간다