Quá trình ánh xạ (mapping) từ ngôn ngữ đặc tả sang ngôn ngữ cài đặt

Tuy nhiên một vấn đề nảy sinh ra , điểm bất đồng giữa các ngôn ngữ lập trình . Các đối tượng thiết kế bằng ngôn ngữ nào thì sau khi biên dịch ra dạng nhị phân (binary) chỉ có mã lệnh tương ứng với ngôn ngữ đó mới có khả năng truy xuất được đối tượng . Đối tượng C++ không dễ gì truy xuất được từ mã lệnh Delphi hay Visual Basic một cách tự nhiên . (Mặc dù có một số kĩ thuật như sử dụng thư viện liên kết động DLL nhưng đó không phải là các giải pháp toàn diện ).

doc37 trang | Chia sẻ: vietpd | Lượt xem: 1295 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Quá trình ánh xạ (mapping) từ ngôn ngữ đặc tả sang ngôn ngữ cài đặt, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Lời nói đầu Ngày nay cùng với việc phát triển của mạng máy tính việc viết một ứng dụng trên một máy đơn cục bộ không còn được ưa chuộng và thích hợp nữa . Các chương trình và ứng dụng hiện đại phải tích hợp và triệu gọi lẫn nhau trên mạng Intranet (mạng cục bộ), mạng Internet (mạng toàn cầu). Tuy nhiên một vấn đề nảy sinh ra , điểm bất đồng giữa các ngôn ngữ lập trình . Các đối tượng thiết kế bằng ngôn ngữ nào thì sau khi biên dịch ra dạng nhị phân (binary) chỉ có mã lệnh tương ứng với ngôn ngữ đó mới có khả năng truy xuất được đối tượng . Đối tượng C++ không dễ gì truy xuất được từ mã lệnh Delphi hay Visual Basic một cách tự nhiên . (Mặc dù có một số kĩ thuật như sử dụng thư viện liên kết động DLL nhưng đó không phải là các giải pháp toàn diện ). Các nhà lập trình luôn mong muốn tìm được một tiếng nói chung cho tất cả các ngôn ngữ lập trình hiện có . Và thế là CORBA ra đời . CORBA ( Common Object Request Broker Achitecture) - tạm dịch là Kiến trúc môi giới gọi các đối tượng thông dụng . CORBA được hình thành từ một tổ chức nghiên cứu quốc tế OMG (Object Management Group ) với sự hợp tác của hơn 800 công ty . Tham vọng của OMG là đưa ra cách để các đối tượng viết bằng những ngôn ngữ khác nhau có thể triệu gọi lẫn nhau theo mô hình đối tượng phân tán . CORBA không phải là ngôn ngữ lập trình như C++ hay Java . CORBA là một ngôn ngữ đặc tả (description language) . Sau đây sẽ trình bày quá trình ánh xạ (mapping) từ ngôn ngữ đặc tả sang ngôn ngữ cài đặt I. ánh xạ từ IDL sang C++ Giới thiệu: ánh xạ IDL sang C++ phải thoã mãn các yêu cầu sau : - ánh xạ phải có tính trực quan và dễ sử dụng phải bảo tồn ngôn ngữ chung của C++ và phải gần giống với C++ thường phải an toàn về kiểu sử dụng có hiệu quả chu kỳ của CPU và bộ nhớ thực hiện trên các cấu trúc của bộ nhớ đoạn và bộ nhớ vật lý phải được hướng nội sao cho nó có thể dùng trong môi trường phân luồng ánh xạ phải bảo toàn tính che giấu cục bộ (tính trong suốt) Việc ánh xạ sang C++ phức tạp và rộng lớn nhưng không phải quá khó. Thứ nhất, ánh xạ là thuận tiện ví dụ bạn hiểu rõ về cách tổ chức và quản lý bộ nhớ của kiểu String, và các luật quản lý đối với kiểu dữ liệu Variable-length, thứ hai, việc ánh xạ là an toàn, không yêu cầu sắc thái và bắt lỗi dễ dàng trong lúc biên dịch Thứ 3, sự ánh xạ này là dễ nhớ mặc dù lớp có nhiều hàm thành viên, nhưng bạn chỉ cần gọi một số hàm chính, còn một số hàm khác tồn tại mặc định để cung cấp các chuyển đổi tham số truyền và không cần phải gọi rõ ràng 2. ánh xạ cho tên: Cỏc tờn của IDL được bảo toàn khi ỏnh xạ sang C++. Để minh hoạ cho điều này ta xột vớ dụ sau: Trong IDL: enum color {red, green, blue}; Khi ỏnh xạ sang C++: enum color {red, green, blue}; Cỏc ỏnh xạ sang C++ cũng bảo toàn cỏc toỏn tử phạm vi. Vớ dụ nếu như trong IDL toỏn tử phạm vi Outer :: Inner là hợp lệ thỡ khi ỏnh xạ sang C++ nú cũng vẫn là Outer :: Inner. Một vấn đề phỏt sinh khi trong IDL ta dựng tờn trựng với từ khoỏ trựng với cỏc từ khoỏ của C++: Vớ dụ định nghĩa sau là hoàn toàn hợp lệ trong IDL: Enum class {if, this, while, case }; nhưng khi ỏnh xạ sang C++ thỡ nú sẽ tự động được thờm vào tiền tố: _cxx_. Vỡ vậy nú sẽ cú dạng như sau: enum _cxx_class { _cxx_if, _cxx_this, _cxx_while, _cxx_case }; cỏc tiền tố này làm cho cỏc cõu lệnh trở nờn khú đọc, do vậy tốt nhất là ta nờn trỏnh dựng chỳng. Bõy giờ chỳng ta sẽ đi xột chi tiết vào từng kiểu dữ liệu một 3. Ánh xạ cỏc kiểu dữ liệu cơ bản Cỏc kiểu dữ liệu cơ bản được ỏnh xạ sang C++ được mụ tả ở bảng sau: OMG IDL C++ C++ Out Type short CORBA::Short CORBA::Short_out long CORBA::Long CORBA::Long_out unsigned short CORBA::UShort CORBA::UShort_out unsigned long CORBA::ULong CORBA::ULong_out float CORBA::Float CORBA::Float_out double CORBA::Double CORBA::Double_out char CORBA::Char CORBA::Char_out boolean CORBA::Boolean CORBA::Boolean_out octet CORBA::Octet CORBA::Octet_out 4. Cỏc kiểu dữ liệu phức: Cỏc kiểu dữ liệu phức ở trong IDL được ỏnh xạ sang C++ như sau: OMG IDL C++ Object CORBA::Object_ptr struct C++ struct union C++ class enum C++ enum string char * Sequence C++ class array C++ array a>. String Một chuỗi trong IDL được ỏnh xạ sang C++ là char *. Cả chuỗi giới hạn và chuỗi khụng giới hạn độ dài thỡ đều được ỏnh xạ sang C++ là char *. Cỏc chuỗi CORBA trong C++ được kết thỳc bởi con trỏ NULL. Nếu một chuỗi mà cú chứa một kiểu tự định nghĩa khỏc, vớ dụ như kiểu struct, thỡ nú được ỏnh xạ sang kiểu C ORBA::String_v ar. Điều này đảm bảo rằng mỗi thành phần trong struct được quản lý bởi chớnh bộ nhớ của nú. Cỏc chuỗi phải được cấp phỏt và ngừng cấp phỏt bằng việc sử dụng cỏc hàm thành phần sau trong lớp CORBA: string_alloc // hàm cấp phỏt string_dup string_free // hàm huỷ Chỳ ý: hàm string_alloc cấp phỏt vựng nhớ cú độ dài len+1 vỡ nú cũn chứa một ký tự null b>.Enum Cỏc kiểu enum trong IDL được ỏnh xạ sang một kiểu enum trong C++ // IDL module INVENT { enum Reply {ACCEPT, REFUSE}; } // C++ class INVENT { . . . enum Reply {ACCEPT, REFUSE}; }; Tham chiếu đến cỏc thành phần như sau là hợp lệ: INVENT::Reply accept_reply; accept_reply = INVENT::ACCEPT; c> .Struct Cỏc kiểu struct trong IDL được ỏnh xạ sang cỏc kiểu struct trong C++. Chỳng ta cựng xem xột cỏc cấu trỳc cú chiều dài cố định với cỏc cấu trỳc cú chiều dài thay đổi: // IDL module INVENT { // Chiều dài cố định struct Date { long year; long month; long day; }; // Chiều dài thay đổi struct Address { string aptNum; string streetName; string city; string state; string zipCode; }; }; // C++ class INVENT { struct Date { CORBA::Long year; CORBA::Long month; CORBA::Long day; }; struct Address { CORBA::String_var aptNum; CORBA::String_var streetName; CORBA::String_var city; CORBA::String_var state; CORBA::String_var zipCode; Address &operator=(const Address &_obj); }; }; Đối với cỏc kiểu dữ liệu cơ bản trong cỏc thành phần của struct được ỏnh xạ sang cỏc kiểu tương ứng trong C++. Cũn cỏc kiểu dữ liệu như: tham chiếu đối tượng, cỏc tham chiếu giả đối tượng, cỏc chuối thỡ được ỏnh xạ cỏc lớp _var tương ứng: CORBA::string_var CORBA::object_var Union Một kiểu Union trong IDL được ỏnh xạ sang một lớp trong C++. Lớp này chứa: Cỏc hàm tạo lập (Constructors) Cỏc hàm huỷ (Destructors) Cỏc toỏn tử gỏn Cỏc thay đổi cho cỏc giỏ trị của union Cỏc bộ truy nhập cho cỏc giỏ trị của union. Vớ dụ: // IDL union OrderItem switch (long) { case 1: itemStruct itemInfo; case 2: orderStruct orderInfo; default: ID idInfo; }; // C++ class OrderItem { public: OrderItem(); OrderItem(const OrderItem &); ~OrderItem(); OrderItem &operator=(const OrderItem&); void _d (CORBA::Long); CORBA::Long _d () const; void itemInfo (const itemStruct &); const itemStruct & itemInfo () const; itemStruct & itemInfo (); void orderInfo (const orderStruct &); const orderStruct & orderInfo () const; orderStruct & orderInfo (); void idInfo (ID); ID idInfo () const; . . . }; Cỏc định nghĩa kiểu Cỏc định nghĩa kiểu trong IDL được ỏnh xạ trực tiếp sang cỏc định nghĩa kiểu của C++. Nếu định nghĩa kiểu IDL gốc được ỏnh xạ sang một vài kiểu của C++ thỡ trỡnh biờn dịch của IDL sẽ sinh ra cỏc bớ danh tương ứng cho mỗi kiểu trong C++. // IDL typedef octet example_octet; typedef enum enum_values {           first,           second,           third } enum_example; // Kết quả trong C++ typedef octet example_octet; enum enum_values {           first,           second,           third }; typedef enum_values enum_example; // bớ danh được tạo ra Modules Một module của IDL nờn được ỏnh xạ sang một namespace của C++ với tờn tương tự // IDL module ABC {           // Definitions           ... }; ... // Kết quả trong C++ class ABC {           // Definitions           ... }; Sequences Cỏc sequences của IDL cả giưúi hạn hay khụng giới hạn đều được ỏnh xạ sang class của C++. Chỳ ý: Khi chiều dài của sequence khụng giới hạn vượt quỏ chiều dài cực đại thỡ C++ sẽ cấp phỏt trong suốt một buffer lớn hơn, nú sẽ copy buffer cũ vào buffer mới và giải phong bộ nhớ khỏi buffer cũ. Tuy nhiờn, nú sẽ khụng thực hiện giải phúng bất kỳ bộ nhớ nào chưa bao giờ được dựng đến nếu chiều dài cực đại giảm. Xột vớ dụ sau: ỏnh xạ một sequence khụng giới hạn (unbounded)của IDL sang C++ // IDL typedef sequence LongSeq; ... // Results in the generation of this C++ code class LongSeq { public: LongSeq(CORBA::ULong max=0); LongSeq(CORBA::ULong max=0, CORBA::ULong length,                               CORBA::Long *data, CORBA::Boolean release = 0); LongSeq(const LongSeq&); ~LongSeq(); LongSeq&                  operator=(const LongSeq&); CORBA::ULong              maximum() const; void                      length(CORBA::ULong len); CORBA::ULong              length() const; const CORBA::ULong&       operator[](CORBA::ULong index) const; ... static LongSeq            *_duplicate(LongSeq* ptr); static void               _release(LongSeq *ptr); static CORBA::Long        *allocbuf(CORBA::ULong nelems); static void               freebuf(CORBA::Long *data); private: CORBA::Long         *_contents; CORBA::ULong        _count; CORBA::ULong        _num_allocated: CORBA::Boolean      _release_flag; CORBA::Long         _ref_count; }; í nghĩa của cỏc hàm được mụt tả ở bảng sau: Phương thức Mụ tả LongSeq(CORBA::ULong max=0) bộ tạo lập cho một sequence khụng giới hạn chiếm một chiều dài cực đại như một tham số. Cỏc sequence giới hạn thỡ cú một chiều dài cực đại xỏc định. LongSeq(CORBA::ULong max=0,     CORBA::ULong length,     CORBA::Long *data,    CORBA::Boolean release=0) Constructor này cho phộp bạn đặt một chiều dài cực đại, chiều dài hiện tại, một con trỏ tới bộ đệm dữ liệu kết hợp và một cờ giải phúng.Nếu cờ giải phúng khỏc 0, ISB về C++ sẽ giải bộ nhớ kết hợp với bộ đẹm dữ liệu khi tăng kớch thước của sequence. Nếu cờ giải phúng bằng 0 thỡ bộ nhớ của bộ dệm dữ liệu cũ khụng được giải phúng. Sequence giới hạn cú tất cả cỏc thụng số này trừ max. LongSeq(const LongSeq&) Bộ tạo lập sao chộp thực hiện sao chộp sõu đối tượng nguồn. ~LongSeq(); Destructor giải phúng tất cả bộ nhớ của chớnh sequence nếu cờ giải phúng (release flag) cú giỏ trị khỏc khụng khi được tạo lập. Operator=(const LongSeq&j) Toỏn tử gỏn thực hiện một sự ao chộp sõu, giải phúng việc lưu trữ cũ nếu cần thiết.. Maximum() Trả lại kớch thước của sequence. length() Hai phương thức được định nghĩa cho việc đặt và trả lại chiều dài của sequence. Operator[]() Hai toỏn tử chỉ mục được cung cấp cho việc truy nhập một phần tử trong sequence. Một toỏn tử cho phộp phần tử được thay đổi cũn một toỏn tử chỉ cho phộp truy nhập đọc phần tử. _release() Giải phúng sequence. Nếu cờ giải phúng của bộ tạo lập là khỏc 0 khi đối tượng được khởi tạo và kiểu phần tử của sequence là một chuỗi hoặc tham chiếu đối tượng thỡ mỗi phần tử sẽ được giải phúng trước khi buffer được giải phúng. allocbuf() freebuf() Bạn nờn dựng hai phương thức tĩnh này để cấp phỏt hay huỷ bất kỳ bộ nhớ nào sử dụng bởi một sequence Quản lý bộ nhớ về cỏc sequence Bạn nờn cõn nhắc cẩn thận cỏc vấn đề quản lý bộ nhớ được chỉ ra dưới đõy: Nếu cờ giải phống được đặt giỏ trị khỏc 0 khi sequence được khởi tạo, thỡ sequence sẽ giả định quản lý bộ nhớ của người dựng. Khi một phần tử được gỏn, bộ nhớ cũ được giải phúng trước khi quyền sở hữu của bộ nhớ của biểu thức bờn tay phải được thừa nhận. Nếu cờ giải phúng được đặt giỏ trị khỏc 0 khi sequence được khởi tạo và cỏc phần tử của sequence là cỏc chuỗi hay cỏc tham chiếu đối tượng, mỗi phần tử sẽ được giải phúng trước khi buffer chứa nội dung của sequence được giải phúng và đối tượng bị huỷ. Trỏnh việc gỏn một phần tử của sequence sử dụng toỏn tử [] trừ khi cờ giải phúng được đặt là 1, hoặc lỗi quản lý bộ nhớ xuất hiện. Cỏc sequence được khởi tạo với cờ huỷ đặt bằng 0 khụng nờn được sử dụng như cỏc tham biến đầu vào/ đầu ra bởi vỡ cỏc lỗi quản lý bộ nhớ trong bộ dịch vụ đối tượng cú thể đưa đến kết quả. Luụn luụn sử dụng allocbuf và freebuf để khởi tạo và giải phúng kho lưu trữ được sử dụng với cỏc sequence. Array Cỏc array của IDL được ỏnh xạ sang cỏc array của C++, cỏi mà cú thể được khởi tạo tĩnh. Nếu cỏc phần tử của array là cỏc chuỗi hoặc cỏc tham chiếu đối tượng, thỡ cỏc phần tử của mảng trong C++ cú kiểu _var. Vớ dụ đoạn chương trỡnh sau chỉ ra ba mảng với cỏc kiểu phần tử khỏc nhau. // IDL interface Intf { // definitions... }; typedef long L[10]; typedef string S[10]; typedef Intf A[10]; // kiểu tham chiếu đối tượng ... // Kết quả trong C++ typedef CORBA::Long L[10]; typedef CORBA::String_var S[10]; typedef Intf_var A[10]; Cỏch sử dụng kiểu được quản lý kiểu _var cho cỏc chuỗi và cỏc tham chiếu đối tượng cho phộp bộ nhớ được quản lý trong suốt khi cỏc phần tử của mảng được gỏn. Cỏc slice của mảng Kiểu _slice của mảng được sử dụng khi truyền tham số cho cỏc mảng nhiều chiều. Một slice của một mảng với tất cả cỏc chiều của mảng gốc trừ chiều đầu tiờn. Kiểu mảng _slice cung cấp một cỏch thuận lợi cho việc truyền và trả lại cỏc tham số. Một định ngh ĩa ki ểu cho m ỗi slice được phỏt sinh. // IDL typedef long L[10]; typedef string str[1][2][3]; ... // Results in the generation of these slices typedef CORBA::Long L_slice[10]; typedef CORBA::String_var str_slice[2][3]; typedef str_slice *str_slice_ptr; Nếu bạn chỉ cú mảng một chiều, một mảng slice chỉ là một kiểu. Như bạn thấy ở vớ dụ trờn, ta cú mảng long L[10] thỡ một mảng slice sẽ trả lại kết quả trong kiểu dữ liệu là CORBA::Long Quản lý bộ nhớ cho cỏc mảng Trỡnh biờn dịch IDL của C++ sinh ra hai hàm phục vụ cho việc cấp phỏt và giải phúng bộ nhớ kết hợp với cỏc mảng. Cỏc hàm này cho phộp ORB quản lý bộ nhớ mà khụng ghi đố cỏc toỏn tử new và delete. // IDL typedef long L[10]; ... // Kết quả trong C++ inline L_slice *L_alloc();           // Cấp phỏt động một mảng. Trả lại giỏ trị NULL nếu lỗi. inline void L_free(L_slice *data);   // Giải phúng bộ nhớ mảng được cấp phỏt bởi L_loc. * Quản lý cỏc ngoại lệ (Exception) Một exception trong Idl được ỏnh xạ sang một lớp của C++. Lớp này chứa cỏc thành phần sau: Cỏc bộ tạo lập (constructor) Destructors Một hàm _narrow static để xỏc định kiểu của exception. // OMG IDL module INVENT { exception NonExist { ID BadId; }; }; // C++ class INVENT { . . . class NonExist : public CORBA::UserException { public: static NonExist * _narrow(CORBA::Exception_ptr); NonExist (ID _BadId); NonExist (); NonExist (const NonExist &); ~NonExist (); NonExist & operator=(const NonExist &); void _raise (); ID BadId; }; }; Cỏc thuộc tớnh của lớp Exception là public vỡ vậy bạn cú thể truy nhập trực tiếp. Ánh xạ cỏc cỏc bộ phận Cỏc bộ phận của lớp ngoại lệ được ỏnh xạ theo cỏch tương tự như cỏc cấu trỳc. Tất cả cỏc bộ phận của ngoại lệ là dữ liệu cụng cộng trong lớp của C++, và được truy nhập trực tiếp. Var Một lớp _var được sinh ra cho một ngoại lệ. Out Một lớp Out được sinh ra cho một ngoại lệ. Cỏc hàm bộ phận Với ngoại lệ của IDL là TYPE cú cỏc hàm bộ phận sau: static TYPE * _narrow(CORBA::Exception_ptr Except); TYPE(); Đõy là constructor mặc định cho ngoại lệ TYPE(cỏc tham chiếu bộ phận); TYPE (const TYPE & From); ~TYPE (); TYPE & operator=(const TYPE & From); void _raise (); * Quản lý cỏc giao diện (interface) Một giao diện trong IDL được ỏnh xạ sang một lớp của C++. Lớp này chứa cỏc định nghĩa của cỏc thao tỏc, cỏc thuộc tớnh, cỏc hằng, và cỏc kiểu người dựng định nghĩa (UDTs). Với một giao diện INTF, đoạn mó giao diện được sinh ra chứa cỏc phần sau: Kiểu tham chiếu đối tượng (INTF_ptr) Kiểu biến tham chiếu đối tượng (INTF_var) Hàm bộ phận tĩnh _duplicate Hàm bộ phận tĩnh _narrow Hàm bộ phận tĩnh _nil UDTs Cỏc hàm bộ phận về cỏc thuộc tớnh và cỏc thao tỏc Xột vớ dụ sau: // OMG IDL module INVENT { interface Order { void cancelOrder (); }; }; Ánh xạ sang C++ như sau: // C++ class INVENT { . . . class Order; typedef Order * Order_ptr; class Order : public virtual CORBA::Object { . . . static Order_ptr _duplicate(Order_ptr obj); static Order_ptr _narrow(CORBA::Object_ptr obj); static Order_ptr _nil(); virtual void cancelOrder () = 0; . . . }; }; Cỏc kiểu tham chiếu đối tượng và cỏc hàm bộ phận được mụ tả như sau: static INTF_ptr _duplicate (INTF_ptr Obj) Hàm bộ phận tĩnh này sao chộp một tham chiếu đối tượng INTF đang tồn tại và trả lại một tham chiếu đối tượng INTF mới. Tham chiếu đối tượng INTF mới phải được giải phúng bằng việc gọi hamf bộ phận CORBA::realease. Nếu một lỗi xuất hiện thỡ một tham chiếu tới đối tượng INTF nil được trả lại. Đối số Obj xỏc định tham chiếu đối tượng được sao chộp. static INTF_ptr _narrow (CORBA::Object_ptr Obj) Hàm bộ phận tĩnh này trả lại một tham chiếu đối tượng INTF mới dựa vào một tham chiếu đối tượng CORBA::Object_ptr đang tồn tại. Tham chiếu đối tượng Obiect_ptr cú thể được khởi tạo bằng việc gọi hàm bộ phận CORBA::ORB::string_to_object hoặc cú thể được trả lại như một tham chiếu từ một thao tỏc. Tham chiếu đối tượng INTF_ptr phải tương ứng với một đối tượng INTF hoặc tương ứng với một đối tượng mà kế thừa từ đối tượng INTF. Tham chiếu đối tượng INTF mới phải được giải phúng bằng việc gọi hàm bộ phận CORBA::release. Đối số Obj xỏc định tham chiếu đối tượng để thu hẹp tới một tham chiếu đối tượng INTF. Tham biến Obj khụng bị thay đổi bởi cỏc hàm bộ phận này và nờn đựoc giải phúng bởi người sử dụng khi nú khụng được sử dụng nữa. Nếu Obj khụng được thu hẹp tới một tham chiếu đối tượng INTF thỡ một tham chiếu đối tượng INTF nil được trả lại. static INTF_ptr _nil ( ) Hàm bộ phận static này trả lại một tham chiếu đối tượng nil mới cho giao diện INTF. Tham chiếu mới khụng phải được giải phúng bằng cỏch gọi hàm bộ phận CORBA::release. Cỏc kiểu tham chiếu đối tượng Một lớp giao diện (INTF) là một lớp ảo; CORBA chuẩn khụng cho phộp bạn: Khởi tạo hay hold một instance của lớp giao diện. Sử dụng một con trỏ hay một tham chiếu tới một lớp giao diện. Thay vỡ đú bạn cú thể sử dụng một kiểu tham chiếu đối tượng: lớp INTF_ptr hay INTF_var. Bạn cú thể giành được tham chiếu đối tượng bằng việc sử dụng hàm bộ phận static _nrrow. Cỏc thao tỏc truy nhập trờn cỏc lớp này thỡ sử dụng toỏn tử -> Lớp _var của INTF đơn giản hoỏ việc quản lý bộ nhớ bằng việc huỷ tự động tham chiếu đối tượng khi lớp _var của INTF nằm ngoài phạm vi được cấp phỏt lại. Cỏc thuộc tớnh Một thuộc tớnh chỉ đọc trong OMG IDL được ỏnh xạ sang một hàm C++ mà hàm đú trả lại giỏ trị thuộc tớnh. Một thuộc tớnh đọc-ghi ỏnh xạ sang hai hàm C++ được chũng hàm, một hàm trả lại giỏ trị thuộc tớnh và một hàm trả lại tập giỏ trị thuộc tớnh. Tờn của hàm bộ phận được chồng hàm là tờn của thuộc tớnh. Cỏc thuộc tớnh được tạo ra theo cỏch tương tự mà cỏc hàm được tạo ra. II. ánh xạ phía server Trong phần này chúng ta sẽ xem cách mà các giao tiếp IDL ánh xạ sang các lớp C++ cùng với sự hỗ trợ việc tạo và gọi đối tượng CORBA ở bên phía server và một số vấn đề liên quan khác . 1 . Mở đầu : Trong mô hình CORBA các đối tượng server thực hiện bởi ứng dụng server.Tại server, đối tượng CORBA được thực thi và thể hịên bởi các hàm ngôn ngữ lập trình và dữ liệu. Các thực thể ngôn ngữ lập trình thực thi và thể hiện các đối tượng CORBA được gọi là các servant. Các servant cung cấp các phần thân của đối tượng CORBA, hay nói cách khác chúng là thể hiện của các đối tượng CORBA. Trong CORBA các bộ điều hợp đối tượng(object adapter ) liên kết các đối tượng CORBA với các servant của ngôn ngữ lập trình. Về khái niệm thì bộ điều hợp đối tượng làm trung gian giữa ORB và các servant của ngôn ngữ lập trình. Chúng cung cấp các dịch vụ để tạo các đối tượng CORBA, tham chiếu lên các đối tượng đó và gửi yêu cầu từ các servant tương ứng. Bộ điều hợp đối tượng chuẩn định nghĩa trong CORBA là POA (Portable Object Adapter ) nó cung cấp các đặc trưng cần thiết để kích hoạt các servant, để có thể thích ứng với các loại ORB được cung cấp bởi nhiề