TRƯỜNG ĐẠI HỌC CÔNG NGHỆ VŨ QUANG HƯNG Nghiên cứu ứng dụng ngôn ngữ F* trong phát triển phần mềm LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN Hà Nội – 2015... TRƯỜNG ĐẠI HỌC CÔNG NGHỆ VŨ QU
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
VŨ QUANG HƯNG
Nghiên cứu ứng dụng ngôn ngữ F* trong
phát triển phần mềm
LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN
Hà Nội – 2015
Trang 2TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
VŨ QUANG HƯNG
Nghiên cứu ứng dụng ngôn ngữ F* trong
phát triển phần mềm
Ngành: Công nghệ thông tin Chuyên ngành: Kỹ thuật phần mềm
Mã số: 60480103
LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN
NGƯỜI HƯỚNG DẪN KHOA HỌC: PGS TS Trương Anh Hoàng NGƯỜI ĐỒNG HƯỚNG DẪN KHOA HỌC: TS Nguyễn Như Sơn
Hà Nội – 2015
Trang 3LỜI CAM ĐOAN
Tôi xin cam đoan luận văn này là công trình nghiên cứu của cá nhân tôi, dưới sự hướng dẫn trực tiếp từ phía PGS.TS Trương Anh Hoàng và TS Nguyễn Như Sơn Các số liệu, nội dung tham khảo được trích dẫn có nguồn gốc rõ ràng, tuân thủ tôn trọng quyền tác giả Kết quả cuối cùng đạt được của luận văn là thành quả của quá trình nghiên cứu bản thân, chưa từng được công bố dưới bất kỳ hình thức nào
Tôi xin chịu trách nhiệm về nghiên cứu trong luận văn
Vũ Quang Hưng
Trang 4LỜI CẢM ƠN
Để hoàn thành đề tài luâ ̣n văn này , bên ca ̣nh sự chủ đô ̣ng cố gắng của bản thân , tôi đã nhâ ̣n được sự ủng hô ̣ và giúp đỡ nhiê ̣t tình từ các tâ ̣p thể , cá nhân trong và ngoài trường
Qua đây , cho phép tôi được bày tỏ lòng cảm ơn sâu sắc tới thầy giáo
PGS.TS.Trương Anh Hoàng , giảng viên bộ môn Công nghệ phần mềm trường Đại học công nghê ̣ – Đa ̣i ho ̣c Quốc gia Hà Nô ̣i , người đã trự c tiếp đô ̣ng viên , đi ̣nh hướng và hướng dẫn tâ ̣n tình trong quá trình ho ̣c tâ ̣p và hoàn thành đề tài luâ ̣n văn này
Đồng kính gửi lời cảm ơn đến tập thể các thầy , cô giáo trong trường Đa ̣i ho ̣c Công Nghệ – Đa ̣i ho ̣c Quốc gia Hà Nô ̣i đã trau dồi kiến thức cho tôi , điều đó là nền tảng quí báu góp phần to lớn trong quá trình vận dụng vào hoàn thiện luận văn
Cuối cùng, tôi xin được gửi lòng biết ơn sâu sắc đến gia đình , bạn bè, đồng nghiê ̣p đã ta ̣o điều kiê ̣n về vâ ̣t chất cũng như tinh thần , luôn sát cánh bên tôi , đô ̣ng viên giúp tôi yên tâm ho ̣c tâ ̣p và kết thúc khóa ho ̣c
Xin chân thành cảm ơn!
Tác giả
Vũ Quang Hưng
Trang 5MỤC LỤC
LỜI CAM ĐOAN 3
LỜI CẢM ƠN 4
MỤC LỤC 5
DANH MỤC CÁC KÝ HIỆU, THUẬT NGỮ, CHỮ VIẾT TẮT 7
DANH MỤC CÁC BẢNG 8
DANH MỤC CÁC HÌNH VẼ 9
PHẦN MỞ ĐẦU 10
Tính cấp thiết của đề tài 10
Mục tiêu của luận văn 10
Công cụ phần mềm 10
Phương pháp nghiên cứu Error! Bookmark not defined.
Bố cục luận văn Error! Bookmark not defined CHƯƠNG 1: TỔNG QUAN VỀ LẬP TRÌNH HÀM Error! Bookmark not defined 1.1 Giới thiệu chung về ngôn ngữ lập trình hàm Error! Bookmark not defined 1.2 Các đặc điểm nổi bật của ngôn ngữ lập trình hàm Error! Bookmark not defined 1.3 Sự phổ biến của ngôn ngữ lập trình hàm Error! Bookmark not defined 1.4 Giới thiệu tổng quan về ngôn ngữ lập trình hàm F# Error! Bookmark not defined CHƯƠNG 2: NGHIÊN CỨU LÝ THUYẾT VỀ NGÔN NGỮ F* Error! Bookmark not
defined.
2.1 Giới thiệu chung Error! Bookmark not defined 2.1.1 Giới thiệu về ngôn ngữ F* Error! Bookmark not defined.
2.1.2 Giới thiệu về kiểu phụ thuộc, hệ thống kiểu phụ thuộc Error! Bookmark not
defined.
2.2 Các đặc điểm nổi bật của ngôn ngữ F* Error! Bookmark not defined 2.2.1 Ngôn ngữ tự chứng thực F* Error! Bookmark not defined 2.2.2 Trình biên dịch từ F* sang mã JavaScript Error! Bookmark not defined 2.3 Các khái niệm cơ bản khi lập trình với F* Error! Bookmark not defined.
Trang 62.3.1 Các định nghĩa kiểu và loại thường dùng trong F* Error! Bookmark not
defined.
2.3.2 Các khái niệm chung về khai báo kiểu trong F* Error! Bookmark not defined 2.3.3 Lý thuyết về tập hợp: Error! Bookmark not defined 2.3.4 Định nghĩa, sử dụng mảng dữ liệu trong F* Error! Bookmark not defined 2.3.5 Kiểu của số tự nhiên (NAT) Error! Bookmark not defined 2.3.6 Chứng minh tính chất cơ bản trong F* Error! Bookmark not defined 2.3.7 Loại suy luận và các ảnh hưởng tới tính toán Error! Bookmark not defined 2.3.8 Sử dụng F* lập trình với các bài toán đơn giản Error! Bookmark not defined 2.3.9 Chứng minh bổ đề (Lemmas) Error! Bookmark not defined.
2.3.10 Chứng minh tính kết thúc của chương trình trong F* (Proving termination)
Error! Bookmark not defined.
2.4 Kết luận chương Error! Bookmark not defined CHƯƠNG 3: BÀI TOÁN ỨNG DỤNG Error! Bookmark not defined 3.1 Ứng dụng F* vào các bài toán lập trình Error! Bookmark not defined.
3.1.1 Ứng dụng trong bài toán sắp xếp mảng nổi bọt (Buble sort) Error! Bookmark
not defined.
3.1.2 Ứng dụng trong lập trình sắp xếp mảng nhanh (Quick sort) Error! Bookmark
not defined.
3.1.3 Ứng dụng trong cái bài toán làm việc với các tập tin, thư mục Error!
Bookmark not defined.
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 Error!
Bookmark not defined.
3.2.1 Giới thiệu bài toán Error! Bookmark not defined 3.2.2 Giải quyết bài toán Error! Bookmark not defined.
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
Error! Bookmark not defined.
KẾT LUẬN Error! Bookmark not defined.
TÀI LIỆU THAM KHẢO 11
Trang 7PHỤ LỤC CÁC CÔNG CỤ HỖ TRỢ CÀI ĐẶT THỰC NGHIỆM Error! Bookmark
not defined.
Trang 8DANH MỤC CÁC KÝ HIỆU, THUẬT NGỮ, CHỮ VIẾT TẮT
CHỮ VIẾT TẮT
1 F* Ngôn ngữ lập trình Fstar
2 STM (Software
Transactional Memory)
Bộ nhớ giao tác phần mềm, một giải pháp viết các chương trình tương tranh, thay cho cơ chế đồng bộ dựa trên khóa
3 TFJ string Là một ngôn ngữ mở rộng của FJ tích hợp mô
hình bộ nhớ giao tác phần mềm
THUẬT NGỮ
1 Type System Hệ thống kiểu
2 Transaction Giao tác
3 Thread Luồng
4 Binary Mã nguồn chương trình
5 Type checker Bộ kiểm tra kiểu
6 Strongly typed Kiểu mạnh
7 AST (Abstract Syntax Tree) Cây cú pháp trừu tượng
8 Onacid Trạng thái mở một giao tác
9 Commit Trạng thái kết thúc một giao tác
10 Lock-based synchronization Đồng bộ hóa dựa trên khóa
11 Nested transactions Các giao tác lồng
12 Multi-threaded Đa luồng
13 Join Hàm khử dấu trừ trong chuỗi có dấu chính tắc
14 Merge Hàm gộp 2 chuỗi có dấu chính tắc
15 Spawn Sinh luồng
16 Joint commits Các commit của các luồng song song đồng thời
thực hiện kết thúc một giao tác chung
17 Syntax Cú pháp
KÝ HIỆU
1 +m Mô tả thành phần + trong hệ thống kiểu dựa trên
chuỗi số có dấu, m thao tác onacid liên tiếp
2 −m Mô tả thành phần – trong hệ thống kiểu dựa trên
chuỗi số có dấu, m thao tác commit liên tiếp
3 #m Mô tả thành phần # trong hệ thống kiểu dựa trên
chuỗi số có dấu, m các giao tác lồng nhau
4 ¬m Mô tả thành phần ¬ thể hiện số lượng joint
commit trong hệ thống kiểu dựa trên chuỗi số có
Trang 9dấu
DANH MỤC CÁC BẢNG
Bảng 2.1: Khai báo biểu thức, kiểu, loại trong ngôn ngữ F* Error! Bookmark not
defined.
Bảng 3.1 Bảng kết quả kiểm thử phép toán chính tắc chuỗi số có dấu Error! Bookmark
not defined.
Bảng 3.2 Bảng kết quả kiểm khử dấu “−” thành dấu “¬” Error! Bookmark not defined Bảng 3.3 Bảng kết quả kiểm khử hàm merge Error! Bookmark not defined Bảng 3.4 Bảng kết quả kiểm khử hàm joint commit Error! Bookmark not defined.
Trang 10DANH MỤC CÁC HÌNH VẼ
Hình 2.1: Kết quả cho bài toán tính giai thừa Error! Bookmark not defined Hình 2.2: Các kiểu, loại dữ liệu đƣợc sử dụng trong F* [4] Error! Bookmark not
defined.
Hình 3.1: Kết quả cho bài toán sắp xếp nổi bọt Error! Bookmark not defined Hình 3.2: Kết quả cho bài toán sắp xếp nhanh Error! Bookmark not defined Hình 3.3: Ví dụ mô hình giao tác lồng, đa luồng và joint [13] Error! Bookmark not
defined.
Trang 11PHẦN MỞ ĐẦU
Tính cấp thiết của đề tài
Hiện nay ngành công nghiệp phần mềm đang rất phát triển ở nhiều lĩnh vực Trên thực tế, tùy theo yêu cầu của mỗi lĩnh vực mà chúng ta có thể lựa chọn các ngôn ngữ lập trình sao cho phù hợp Chúng ta có thể thấy rất nhiều ngôn ngữ lập trình được sử dụng ngày nay, trong đó phải kể đến một số ngôn ngữ lập trình rất được phổ biến như là Java, C#, Objective-C, JavaScript, SQL, PHP Các ngôn ngữ lập trình hàm như OCaml, ML, F# cũng dần được phổ biến trong khoảng thời gian gần đây Ngôn ngữ lập trình hàm F# là
ngôn ngữ có kiểu mạnh (strongly-typed) và tự suy luận kiểu (không cần phải khai báo
kiểu cho các biến đầu vào), trình biên dịch có thể tự suy luận ra kiểu của các biến đầu vào
đó khi dịch chương trình Tuy nhiên các kiểu được sử dụng để gán cho các biến đầu vào của ngôn ngữ là có sẵn và được gán một cách tự động khiến người lập trình khó có thể tùy biến được trong F#
Từ nhu cầu này, ngôn ngữ F* đã ra đời Ngôn ngữ F* có hệ thống kiểu được xây dựng dựa trên nền tảng lý thuyết System Fω [1] nhưng được mở rộng hơn với hệ thống kiểu phụ thuộc, các kiểu được tùy chỉnh, cho phép người lập trình có thể làm mịn kiểu dữ liệu cho chặt hơn, phù hợp hơn với ý đồ Ngoài ra F* có thể kiểm chứng tính đúng đắn của chương trình theo kiểu dữ liệu mới được làm mịn này Tức là thông thường, chúng ta
chỉ có kiểu số nguyên (int) nhưng với ngôn ngữ F* chúng ta có thể khai báo kiểu số
nguyên nằm trong khoảng 0 đến 10, hay chỉ gồm các số chẵn hoặc chỉ có các số lẻ Hơn nữa ngôn ngữ F* có thể được dịch sang những ngôn ngữ khác như OCaml, F# hoặc JavaScript để thực thi Những vấn đề trên là cơ sở khoa học và thực tiễn để tôi thực hiện
đề tài “Nghiên cứu ứng dụng ngôn ngữ F* trong phát triển phần mềm”
Mục tiêu của luận văn
Trên cơ sở nghiên cứu lý thuyết, cài đặt, thử xây dựng các chương trình cơ bản, luận văn đã ứng dụng ngôn ngữ F* vào việc xây dựng công cụ tính tổng tài nguyên được sử dụng trong chương trình đa luồng có dùng bộ nhớ giao dịch, theo bài báo nghiên cứu của thầy hướng dẫn
Công cụ phần mềm
Trong luận văn, tôi có sử dụng mã nguồn F* để cài đặt thuật toán chương trình Ngoài ra còn một số công cụ hỗ trợ như Cygwin, OCaml và Visual Studio (C#, F#)
Trang 12TÀ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, MSR-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