문제

저는 Ruby 블록이 어떻게 작동하는지 이해하려고 노력해왔고, 이를 위해 C로 구현하려고 노력해 왔습니다.

클로저를 구현하는 쉬운 방법 중 하나는 void* 클로저/함수에 대한 엔클로징 스택으로 이동하지만 Ruby 블록은 블록을 사용하는 범위에서 return 및 break 문도 처리하는 것으로 보입니다.

loop do
  break i if (i >= 4000)
  i *= 2
end

나는 Java에 대한 클로저 제안 중 하나가 이와 같이 작동한다고 생각합니다.

그렇다면 C에서 Ruby 블록/Java 클로저를 어떻게 구현하시겠습니까?

도움이 되었습니까?

해결책

클로저의 개념에는 컨텍스트의 개념이 필요합니다.C의 컨텍스트는 CPU의 스택과 레지스터를 기반으로 하므로 블록/클로저를 생성하려면 스택 포인터를 올바른(및 재진입) 방식으로 조작하고 필요에 따라 레지스터를 저장/복원할 수 있어야 합니다.

인터프리터나 가상 머신이 이를 수행하는 방식은 context 구조 또는 이와 유사한 것을 사용하고 스택과 레지스터를 직접 사용하지 마십시오.이 구조는 레지스터 기반 VM을 설계하는 경우 스택과 선택적으로 일부 레지스터를 추적합니다.적어도 이것이 가장 간단한 방법입니다(실제로 올바르게 매핑하는 것보다 성능이 약간 떨어지기는 하지만).

다른 팁

나는 실제로 이것을 구현하지 않았으므로 소금 자루와 함께 가져 가십시오.

클로저에는 두 부분이 있습니다:데이터 환경과 코드 환경.당신이 말했듯이, 데이터에 대한 참조를 처리하기 위해 void*를 전달할 수 있습니다.아마도 setjmp와 longjmp를 사용하여 Ruby 중단에 필요한 비선형 제어 흐름 점프를 구현할 수 있습니다.

클로저를 원한다면 실제로 이를 지원하는 언어로 프로그래밍해야 할 것입니다.:-)

업데이트:Clang에서는 흥미로운 일들이 일어나고 있습니다.그들은 C에 대한 클로저 프로토타입을 만들었습니다. http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-August/002670.html 흥미로운 독서가 될 것 같습니다.

"Rails with Passion" 과정의 일부로 Ruby Blocks에 대한 좋은 슬라이드 세트가 있습니다.

Ruby_Blocks.pdf

여기에는 블록을 표현하는 방법, 인수가 전달되고 실행되는 방법, Proc 객체와 같은 사항에 대한 내용이 포함됩니다.매우 명확하게 설명되어 있습니다.

그러면 JRuby 직원이 Java로 구문 분석할 때 이를 어떻게 처리했는지 살펴보는 것이 흥미로울 수 있습니다.에서 소스를 살펴보세요. 코드하우스.

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