2008-08-21 2 views
6

자바 폐쇄 내가 전달하는 루비 블록의 작동 방식을 이해하기 위해 노력했습니다, 나는 C로 클로저를 구현하는루비 블록/C

쉬운 방법 중 하나를이를 구현하기 위해 노력했다고 할 void*을 클로저/함수에 포함 된 스택에 추가하지만 Ruby 블록은 블록을 사용하는 범위에서 return 및 break 문도 처리합니다.

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

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

그래서 Ruby-blocks/Java-closure를 C로 구현할 수 있을까요?

+0

"C에서 Ruby-Block/Java-Closure를 구현하는 방법은 무엇입니까?" 적어도 Java 7이 릴리스 될 때까지는 Java 클로저와 같은 것이 없습니다. –

+0

그래, 바로 전에 "Java 용 제안서 폐쇄"라고 했지. –

답변

10

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

인터프리터 또는 가상 컴퓨터에 의해 수행되는 방식은 context 구조 또는 유사한 것을 가지며 스택과 레지스터를 직접 사용하지 않는 것입니다. 이 구조체는 레지스터 기반 VM을 설계하는 경우 스택과 선택적으로 일부 레지스터를 추적합니다. 적어도, 그 일을하는 가장 간단한 방법입니다. 실제로 실제로 사물을 올바르게 매핑하는 것보다 약간 덜 효과적입니다.

2

물론 "열정과 레일"의 일환으로 루비 블록에 슬라이드의 좋은 세트가있다 :

Ruby_Blocks.pdf

이 그들이 더욱 인수를 통과하고 실행하고, 취득 방법, 블록을 나타내는 커버 Proc 객체와 같은 것으로 변환합니다. 그것은 아주 명확하게 설명되어 있습니다.

그런 다음 JRuby 사람들이 Java 구문 분석에서이를 처리하는 방법을 살펴 보는 것이 좋습니다. 출처 : codehaus을보십시오.

3

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

클로저에는 데이터 환경과 코드 환경의 두 부분이 있습니다. 위에서 말한 것처럼 데이터에 대한 참조를 처리하기 위해 void *를 전달할 수 있습니다. 루비 브레이크에 필요한 비선형 제어 흐름 점프를 구현하려면 setjmp 및 longjmp를 사용할 수 있습니다.

클로저를 원할 경우 실제로 지원하는 언어로 프로그래밍해야합니다. :-)

업데이트 : Clang에서 흥미로운 일들이 일어나고 있습니다. 그들은 C.에 대한 폐쇄를 프로토 타이핑했습니다. http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-August/002670.html 흥미로운 독서가 될 수도 있습니다.