CHƯƠNG 3 : BÀI TOÁN ỨNG DỤNG
3.2. Ứng dụng F* trong bài toán tính tổng tài nguyên sử dụng chương trình
3.2.3. Tính toán giá trị mức giới hạn trên tổng chi phí tài nguyên cho chương trình
a. Mô tả thuật toán:
Đầu vào: Cho đoạn giả mã chứa các giao tác.
Đầu ra: Tính toán giá trị giới hạn trên tổng chi phí tài nguyên cho đoạn mã trên.
Ta chia nhỏ bài toán thành các giai đoạn sau:
Giai đoạn 1: Từ đoạn giả mã chứa các giao tác, kết xuất được chuỗi nguyên thủy TFJ bao
gồm các phần tử +1, −1, “(”, “)” thông qua parser với các từ khóa onacid, commit,
spawn, “)” tương đương endspawn.
Đối với từng work, hàm parser có nhiệm vụ chuyển đổi đúng đắn sao cho:
- e1 thành +1−1 - e2 thành +1+1−1−1 - e3 thành +1+1+1−1−1−1 - e4 thành +1+1+1+1−1−1−1−1 - Tương tự với các e5, e6 …
Giai đoạn 2: Từ chuỗi nguyên thủy, đưa vào cây cú pháp trừu tượng theo quy tắc: - Khởi tạo thread mới (spawn) thì tiến hành tạo ra một nhánh mới.
- Khởi tạo giao tác mới (onacid) thì tiến hành tạo ra một lá mới với giá trị +1.
- Đóng thread thì dừng tạo nhánh mới.
- Kết thúc giao tác (commit)thì tạo ra lá mới với giá trị −1.
Giai đoạn 3: Tính toán giá trị mức giới hạn dựa trên cây cú pháp trừu tượng mà chúng ta
xây dựng nên từ chuỗi chuẩn tắc và các hàm tính toán đã được định nghĩa như seq, join,
joint commit merge:
1letrec infer (branch:list Tree)(headseq:list TagNum): TagSeq = 2 match branch with
3 |[]-> seq headseq 4 | x::xs ->
5 match x with
6 | Leaf tagnum ->
7 let newhead = seq (append headseq [tagnum])in
8 infer xs newhead 9 | Branch br ->
10 let child = join (infer br [])in
11 let parent = join (infer xs [])in
12 let tailseq = seq (merge child parent)in
13 seq (jc headseq tailseq)
Gọi S là chuỗi TFJ cần tính toán, áp dụng các công thức được định nghĩa và xử lý trên cây cú pháp trừu tượng ta sẽ có:
S = +1+1(+1−1−1−1)+1(+1+1−1−1−1−1−1)−1+1+1+1−1−1−1−1+1+1+1+1−1−1−1−1−1 ≅+2(+1−1−1−1)+1(+1+1−1−1−1−1−1)−1+1+1+1−1−1−1−1+1+1+1+1−1−1−1−1−1 ≅+2(#1¬2)+1(+1+1−1−1−1−1−1)−1+1+1+1−1−1−1−1+1+1+1+1−1−1−1−1−1 ≅+2(#1¬1¬1)+1(#2¬1¬1¬1)−1+1+1+1−1−1−1−1+1+1+1+1−1−1−1−1−1 ≅+2(#1¬1¬1)+1(#2¬1¬1¬1)¬1#3¬1#4¬1 ≅+2(#1¬1¬1)+1(#2¬2#3¬2#4¬2) ≅+2(#1¬1¬1)#4¬2#4¬2 ≅+2(#5¬3#4¬3) ≅+1(#8¬3) ≅#11
Như vậy với chương trình có đoạn mã như trên, giá trị giới hạn trên tổng tài nguyên sẽ là 11. Tóm lại, tại bài toán này, chúng ta mô tả các bước xây dựng công cụ tính toán giá trị mức giới hạn sau khi đã xây dựng một loạt các hàm và công thức tính toán trên nền tản F*. Dưới đây là một vài thực nghiệm khác để chứng tỏ rằng việc xây dựng các công cụ tính toán của chúng ta là đúng đắn: 1onacid; //thread 0 2 onacid; 3 commit; 4spawn(commit); 5commit
Ta có chuỗi TFJ cần tính toán như sau: S = +1+1−1(−1)−1
≅+
1#1(¬2)
≅# 2
KẾT LUẬN
Luận văn đã đưa ra được các khái niệm cơ bản cũng như kiến thức khi cài đặt và lập trình với ngôn ngữ F*. Mặt khác, điểm nổi bật trong đề tài này là áp dụng phương pháp lập trình với F* để áp dụng xây dựng bài toán tính giá trị mức giới hạn trên tổng chi phí tài nguyên của chương trình. Quá trình xây dựng các thuật toán bao gồm xây dựng các hàm tính toán, các phép tính toán trên chuỗi số có dấu từ đó làm các hàm chính để giải quyết cho bài toán nêu trên. Việc xây dựng thành công bài toán trên cũng góp phần giúp các nhà phát triển phần mềm có sử dụng bộ nhớ giao dịch biết được chương trình của mình sẽ cần bao nhiêu tài nguyên, qua đó cấp phát vừa đủ, tránh việc sử dụng dư thừa tài nguyên của hệ thống.
Xét về mặt thực tiễn, hiện nay ngôn ngữ F* vẫn còn khá mới mẻ, F* mới phát triển được hơn hai năm từ 29/4/2013 tuy nhiên đã đạt được những thành quả nhất định như có thể xác thực được tính đúng đắn của những đoạn mã được viết trên F#, ngoài ra có thể tùy biến được các kiểu được sử dụng thông dụng hiện nay thành những kiểu mới tinh vi hơn và phù hợp với từng hoàn cảnh khi lập trình. Đối với bài toán và những thực nghiệm chỉ ở mức độ xác thực tính đúng đắn và chỉ được kiểm chứng ở mức độ nghiên cứu. Chính vì vậy, để áp dụng vào bài toán cụ thể và có thể xử lý hoàn toàn từ đầu vào cho đến kết quả 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 khi công cụ F* được hoàn thiện từ nhóm nghiên cứu của Microsoft, chúng ta có thể xây dựng các bài toán có thể đưa ra được kết quả như F# với mức độ kiểm soát và tùy chỉnh kiểu tinh vi hơn, đáp ứng được các nhu cầu thực tế của người dùng trong tương lai.
TÀI LIỆU THAM KHẢO
Tiếng Anh
[1] Reynolds and John, "Towards a Theory of Type Structure," Carnegie Mellon University, 1974.
[2] P. Hudak, Conception, evolution, and application of functional programming languages, ACM Computing Surveys, 1989.
[3] P.-Y. Strub, N. Swamy, C. Fournet and J. Chen, "Self-Certification, Bootstrapping Certified Typecheckers in F* with Coq," Microsoft Research, 2012.
[4] U. N. a. J. Chapman, "Dependently Typed Programming in Agda," Chalmers University, Gothenburg, 2013.
[5] P. H. Khanh, Lập Trình Hàm và Lập Trình Logic, Đà Nẵng, 2009.
[6] N. Swamy, C. Hritcu, C. Keller, P.-Y. Strub, A. Rastogi, A. Delignat-Lavaud, K. Bhargavan and C. Fourne, "Semantic Purity and Effects Reunited in F," ICFP, 2015. [7] H. Geuvers, "Introduction to Type Theory," Radboud University Nijmegen; The
Netherlands Technical University Eindhoven;, The Netherland, 2008.
[8] P. Castéran and M. Sozeau, "A Gentle Introduction to Type Classes and Relations in Coq," CNRS; LaBRI; UMR 5800; F-33400 Talence, France, 2014.
[9] R. Harper, "Programming in Standard ML," Carnegie Mellon University, 2011. [10] N. Swamy, J. Chen, C. Fournet, P.-Y. Strub, K. Bhargavan and J. Yang, "Secure
Distributed Programming with Value-Dependent Types," Microsoft Research, MSR- INRIA, INRIA, MIT, 2011.
[11] J. Condit, M. Harren, Z. Anderson, D. Gay and G. C. Necula, "Dependent Types for Low-Level Programming," University of California, Berkeley, Intel Research, Berkeley, 2007.
[12] A. Bove and P. Dybjer, "Dependent Types at Work," Chalmers University of Technology, Sweden, 2008.
[13] H. Truong, "Type Systems for Guaranteeing Resource Bounds of Component Software," 2006.
[14] C. Fournet, N. Swamy, J. Chen, Pierre-Evariste, D. Pierre-Yves, Strub and B. Livshits, "Fully Abstract Compilation to JavaScript," Microsoft Research and MSR- INRIA, 2013.
[15] J. Bengtson, K. Bhargavan, C. Fournet, A. D. Gordon and S. Maffeis, "Refinement Types for Secure Implementations," 2008.
[16] H. Truong, "A type and effect system for counting logs of multi-threaded nested transactional programs," Vietnam National Foundation for Science and Technology Development (NAFOSTED), 2014.
[17] D. Wahlstedt, "Dependent Type Theory with Parameterized First-Order Data Types and Well-Founded Recursion," 2007.