Sự giao tiếp trong điều phối giữa các agent

Một phần của tài liệu Lập trình Game Agent (Trang 49)

Sử dụng ngôn ngữ KQML để định dạng các thông điệp, còn các dạng hoạt động liên lạc, truyền thông được tạo ra bởi người phát triển chúng. Ta hãy xét đến cách các agent trao đổi với nhau qua việc gửi thông điệp trong môi trường chúng chạy như thế nào.

Cấu trúc của mỗi agent có dạng: bao gồm một tên (name) và một thông dịch viên (interpreter) để điều khiển sự trao đổi của agent đó. Mỗi agent được điều khiển bởi một bộ phận quản lý sự trao đổi (conversation manager).

Mỗi bộ phận quản lý sự trao đổi bao gồm:

 Một danh sách các agent mà nó quản lý

 Một hàm điều khiển để lựa chọn các agent để thực thi và điều khiển tài nguyên

Môi trường để “chạy” agent với mục đích: quản lý việc trao đổi thông điệp và đưa ra lịch biểu thực thi của agent. Môi trường có thể được phân chia để các tiến trình chạy trên các máy tính khác nhau (môi trường phân tán). Trong môi trường đó có dịch vụ cho phép chuyển các thông điệp đến các máy tính khác nhau

Các agent có thể chuyển thông điệp, thay đổi trạng thái và thực hiện các hoạt động bộ phận trong quá trình trao đổi. Luật trao đổi dựa trên giá trị của các biến đặc biệt gọi là “biến trạng thái”. Những sự trao đổi này được thể hiện thành các “lớp trao đổi” (conversation classes) hoạt động để mô tả các kế hoạch của agent để đạt được một mục đích. Các lớp trao đổi được liên kết với các agent riêng biệt để quyết định xem mỗi agent có thể tương tác theo kiểu nào.

Quá trình trao đổi:

• Đầu tiên mỗi agent tạo ra một thể hiện của sự trao đổi.

• Khi một thể hiện của sự trao đổi được thực hiện thì thông điệp sẽ được gửi từ một agent và sẽ nhận được thông điệp từ các agent khác. Mỗi một thông điệp có một vùng để định danh các agent có liên quan đến thông điệp đó.

• Mỗi một agent có thể đưa ra các chính sách của mình để lựa chọn thông điệp nào để tiếp tục công việc. Một agent có thể cùng một lúc thực hiện vài cuộc trao đổi. Một agent đưa ra quyết định lựa chọn cuộc trao đổi nào tiếp theo để điều khiển dựa trên sự ưu tiên của chúng (phụ thuộc vào tập luật).

• Các agent dựa vào các chính sách của mình về sự trao đổi để đưa ra quyết định xem agent đó có nên tiếp tục bắt đầu một cuộc trao đổi mới hay không.

Những điểm cần chú ý trong khi thực hiện các cuộc trao đổi:

• Các cuộc trao đổi có thể hoạt động như các luồng.

• Mỗi cuộc trao đổi có thể bị dừng (hoãn) trong khi agent thực hiện một cuộc trao đổi khác.

• Có nhiều cuộc trao đổi có thể được khôi phục lại khi những cuộc trao đổi khác kết thúc.

PHẦN II: Ngôn ngữ Java và việc hỗ trợ xây dựng game trong Java

Game mà chúng em xây có sử dụng một số công cụ phát triển, bao gồm:

• Ngôn ngữ Java: được sử dụng để dịch và chạy trên hệ thống.

• Ant: Được sử dụng để xây dựng hệ thống.

• Các lớp Java2D, Java3D: Được sử dụng xây dựng giao diện đồ họa trong game..

• IDE: Như Eclipse, Netbean, …. Môi trường phát triển khá tốt cho ngôn ngữ Java.

Sau đây em xin giới thiệu về các vấn đề này:

II.1. Ngôn ngữ Java:

II.1.1. Giới thiệu về ngôn ngữ Java:

Vào năm 1991, một nhóm các kỹ sư của Sun Microsystems có ý định thiết kế một ngôn ngữ lập trình để điều khiển các thiết bị điện tử như Tivi, máy giặt, lò nướng, … Mặc dù C và C++ có khả năng làm việc này nhưng trình biên dịch lại phụ thuộc vào từng loại CPU. Trình biên dịch thường phải tốn nhiều thời gian để xây dựng nên rất đắt. Vì vậy để mỗi loại CPU có một trình biên dịch riêng là rất tốn kém. Do đó nhu cầu thực tế đòi hỏi một ngôn ngữ chạy nhanh, gọn, hiệu quả và độc lập thiết bị tức là có thể chạy trên nhiều loại CPU khác nhau, dưới các môi trường khác nhau. “Oak” đã ra đời và vào năm 1995 được đổi tên thành Java. Mặc dù mục tiêu ban đầu không phải cho Internet nhưng do đặc trưng không phụ thuộc thiết bị nên Java đã trở thành ngôn ngữ lập trình cho Internet.

Chính thức thì Java được Sun Microsystems giới thiệu vào tháng 6 năm 1995. Từ đó, nó đã trở thành một công cụ lập trình của các lập trình viên chuyên nghiệp.

Java được xây dựng trên nền tảng của C và C++. Do vậy nó sử dụng các cú pháp của C và các đặc trưng hướng đối tượng của C++.

Hình sau thể hiện kiến trúc tổng quát toàn bộ nền tảng Java:

Hình 7: Kiến trúc tổng quát.

II.1.2. Các đặc trưng của ngôn ngữ Java:

 Đơn giản

 Hướng đối tượng

 Độc lập phần cứng và hệ điều hành  Mạnh  Bảo mật  Phân tán  Đa luồng  Động

II.1.2.1. Đơn giản:

Những người thiết kế mong muốn phát triển một ngôn ngữ dễ học và quen thuộc với đa số người lập trình. Do vậy Java được loại bỏ các đặc trưng phức tạp

của C và C++ như thao tác con trỏ, thao tác nạp đè (overload),… Java không sử dụng lệnh “goto” cũng như file header (.h). Cấu trúc “struct” và “union” cũng được loại bỏ khỏi Java.

II.1.2.2. Hướng đối tượng:

Java được thiết kế xoay quanh mô hình hướng đối tượng. Vì vậy trong Java, tiêu điểm là dữ liệu và các phương pháp thao tác lên dữ liệu đó. Dữ liệu và các phương pháp mô tả trạng thái và cách ứng xử của một đối tượng trong Java.

Bởi vì là một ngôn ngữ lập trình hướng đối tượng nên nó có những khả năng sau:

• Mô phỏng thế giới thực một cách tự nhiên bởi các đối tượng và các mối quan hệ giữa chúng, thuận tiện cho việc thiết kế hệ thống phức tạp.

• Thừa kế mã có sẵn một cách dễ dàng, giúp tiết kiệm công sức và nâng cao năng suất người lập trình.

• Thu gom rác ký ức một cách linh hoạt, giải phóng người lập trình khỏi công việc quản lý ký ức và gia tăng độ tin cậy của phần mềm.

Một chương trình hướng đối tượng được cấu trúc từ nhiều mođun, mỗi mođun là một đối tượng. Chính những đối tượng này cho phép tạo ra những chương trình phức tạp . Java là một ngôn ngữ hướng đối tượng vì nó cho ta những phương tiện để cấu trúc nên các chương trình từ các đối tượng. Bên trong mỗi đối tượng có chứa dữ liệu thể hiện tình trạng (state) hay thuộc tính (property) của nó. Mỗi đối tượng được trang bị những hành vi (behavior) hay phương thức (method) để thực hiện một số nhiệm vụ, nhằm thông báo hoặc làm thay đổi thuộc tính của nó. Như vậy đối tượng bao gồm một nhóm các dữ liệu và các lệnh tác động đến dữ liệu đó. Một sự kết hợp như vậy tạo nên các bó gần như độc lập. Việc lựa chọn các dữ liệu và các tác động không phải là tuỳ tiện – các dữ liệu và các tác động phải có quan hệ khăng khít để đối tượng trở nên có ý nghĩa.

Trong OOP thay vì mô tả từng đối tượng, người lập trình sẽ mô tả kiểu chung của đối tượng và sau đó tạo ra nhiều đối tượng theo mức cần thiết. Kiểu chung đó của đối tượng được gọi là một lớp. Như vậy mỗi đối tượng được phát sinh từ một

lớp. Lớp là khuôn mẫu “nặn” ra các đối tượng cụ thể. Trong hệ thống hướng đối tượng, các đối tượng làm việc với nhau bằng cách gửi thông điệp cho nhau. Đối tượng này có thể yêu cầu đối tượng kia làm một việc gì đó. Dữ liệu luôn nằm trong các đối tượng, không có dữ liệu nào nằm ngoài đối tượng. Muốn tác động lên dữ liệu ta phải nhờ cậy đến đối tượng. Ngoài ra, vị trí cụ thể của đối tượng là không quan trọng. Điều này đặc biệt thích hợp cho môt trường mạng máy tính. Phần mềm trên mạng có thể gồm nhiều đối tượng phân tán, có đối tượng nằm trên máy tính của bạn, có đối tượng nằm trên máy tính chủ ở xa.

Khi nói đến OOP chúng ta còn một khái niệm nữa là tính kế thừa. Tức là ta có thể tạo ra một lớp có thể kế thừa các đặc tính của một lớp đã có sẵn. Khi đó lớp đã có sẵn được gọi là lớp cha hay lớp căn bản. Lớp mà được tạo ra do mở rộng của lớp cha được gọi là lớp con hay lớp dẫn xuất. Lớp con thừa kế các đặc tínhtừ những lớp trước nó và nó còn có thêm một số đặc tính bổ sung thêm. Những gì tính kế thừa cung cấp, người sử dụng đều có thể sử dụng lại được.

Nếu từng lập trình với C++, chắc hẳn bạn sẽ biết trong C++người ta có thể dùng biến và hàm một cách độc lập, không phải là thành viên của một đối tượng nào cả. Trong Java, cũng như các ngôn ngữ hướng đối tượng thuần tuý, mọi thứ đều là đối tượng, không có biến và hàm nào nằm ngoài đối tượng. Java chỉ giống C++ ở diện mạo, còn “phần hồn” của Java hoàn toàn là hướng đối tượng.

Khác với nhiều ngôn ngữ lập trình, thường cho kết quả cuối cùng là một file chứa mã khả thi, mã biên dịch của Java tồn tại dưới một tập tin lớn (class file) riêng biệt tương ứng với mỗi lớp tham gia vào ứng dụng . Trong Java, giai đoạn liên kết được thực hiện vào lúc chạy. Cần nhấn mạnh rằng các tập tin lớp tạo nên ứng dụng Java có thể nằm phân tán trên nhiều máy, không nhất thiết phải tập trung một chỗ. Điều này xuất phát từ bản chất hướng đối tượng của Java.

II.1.2.3. Độc lập phần cứng và hệ điều hành:

Đây là khả năng một chương trình được viết tại một máy nhưng có thể chạy được bất kỳ đâu. Chúng được thể hiện ở mức mã nguồn và mức nhị phân.

Hình 8: Biên dịch chạy trên các nền khác nhau.

Nếu như với C++, ta có thể đạt được tính khả chuyển nhất định đối với mã nguồn thì với Java, bản thân mã biên dịch cũng có tính khả chuyển. Việc biên dịch Java dựa vào quy ước về máy ảo Java. Mã nguồn Java được biên dịch thành một dạng byte đặc biệt gọi là mã byte thay vì mã bit như bình thường. Gọi là mã byte bởi vì mã này được tạo thành bởi từng byte một, thuận tiện cho việc truyền qua mạng như một văn bản ASCII. Chỉ có điều bạn không thể đọc chương trình ở dạng mã byte. Mã byte chỉ dành cho trình thông dịch Java đọc và thực thi. Nếu như bạn đặt chương trình Java ở dạng mã byte trên máy chủ, chương trình có thể được truyền qua mạng nhanh chóng và chạy trên mọi loại máy tính khách miễn là tại đó có trình thông dịch Java. Hình dưới đây là lộ trình hai giai đoạn của mã Java:

Mã giống mã hợp ngữ ở chỗ là mã cấp thấp. Những người thiết kế Java đã cố gắng để mã byte được thông dịch đủ nhanh(nhanh hơn nhiều so với thông dịch từ mã nguồn), nhằm đạt đến tốc độ thực thi chấp nhận được so với chương trình được biên dịch theo cách truyền thống, được cái, giai đoạn liên kết với mã thư viện được thực hiện chính vào lúc chạy, chỉ khi nào cần thiết. Nhờ vậy, các tập tin mã byte thường nhỏ gọn và thời gian khởi động chương trình không kéo dài. Ngoài ra, khi bạn lập trình Java, chu trình “chạy rồi sửa, sửa rồi chạy” được tiến hành nhanh chóng .

Dạng mã byte còn tạo điều kiện cho chương trình Java sau biên dịch không phụ thuộc vào cấu trúc cụ thể vào cấu trúc cụ thể của các dữ liệu cơ bản của mỗi loại máy. Kiểu nguyên(integer), kiểu chấm động(floating point) ,...trên các loại máy khác nhau thường không thống nhất. Chẳng hạn, loại máy này dùng 16 bit để biểu diễn trị nguyên, trong khi trên loại máy khác, trị nguyên có thể có kích thước 32 bit. Điều này thường liên hệ chặt chẽ với cấu trúc tối ưu hoá bên trong vi xử lý. Máy ảo Java có quy ước riêng để biểu diễn kiểu dữ liệu cơ bản. Với mã byte, trình thông dịch Java dễ dàng tái cấu trúc các kiểu dữ liệu cơ bản thành 16 bit hay 32 bit vào lúc chạy.

II.1.2.4. Mạnh mẽ:

Java yêu cầu chặt chẽ về kiểu dữ liệu và phải mô tả rõ ràng khi viết chương trình. Chúng sẽ kiểm tra lúc biên dịch và cả trong thời gian thông dịch vì vậy Java loại bỏ các kiểu dữ liệu dễ gây ra lỗi.

II.1.2.5. An toàn, bảo mật:

Mô hình an toàn của Java gồm có 4 tầng thường gọi là 4 tầng bảo an (secutity layer):

Tầng bảo an thứ nhất : ngôn ngữ và trình biên dịch: Bản thân ngôn ngữ Java đã được thiết kế để đảm bảo chương trình Java hoạt động ổn định. Java không có công cụ mạnh mẽ nhưng nguy hiểm như các con trỏ của C/C++ . Trình biên dịch Java kiểm tra rất chặt chẽ mọi chuyển đổi kiểu (còn gọi là ép kiểu – casting) đều phải được thực hiện một

cách tường minh, không hề có sự chuyển đổi kiểu ngầm định như C/C+ +. Nói chung, trình biên dịch Java từ chối sinh ra mã byte nếu mã nguồn không tuân thủ nghiêm nhặt các quy tắc an toàn.

Tầng bảo an thứ hai (bộ phận kiểm tra mã byte): Bộ kiểm tra mã byte(byte code verifier)vào lúc chạy sẽ rà soát mã byte được nạp vào ký ức, ngăn ngừa trường hợp chương trình Java chuyển đến hệ thống của bạn đã được biên dịch bởi trình biên dịch Java bất hợp pháp nào đó, yếu kém hoặc là có ác ý. Cần chú ý rằng Java thực hiện việc liên kết các đơn thể mã byte để tạo mã thực thi và tổ chức ký ức vào lúc chạy. người lập trình không biết trước cách xếp đặt mã thực thi trên ký ức, do đó có thể dùng mánh lới để qua mặt bộ kiểm tra mã byte.

Tầng bảo an thứ ba (bộ phận class loader): Sau khâu kiểm tra, mã byte được dàn thành “đội hình” trên ký ức. Bộ phận chuyên trách này được gọi là class loader (bộ nạp lớp). Đúng ngư tên gọi, class loader nạp các tsspj tin lớp của ứng dụng Java vào ký ức. Java tổ chức những vùng trên (namespace) khác nhau dành cho những lớp có xuất xứ khác nhau, phân biệt các lớp được nạp từ hệ thống từ hệ thống tại chỗ với các lớp được nạp qua mạng. Nhờ phân biệt như vậy, lớp được nạp qua mạng bị khống chế chặt chặt chẽ, không được phép thực hiện các thao tác ở mức thấp, không qua mặt, làm biến chất hoặc thay thế bộ phận bảo an gọi là security manager (bản thân security manager cũng là một lớp Java, mang tên security manager).

Tầng bảo an thứ tư (security manager): Cuối cùng là việc kiểm tra mã vào lúc chạy nhằm bảo đảm mã đang xét không vi phạm quy tắc an toàn đã được thiết lập trong môi trường hiện hành. Bộ phận đảm

nhiệm việc kiểm tra này chính là security manager. Đối với những thao tác của ứng dụng được liệt vào loại có khả năng gây nguy hiểm, như đọc hoặc xoá một tập tin trên đĩa cứng, sẽ khôngđược security manager cho phép.

Hình 10: Các tầng bảo mật trong java.

II.1.2.6. Phân tán:

Java có nhiều yếu tố thích hợp cho việc tạo ra môi trường xử lý phân tán trên mạng máy tính. Ta có thể chạy chương trình Java trực tiếp từ mã byte, liên kết với các mã thư viện (cũng ở dạng mã byte) chỉ được phân giải vào lúc chạy. Mã byte trong chương trình Java không chứa mã thư viện nên thường ghọn nhẹ. Chương trình Java được nạp dẫn một cách linh hoạt vào máy khách trong thời gian chạy, do đó không gây quá tải cho mạng. Ngoài ra, chính vò mã thư viện được liên kết vào lúc chạy, ngững thay đổi ở mã thư viện không gây xáo trộn dây chuyền, không đòi hỏi phải biên dịch lại toàn bộ ứng dụng Java.

Sự liên kết các tập tin mã byte vào lúc chạycủa ứng dụng Java được gọi là sự liên kết động (dynamic linking). Các tập tin mã byte tạo nên ứng dụng Java có thể nằm phân tán trên các máy khác nhau chứ không nhất thiết phải tập trung một chỗ.

Khả năng đa tuyến cũng là một lợi thế trên mạng. Khi chương trình đang tiếp xúc với

Một phần của tài liệu Lập trình Game Agent (Trang 49)

Tải bản đầy đủ (DOC)

(118 trang)
w