.1 Mô hình giao tác Thực nghiệm 1

Một phần của tài liệu (LUẬN văn THẠC sĩ) phương pháp dựa trên hệ thống kiểu để tính cận trên tài nguyên của các chương trình featherweight java có giao tác (Trang 56)

Gọi S1 là tài nguyên cần tính, áp dụng lý thuyết kiểu để tính kiểu cho mô hình này ta có đƣợc: S1=+1+1 (+1+1 −1−1−1+1−1−1⨂+1 −1−1+1+1 +1 −1−1−1−1) ≅ +2 (#2−1#1−1⨂#1−1#3−1) ≅ +2 #3¬2(#1−1⨂#3−1) ≅ +1 #3¬2#4¬2 ≅ +1 #5#4¬2 ≅ +1 #5¬2 ≅ #7

Sau đây là bộ mã chƣơng trình mô tả cho mô hình giao tác trên:

Mã chương trình 1: Chƣơng trình đơn giản, xử lý trong phƣơng thức main, một lớp. class a

{

public int main() {

onacid

onacid

spawn

onacid //Bat dau e1 onacid

write("cong viec 1"); commit

commit // Ket thuc e1 commit

59 write("cong viec 2"); commit commit endspawn onacid write("cong viec 3"); commit commit onacid onacid onacid write("cong viec 4"); commit commit commit commit } }

Kết quả màn hình thực nghiệm cho ta thấy giá trị thu đƣợc bằng với kết quả tính toán ở trên:

Hình 5.2 Chạy mã Thực nghiệm 1 trên công cụ

Mã chương trình 2: Chƣơng trình triệu gọi phƣơng thức trong một lớp và trong một lớp khác.

class B {

int max(int a, int b) { int result =0;

60 else {result:=b} commit return result; } } class A { void task1(){ onacid onacid write("cong viec 1"); commit commit } void task2(){ onacid write("cong viec 2"); commit } void task3(){ onacid write("cong viec 3"); commit } void task4(){ onacid onacid onacid write("cong viec 3"); commit commit commit }

public int main() { B ob= new B; ob.max(4,5); onacid onacid spawn this.task1(); commit this.task2(); commit endspawn this.task3(); commit this.task4(); commit } }

Theo mã chƣơng trình này ta thấy phƣơng thức main() nằm trong lớp A khởi tạo một đối tƣợng ob thuộc lớp B và đồng thời triệu gọi phƣơng thức max(int a, int b) của lớp

B. Ngoài ra, nó cũng triệu gọi các phƣơng thức nội tại ở lớp A thông qua con trỏ this. Sau khi triệu gọi tất cả các lệnh liên quan đến giao tác nhƣ onacid, commit, spawn, endspawn

có mặt trong các phƣơng thức sẽ đƣợc cộng dồn tại vị trí mà phƣơng thức đƣợc triệu gọi. Thao tác kiểm tra tƣơng tự nhƣ với mã chƣơng trình 1 ta vẫn thu đƣợc mô hình giao tác giống và kết quả tài nguyên nhƣ mã chƣơng trình 1.

61

Thực nghiệm 2: Xây dựng một chƣơng trình cho bài toán đa luồng. Sử dụng lại bài toán đã thảo luận ở các chƣơng trƣớc theo mô hình sau:

Hình 5.3 Mô hình giao tác cho Thực nghiệm 2

Trong đó e1 đóng góp 1 giao tác, e2 đóng góp 2 giao tác, e3 đóng góp 3 giao tác, e4

đóng góp 4 giao tác.

Gọi S2 là tài nguyên cần tính, áp dụng lý thuyết kiểu để tính kiểu cho mô hình này ta có đƣợc: S2=+1+1 [#1−1−1 +1(#2−1−1−1−1 #3−1#4−1)] +2[#1−2+1(#2−3−1#3−1#4−1)] +2(#1−2+1#2¬2#3¬2#4−2) +2(#1−2#4#3¬2#4¬2) +2(#1−2#4¬2#4¬2) +2#5¬3#4¬3 +1#8#4¬3 +1#8¬3 #11

Sau đây là bộ mã chƣơng trình TFJ mô tả mô hình giao tác trên: class a

{

public int main() {

onacid

onacid

spawn

onacid //Bat dau e1

write("cong viec 1"); commit // Ket thuc e1 commit

commit endspawn onacid

spawn

onacid //Bat dau e2 onacid

write("cong viec 2"); commit

62 commit endspawn commit

onacid //Bat dau e3 onacid

onacid

write("cong viec 3"); commit

commit

commit // Ket thuc e3 commit

onacid //Bat dau e4 onacid onacid onacid write("cong viec 4"); commit commit commit

commit // Ket thuc e4 commit

} }

Và kết quả ta thu đƣợc màn hình chƣơng trình sau

63

KẾT LUẬN

Luận văn đã tổng quát hóa đƣợc các khái niệm cũng nhƣ kiến thức về hệ thống kiểu, bộ nhớ giao tác phần mềm, trình bày đƣợc cú pháp, ngữ nghĩa của TFJ. Mặt khác điểm nổi bật mà đề tài tập trung nhất là đã áp dụng lý thuyết phƣơng pháp hệ thống kiểu để xây dựng bộ công cụ tính kiểu tự động. Quá trình xây dựng bộ công cụ tự động tính kiểu này bao gồm xây dựng module các phép toán tính kiểu trên chuỗi số có dấu, từ đó làm thƣ viện cho việc giải quyết bài toán cuối cùng đó là tạo một module, với một chƣơng trình đầu vào Featherweight Java có giao tác ta có thể tính toán tĩnh giới hạn trên tổng tài nguyên chi phí khi chƣơng trình thành lập đúng hoặc ngƣợc lại đƣa ra thông báo nhận xét chƣơng trình thành lập không đúng.

Xét về mặt đƣa vào thực tiễn, đề tài này vẫn còn khá mới mẻ, chỉ đƣợc kiểm chứng ở mức độ nghiên cứu. Cụ thể, thực nghiệm thể hiện giải thuật cho các phép toán tính toán kiểu và đi xây một cú pháp cho ngôn ngữ TFJ trên ALTNR , từ đó với các chƣơng trình viết ra tuân theo chuẩn ngữ pháp ngôn ngữ này ta có thể tính toán tĩnh giá trị giới hạn trên của tổng chi phí tài nguyên. Việc xây dựng một ngữ pháp cho ngôn ngữ còn nhiều hạn chế (chƣa xét đến các thuộc tính phức tạp của một ngôn ngữ hƣớng đối tƣợng nhƣ kế thừa, đa hình, lớp ảo …), đồng thời việc tính giá trị tài nguyên ở trên cũng chỉ dừng lại ở mức các giao tác và các luồng lồng nhau mà chƣa xét đến trƣờng hợp có điều kiện logic (tƣơng ứng với việc sử dụng phép toán chọn trong tính kiểu). Chính vì vậy, để áp dụng hệ thống kiểu này vào thực tiễn cho các ngôn ngữ trong các hệ thống phần mềm lớn thì cần phải mất nhiều thời gian và công sức hơn nữa. Hy vọng rằng kết quả của hƣớng nghiên cứu này sẽ là cơ sở cho các nghiên cứu tiếp theo nhằm tối ƣu các chƣơng trình phần mềm, đáp ứng đƣợc nhu cầu thực tế của ngƣời dùng trong tƣơng lai.

64

TÀI LIỆU THAM KHẢO Tiếng Anh

1. Benjamin C. Pierce (2002), Types and Programming Languages, MIT Press.

2. Suresh Jagannathan, Jan Vitek, Adam Welc, and Antony Hosking, (2005), “A transactional object calculus”.

3. Luca Cardelli (1997), Type systems.

4. Robert Harper (2012), Practical Foundations for Programming Languages.

5. Hoang Truong (2006), Type Systems for Guaranteeing Resource Bounds of Component Software.

6. T. Mai Thuong Tran, O. Owe, and M. Steffen (2010), “Safe typing for transactional vs. lock-based concurrency in multi-threaded Java”.

7. M. Steffen and T. M. T. Tran (2009), “Safe commits for Transactional Featherweight Java”.

8. Ronald Garcia (2007), Static Computation and Reflection.

9. Matthias Ladkau (2009), A Wide Spectrum Type System for Transformation Theory. 10. Jiang Hui, Lin Dong, Zhang Xingyuan, Xie Xiren (2001), “Type System in

Programming Languages”.

11. Igarashi, Atsushi, Pierce Benjamin C, Wadler, Philip (2001), “Featherweight Java: a minimal core calculus for Java and GJ”.

12. Simon Peyton Jones (2007), “Beautiful concurrency”.

13. Thi Mai Thuong Tran, Martin Steffen, and Hoang Truong (2011), “Estimating Resource Bounds for Software Transactions”.

14. Ryan Saptarshi Ray (2012),“Lock-Free Synchronization”.

15. N. Shavit, and D. Touitou (1995), “Software Transactional Memory”. 16. Casey Marshall (2005), “Software Transactional Memory”.

17. T. V. Xuan, H. T. Anh, T. Mai Thuong Tran, and M. Steffen (2012), “A type system for ※nding upper resource bounds of multi-threaded programs with nested transactions”.

18. Terence Parr (2007), The Definitive ANTLR Reference Building Domain-Specific Languages.

65

PHỤ LỤC

PHỤ LỤC 1. CÁC CÔNG CỤ HỖ TRỢ CÀI ĐẶT THỰC NGHIỆM 1.1. Các công cụ hỗ trợ 1.1. Các công cụ hỗ trợ

TFJ là một ngôn ngữ nghiên cứu, có cấu trúc cú pháp đã đƣợc định nghĩa trong Chƣơng 2. Do vậy, việc đầu tiên chúng ta là phải đặc tả hình thức cú pháp cho ngôn ngữ, từ bộ cú pháp đó có thể sinh ra các bộ kiểm tra từ vựng và cú pháp để xác định một chƣơng trình TFJ có tuân thủ đặc tả hay không.

Để tiến hành cài đặt thực nghiệm ta cần 2 công cụ cơ bản sau:

- ANTLR: Đây là bộ công cụ cho phép ta xây dựng bộ phân tích từ vựng và bộ phân tích cú pháp (dƣới dạng mã lệnh Java, C#, Python, Ocalm, …) một cách tự động thông qua việc đặc tả cú pháp của ngôn ngữ trên nó.

- Visual Studio 2010: Là bộ soạn thảo, dùng để viết mã lệnh C# xây dựng các module thuật toán kiểu trên nền .Net 4.0 cũng nhƣ viết đặc tả cú pháp ngôn ngữ TFJ dựa khi đƣợc tích hợp bộ ANTLR.

1.2. Cấu hình ANTLR V3 với Visual Studio.Net

Do ANTLR V3 là một phiên bản khá mới và cập nhật. Việc cấu hình ANTLR V3 với Visual Studio.Net đƣợc xem nhƣ là khá khó để tiếp cận và hiện chƣa có tài liệu chính thống, đầy đủ cách thức cấu hình để phục vụ cho bài toán của chúng ta. Tổng hợp từ nhiều thông tin tham khảo sau đây phần phụ lục này cũng xin giới thiệu đầy đủ các bƣớc để chúng ta có thể cấu hình thành công ANTLR V3 với Visual Studio.Net.

Nhƣ mục 1.1, PHỤ LỤC 1 ta đã giới thiệu ANTLR là một bộ công cụ cho phép ta xây dựng bộ phân tích từ vựng và bộ phân tích cú pháp một cách tự động thông qua cú pháp đặc tả trong nó. Ta có thể lựa chọn Visual Studio 2010 có tích hợp ANTLR V3 để xây dựng ngôn ngữ TFJ này. Do đó, chúng ta cần có bƣớc cấu hình trƣớc khi thực hiện các công việc đó. Việc còn lại ta phải xây dựng các module thuật toán kiểu có thể viết với công cụ Visual Studio 2010 trên nền .NET 4.0 là công cụ để soạn thảo và xây dựng các module thuật toán kiểu và đầu vào của module chính là một chƣơng trình TFJ.

Trƣớc khi cấu hình các công cụ ta cần chuẩn bị nhƣ sau:

- Bộ ANTLR V3.3.1: Ta có thể tải gói antlr-dotnet-csharp3bootstrap-3.3.1.7705 từ địa chỉ www.tunnelvisionlabs.com/downloads/antlr/antlr-dotnet-csharp3bootstrap- 3.3.1.7705.7z .

66

- Gói Tvl.VisualStudio.Language.Antlr3 tƣơng tác ANTLR với Visual Studio 2010 từ địa chỉ

http://www.tunnelvisionlabs.com/downloads/vsx/Tvl.VisualStudio.Language.Antlr3.vsix

Các bƣớc tạo cấu hình một dự án có tích hợp bộ ANTLR ta có thể quan sát ở mục 1.3 PHỤ LỤC 1 tiếp sau đây.

1.3. Các bƣớc cấu hình một dự án có tích hợp bộ ANTLR

Bước 1: Tạo dự án TFJAnalysis có cấu trúc thƣ mục nằm trong thƣ mục C:\dev nhƣ sau:

C:\dev\TFJTools\

o TFJAnalysis\

TFJAnalysis.csproj

o TFJAnalysis.sln

Hình PL-0 1 Tạo mới một Project

Bước 2: Giải nén gói antlr-dotnet-csharp3bootstrap-3.3.1.7705 ở trên vào thƣ mục

C:\dev\TFJTools\Reference\Antlr\ nhƣ sau:  C:\dev\TFJTools\ o Reference\ Antlr\ CodeGen\... Targets\... Tool\... Antlr3.exe Antlr3.exe.config Antlr3.Runtime.Debug.dll Antlr3.Runtime.dll Antlr3.StringTemplate.dll Antlr3.targets

67

AntlrBuildTask.dll

o TFJAnalysis\

TFJAnalysis.csproj

o TFJAnalysis.sln

Bước 3: Tích hợp tính năng Msbuild của ANTLR

Nhờ có Msbuid khi tích hợp vào .Net nó sẽ tự động sinh các lớp phân tích từ vựng (lexer) và phân tich cú pháp (parser) cho chƣơng trình nếu có đầu vào là một tệp định nghĩa cú pháp. Lần lƣợt thực hiện từng bƣớc nhỏ sau:

- Mở TFJAnalysis.sln.

- Unload dự án TFJAnalysis (bằng cách kích chuột phải lên dự án trong vùng

Solution Explorer và chọn Unload Project).

- Mở TFJAnalysis.csproj để soạn thảo (bằng cách kích chuột phải vào dự án đã đƣợc unload trong vùng Solution Explorer và chọn Edit TFJAnalysis.csproj). - Tìm đến dòng có nội dung:

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />

Chèn dƣới dòng này nội dung:

<PropertyGroup> <!-- Folder containing AntlrBuildTask.dll -->

<AntlrBuildTaskPath>$(ProjectDir)..\Reference\Antlr</AntlrBuildTaskPath> <!-- Path to the ANTLR Tool itself. -->

<AntlrToolPath>$(ProjectDir)..\Reference\Antlr\Antlr3.exe</AntlrToolPath> </PropertyGroup>

<Import Project="$(ProjectDir)..\Reference\Antlr\Antlr3.targets" />

- Lƣu lại và đóng TFJAnalysis.csproj.

- Tải lại dự án TFJAnalysis (bằng cách kích chuột phải vào dự án đã đƣợc

unload trong vùng Solution Explorer và chọn Reload Project).

Bước 4: Tạo tham chiếu tới thƣ viện của ANTLR (bằng cách thêm một reference tới

Antlr3.runtime.dll có địa chỉ C:\dev\TFJTools\Reference\Antlr\Antlr3.runtime.dll).

Bước 5: Cài đặt gói Tvl.VisualStudio.Language.Antlr3 giúp tƣơng tác Antlr với .Net. Cho phép tạo mới một tệp định nghĩa ngữ pháp cho ngôn ngữ có đuôi mở rộng “.g3” (Ví dụ ở đây ta có thể thêm tệp Tfj.g3). Ta hoàn toàn có thể kiểm tra việc cài đặt gói

Tvl.VisualStudio.Language.Antlr3 thành công hay không bằng cách tạo mới một tệp định nghĩa ngôn ngữ.

68

Hình PL-0 2Tạo một tệp ngữ pháp trong ANTLR

Kết thúc bƣớc này ta sẽ thấy rằng mặc định 3 tệp tƣơng ứng TfjLexer.tokens,

TfjLexer.cs, TfjParser.cs sẽ tự sinh ra.

Kết thúc 6 bƣớc trên ta có đƣợc bảng từ vựng, bộ phân tích từ vựng và phân tích cú pháp tƣơng ứng với 3 tệp TfjLexer.tokens, TfjLexer.cs, TfjParser.cs ta có thể sử dụng vào trong bài toán xử lý kiểu của chúng ta.

69

PHỤ LỤC 2. BẢNG MÔ TẢ CHI TIẾT ĐẶC TẢ CÚ PHÁP TFJ TRÊN ANTLR V3

Bảng PL-0 1Chú giải chi tiết các rule trong cú pháp của ngôn ngữ TFJ

TÊN RULE CÚ PHÁP, SƠ ĐỒ ĐƢỜNG, MÔ TẢ CẤU TRÚC CỦA CÁC RULE

Program Program

: classDeclaration+ ;

Sơ đồ:

Mô tả:

Mô tả cấu trúc của một chƣơng trình, một chƣơng trình có thể có nhiều hơn một lớp.

classDeclaration classDeclaration

: classModifier* 'class' IDENT classBody ;

Sơ đồ:

Mô tả:

Đặc tả cấu trúc của một lớp, bao gồm các tính chất của lớp (classModifier), từ khóa 'class' . tên của lớp IDENT và thân của lớp classBody. classModifier classModifier : 'public' | 'protected' | 'private' | 'static' | 'final' ; Sơ đồ: Mô tả: Đặc tả tính chất của lớp. classBody classBody

70 Sơ đồ:

Mô tả:

Đặc tả thân của một lớp, bao gồm tập các khai báo

classBodyDeclaration nằm trong cặp ngoặc '{','}'.

classBodyDeclaration classBodyDeclaration

: fieldOfClass* methodOfClass* ;

Sơ đồ:

Mô tả:

Đặc tả tập các khai báo trong thân của một lớp, bao gồm có khai báo các trƣờng fieldOfClass và khai báo các phƣơng thức

methodOfClass.

fieldOfClass fieldOfClass

: modifiers typeData nameField (',' nameField)*('=' expression)? ';'

| modifiers typeObj nameFieldObj (fieldOfClassRest)?

';'

Sơ đồ:

Mô tả:

Đặc tả khai báo các trƣờng, bao gồm có thuộc tính trƣờng (modifiers) , kiểu dữ liệu trƣờng (nameField dành cho kiểu dữ liệu cơ bản hoặc nameFieldObj dành cho kiểu dữ liệu đối tƣợng), danh sách tên trƣờng, biểu thức gán , dấu kết thúc “;”.

fieldOfClassRest fieldOfClassRest

: '=' 'new' typeObj ;

Sơ đồ:

71

Phần còn lại của biểu thức gán cho khởi một trƣờng có kiểu là đối tƣợng. nameField nameField : IDENT ; Sơ đồ: Mô tả:

Tên một trƣờng có dạng chữ và số trong đó các số không đƣợc đứng đầu (IDENT). typeObj typeObj : IDENT ; Sơ đồ: Mô tả:

Kiểu cho trƣờng đối tƣợng có dạng chữ và số trong đó các số không đƣợc đứng đầu (IDENT), do lập trình tự định nghĩa một lớp đối tƣợng. nameFieldObj nameFieldObj : IDENT ; Sơ đồ: Mô tả:

Tên của trƣờng có kiểu đối tƣợng.

methodOfClass methodOfClass

: modifiers typeData nameMethodOfClass '(' parameterDeclarations? ')' block ;

Sơ đồ:

Mô tả:

Đặc tả môt khai báo phƣơng thức, bao gồm: tính chất của phƣơng thức (modifiers), kiểu trả về của phƣơng thức(typeData), tên phƣơng thức (nameMethodOfClass), danh sách các tham số có thể có

72

(parameterDeclarations) và thân phƣơng thức (block).

nameMethodOfClass nameMethodOfClass :'main' |IDENT ; Sơ đồ: Mô tả:

Đặc tả tên phƣơng thức, tên này có thể là một tên tự đặt hoặc tên bắt buộc với từ khóa 'main'.

parameterDeclarations parameterDeclarations

: parameterDeclaration parameterDeclarationRest ;

Sơ đồ:

Mô tả:

Đặc tả thành phần tham số nếu có, có thể có một tham số hoặc nhiều tham số. parameterDeclarationRe st parameterDeclarationRest : (',' parameterDeclaration)* ; Sơ đồ: Mô tả:

Đặc tả này xuất hiện nếu có nhiều hơn một tham số.

parameterDeclaration parameterDeclaration

: typeData IDENT ('=' valueDefaultParametter)? ;

Sơ đồ:

Mô tả:

Đặc tả khai báo tham số trong phƣơng thức, bao gồm: Kiểu tham số (typeData), tên tham số (IDENT), giá trị mặc định của tham số(valueDefaultParametter).

valueDefaultParametter valueDefaultParametter

73

| INTEGER ;

Sơ đồ:

Mô tả:

Đặc tả giá trị mặc định của tham số, ở đây ta mới chỉ xét cho 2 trƣờng hợp giá trị mặc định là kiểu số nguyên hoặc là kiểu xâu. Ngoài ra khi mở rộng ta có thể xây dựng các kiểu số nhƣ: REAL, CHAR, hoặc kiểu đối tƣợng …

block Block : '{' statement* '}' ; Sơ đồ: Mô tả:

Đặc tả thân của một phƣơng thức, bao gồm tập các lệnh nằm trong cặp ngoặc '{', '}' modifiers modifiers : modifier* ; Sơ đồ: Mô tả:

Đặc tả tính chất của phƣơng thức, các tính chất có thể có hoặc không. modifier Modifier : 'public' | 'protected' | 'private' | 'static' | 'abstract' | 'final' | 'native' | 'synchronized' | 'transient' | 'volatile'

74 ; Sơ đồ: Mô tả: Các tính chất của phƣơng thức. typeData typeData : primitiveType | arrayType ; Sơ đồ: Mô tả:

Các kiểu dữ liệu trả về dữ liệu cơ bản, bao gồm có kiểu nguyên thủy (primitiveType) và kiểu mảng (arrayType).

primitiveType primitiveType : 'bool' | 'string' | 'char' | 'byte' | 'short' | 'int' | 'long' | 'float' | 'double' ; Sơ đồ:

75

Mô tả:

Danh sách các kiểu nguyên thủy có thể chọn.

arrayType arrayType

:primitiveType 'array' '[' INTEGER '..' INTEGER ']' ;

Sơ đồ:

Mô tả:

Định nghĩa một kiểu dạng mảng các phần tử kiểu nguyên thủy.

statement Statement

Một phần của tài liệu (LUẬN văn THẠC sĩ) phương pháp dựa trên hệ thống kiểu để tính cận trên tài nguyên của các chương trình featherweight java có giao tác (Trang 56)