[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][TOP]

Glib Object Systemの日本語訳について


 初めまして、徳永と申します。

 Glib Object Systemの日本語訳を読んでみて、いくつか気になるところがあっ
たのでまとめてみました。納得できる部分だけでも利用して頂ければうれしいで
す。

 こういう場合にどうやればよいのかよくわからなかったので、>で始まってい
る部分に訳文と原文があり、その下に私の訳案という形にしました。#で始まる
のがコメントです。


*第 1 章 はじめに

> コンパイルやインタプリタの対象となるその他の言語に (自動的に) 透過な
>API のバインディング
> automatic transparent API bindings to other compiled or interpreted
>languages.

 C以外の言語(コンパイルされるものでもインタプリタを使うものでもどちら
でもよい)に対して自動的に透過的になるAPIバインディング

#原文に比べてだいぶ長いですが


>コンパイルするだけ、または直接インタプリタするだけの言語を使った作業
>work with compiled-only or dynamically interpreted-only languages

コンパイル言語のみもしくは動的なインタプリタ言語のみを使った作業


>相互に互換性をもつクロス言語に関連する課題
>the challenges associated with cross-language interoperability

複数の言語を使用する際の相互運用に関連する課題


>このセクションでは、これらの挑戦に視点を移して GLib が選択した (マルチ・
>プラットフォームを意識した) その解決方法について簡単に解説します。
>This introduction tries to provide an insight into these challenges and
>describes briefly the solution choosen by GLib.

 このイントロダクションではこれらの問題と、Glibが選択した解決法について
の簡単な説明を行います。

#かなり意訳入ってるので微妙。


**C 言語 API のエキスポート

>議論する目的のために
>For the sake of discussion

 議論のために

>ランタイムで
> at runtime

 実行時に


*第 2 章 Glib のダイナミックな型管理システム

>ある一つのオブジェクトの型を普通に理解することよりもはるかに汎用的です
>much more generic than what is usually understood as an Object type

通常オブジェクトの型と理解されているものよりもはるかに汎用的です。


>それは、型管理システムの中で新しい型を登録するために使用する構造体と関数
>に注目することが理解の一助になります。 
>It is best explained by looking at the structure and the functions used
>to register new types in the type system. 

 新しい型を型システムに登録する際に使用する構造体と関数に注目すると、
(Glibの型システムについて)理解しやすいでしょう。


>g_type_init() 関数による初期化で、型管理システムはその内部のデータ構造体
>のみ初期化しませんが、たくさんの核となる型を登録します: これらのいくつか
>は基本型です。その他の型はこれらの基本型から派生します。
>Upon initialization by g_type_init, the type system not only initializes
>its internal data structures but it also registers a number of core
>types

 g_type_initによる初期化の際、型システムは内部のデータ構造体を初期化す
るだけではなく、たくさんの核となる型を登録します。


>基本型と基本型ではない型は次のメンバで定義されます
>Fundamental and non-Fundamental types are defined by

 基本型、非基本型は両方とも次のメンバで定義されます


>基本型ではない型は、その親の型で定義されます。この親の型は引数
>parent_type として g_type_register_static() と g_type_register_dynamic()
>の両関数へ引き渡されます。
>Non-Fundamental types are furthermore defined by the type of their
>parent which is passed as the parent_type parameter to
>g_type_register_static  and g_type_register_dynamic. 

 基本型でない型をg_type_register_staticやg_type_register_dynamicを用い
て登録する際には、引数として親となる型を渡す必要があります。

#かなり意訳ですが、リファレンスマニュアルを読むとg_type_register_static
#(GType parent_type,...となっていますから、こんなものではないかと。


**コピー関数

>それらの型をコピーしたり挿入したりする単一 API を介して全ての操作
>を行うことができるということです。
>is that they can all be manipulated through a single API to copy/assign
>them. 

 全ての型をコピー/代入するための操作が単一のAPIを介して行えるということ
です。


>興味深いことに、型を登録する際に value_table を指定する必要性は全くあり
>ません。その理由は、これらの value_table が基本型ではない型の親の型から
>派生しているからです。これは基本型を記述することがないことを意味します
>(素晴らしい考えではありません!)。親の型から value_table 構造体を派生さ
>せればよいので、新しく value_table を提供する必要がないのです。
> Interestingly, it is also very unlikely you will ever need to specify a
>value_table during type registration because these value_tables are
>inherited from the parent types for non-fundamental types which means
>that unless you want to write a fundamental type (not a great idea !),
>you will not need to provide a new value_table since you will inherit
>the value_table structure from your parent type.

 興味深いことに、型を登録する際にコピー関数を指定する必要はほとんどあり
ません。基本型以外の方は親から派生しているので、親の型が持つコピー関数を
使えるからです。

#かなり意訳気味ですが、原文をそのまま訳すとわけがわからないと思います。


**規約

>オブジェクト型 bar のインスタンス上でメソッド名 foo を呼び出す場合は
>bar_foo が関数名になります。
>to invoke the method named foo on an instance of object type bar, call
>bar_foo.

 bar型のインスタンスの持つfooというメソッドを呼び出す場合にはbar_fooと
なります。


>PREFIX_OBJECT_TYPE という名前のマクロを生成して下さい。このマクロは常に
>関連するオブジェクト型に対して GType を返します。maman を接頭子
>(PREFIX)とするライブラリの中にある Bar 型のオブジェクトに対しては、
>MAMAN_BAR_TYPEを使います。グローバルな static 変数、あるいは
>prefix_object_get_type という名前の関数のどちらか一方を使ってこのマクロ
>を実装する必要はありませんが共に同じです。このドキュメントの中では、可能
>な限り常に関数パターンに従います。
>Create a macro named PREFIX_OBJECT_TYPE which always returns the Gtype
>for the associated object type. For an object of type Bar in a libray
>prefixed by maman, use: MAMAN_BAR_TYPE. It is common although not a
>convention to implement this macro using either a global static variable
>or a function named prefix_object_get_type. We will follow the function
>pattern wherever possible in this document.

 オブジェクトの型を表すGType型の値を常に返すPREFIX_OBJECT_TYPEという名
前のマクロを作成してください。mamanがprefixでオブジェクトの型がBarであれ
ば、MAMAN_BAR_TYPEとなります。
 なお、これは規約ではありませんが、このマクロは大抵staticなグローバル変
数かprefix_object_get_typeという名前の関数のどちらかで実装されます。この
ドキュメントの中では、可能な限り関数パターンを使います。


>これらのマクロの実装は少しだけ分かりやすいものになっています: 簡単に利用
>できるいくつかのマクロは gtype.h の中で提供されています。例えば上記を利
>用した例として、マクロを宣言するために次のようなちょっとしたコードを書
>くだけで済みます
> The implementation of these macros is pretty straightforward: a number
>of simple-to-use macros are provided in gtype.h. For the example we used
>above, we would write the following trivial code to declare the macros:

 これらのマクロを実装するのはかなり簡単です。簡単に使える数々のマクロが
gtype.hに定義されています。例えば、上に書いたような名前のマクロを実際に
実装するためには、マクロを宣言するために次のようなちょっとしたコードを書
くだけです。


**インスタンス化できない、クラス化できない基本型

>型管理システムによってインスタンスできないたくさんの型はクラスを持ちませ
>ん。これらの型の多くは gchar のような foundamental trivial 型で、
>(gvaluetypes.c の) g_value_types_init() 関数の中に登録されています。
> A lot of types are not instantiable by the type system and do not have
>a class. Most of these types are fundamental trivial types such as
>gchar, registered in g_value_types_init (in gvaluetypes.c).

 多くの型は型管理システムによってインスタンス化できず、また、クラスも持
っていません。これらの方の多くはgcharのような基本的かつ自明な型で、
g_value_types_init関数の中で登録が行われます。


>これらの型のほとんどは、複数の GValue の接続に使用します:GValue は整数値
>や文字列を使って初期化され、登録した型の value_table を利用して引き渡さ
>れます。複数の GValue (と、これらの trivial fundamental 型の拡張) は、オ
>ブジェクトのプロパティとシグナルを接続する際にとても便利なものです。 
>Most of these types are used in conjunction with GValues: a GValue is
>initialized with an integer or a string and it is passed around by using
>the registered type's value_table. GValues (and by extension these
>trivial fundamental types) are most useful when used in conjunction with
>object properties and signals.

 これらの型のほとんどはGValueとともに使用します。GValueは整数値や文字
列を使って初期化され、登録された型のvalue_tableを用いて引き渡されます。
GValueはオブジェクトのプロパティやシグナルとともに使用するととても便利です。


**インスタンス化できるクラス型: オブジェクト

>あるクラスで登録され、インスタンス可能であると宣言された型は、とてもよく
>似たオブジェクトです。次のコードは、型管理システムの中にあるそのような型
>を登録することができることを示しています: 
> Types which are registered with a class and are declared instantiable
>are what most closely resembles an object. The code below shows how
>you could register such a type in the type system:

 クラスとともに登録され、インスタンス化可能であると宣言された型は、オブ
ジェクトと非常に似ています。次のコードは、型管理システムの中にそのような
型を登録する方法を示しています


> 標準 C 言語は、メモリの中にある構造体のメンバを格納するために使用するバ
>ッファの先頭バイトに配置された C 言語構造体の先頭メンバに権限を委譲しま
>す。
> The C standard mandates that the first field of a C structure is stored
>starting in the first byte of the buffer used to hold the structure's
>fields in memory. 

 C言語の標準は、構造体の先頭のメンバを、構造体を格納するために使用され
るメモリの先頭バイトに配置するように要求しています


>これらの型のインスタンスは g_type_create_instance() 関数を使って実行する
>ことが可能です:
>Instanciation of these types can be done with g_type_create_instance

 これらの型のインスタンスの作成はg_type_create_instanceを使うことで行え
ます。


>呼び出す関数
>Function Invoked

 呼び出される関数


**インスタンス化できないクラス型: インタフェース

>次のコードの一部分はそのようなインタフェースを宣言するものです:
>The following piece of code declares such an interface.

 次のコードの断片は、そのようなインタフェースを宣言するためのものです。


>g_type に直近で派生したインタフェースの型がセットされ、このインタフェー
>スを実装している直近で派生した型がセットされます。
> g_type is set to the type of the most-derived interface and
>g_instance_type is set to the type of the most derived type which
>implements this interface.

 g_type に直近で派生したインタフェースの型がセットされ、
g_instance_typeにこのインタフェースを実装している直近で派生した型がセッ
トされます。


*第3章 クロージャ (Closure)

>クロージャは抽象的な、コールバックの汎用的な代理システムです。
> A Closure is an abstraction, a generic representation of a callback.

 クロージャは抽象概念であり、コールバックの一般的な表現です。

#訳は自信ないです。とりあえず代理は変だと思います。


> クロージャの破壊を代理する関数ポインタ。
> a function pointer which represents the destructor of the closure:

 クロージャのデストラクタを示す関数ポインタ。

#destructorをどう訳すべきかわかりませんが、とりあえず破壊は変じゃないかと。
#代理も変だと思います。


>C クロージャマーシャラは、目的の関数へのパラメータを置き換えるGValueの配
>列を C スタイルの関数パラメータリストへ変換し、ユーザーが与えた C 関数を
>新しいパラメータリストとともに起動し、その関数の返り値を受け取り、それを
>GValueへ変換して、マーシャラの呼び出し元へこの GValue を返します。
> C closure marshallers transform the array of GValues which represent
>the parameters to the target function into a C-style function parameter
>list, invoke the user-supplied C function with this new parameter list,
>get the return value of the function, transform it into a GValue
>and return this GValue to the marshaller caller.

 C クロージャマーシャラは、呼び出すコールバック関数の引数リストを表して
いるGValueの配列を実際のC言語スタイルの引数リストへと変換し、変換した引
数リストとともにコールバック関数を起動し、そしてその関数の返り値を受け取
り、さらにそれをGValueへ変換して、マーシャラの呼び出し元へこのGValueを返
します。


**シグナルの発行

>HANDLER_RUN_LAST: もし g_signal_connect_after によってクロージャが起動され
>HANDLER_RUN_LAST: if any closure were connected with the
>g_signal_connect_after family of functions

 もし g_signal_connect_after 関数ファミリでクロージャが接続され


*第 4 章 GObject: ともに全てをもたらすもの

>GObject は基本クラス化された、インスタンス化可能な型です
>GObject is a fundamental classed instantiable type

GObjectはクラス化された、インスタンス化可能な基本型です




徳永拓之