스몰 토크의 'Bome :'은 어떤 용도로 사용됩니까?


12

become:스몰 토크 의 메시지는 한 객체를 다른 객체로 변경하여 모든 참조에 영향을 미칩니다.

이 언어 기능에는 어떤 용도가 있습니까? 실제 코드에서 사용됩니까? 호기심일까요? 그것을 사용하는 것이 좋거나 나쁜 습관으로 간주됩니까?

답변:


11

Gilad Bracha는 다음과 같이 이야기합니다 become:.

스몰 토크의 가장 독특하고 강력한 기능 중 하나는 스몰 토크 커뮤니티 외부에서 가장 잘 알려지지 않은 기능 중 하나입니다. 는 다음과 같은 작은 방법입니다.

수신자의 신원과 주장을 바꾸는 것이다. 즉, 후

a가된다 : b

콜 포인트 이전에 a로 표시된 객체에 대한 모든 참조는 b로 표시된 객체를 참조하고 그 반대도 마찬가지입니다.

이것을 내면화하는 데 잠시 시간을 내십시오. 당신은 그것을 사소한 것으로 오해 할 수도 있습니다. 이것은 두 변수를 바꾸는 것이 아니라 말 그대로 한 객체가 다른 객체가되는 것입니다. 이 기능이있는 다른 언어는 알지 못합니다. 그것은 엄청난 힘과 위험의 특징입니다.

영구 객체를 지원하기 위해 언어를 확장하는 작업을 고려하십시오. 디스크에서 객체를로드하려고하지만 그것이 참조하는 모든 객체를 전 이적으로로드하고 싶지 않다고 가정 해보십시오 (그렇지 않으면 일반 객체 직렬화 해제 일뿐입니다). 따라서 객체 자체를로드하지만 직접 참조를로드하는 대신 껍질 객체로 대체합니다.

껍질은 보조 스토리지의 실제 데이터를 나타냅니다. 그 데이터는 느리게로드됩니다. 실제로 껍질에서 메소드를 호출해야하는 경우 doesNotUnderstand : 메소드는 디스크에서 해당 데이터 오브젝트를로드합니다 (단, 전 이적으로는 아님).

그런 다음 :가되어 껍질에 대한 모든 참조를 새로로드 된 오브젝트에 대한 참조로 바꾸고 호출을 재 시도합니다.

일부 지속성 엔진은 수십 년 동안 이러한 종류의 작업을 수행했지만 일반적으로 표현에 대한 낮은 수준의 액세스에 의존했습니다. 되기 : 소스 코드 수준에서이 작업을 수행 할 수 있습니다.

이제 Java 로이 작업을 수행하십시오. 또는 다른 동적 언어로도. 당신은 이런 식으로 일반적인 형태의 미래를 할 수 있다는 것을 인식 할 것입니다. 구현 작업에 대한 특권 액세스 권한이없는 모든 것. 예를 들어 클래스에 인스턴스 변수를 추가 할 때 스키마 진화에도 유용합니다. 필요에 따라 모든 인스턴스를 "형성"할 수 있습니다.

물론, 부담없이 사용해서는 안됩니다. 많은 구현에서 엄청나게 비용이 듭니다. 초기 스몰 토크에서는 모든 개체가 개체 테이블을 통해 간접적으로 참조 되었기 때문에 저렴 해졌습니다. 오브젝트 테이블이 없으면 가비지 콜렉터와 유사한 방식으로 힙을 트래버스합니다. 메모리가 많을수록 더 비쌉니다.

오브젝트 테이블이 있으면 스토리지를 차지하고 액세스 속도가 느려집니다. 그러나 그것은 당신에게 많은 융통성을 부여합니다. 하드웨어 지원으로 성능이 저하 될 수 있습니다. 객체 테이블을 통해 간접 비용을 기꺼이 지불하려는 경우 많은 어려운 문제가 상당히 다루기 쉽다는 장점이 있습니다. 기억하십시오 : 컴퓨터 과학의 모든 문제는 추가적인 수준의 간접 지향으로 해결 될 수 있습니다. 예를 들어 Alex Warth는이 범주에 맞는 매우 흥미로운 작업을 수행합니다.

되기 : 여러 변형이 있습니다. 한 가지 방법은 다음과 같습니다. 객체 A의 정체성을 다른 객체 B의 정체성으로 변경하여 A에 대한 참조가 이제 B를 가리 킵니다. B에 대한 참조는 변경되지 않습니다. 대량으로-배열의 모든 객체의 ID를 (단방향 또는 양방향으로) 변환하는 것이 종종 유용합니다. 예를 들어 시스템에 대한 반사 업데이트를 구현하는 데 원자 적으로 마술처럼 작용하는 그룹이됩니다. 한 번에 전체 클래스 세트와 인스턴스를 변경할 수 있습니다.

safe 타입은 다음과 같이 생각할 수도 있습니다. 양방향은 다음과 같습니다. A의 유형이 B의 유형과 동일한 경우에만 유형이 안전하지만 한 가지 방법은 새 오브젝트가 이전 오브젝트의 하위 유형이어야합니다.

오브젝트 테이블을 갖는 것이 실제로 좋은지 여부를 재고해야 할 때입니다.

효과적으로 얻을 수있는 것은 메타 프로그래밍을 통한 게으른 로딩 형태입니다. Bracha가 지적했듯이 이것은 매우 유용 할 수 있지만 성능에 심각한 영향을 줄 수 있으므로 위험합니다.


become프로그램 성능보다 내 정신에 미치는 영향 이 더 걱정 됩니다 ...
Benjamin Hodgson

Hardware support could ease the performance penalty.내가 들었던 모든 장소 중에서 스몰 토크 커뮤니티가 가장 두드러졌습니다. 이상적인 프로그래밍 패러다임을 가능하게하는 데있어 하드웨어 향상을 "보내는"이유는 성능 향상, 전력 사용 감소 또는 기능 향상으로 이어질 수 있습니다.
Alexander-복원 모니카

2

많이 사용되지 않습니다. 내가 열었던 Pharo 5 이미지에는 9 개의 발신자가 있습니다 : 그 중 7 명이 단위 테스트 중입니다. 컴파일러는 코드 생성 및 연료 직렬화 라이브러리에서 프록시를 내용으로 대체하는 데 사용됩니다.


흥미 롭군 단위 테스트는 어떤 용도로 사용됩니까?
dpk

그것이 작동하는지 확인하려면 ...
Stephan Eggermont
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.