GOBject

GObject
GOBject
개발자GNOME 프로젝트
초기 릴리즈2002년 3월 11일, 20년 전(2002-03-11)
안정된 릴리스2.66.7(2021년 2월 11일, 17개월(2021-02-11) [±][1]
기입처C
운영 체제크로스 플랫폼
이용가능기간:다국어[어느?]
유형소프트웨어 라이브러리
면허증.GNU LGPL
웹 사이트developer.gnome.org/gobject/stable/
GNU C 라이브러리는 Linux 커널 시스템콜의 래퍼로서 기능하고 있기 때문에 GLIB에 번들된 라이브러리(GOBject, Glib, GMochedule, GThread GIO)도 특정 태스크의 래퍼로서 기능합니다.

GLib Object(GLib 객체 시스템)는 휴대용 객체 시스템과 투명한 언어 간 상호 운용성을 제공하는 무료 소프트웨어 라이브러리입니다.GObject는 객체 지향 C 기반 API를 제공하기 위해 C 프로그램에서 직접 사용하거나 PyGObject와 같은 투명한 언어 간 상호 운용성을 제공하기 위해 다른 언어와의 바인딩을 통해 사용할 수 있도록 설계되었습니다.

GObject Introspection

  • C라이브러리(GObject을 사용하여)및 언어 바인딩, 비교하라 사이에 GObject 자기 성찰( 짧게 한 GIR[2])은 미들웨어 계층이다.언어 바인딩의 GTK 목록.

역사

그 놈의 GLib과 libc에만 따라 GObject 초석과 GTK, Pango, 컴퓨터 앞에 있음, 그리고 GStreamer와 애플리케이션 같은 대부분의 상위 수준의 그 놈 도서관에서 두루 통용되는 언어다그 GTK 대로 코드 베이스의 이전에 GTK+ 2.0코드 GObject과 비슷한 일부였다.— 일반적인 baseclass라고 불리었다(이름“GObject”아직 사용에 없었다.GtkObject.)

GTK+ 2.0의 석방에, 개체 시스템 별도의 도서관에 대한 일반 공용으로 인해 뽑았다.이 과정에서 의, 대부분의non-GUI-specific 부분이다.GtkObject등급을로 감동을 받았다.GObject, 새로운 공통 베이스 클래스.2002년 3월 11일(GTK+ 2.0 출시일)부터 독립된 라이브러리로 존재해 온 GObject 라이브러리는 현재 명령줄이나 서버 애플리케이션 등 GUI 이외의 많은 프로그램에서 사용되고 있습니다.

GLib와의 관계

GObject는 독자적인 매뉴얼세트를[3] 가지고 있으며 보통 독자적인 공유 라이브러리 파일로 컴파일되지만 GLib 소스 트리에 GLib와 함께 배포됩니다.이러한 이유로 GLib 버전 번호를 사용하며 일반적으로 GLib와 함께 패키지화됩니다(예를 들어 Debian은 Gobject를 GLib에 넣습니다).libglib2.0패키지 패밀리).

타입 시스템

GObject 프레임워크의 가장 기본적인 레벨에는 GType이라고 불리는 범용 다이내믹 타입 시스템이 있습니다.GType 시스템은 모든 객체에 대한 런타임 설명을 유지하며, 여러 언어 바인딩을 용이하게 하는 글루 코드를 제공합니다.유형 시스템은 불투명 포인터, 문자열, 다양한 크기의 정수 및 부동소수점 번호 등 비클래스 유형과 함께 개별적으로 상속되는 모든 클래스 구조를 처리할 수 있습니다.

유형 시스템은 등록된 유형에 속하는 값을 복사, 할당 및 삭제하는 방법을 알고 있습니다.이는 정수와 같은 유형의 경우 사소한 것이지만, 많은 복잡한 개체가 참조 카운트가 되는 반면, 일부는 복잡하지만 참조 카운트가 되지 않습니다.유형 시스템이 참조 카운트를 "복사"하는 경우 일반적으로 참조 카운트를 늘리기만 하지만, 복잡한 참조 카운트되지 않은 개체(예: 문자열)를 복사할 때는 메모리를 할당하여 실제 복사본을 만듭니다.

이 기본 기능은 다음 기능을 구현하기 위해 사용됩니다.GValue타입 시스템으로 알려진 모든 유형의 값을 저장할 수 있는 범용 컨테이너의 일종입니다.이러한 컨테이너는 모든 네이티브 값이 이러한 유형 태그 부착 컨테이너에 상주하는 동적 유형 언어 환경과 상호 작용할 때 특히 유용합니다.

기본형

연관된 클래스가 없는 유형을 비클래스라고 합니다.이러한 유형은 루트 클래스의 특정 형식에 대응하는 모든 유형과 함께 기본 유형(다른 모든 유형이 파생되는 유형)으로 알려져 있습니다.이들은 비교적 폐쇄적인 세트를 구성하지만 일반 사용자가 자신의 기본 유형을 만들 것으로 예상되지는 않지만 가능성이 존재하며, 이러한 가능성이 커스텀클래스 계층(즉, 클래스 계층이 베이스가 아닌 클래스 계층)을 만들기 위해 악용되고 있습니다.GObject학급.

GLib 2.9.[4]2에서 비클래스 내장 기본 유형은 다음과 같습니다.

  • C에 대응하는 빈 활자void(G_TYPE_NONE);
  • C의 서명 및 서명되지 않은 유형에 대응하는 유형char,int,long, 및 64비트 정수(G_TYPE_CHAR,G_TYPE_UCHAR,G_TYPE_INT,G_TYPE_UINT,G_TYPE_LONG,G_TYPE_ULONG,G_TYPE_INT64,그리고.G_TYPE_UINT64);
  • 부울형(G_TYPE_BOOLEAN);
  • 열거형 및 "플래그"형, 둘 다 C에 대응합니다.enumtype. 단, 후자는 비트필드에만 사용된다는 점에서 다릅니다(G_TYPE_ENUM그리고.G_TYPE_FLAGS);
  • C에 대응하는 단정도 및 배정도 IEEE 플로트 타입float그리고.double(G_TYPE_FLOAT그리고.G_TYPE_DOUBLE);
  • C에 대응하는 문자열 활자char *(G_TYPE_STRING);
  • C에 대응하는 불투명한 포인터 타입void *(G_TYPE_POINTER).

분류된 임베디드 기본 유형은 다음과 같습니다.

  • 인스턴스의 기본 클래스 유형GObject, 표준 클래스 상속 트리의 루트(G_TYPE_OBJECT)
  • 기본 인터페이스 타입. 기본 클래스 타입과 유사하지만 표준 인터페이스 상속 트리의 루트를 나타냅니다.G_TYPE_INTERFACE)
  • 박스 구조의 유형으로, 단순한 가치 오브젝트 또는 이물질을 참조로 감싸는 데 사용됩니다.G_TYPE_BOXED)
  • GObject에서 개체 속성의 메타데이터를 설명하는 데 사용되는 "매개 변수 지정 개체" 유형입니다( ).G_TYPE_PARAM).

유형 시스템에 의해 자동으로 인스턴스화될 수 있는 유형을 인스턴스화 가능이라고 합니다.이러한 유형의 중요한 특징은 인스턴스의 첫 번째 바이트에는 항상 인스턴스의 유형과 관련된 클래스 구조(가상 테이블의 일종)에 대한 포인터가 포함되어 있다는 것입니다.따라서 인스턴스화 가능한 유형을 분류해야 합니다.반대로 클래스되지 않은 유형(정수나 문자열 )은 인스턴스화되지 않아야 합니다.한편, 대부분의 클래스 타입은 인스턴스화 가능하지만, 인터페이스 타입 등, 인스턴스화 할 수 없는 타입도 있습니다.

파생형

내장된 GObject 기본 유형에서 파생된 유형은 크게 4가지 범주로 나뉩니다.

열거형 및 "플래그"형
일반적으로 열거된 모든 유형 및 정수 기반 모든 비트필드 유형(즉, every)입니다.enumtype) 오브젝트시스템과 관련된 어떤 방법으로 사용하려는 경우(예를 들어 오브젝트속성의 유형)는 타입 시스템에 등록해야 합니다.통상, 이러한 타입의 등록을 담당하는 초기화 코드는, 라고 하는 자동 툴에 의해서 생성됩니다.glib-mkenums[5] 다른 파일에 저장합니다.
박스형
완전한 클래스 타입을 만들기에는 너무 단순한 일부 데이터 구조(모든 오버헤드가 발생)는 여전히 타입 시스템에 등록해야 할 수 있습니다.예를 들어, 클래스 중 하나를 추가할 수 있습니다.background-color속성: 그 값은 다음과 같은 구조의 인스턴스여야 합니다.struct color { int r, g, b; }서브클래스를 회피하기 위해GObject이 구조를 나타내는 박스 타입을 작성해, 카피와 해방 기능을 제공할 수 있습니다.GObject는 단순한 GLib 데이터 유형을 포장한 몇 가지 박스 타입과 함께 출하됩니다.박스형 타입의 또 다른 용도는 타입 시스템이 식별할 수 있는 태그 부착 컨테이너에 이물질을 랩하는 방법으로 복사 및 해방 방법을 알고 있습니다.
불투명 포인터 유형
복사하거나 참조 카운트하거나 해방할 필요가 없는 객체의 경우 박스형이라도 오버킬할 수 있습니다.이러한 오브젝트는 단순히 불투명한 포인터로 처리함으로써 GObject에서 사용할 수 있습니다.G_TYPE_POINTER파생 포인터 타입을 작성하여 포인터가 특정 종류의 오브젝트를 참조할 필요가 있다는 사실을 문서화하는 것이 좋습니다.단, 그 이외의 포인터에 대해서는 언급하지 않습니다.
클래스 및 인터페이스 유형
GObject 어플리케이션의 대부분의 유형은 루트 클래스에서 직접 또는 간접적으로 파생된 클래스입니다.GObject또, 기존의 Java 스타일의 인터페이스와는 달리, 실장된 메서드를 포함할 수 있는 인터페이스도 있습니다.따라서 GObject 인터페이스는 mixin이라고 할 수 있습니다.

메시징 시스템

GObject 메시지 시스템은 폐쇄와 신호라는 가지 보완적인 부분으로 구성됩니다.

폐쇄
GObject 클로저는 콜백의 일반 버전입니다.C 및 C++로 작성된 클로저와 임의의 언어(바인딩이 제공되는 경우)가 지원됩니다.이를 통해 GObject 클로저를 통해 Python 및 Java로 작성된 코드를 호출할 수 있습니다.
신호.
신호는 폐쇄를 호출하는 주요 메커니즘입니다.객체는 신호 수신기를 유형 시스템에 등록하여 지정된 신호와 지정된 폐쇄 사이의 매핑을 지정합니다.등록된 신호가 방출되면 해당 신호의 닫힘이 호출됩니다.GTK에서는 모든 네이티브 GUI 이벤트(마우스 동작이나 키보드액션 등)에서 청취자가 동작할 가능성이 있는 GObject 신호를 생성할 수 있습니다.

등급 구현

각 GObject 클래스는 클래스 구조 및 인스턴스 구조라는 적어도2개의 구조에 의해 구현됩니다.

계급 구조
클래스 구조는 C++ 클래스의 vtable에 대응합니다.슈퍼클래스의 클래스 구조부터 시작해야 합니다.이어서 클래스의 각 가상 메서드에 대해 하나씩 함수 포인터 세트를 유지합니다.클래스 고유의 변수를 사용하여 클래스 멤버를 에뮬레이트할 수 있습니다.
인스턴스 구조
오브젝트 인스턴스당 1개의 복사본에 존재하는 인스턴스 구조는 슈퍼클래스의 인스턴스 구조부터 시작해야 합니다(인스턴스 가능한 모든 기본 유형이 이 속성을 공유하므로 모든 인스턴스가 클래스 구조에 대한 포인터로 시작됩니다).슈퍼클래스에 속하는 데이터 후에 구조체는 C++ 멤버 변수에 대응하는 인스턴스 고유의 변수를 유지할 수 있습니다.

GObject 프레임워크에서 클래스를 정의하는 것은 복잡하며, 활자 주조 매크로의 수동 정의 및 불분명한 활자 등록 명령과 같은 많은 의 보일러 플레이트 코드가 필요합니다.또한 C 구조체는 "public", "protected" 또는 "private"와 같은 액세스 수식자를 가질 수 없으므로 캡슐화를 제공하기 위해 회피책을 사용해야 합니다.한 가지 접근방식은 개인 데이터에 대한 포인터를 포함하는 것입니다(통칭:_priv: 인스턴스 구조에서.프라이빗 구조는 퍼블릭헤더 파일에는 선언할 수 있지만 구현 파일에만 정의되므로 프라이빗 데이터는 사용자에게는 불투명하지만 구현자에게는 투과적입니다.프라이빗 구조가 GType에 등록되어 있으면 오브젝트 시스템에 의해 자동으로 할당됩니다.실제로, 이러한 정보를 포함할 필요도 없습니다._priv포인터, 주문을 사용할 의향이 있다면G_TYPE_INSTANCE_GET_PRIVATE개인 데이터가 필요할 때마다 말이죠.

이러한 복잡성 중 일부를 해결하기 위해 C의 GObject에 소스컴파일을 하는 몇 가지 상위 수준의 언어가 존재합니다.Vala 프로그래밍 언어는 C# 스타일의 구문을 사용하며 바닐라 C 코드로 사전 처리됩니다.GOBject Builder(GOB2)는 Java를 연상시키는 템플릿 구문을 제공합니다.

사용.

C와 GObject의 조합은 GNOME 데스크톱, GTK 툴킷 및 GIMP 이미지 조작 프로그램과 같은 많은 성공적인 자유 소프트웨어 프로젝트에서 사용됩니다.

많은 GObject 어플리케이션들이 완전히 C로 작성되어 있지만 GObject 시스템은 C++, Java, Ruby, Python, Common Lisp 및 같은 많은 다른 언어의 네이티브 오브젝트 시스템에 잘 매핑됩니다.NET/Mono.그 결과 GObject 프레임워크를 사용하는 잘 작성된 라이브러리를 위해 언어 바인딩을 작성하는 것은 비교적 쉬운 작업입니다.

단, 처음부터 GObject 코드를 C에 쓰는 것은 비교적 상세합니다.라이브러리는 학습하는 데 상당한 시간이 걸리고, 높은 수준의 객체 지향 언어에 대한 경험이 있는 프로그래머들은 종종 C에서 GObject를 사용하는 것이 다소 지루하다고 느낍니다.예를 들어 서브클래스 작성(단순히 서브클래스 작성)GObject)는 대량의 보일러 플레이트 [6]코드를 작성하거나 복사해야 할 수 있습니다.그러나 주로 GObject와 연동하도록 설계되어 C로 변환되는 언어인 Vala를 사용하면 GObject 또는 GObject 기반 라이브러리를 보다 효율적으로 작성할 수 있습니다.

실제로 퍼스트 클래스 객체는 아니지만(GType에는 실제 메타타입이 없음), 클래스 및 인터페이스와 같은 메타 객체는 런타임에 GObject 응용 프로그램에 의해 생성되어 자기성찰에 대한 좋은 지원을 제공합니다.Glade와 같은 언어 바인딩 및 사용자 인터페이스 설계 응용 프로그램에서 이 기능을 사용하여 GObject 클래스를 제공하는 공유 라이브러리를 로드하고(보통 Glade의 경우 위젯의 일종), 클래스의 모든 속성 목록과 유형 정보 및 문서 목록을 가져옵니다.반지.

다른 개체 시스템에 비교는.

GObject는 C를 위한[citation needed] 거의 완전한 오브젝트 시스템을 제공하기 때문에 C++Objective-C같은 C에서 파생된 언어의 대안으로 볼 수 있습니다.C++와 GObject의 차이는 GObject(Java와 마찬가지로)가 다중 상속[7]지원하지 않는다는 것입니다.

GLib의 g_malloc() 메모리 할당 함수를 사용하는 GObject는 단순히 [8]크래시하지 않고 프로그램이 메모리 부족 상황에 대처하거나 완전히 복구할 수 있는 C 라이브러리의 malloc(), C++의 새로운 메모리 할당기 및 기타 일반적인 메모리 할당기와는 달리, 메모리가 고갈되었을 때 프로그램을 무조건 종료시킵니다.이는 메모리 부족 시 복원력이 중요하거나 매우 많은 객체 또는 매우 큰 객체가 일반적으로 취급되는 소프트웨어에 GObject를 포함시키는 것을 반대하는 경향이 있습니다.g_try_new()는 메모리 할당이 실패할 가능성이 더 높은 경우(예를 들어 큰 개체의 경우) 사용할 수 있지만 코드 [9]내의 다른 곳에서 할당이 실패하지 않는 것을 허용할 수는 없습니다.

또 다른 중요한 차이점은 C++와 Objective-C는 별개의 언어이지만 GObject는 엄밀하게 라이브러리이기 때문에 새로운 구문이나 컴파일러 인텔리전스를 도입하지 않는다는 것입니다.예를 들어 GObject 기반 C 코드를 작성할 때 명시적[citation needed]업캐스팅을 수행해야 하는 경우가 많습니다.따라서 "C with GObject"는 플레인 C와는 다른 언어로 간주되며, C++와는 달리 플레인 C의 엄밀한 슈퍼셋입니다.

모든 C++ 컴파일러에서 동작하는 표준 ABI가 없는 플랫폼에서는(일반적으로 Itanium ABI 또는 Microsoft ABI 중 하나를 따르기 때문에) 하나의 C++ 컴파일러로 컴파일된 라이브러리가 항상 다른 [citation needed]컴파일러로 컴파일된 라이브러리를 호출할 수 있는 것은 아닙니다.이러한 호환성이 필요한 경우 C++ 메서드를 플레인 C 함수로 내보내야 하며 C++ 오브젝트 시스템의 [citation needed]목적을 부분적으로 무시합니다.이 문제는 부분적으로 C++ 컴파일러마다 다른 종류의 이름 망글링을 사용하여 내보낸 모든 심볼의 일의성을 보증하기 위해 발생합니다.(예를 들어, 2개의 다른 클래스에서 동일한 이름의 멤버함수가 있거나, 1개의 함수명이 여러 번 오버로드되거나, 동일한 이름의 함수가 다른 네임스페이스에 표시될 수 있지만 오브젝트코드에서는 이러한 중복은 허용되지 않습니다).[citation needed]이와는 대조적으로 C는 오버로드나 네임스페이스를 지원하지 않기 때문에 C 라이브러리의 작성자는 일반적으로 내보낸 [citation needed]이름의 글로벌 고유성을 확보하기 위해 명시적 프레픽스를 사용합니다.따라서 객체 지향에도 불구하고 C로 작성된 GObject 기반 라이브러리는 어떤 컴파일러가 사용되는지에 관계없이 항상 동일한 외부 심볼 이름을 사용합니다.

아마도 가장 심오한 차이는 GObject가 신호(다른 [citation needed]언어로 이벤트라고 함)에 중점을 둔다는 것이다.이 점은 GObject가 GUI 툴킷의 요구를 충족하도록 특별히 설계되었다는 사실에서 비롯됩니다.대부분의 객체 지향 언어를 위한 신호 라이브러리가 있지만 GObject의 경우 객체 시스템에 내장되어 있습니다.이 때문에 일반적인 GObject 어플리케이션은 비 GOBject 어플리케이션보다 훨씬 더 많은 신호를 사용하는 경향이 있기 때문에 GObject 컴포넌트는 플레인 C++ 또는 [citation needed][according to whom?]Java를 사용하는 컴포넌트보다 훨씬 더 캡슐화되어 재사용이 가능합니다.각각 Glib/GTK에 대한 공식 C++ 래퍼인 glibmm/gtkmm를 사용하는 경우 형제 프로젝트 libsigc++를 사용하면 표준 C++를 사용하여 기본 GObject 신호를 쉽게 사용할 수 있습니다.물론 Boost와 같은 추가 라이브러리가 필요할 수도 있지만, 대부분의 플랫폼에서 신호의 다른 구현도 사용할 수 있습니다.C++의 시그널2

「 」를 참조해 주세요.

레퍼런스

  1. ^ Withnall, Philip (11 Feb 2021). "glib 2.66.7". GNOME ftp-release (Mailing list). Retrieved 12 February 2021.
  2. ^ "Introspection, Summary". Gnome Developer, Programming Guidelines - Specific How-Tos. Retrieved 9 August 2020.
  3. ^ "GObject Reference Manual".
  4. ^ "GObject Reference Manual - Stable".
  5. ^ "glib-mkenums, GObject Reference Manual".
  6. ^ "How to define and implement a new GObject". gnome.org. Retrieved 27 July 2013.
  7. ^ "c++ - Why Was the GObject System Created?". Stack Overflow. Retrieved 2019-11-16.
  8. ^ "Memory Allocation: GLib Reference Manual". developer.gnome.org. Retrieved 2019-11-16.
  9. ^ "Memory Allocation: GLib Reference Manual". developer.gnome.org. Retrieved 2019-11-17.

외부 링크