루비코아

RubyCocoa

RubyCocoa사용자가 Ruby에서 Objective-C 객체를 조작할 수 있도록 Ruby와 Objective-C 프로그래밍 언어 사이의 브릿지를 제공하는 macOS 프레임워크입니다.루비로 코코아 어플리케이션을 완전히 작성할 수 있을 뿐만 아니라 루비와 Objective-C 코드를 혼합한 어플리케이션도 작성할 수 있습니다.맥루비라고 불리는 애플 프로젝트는 2008년에 루비코아를 대체하기 위해 개발 중에 있었다.그 후 2012년에 루비 모션이라는 독점 스핀오프가 출시되어 iOS, MacOS 및 Android에서 사용할 수 있게 되었습니다.

RubyCocoa의 유용한 어플리케이션으로는 irb를 사용한 코코아 오브젝트 기능 탐색, 코코아 어플리케이션 프로토타입 제작, Ruby와 Objective-C의 기능을 결합한 코코아 어플리케이션 작성, macOS의 네이티브 GUI를 Ruby 스크립트로 랩핑하는 것이 있습니다.

RubyCocoa는 Ruby LicenseLGPL 양쪽에 따라 출시된 무료 소프트웨어입니다.

역사

RubyCocoa는 2001년 후지모토 히사쿠니가 NSObject와 NSClassFromString 함수를 랩하는 Ruby 확장 모듈을 구현하면서 시작되었습니다.나중에 Project Builder(나중에 Xcode가 됨)와 통합되었습니다.2002년에 이 프로젝트는 Source Forge에 등록되었고 개발 팀은 성장하기 시작했습니다.

2006년에 커밋 리스트는 처음에 Apple의 개발자인 Laurent Sansonetti에 의해 가입되어 WWDC에서 RubyCocoa 프레젠테이션이 이루어졌습니다.Apple은 RubyCocoa가 Mac OS X v10.5 "Leopard"에 포함되어 지원될 것이라고 말했습니다.

2008년 8월, 산소네티는 맥루비가 "루비코아를 대체할 "이라고 확인했다.

다리는 어떻게 작동하나요?

Ruby Cocoa는 때때로 코코아 프레임워크에 대한 일련의 결합으로 해석되기도 하는데, 이는 잘못된 것입니다.RubyCocoa는 Objective-C와 Ruby 프로그래밍 언어 사이의 진정한 브리지입니다.

레이지 클래스 Import

Ruby Cocoa는 Objective-C 클래스를 요청 시 Ruby 월드에 Import합니다.예를 들어, 에 액세스 하는 경우OSX::NSTableViewRubyCocoa는 코드에서 처음으로 Objective-C 런타임에서 이 클래스에 대한 모든 필요한 정보를 가져와 프록시 역할을 하는 같은 이름의 Ruby 클래스를 만듭니다.또한 상속된 모든 클래스를 동일한 방법으로 가져옵니다.

메시지 전송

앞에서 설명한 바와 같이 Ruby Cocoa는 특별한 프록시 객체를 만듭니다.Ruby 메시지를 프록시 객체에 보낼 때마다 RubyCocoa는 메시지 이름을 Objective-C 셀렉터로 변환하고 Objective-C 런타임에 전송하도록 요청함으로써 내장된 Objective-C 인스턴스로 전송하려고 합니다.

Objective-C 월드에서 예외가 발생하면 RubyCocoa가 Ruby 예외로 변환하여 전송합니다.

RubyCocoa는 libffi 라이브러리를 사용하여 Objective-C 메서드 구현을 호출합니다.

자동 메서드 재정의

RubyCocoa는 Objective-C 메서드를 Ruby에서 서브클래스 또는 직접 클래스로 덮어쓰기가 쉽습니다(오브젝티브-C에서 카테고리를 사용하여 하는 것처럼).

메서드가 삽입되면 RubyCocoa는 기존 Objective-C 메서드의 시그니처를 취득하여 동일한 시그니처의 Objective-C 런타임에 새로운 시그니처를 주입합니다만, 현재는 코드를 가리키고 있습니다.

이를 달성하기 위해 RubyCocoa는 libffi 라이브러리를 사용하여 Ruby 메서드를 호출하는 닫힘을 동적으로 생성하고 Objective-C 런타임에 새로운 닫힘에 대한 포인터를 전달합니다.

C 비트에의 액세스

Objective-C 언어의 특성상 Objective-C 코드에서 C를 자유롭게 사용할 수 있습니다.C구조, 함수, 열거, 상수 등 Objective-C 프레임워크의 관련 C부분을 연결하기 위해 RubyCocoa는 BridgeSupport 프로젝트에 의존합니다.

RubyCocoa는 런타임에 BridgeSupport 파일을 해석합니다(매우 빠른 libX 사용).ML2의 xmlTextReader)와 그에 따라 콘텐츠를 처리합니다.예를 들어 C구조를 위한 루비 프록시 클래스를 구축하고 함수를 만듭니다.

기호 현지화 등 비용이 많이 드는 작업은 온디맨드 방식으로 한 번만 수행됩니다.

형식 문자열

RubyCocoa는 NSLog 또는 NSString.stringWithFormat 등의 형식 문자열을 사용하는 API를 검출하여 변수 인수를 형식 문자열로 지정된 형식으로 적절하게 변환할 수 있습니다.

함수 포인터

Ruby Cocoa를 통해 Ruby를 전달할 수 있습니다.Proc오브젝트를 함수 포인터 인수로 지정합니다.그런 다음 libffi 라이브러리를 사용하여 닫힘을 동적으로 만들고 기본 함수/메서드에 전달합니다.

루비로 작성된 코코아 어플리케이션 작성

RubyCocoa를 설치하면 해당 Xcode 템플릿도 자동으로 설치됩니다.이를 통해 개발자는 Xcode 프로젝트 유형으로 "Cocoa-Ruby Application"을 선택할 수 있으며 Xcode는 이들을 위해 필요한 모든 파일을 생성합니다.

Ruby에서 Objective-C 메서드를 호출하는 방법

Objective-C 메서드를 호출하려면 메서드 이름의 마지막 콜론을 각각 밑줄로 바꿉니다.예를 들어 NSWindow 인스턴스 메서드는initWithContentRect:styleMask:backing:defer:된다initWithContentRect_styleMask_backing_defer.

모든 코코아 클래스 및 기능은 다음 항목에 속합니다.OSX예를 들어 Objective-C 코드:

[[NSIndow 할당하다] initWithContentRect:                             스타일 마스크:NSTitled Window Mask(NSTitled Window 마스크)                               지원.:NSBacking Store Buffered(NSBackingStoreBuffered                                 미루다:아니요.] 

다음과 같이 됩니다.

OSX::NSIndow.할당하다.initWithContentRect_styleMask_backing_defer(,   OSX::NSTitled Window Mask(NSTitled Window 마스크),   OSX::NSBacking Store Buffered(NSBackingStoreBuffered,   거짓의) 

보시다시피 Objective-C 파라미터의 이름을 사용할 수 없게 함으로써 코드 판독성이 저하됩니다.따라서 메서드 호출을 기술하는 다른 편리한 방법이 있습니다.objc_sendmethod: 매개 변수 이름으로 루비 기호를 사용할 수 있습니다.예를 들어, 이전 코드는 다음과 같이 쓸 수도 있습니다.

OSX::NSIndow.할당하다.objc_전송(: initWithContentRect, ,   : styleMask(스타일 마스크), OSX::NSTitled Window Mask(NSTitled Window 마스크),   : 개요, OSX::NSBacking Store Buffered(NSBackingStoreBuffered,   : 개요, 거짓의) 

Ruby Cocoa의 장점

  • Ruby는 통역 언어이기 때문에 개발 중에 애플리케이션을 자주 재컴파일할 필요가 없습니다.
  • 내장된 정규 표현 지원 등 Ruby의 풍부한 기능 중 일부는 코드 작성을 빠르게 하고 RubyCocoa를 프로토타이핑에 이상적인 도구로 만듭니다.

단점들

  • Ruby 인터프리터의 속도를 무시하면 오브젝트 변환의 오버헤드가 증가하기 때문에 Ruby Cocoa 어플리케이션은 Objective-C/Cocoa 어플리케이션보다 항상 느려집니다.
  • Ruby는 스레드 세이프가 아니기 때문에 여러 네이티브 스레드를 디스패치하여 RubyCocoa 코드를 실행할 수 없습니다.그러나 루비의 에뮬레이트된 스레드는 사용할 수 있습니다.

외부 링크