Nghiên cứu ứng dụng ngôn ngữ f trong phát triển phần mềm

64 452 0
Nghiên cứu ứng dụng ngôn ngữ f trong phát triển phần mềm

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ VŨ QUANG HƯNG Nghiên cứu ứng dụng ngôn ngữ F* 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 ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ VŨ QUANG HƯNG Nghiên cứu ứng dụng ngôn ngữ F* phát triển phần mềm Ngành: Chuyên ngành: Mã số: Công nghệ thông tin Kỹ thuật phần mềm 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 LỜI CAM ĐOAN Tôi xin cam đoan luận văn công trình nghiên cứu cá nhân tôi, hướng dẫn trực tiếp từ phía PGS.TS.Trương Anh Hoàng TS Nguyễn Như Sơn Các số liệu, nội dung tham khảo 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 cuối đạt luận văn thành trình nghiên cứu thân, chưa công bố hình thức Tôi xin chịu trách nhiệm nghiên cứu luận văn Hà Nội, ngày 28 tháng năm 2015 Tác giả Vũ Quang Hưng LỜI CẢM ƠN Để hoàn thành đề tài luận văn này, bên cạnh chủ động cố gắng thân, nhận ủng hộ giúp đỡ nhiệt tình từ tập thể, cá nhân trường Qua đây, cho phép 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 môn Công nghệ phần mềm trường Đại học công nghệ – Đại học Quốc gia Hà Nội, người trực tiếp động viên, định hướng hướng dẫn tận tình trình học tập hoàn thành đề tài luận văn Đồng kính gửi lời cảm ơn đến tập thể thầy, cô giáo trường Đại học Công Nghệ – Đại học Quốc gia Hà Nội trau dồi kiến thức cho tôi, điều tảng quí báu góp phần to lớn trình vận dụng vào hoàn thiện luận văn Cuối cùng, xin gửi lòng biết ơn sâu sắc đến gia đình, bạn bè, đồng nghiệp tạo điều kiện vật chất tinh thần, sát cánh bên tôi, động viên giúp yên tâm học tập kết thúc khóa học Xin chân thành cảm ơn! Tác giả Vũ Quang Hưng MỤC LỤC LỜI CAM ĐOAN LỜI CẢM ƠN MỤC LỤC DANH MỤC CÁC KÝ HIỆU, THUẬT NGỮ, CHỮ VIẾT TẮT DANH MỤC CÁC BẢNG DANH MỤC CÁC HÌNH VẼ PHẦN MỞ ĐẦU 10 Tính cấp thiết đề tài 10 Mục tiêu luận văn 10 Công cụ phần mềm 10 Phương pháp nghiên cứu 11 Bố cục luận văn 11 CHƯƠNG 1: TỔNG QUAN VỀ LẬP TRÌNH HÀM 12 1.1 Giới thiệu chung ngôn ngữ lập trình hàm 12 1.2 Các đặc điểm bật ngôn ngữ lập trình hàm 13 1.3 Sự phổ biến ngôn ngữ lập trình hàm 14 1.4 Giới thiệu tổng quan ngôn ngữ lập trình hàm F# 15 CHƯƠNG 2: NGHIÊN CỨU LÝ THUYẾT VỀ NGÔN NGỮ F* 17 2.1 Giới thiệu chung 17 2.1.1 Giới thiệu ngôn ngữ F* 17 2.1.2 Giới thiệu kiểu phụ thuộc, hệ thống kiểu phụ thuộc 17 2.2 Các đặc điểm bật ngôn ngữ F* 18 2.2.1 Ngôn ngữ tự chứng thực F* 18 2.2.2 Trình biên dịch từ F* sang mã JavaScript 19 2.3 Các khái niệm lập trình với F* 20 2.3.1 Các định nghĩa kiểu loại thường dùng F* 20 2.3.2 Các khái niệm chung khai báo kiểu F* 23 2.3.3 Lý thuyết tập hợp: 23 2.3.4 Định nghĩa, sử dụng mảng liệu F* 24 2.3.5 Kiểu số tự nhiên (NAT) 26 2.3.6 Chứng minh tính chất F* 26 2.3.7 Loại suy luận ảnh hưởng tới tính toán 28 2.3.8 Sử dụng F* lập trình với toán đơn giản 29 2.3.9 Chứng minh bổ đề (Lemmas) 31 2.3.10 Chứng minh tính kết thúc chương trình F* (Proving termination) 35 2.4 Kết luận chương 38 CHƯƠNG 3: BÀI TOÁN ỨNG DỤNG 39 3.1 Ứng dụng F* vào toán lập trình 39 3.1.1 Ứng dụng toán xếp mảng bọt (Buble sort) 39 3.1.2 Ứng dụng lập trình xếp mảng nhanh (Quick sort) 40 3.1.3 Ứng dụng toán làm việc với tập tin, thư mục 45 3.2 Ứng dụng F* toán tính tổng tài nguyên sử dụng chương trình 48 3.2.1 Giới thiệu toán 48 3.2.2 Giải toán 50 3.2.3 Tính toán giá trị mức giới hạn tổng chi phí tài nguyên cho chương trình 57 KẾT LUẬN 60 TÀI LIỆU THAM KHẢO 61 PHỤ LỤC CÁC CÔNG CỤ HỖ TRỢ CÀI ĐẶT THỰC NGHIỆM 62 DANH MỤC CÁC KÝ HIỆU, THUẬT NGỮ, CHỮ VIẾT TẮT CHỮ VIẾT TẮT, THUẬT NGỮ, KÝ HIỆU STT GIẢI NGHĨA CHỮ VIẾT TẮT F* STM (Software Transactional Memory) TFJ string Ngôn ngữ lập trình Fstar Bộ nhớ giao tác phần mềm, giải pháp viết chương trình tương tranh, thay cho chế đồng dựa khóa Là ngôn ngữ mở rộng FJ tích hợp mô hình nhớ giao tác phần mềm THUẬT NGỮ 10 11 12 13 14 15 Type System Transaction Thread Binary Type checker Stronglytyped AST (Abstract Syntax Tree) Onacid Commit Lock-based synchronization Nested transactions Multi-threaded Join Merge Spawn 16 Joint commits 17 Syntax Hệ thống kiểu Giao tác Luồng Mã nguồn chương trình Bộ kiểm tra kiểu Kiểu mạnh Cây cú pháp trừu tượng Trạng thái mở giao tác Trạng thái kết thúc giao tác Đồng hóa dựa khóa Các giao tác lồng Đa luồng Hàm khử dấu trừ chuỗi có dấu tắc Hàm gộp chuỗi có dấu tắc Sinh luồng Các commit luồng song song đồng thời thực kết thúc giao tác chung Cú pháp KÝ HIỆU + − # ¬ m m m m Mô tả thành phần + hệ thống kiểu dựa chuỗi số có dấu, m thao tác onacid liên tiếp Mô tả thành phần – hệ thống kiểu dựa chuỗi số có dấu, m thao tác commit liên tiếp Mô tả thành phần # hệ thống kiểu dựa chuỗi số có dấu, m giao tác lồng Mô tả thành phần ¬ thể số lượng joint commit hệ thống kiểu dựa chuỗi số có dấu DANH MỤC CÁC BẢNG Bảng 2.1: Khai báo biểu thức, kiểu, loại ngôn ngữ F* 20 Bảng 3.1 Bảng kết kiểm thử phép toán tắc chuỗi số có dấu 52 Bảng 3.2 Bảng kết kiểm khử dấu “−” thành dấu “¬” 53 Bảng 3.3 Bảng kết kiểm khử hàm merge 54 Bảng 3.4 Bảng kết kiểm khử hàm joint commit 57 DANH MỤC CÁC HÌNH VẼ Hình 2.1: Kết cho toán tính giai thừa 20 Hình 2.2: Các kiểu, loại liệu sử dụng F* [4] 22 Hình 3.1: Kết cho toán xếp bọt 40 Hình 3.2: Kết cho toán xếp nhanh 45 Hình 3.3: Ví dụ mô hình giao tác lồng, đa luồng joint [13] 49 10 PHẦN MỞ ĐẦU Tính cấp thiết đề tài Hiện ngành công nghiệp phần mềm phát triển nhiều lĩnh vực Trên thực tế, tùy theo yêu cầu lĩnh vực mà lựa chọn ngôn ngữ lập trình cho phù hợp Chúng ta thấy nhiều ngôn ngữ lập trình sử dụng ngày nay, phải kể đến số ngôn ngữ lập trìnhrất phổ biến nhưlà Java, C#, Objective-C, JavaScript, SQL, PHP Các ngôn ngữ lập trình hàm OCaml, ML, F# dần phổ biến khoảng thời gian gần Ngôn ngữ lập trình hàm F# ngôn ngữ có kiểu mạnh(strongly-typed) tự suy luận kiểu (không cần phải khai báo kiểu cho biến đầu vào), trình biên dịch có thểtự suy luận kiểu biến đầu vào dịch chương trình Tuy nhiên kiểu sử dụng để gán cho biến đầu vào ngôn ngữ có sẵn gán cách tự động khiến người lập trình khó tùy biến F# Từ nhu cầu này, ngôn ngữF* đời Ngôn ngữ F* có hệ thống kiểu xây dựng dựa tảng lý thuyết System Fω [1] mở rộng với hệ thống kiểu phụ thuộc, kiểu tùy chỉnh, cho phép người lập trình làm mịn kiểu liệu cho chặt hơn, phù hợp với ý đồ.Ngoài F* kiểm chứng tính đắncủa chương trình theo kiểu liệu làm mịn này.Tức làthông thường, có kiểu số nguyên (int) với ngôn ngữ F* khai báo kiểu số nguyên nằm khoảng đến 10, hay gồm số chẵn có số lẻ Hơn nữangôn ngữ F* dịch sang ngôn ngữ khác OCaml, F# JavaScript để thực thi Những vấn đề sở khoa học thực tiễn để thực đề tài “Nghiên cứu ứng dụng ngôn ngữ F* phát triển phần mềm” Mục tiêu luận văn Trên sở nghiên cứu lý thuyết, cài đặt, thử xây dựng chương trình bản, luận văn ứng dụng ngôn ngữ F* vào việcxây dựng công cụ tính tổng tài nguyên sử dụng chương trình đa luồng có dùng nhớ giao dịch, theo báo nghiên cứu thầy hướng dẫn Công cụ phần mềm Trong luận văn, có sử dụng mã nguồn F* để cài đặt thuật toán chương trình Ngoài số công cụ hỗ trợ Cygwin, OCaml Visual Studio (C#, F#) 50 Ở phát triển hệ thống kiểu để đánh giá tĩnh tổng chi phí nhớ dành cho chương trình việc tính tổng số log lớn nhất, log tồn thời điểm 3.2.2 Giải toán Xây dựng thuật toán tính kiểu cho toán Trước tiên để xây dựng thuật toán tính kiểu, cần phải xây dựng hàm parser từ đoạn giả mã thành chuỗi số ngoặc tương ứng với luồng định Ta có onacid tương ứng với +1, commit tương ứng với -1, khởi tạo luồng spawn tương ứng với “(“, kết thúc luồng tương ứng với “)”,bắt đầu công việc tương ứng với “e” Sau đưa chuỗi số vào cú pháp trừu tượng sử dụng thuật toán để rút gọn, tính toán đưa kết cuối Trong ta có định nghĩa kiểu sau: type Tag = | Plus = | Minus = | Max = | Join = Để trừu tượng hóa hành vi giao tác mở đóng giao tác, giá trị giới hạn max tài nguyên thành phần joint commit, ta sử dụng định nghĩa kiểu sau: plus, minus, max, jointương ứng với dấu sau ‘+’, ‘−’, ‘#’,‘¬’ Kèm theo dấu số tự nhiên thể cho giá trị hành vi sau:type TagNum = Tag * int Tiếp theo ta định nghĩa chuỗi hành vi type TagSeq = TagNum listtương ứng với chuỗi hành vi thread.Cuối ta tổng hợp lại thành phần đưa vào cú pháp trừu tượng định nghĩa sau: type Tree = | Branch of Tree list | Leaf of TagNum 3.2.2.1 Chính tắc chuỗi số có dấu a Mô tả thuật toán: Đầu vào: Một chuỗi có dấu chưa tắc Ta có quy tắc rút gọn sau: - seq(S) = S S chuỗi tắc - seq(S#m#nS') = seq(S#max(m,n)S') - seq(S+m+nS') = seq(S+(m+n)S') 51 - seq(S−m−nS') = seq(S−(m−n)S') - seq(S+m#l−nS') = seq(S+ (m - 1)# (l + 1)− (n - 1)S') Đầu ra: Chuỗi tắc Bước 1: Lấy phần tử từ trái qua phải kiểm tra sau: Chuỗi tắc chuỗi không chứa dấu liền −−, +¬, ##, ++, +−, +#−, +#¬.Như chuỗi không gồm dấu liền chuỗi gọi chuỗi tắc Bước 2: Gọi x mẫu tìm thấy từ trái qua phải chuỗi lst, x rút gọn y theo quy tắc tiếp tục việc sau: - Loại x khỏi lst - Thêm y vào đầu danh sách lst - Quay lại Bước với chuỗi lst b Cài đặt kiểm chứng: Phương thức seq xây dựng để giải chuẩn tắc chuỗi có dấu có dạng sau: 1val seq: TagSeq -> TagSeq letrec seq lst = match lst with | [] -> [] | (_, 0)::xs-> seq xs | (Tag.Plus, n1)::(Tag.Plus, n2)::xs -> seq ((Tag.Plus,n1+n2)::xs) | (Tag.Max, n1)::(Tag.Max, n2)::xs -> seq ((Tag.Max,max n1 n2)::seq xs) | (Tag.Minus, n1)::(Tag.Minus, n2)::xs -> seq ((Tag.Minus,n1+n2)::xs) | (Tag.Plus, n1)::(Tag.Minus, n2)::xs -> 10 if n1 >= n2 then 11 seq ((Tag.Plus,n1-n2)::(Tag.Max,n2)::xs) 12 else 13 seq ((Tag.Max,n1)::(Tag.Minus,n2-n1)::xs) 14 | (Tag.Plus, n1)::(Tag.Max, n)::(Tag.Minus, n2)::xs -> 15 let m = n1 n2 in 16 if n1 > n2 then 17 seq ((Tag.Plus,n1-m)::(Tag.Max, n+m)::xs) 18 elif n1 = n2 then 19 seq ((Tag.Max, n+m)::xs) 20 else 52 21 22 seq ((Tag.Max, n+m)::(Tag.Minus,n2-m)::xs) | x::xs ->x::(seq xs) Theo đưa liệu đầu vào, ta có số ví dụ minh họa cho việc kiểm chứng có kết trả đắn Bảng 3.1 Bảng kết kiểm thử phép toán tắc chuỗi số có dấu Lượt Dữ liệu vào (lst) (Plus,1); (Minus,1) (Plus,1); (Max,1); (Minus,1) (Max,4); (Max,5); (Plus,3); (Max,3); (Minus,4) Kết (Max,1) (Max,2) (Max,6);(Minus,1) 3.2.2.2 Khử dấu trừ chuỗi có dấu tắc (Join) a Mô tả thuật toán: Đầu vào: Cho chuỗi có dấu tắc mà tagset(S)∩ {¬,+} = ∅ có i = first(S, −) i # Hàm join(S) đệ quy để thay dấu “−” thành dấu “¬” thuật toánnhư saujoin(S) = S first(S, −) = không thìjoin(S) = s1…si-1¬1join(−(|si|- 1) si+1…sk) Đầu ra: Chuỗi thay hoàn toàn dấu “−” thành dấu “¬” Bước 1: Lấy phần tử từ trái qua phải kiểm tra sau: Nếu chuỗi phần tử chứa dấu “−” chuỗi khử hoàn toàn dấu“−” Bước 2: Gọi x mẫu chứa dấu “ −”và có giá trị ntrong danh sách lst1, ta cầnthay thành dấu “¬” sau: - Thêm phần tử “¬1”vào đầu danh sách - Bổ sung phần tử “− (n-1) ” vào đầu danh sách lại - Tiếp tục gọi đệ quy với hàm join danh sách lại b Cài đặt kiểm chứng: Phương thức join định nghĩa để biến tất phần tử chứa dấu “−” thành phần tử chứa dấu “¬” sau: val join: TagSeq -> TagSeq letrec join lst = match lst with | [] -> [] | (Tag.Minus, n1)::xs-> 53 if n1 > then (Tag.Join, 1)::(join ((Tag.Minus, n1-1)::xs)) else (join xs) 10 | x::xs ->x::(join xs) Theo đưa liệu đầu vào, ta có số ví dụ minh họa cho việc kiểm chứng có kết trả đắn Bảng 3.2 Bảng kết kiểm khử dấu “−” thành dấu “¬” Lượt Dữ liệu vào (lst) (Minus,1) (Minus,2) (Max,3); (Minus,2) Kết (Join,1) (Join,1); (Join,1) (Max,3); (Join,1); (Join,1) 3.2.2.3 Gộp chuỗi số có dấu tắc (Merge) a Mô tả thuật toán: Đầu vào: Cho chuỗi có dấu tắc với số phần tử chứa dấu “¬”bằng (Có thể 0) Cho i = 1, Si viết dạng tổng quát: Si = #mi ¬ni S'i (mi ni 0) Hàm mergeđịnh nghĩa quy tắc đệ quy sau: merge(S1, S2) =#(m1+m2) Si = # mi , i =1, không thì: merge(S1, S2) = (m1+m2) (n1+n2)merge(S'1, S'2) Đầu ra: Chuỗi sau gộp từ chuỗi có dấu tắc ban đầu Bước 1: Lấy phần tử từ trái qua phải chuỗi lst1, lst2 kiểm tra Nếu phần tử lấy có dạng #mi - Loại phần tử đầu lst1, lst2 khỏi danh sách - Thêm phần tử #(m1 + m2) vào đầu danh sách mảng kết trả bước sau - Quay lại bước với phần tử lại danh sách Nếu phần tử có dạng −mi - Loại phần tử đầu lst1, lst2 khỏi danh sách - Thêm phần tử −(m1 + m2) vào đầu danh sách mảng kết trả bước sau - Quay lại bước với phần tử lại danh sách Nếu phần tử có dạng –m1 ,#m2 54 - Loại phần tử đầu S2 khỏi danh sách - Quay lại bước với lst1và phần tử lại lst2 Nếu phần tử có dạng #m1 , –m2 - Loại phần tử đầu lst1ra khỏi danh sách - Quay lại bước với phần tử lại lst1và lst2 b Cài đặt kiểm chứng: Phương thức merge đưa để gộp chuỗi có dấu chuẩn tắc chứa số phần tử có dấu “¬”bằng 1val merge: TagSeq -> TagSeq -> TagSeq 2letrec merge lst1 lst2 = if List.isEmpty lst1 then lst2 elif List.isEmpty lst2 then lst1 else let tag1 = fst (List.head lst1) in let tag2 = fst (List.head lst2) in if tag1 = Tag.Max && tag2 = Tag.Max then (Tag.Max, (snd (List.head lst1)) + (snd (List.head lst2))):: (merge (List.tail lst1) (List.tail lst2)) 10 elif tag1 = Tag.Join && tag2 = Tag.Join then 11 (Tag.Join, (snd (List.head lst1)) + (snd (List.head lst2))):: (merge (List.tail lst1) (List.tail lst2)) 12 elif tag1 = Tag.Max && tag2 = Tag.Join then 13 (Tag.Max, snd (List.head lst1))::(merge (List.tail lst1) lst2) 14elif tag1 = Tag.Join && tag2 = Tag.Max then 15 (Tag.Max, snd (List.head lst2))::(merge lst1 (List.tail lst2)) 16 else failwith "Error in merge" Theo đưa liệu đầu vào, ta có số ví dụ minh họa cho việc kiểm chứng có kết trả đắn Bảng 3.3 Bảng kết kiểm khử hàm merge Lượt Dữ liệu vào (lst1) (Join,1) (Join,1) (Max,2) ; (Join, 2) (Max,3) Dữ liệu vào (lst2) (Join,1) (Max,1) ; (Join,1) (Join,1) (Max,3) Kết (Join,2) (Max,1) ; (Join, 2) (Max,2) ; (Join, 3) (Max,6) 55 3.2.2.4 Đồng hóa luồng song song kết thúc giao tác (Joint commit) a Mô tả thuật toán: Đầu vào: Cho chuỗi tắc phần tử chứa dấu “−” Hàm joint commit viết để kết hợp chuỗi tắc thành chuỗi theo quy tắc sau: jc(#n , #l) = #max(n,l) jc(S'1+n#n , #l¬lS'2) = jc(S'1+(n−1)max((n' +1), (l'+l)),S'2) Đầu ra: Chuỗi tắc từ kết hợp chuỗi tắc Bước 1: Lấy phần tử chuỗi lst1, lst2 kiểm tra: - Nếu phần tử đầu lst1 có dạng “+n1#n2” kiểm tra tiếp phần tử lst2: o Nếu phần tử đầu lst2 có dạng ¬l thì:  Loại bỏ phần tử đầu chuỗi lst2  Gọi hàm tắcseqvới đầu vào chuỗi lst2 sau thêm vào phần tử #l (Với l giá trị phần tử đầu mảng lst2 loại bỏ trên)  Gọi đệ quy joint commit với chuỗi lst1 = +(n − 1) lst2 sau thực bước o Nếu phần tử đầu lst2 có dạng #l1¬l2 thì:  Loại bỏ phần tử đầu lst2  Gọi đệ quy joint commit với chuỗi lst1 = +(n−1) #(max (n2+1) (l1+l2) lst2 sau thực bước - Nếu phần tử đầu lst1 có dạng “+n1” kiểm tra tiếp phần tử lst2: o Nếu phần tử đầu lst2 có dạng ¬l thì:  Loại bỏ phần tử đầu chuỗi lst2  Gọi hàm tắc seq lại chuỗi lst2 sau thêm vào phần tử #l (Với l giá trị phần tử đầu mảng lst2 loại bỏ trên)  Gọi đệ quy joint commit với chuỗi lst1 = +(n − 1) lst2 sau thực bước o Nếu phần tử đầu lst2 có dạng #l1¬l2 thì:  Loại bỏ phần tử đầu lst2  Thêm phần tử #max (l1+l2) vào đầu chuỗi lst2 56  Gọi hàm tắc seq với đầu vào chuỗi lst2  Gọi đệ quy joint commit với chuỗi lst1 = +(n−1)và lst2 sau thực bước b Cài đặt kiểm chứng: Phương thức joint commit đưa để gộp chuỗi có dấu tắc không bao gồm dấu“−” sau: letrec jc (lst1: TagSeq) (lst2: TagSeq) : TagSeq = match lst1 with | [] ->if List.isEmpty lst2 then [] else lst2 | (Tag.Plus,m1)::[] -> match lst2 with | [] -> lst1 | (Tag.Max,l1)::(Tag.Join,l2)::xs2 -> 10 if m1 > then 11 jc [(Tag.Plus,m1-1)] (seq((Tag.Max,l1+l2)::xs2)) 12 else 13 (Tag.Max,l1+l2)::xs2 14 |(Tag.Join, l2)::xs2 -> 15 if m1 > then 16 jc [(Tag.Plus, m1-1)] (seq ((Tag.Max, l2)::xs2)) 17 else 18 (Tag.Max, l2)::xs2 19 | otherwise -> failwith "Need attention in jc 1" 20 | (Tag.Plus,n1)::(Tag.Max,n2)::[] -> 21 match lst2 with 22 | [] -> lst1 23 | (Tag.Max,l1)::(Tag.Join,l2)::xs2 -> 24 if n1 >= then 25 jc ((Tag.Plus,(n1-1))::[Tag.Max,(max (n2+1) (l1+l2))]) xs2 26 else 27 jc [Tag.Join,max (n2+1) (l1+l2)] xs2 28 | (Tag.Join, l2)::xs2-> 29 if n1 > then 30 jc [(Tag.Plus, n1-1)] (seq ((Tag.Max, l2)::xs2)) 31 else 32 (Tag.Max, max (n2+1) l2)::xs2 33 | otherwise -> failwith "Need attention in jc 2" 34 | x::xs -> [] 57 Theo đưa liệu đầu vào, ta có số ví dụ minh họa cho việc kiểm chứng có kết trả đắn Bảng 3.4 Bảng kết kiểm khử hàm joint commit Lượt Dữ liệu vào (lst1) (Plus,1) (Plus,1) (Plus,1) ; (Max,1) (Plus,2) ; (Max,3) Dữ liệu vào (lst2) (Join,1) (Max,1) ; (Join,1) (Max,1) ; (Join,1) (Max,2) ; (Join,1) Kết (Max,1) (Max,2) (Max,2) (Plus,1) ; (Max,4) 3.2.3 Tính toán giá trị mức giới hạ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 giao tác Đầu ra: Tính toán giá trị giới hạn tổng chi phí tài nguyên cho đoạn mã Ta chia nhỏ toán thành giai đoạn sau: Giai đoạn 1: Từ đoạn giả mã chứa giao tác, kết xuất chuỗi nguyên thủy TFJ bao gồm phần tử +1, −1, “(”, “)” thông qua parser với từ khóa onacid, commit, spawn, “)” tương đương endspawn Đối với work, hàm parser có nhiệm vụ chuyển đổi đắn 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 e5, e6 … Giai đoạn 2: Từ chuỗi nguyên thủy, đưa vào cú pháp trừu tượng theo quy tắc: - Khởi tạo thread (spawn) tiến hành tạo nhánh Khởi tạo giao tác (onacid) tiến hành tạo với giá trị +1 Đóng thread dừng tạo nhánh Kết thúc giao tác (commit)thì tạo với giá trị −1 Giai đoạn 3: Tính toán giá trị mức giới hạn dựa cú pháp trừu tượng mà xây dựng nên từ chuỗi chuẩn tắc hàm tính toán định nghĩa seq, join, joint commit merge: 1letrec infer (branch:list Tree)(headseq:list TagNum): TagSeq = match branch with 58 10 11 12 13 |[]-> seq headseq | x::xs -> match x with | Leaf tagnum -> let newhead = seq (append headseq [tagnum])in infer xs newhead | Branch br -> let child = join (infer br [])in let parent = join (infer xs [])in let tailseq = seq (merge child parent)in seq (jc headseq tailseq) Gọi S chuỗi TFJ cần tính toán, áp dụng công thức định nghĩa xử lý cú pháp trừu tượng ta 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 + # ¬ + + + − − − − − − + + + − − − − + + + + − − − − − ≅ 2( 2) 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( 3) ≅ 1( 3) # ≅ 11 Như với chương trình có đoạn mã trên, giá trị giới hạn tổng tài nguyên 11 Tóm lại, toán này, mô tả bước xây dựng công cụ tính toán giá trị mức giới hạn sau xây dựng loạt hàm công thức tính toán tản F* Dưới vài thực nghiệm khác để chứng tỏ việc xây dựng công cụ tính toán đắn: 1onacid; //thread onacid; commit; 4spawn(commit); 5commit Ta có chuỗi TFJ cần tính toán sau: S = +1+1−1(−1)−1 59 ≅+1#1(¬2) ≅# Vậy với đoạn mã trên, giá trị giới hạn tổng tài nguyên chương trình 60 KẾT LUẬN Luận văn đưa khái niệm kiến thức cài đặt lập trình với ngôn ngữ F* Mặt khác, điểm bật đề tài áp dụng phương pháp lập trình với F* để áp dụng xây dựng toán tính giá trị mức giới hạn tổng chi phí tài nguyên chương trình Quá trình xây dựng thuật toán bao gồm xây dựng hàm tính toán, phép tính toán chuỗi số có dấu từ làm hàm để giải cho toán nêu Việc xây dựng thành công toán góp phần giúp nhà phát triển phần mềm có sử dụng nhớ giao dịch biết chương trình cần 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 hệ thống Xét mặt thực tiễn, ngôn ngữ F* mẻ, F* phát triển hai năm từ 29/4/2013 nhiên đạt thành định xác thực tính đắn đoạn mã viết F#, tùy biến kiểu sử dụng thông dụng thành kiểu tinh vi phù hợp với hoàn cảnh lập trình Đối với toán thực nghiệm mức độ xác thực tính đắn kiểm chứng mức độ nghiên cứu Chính vậy, để áp dụng vào toán cụ thể xử lý hoàn toàn từ đầu vào kết cần phải nhiều thời gian công sức Hy vọng công cụ F* hoàn thiện từ nhóm nghiên cứu Microsoft, xây dựng toán đưa kết F# với mức độ kiểm soát tùy chỉnh kiểu tinh vi hơn, đáp ứng nhu cầu thực tế người dùng tương lai 61 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 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, MSRINRIA, 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 MSRINRIA, 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 62 PHỤ LỤC CÁC CÔNG CỤ HỖ TRỢ CÀI ĐẶT THỰC NGHIỆM 1.1 Cài đặt Lập trình viên cần có sẵn ứng dụng sau để cài đặt sử dụng biên dịch ngôn ngữ F*: - Bộ cài đặt z3 version 4.3.2: https://z3.codeplex.com/downloads/get/623728 F# version 12.0.21005.1 Cygwin Visual Studio 2013 Để viết đoạn mã ngôn ngữF* lập trình viên sử dụng chương trình notepad notepad++ với tùy chọn ngôn ngữ (Language option)làCaml 1.1.1 Sử dụng Visual Studio 2013 - Tải cài đặt Visual Studio 2013 theo đường dẫn sau: https://www.visualstudio.com/en-us/downloads/download-visual-studio-vs.aspx - Sử dụng dotNet framework 4.5 F# version 3.0 có sẵn cài đặt Visual Studio - Mở tập tin FStar.sln thư mục FStar-master/src thực dịch chương trình khác - Tập tin thực thi fstar.exe thư mục FStar-master/bin 1.1.2 Sử dụng Cygwin - Sử dụng cài đặt Cygwin GNU với lựa chọn thêm thư viện devel 32 bit: https://www.cygwin.com/setup-x86.exe 64 bit: https://www.cygwin.com/setup-x86_64.exe - Sử dụng câu lệnh sau: o Trỏ tới thư mục F*: cd FStar-master o Sử dụng source cho F*: source setenv.sh o Trỏ tới thư mục src thư mục F*:cd src o Thực build F*: make - Tương tự file thực thi fstar.exe nằm thư mục bin FStar-master\bin 1.2 Lập trình F* 63 1.2.1 Kiểm tra tính đắn hàm xây dựng Cấu trúc thư mục Fstar bao gồm: D:\Fstar-Master - bin // Chứa thư viện kèm để trình biên dịch chạy doc // Chứa tập tin hướng dẫn lib // Định nghĩa thư viện src // Bao gồm đoạn mã để xây dựng trình biên dịch CoreTypeSystem // Gồm đoạn mã cho toán Để thực thi toán (Ví dụ: Core Type System) từ Cygwin, ta thực thao tác sau: - cd "D:\FStar-master" source setenv.sh cd CoreTypeSystem /bin/fstar.exe codegen OCaml /lib/string.fst CoreTypeSystem.fst 1.2.2 Sử dụng hàm Assert F* để kiểm tra Hiện nay, F* chưa hỗ trợ khả gỡ lỗi (debug)linh hoạt ngôn ngữ khác nên thay đó, lập trình viên sử dụng hàm assert F* để xác thực.Ví dụ với hàm kiểm tra độ dài mảng ta viết đoạn mã sử dụng hàmassert sau để xác nhận lại kết quả: let test1 = assert((length [3;5;7;6;8;9])=6) Tuy nhiên nhược điểm F* cần đánh giá đầy đủ biểu thức phức tạp trình biên dịch nên sử dụng hàm assert gây lỗi F* xác thực tới hàm Đó ràng buộc định F* hiệu Chính lập trình viên nên thử với việc sử dụng tính codegennhư phần 1.2.3 Biên dịch sang đoạn mã OCaml thực thi Do dự án phát triển nên F* chưa hỗ trợ tính IDE, giao diện trình biên dịch chưatrực quan chưa thể tạo đoạn mã thực thi, dừng lại việc xác thực nên lập trình viên cần sử dụng tính codegen trình biên dịch sang đoạn mã OCaml JavaScript Tuy nhiên, số hàm kiểm tra, hàm bổ đề, xác thực F* bị lược bớt sử dụng tính Lập trình viên thực -codegenvới cú pháp sau: $ fstar TestFstar.fst prims link/prims.fst –codegen OCaml 64 Khi tập tin TestFstar.ml tự động sinh thư mục chứa tệp tin TestFstar.fst Với đoạn mã OCaml (TestFstar.ml) lập trình viên đưa vào trình biên dịch OCaml kiểm tra tính đắn hàm vừa viết Ví dụ với hàm quicksort: # sort [2;8;7;6;5;1];; int list = [1; 2; 5; 6; 7; 8] [...]... toán áp dụng khi lập trình với ngôn ngữ F* 17 CHƯƠNG 2: NGHIÊN CỨU LÝ THUYẾT VỀ NGÔN NGỮ F* 2.1 Giới thiệu chung 2.1.1 Giới thiệu về ngôn ngữ F* Fstar (F* ) [2] là ngôn ngữ lập trình hàm có thể xác thực tính đúng đắn của các đoạn mã viết ra, được phát triển bởi trung tâm nghiên cứu của Microsoft, MSR-Inria, Inria và trung tâm phần mềm IMDEA Với các phương thức và cách hoạt động gần giống với F7 [5],... (programming language) F* (programming language) Idris (programming language) 2.2 Các đặc điểm nổi bật của ngôn ngữ F* 2.2.1 Ngôn ngữ tự chứng thực F* Ngôn ngữ tự chứng thực (Self Certification) là ngôn ngữ có khả năng kiểm chứng tính đúng đắn của các chương trình được xây dựng bởi ngôn ngữ đó Một số ngôn ngữ trước đó cũng có khả năng này như Coq [11], Agda[7] Trình biên dịch F* có thể tự kiểm chứng tính đúng... biến của ngôn ngữ lập trình hàm trong ngành phát triển phần mềm hiện nay - Chương 2: Giới thiệu tổng quan về ngôn ngữ F* ,phương pháp xây dựng một chương trình trên nền tảng F* Đưa ra các khái niệm, tính năng cơ bản và một số tính năng nâng cấp của F* so với các ngôn ngữ khác Khái quát và tóm tắt lại để đưa ra kết luận chung về ngôn ngữ F* - Chương 3: Ứng dụng F* trên một số bài toán lập trình trong thực...11 Phương pháp nghiên cứu Để đề tài có thể đạt được kết quả như mục tiêu đặt ra, trong luận văn, tôi đã đề xuất và áp dụng các phương pháp nghiên cứu như sau: - Nghiên cứu các tài liệu liên quan đến lập trình hàm nói chung và lập trình ngôn ngữ F* nói riêng - Thử nghiệm với một số chương trình cơ bảnsử dụng ngôn ngữ F* - Ứng dụng xây dựng công cụ phần mềm: Cài đặt các thuật toán cho... dụ như f( x) + f( x) và 2 *f( x) luôn cùng một kết quả Ngoài ra, ngữ nghĩa của ngôn ngữ lập trình hàm đơn giản hơn ngữ nghĩa của ngôn ngữ lập trình mệnh lệnh Trong các ngôn ngữ lập trình hàm, các lời gọi chương trình con được viết thành biểu thức đơn giản Các ngôn ngữ hàm cũng là các ngôn ngữ bậc cao và mang tính trừu tượng hơn so với các ngôn ngữ mệnh lệnh Ngoài ra, lập trình hàm thường tránh sử dụng các... biến của ngôn ngữ lập trình hàm Các ngôn ngữ lập trình hàm hiện nay được biết đến khá nhiều và một trong số đó có thể kể đến là F# Ngôn ngữ F# được cài đặt bởi tiến sĩ Don Syme tại Microsoft Research tại Cambridge Hiện tại được tiếp quản bởi Microsoft và vẫn đang được tiếp tục phát triển bởi nhóm chuyên gia ở cả Cambridge và Redmond Ngôn ngữ F# mang đến cho bạn một ngôn ngữ lập trình hàm an toàn, gọn nhẹ... viện sẽ được phát hành cùng với phiên bản mới của ngôn ngữ Mã này hiện diện như là một phần của F# PowerPack Hiện nay, F# phiên bản 4.0 đã được cài đặt mặc định với Visual Studio 2015 v F# có thể chạy trên phần lớn các nền tảng như HTML5, Android, JavaScript, Windows và MacOS 15 1.4 Giới thiệu tổng quan về ngôn ngữ lập trình hàm F# Như đã nhắc đến ở các phần trên, việc lập trình với ngôn ngữ F# khá là... dụng thư viện NET cũng giúp cho việc lập trình với F# trở nên dễ dàng hơn Các thư viện khi lập trình với F# như System.IO, Microsoft.FSharp.Text.Lexing, Microsoft.FSharp.Text.Parsing.ParseHelpers và Microsoft.FSharp.Collections giúp ích rất nhiều trong các bài toán như đọc ghi dữ liệu, phân tích cú pháp trong một đoạn mã cho trước Mặt khác trong ngôn ngữ F# , chúng ta có thể tự khai báo một số kiểu mới... ngôn ngữ F# Ngôn ngữ F# có thể tận dụng hầu hết các công cụ phát triển trong Visual Studio F# hỗ trợ lập trình hướng đối tượng Khi lập trình với F# , các đoạn mã được viết ra cũng đơn giản hơn so với các ngôn ngữ như C# hoặc Java tuy nhiên điều khó khăn nhất đối với những lập trình viên chưa biết về lập trình hàm đó chính là cú pháp hoàn toàn mới của nó, gần như sẽ rất khác so với PHP, Java, C Tại sao ngôn. .. tài nguyên sử dụng của chương trình đa luồng có dùng bộ nhớ giao dịch trong trường hợp xấu nhất Bố cục luận văn Trong luận văn này sẽ bao gồm các phần cơ bản sau: - Phần mở đầu: Đưa ra tính cấp thiết của đề tài, công cụ phần mềm được sử dụng, phương pháp nghiên cứu và bố cục của luận văn - Chương 1: Giới thiệu tổng quan về ngôn ngữ lập trình hàm, đưa ra các đặc điểm nổi bật của ngôn ngữ lập trình hàm ... số lẻ Hơn nữangôn ngữ F* dịch sang ngôn ngữ khác OCaml, F# JavaScript để thực thi Những vấn đề sở khoa học thực tiễn để thực đề tài Nghiên cứu ứng dụng ngôn ngữ F* phát triển phần mềm Mục tiêu... đặc điểm số toán áp dụng lập trình với ngôn ngữ F* 17 CHƯƠNG 2: NGHIÊN CỨU LÝ THUYẾT VỀ NGÔN NGỮ F* 2.1 Giới thiệu chung 2.1.1 Giới thiệu ngôn ngữ F* Fstar (F* ) [2] ngôn ngữ lập trình hàm xác... language) F* (programming language) Idris (programming language) 2.2 Các đặc điểm bật ngôn ngữ F* 2.2.1 Ngôn ngữ tự chứng thực F* Ngôn ngữ tự chứng thực (Self Certification) ngôn ngữ có khả kiểm chứng

Ngày đăng: 04/11/2015, 09:34

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan