bài giảng môn nguyên lý các ngôn ngữ lập trình C5

38 618 0
bài giảng môn nguyên lý các ngôn ngữ lập trình C5

Đ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

Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại BÀI 5: TRỪU TƯỢNG DỮ LIỆU VÀ TÍNH MODULARITY Các lập trình viên máy tính phải thời gian lâu công nhận giá trị việc xây dựng hệ thống phần mềm mà bao gồm số modules Trong thiết kế hiệu quả, module cần thiết kế kiểm chứng độc lập Hai mục tiêu quan trọng tính module cho phép module viết với kiến thức code module khác cho phép module thiết kế cài đặt lại mà không sửa phần khác hệ thống Các ngôn ngữ lập trình môi trường phát triển phần mềm đại hỗ trợ tính module theo nhiều cách khác Trong chương này, xét số cách mà chương trình chia phần có ý nghĩa cách mà ngôn ngữ lập trình thiết kế để hỗ trợ việc chia Trong chương xét đến chế module mà không nói đến đối tượng Chủ đề lập trình cấu trúc hỗ trợ trừu tượng hóa modules Hai ví dụ sử dụng để mô tả hệ thống module lập trình khái quát hệ thống module ML chuẩn thư viện mẫu chuẩn C++ (Standard Template Library – STL) 2.1 Lập trình cấu trúc Trong báo có ảnh hưởng lớn vào năm 1969 mang tên Structured Programming, E.W.Dijkstra rõ cần phát triển chương trình cách nêu toán mà cần phải thực sau làm mịn dần toán thành toán nhỏ hơn, đạt đến mức độ, nhiệm vụ lại dễ dàng biểu diễn thao tác Điều tạo vấn đề mà đủ nhỏ đến mức hiểu đủ riêng biệt để giải độc lập Trong Ví dụ 9.1, cấu trúc liệu truyền phần riêng biệt chương trình đơn giản trực tiếp Điều làm cho xác định sớm cấu trúc liệu trình Vì cấu trúc liệu bất biến qua hầu hết trình thiết kế Ví dụ Dijkstra tập trung vào việc làm mịn thủ tục thành thủ tục nhỏ Trong hệ thống phức tạo hơn, cần thiết làm mịn cấu trúc liệu thủ tục Điều thể Ví dụ 9.2 Nhà bác học kiên trì nồng hậu, E.W Dijkstra có nhiều đóng góp quan trọng cho lĩnh vực Khoa học máy tính Ông biết đến qua semaphore, mà sử dụng cho điều khiển song song, thuật toán phương pháp tìm đường ngắn đồ thị, ngôn ngữ ‘guarded command’ phương pháp suy luận chương trình Qua vài năm, Dijkstra viết loạt báo viết tay cẩn thận, người biết đến EWD Đến đầu năm 2002, nhà bác học viết 1309 EWDs, scanned đưa lên trang web ông Như ông viết: ‘Lĩnh vực quan tâm tập trung vào công cụ toán học để làm tăng khả suy luận, đặc biệt sử dụng phương pháp hình thức’ oạAn toàn bảo mật thông itn 13 Trần Văn Dũng BM Khoa học máy tính 14 Bài 4: Mã khối đại An toàn bảo mật thông tin Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại Sự quan tâm công cụ toán học minh chứng EWDs, phát triển giải pháp đẹp đẽ cho toán hấp dẫn vài trang Như nhiều trường phái Châu âu cổ, không giống nhiều người Mỹ, Dijkstra coi trọng việc viết tay Một phần vui đùa phần để tỏ lòng kính trọng Dijkstra, nhà nghiên cứu ngôn ngữ lập trình Luca Cardelli chép cẩn thận viết tay từ tập EWDs tạo thành font EWD Nếu bạn tìm thấy font web, bạn viết ghi ngắn theo cách viết tay tiếng Dijkstra Ví dụ 9.1 Dijkstra xét toán tính in 1000 số nguyên tố Phiên chương trình có chứa chút cú pháp cho ta suy nghĩ việc viết chương trình Ngược lại, trông giống mô tả tiếng Anh toán mà muốn giải Chương trình 1: Bài toán làm mịn thành toán nhỏ Để chia toán thành hai, cấu trúc liệu cần phải chọn để truyền kết toán thứ cho toán thứ hai Trong ví dụ Dijkstra, cấu trúc liệu bảng, mà diền 1000 số nguyên tố Chương trình : Trong phần làm mịn tiếp theo, toán xét tiếp Một ý tưởng quan trọng lập trình cấu trúc toán xét độc lập Trong ví dụ trên, toán điền vào bảng số nguyên tố độc lập với toán in bảng Do toán giao cho lập trình viên khác nhau, cho phép toán giải vào thời điểm người khác Ngay chương trình viết người nhất, có lợi ích quan trọng tách toán phức tạp thành toán nhỏ độc lập Đặc biệt lắm, người nghĩ nhiều chi tiết lúc Chia toán thành toán làm cho nghĩ toán thời điểm, giảm số chi tiết mà cần phải xét thời điểm Chương trình oạAn toàn bảo mật thông itn 15 Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại Tại điểm này, cấu trúc chương trình xác định lập trình tập trung thuật toán tính số nguyên tố Mặc dù ví dụ đơn giản, cho ý tưởng lập trình việc làm mịn bước Làm mịn bước nói chung đưa chương trình với cấu trúc giống khái niệm Một khía cạnh khó việc phát triển chương trình trên-xuống làm cho toán trở nên đơn giản bước làm mịn Nếu không, làm mịn toán tạo danh sách toán lập trình mà chúng khó toán gốc Điều có nghĩa người thiết kế mà sử dụng việc làm mịn bước cần phải có ý tưởng tốt trước toán thực 2.1.1 Làm mịn liệu Bổ sung thêm cho việc làm mịn toán thành toán đơn giản hơn, tiến triển thiết kế hệ thống dẫn đến thay đổi cấu trúc liệu sử dụng để kết hợp hành động modules độc lập Ví dụ 9.2 16 An toàn bảo mật thông tin Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại Xét toán thiết kế chương trình ngân hàng đơn giản Mục đích chương trình xử lý việc gửi tiền tài khoản, rút tiền in kê hàng tháng Trong lần duyệt đầu, ta hình thành thiết kế hệ thống trông sau: Trong thiết kế này, chương trình nhận danh sách giao dịch đầu vào lời gọi chương trình thích hợp Nếu giả thiết kê chứa số số dư tài khoản, biểu diễn tài khoản ngân hàng số nguyên lưu tài khoản ngân hàng vào mảng số nguyên Nếu sau đó, làm mịn toán ‘In Sao kê’ để bao gồm nhiệm vụ nhỏ ‘In danh sách giao dịch’, sau bảo trì ghi giao dịch ngân hàng Để làm mịn vậy, thay mảng số nguyên cấu trúc liệu khác mà ghi lại dãy giao dịch mà xảy từ kê cuối Nó đòi hỏi thay đổi hành vi tất chương trình con, tất chúng thực thao tác tài khoản ngân hàng 2.1.2 Tính modularity Chia để trị kỹ thuật Khoa học máy tính Vì hệ thống phần mềm phức tạp, quan trọng chia chương trình thành phần riêng biệt mà xử lý độc lập Phát triển chương trình trên-xuống, triển khai, phương pháp tạo chương trình gồm phần riêng biệt Trong số trường hợp, có ích triển khai dưới-lên, thiết kế phần mà cần hệ thống phần mềm lớn sau kết hợp chúng lại thành hệ thống lớn Từ năm 1970, số phương pháp phát triển chương trình khác đề xuất Một phương pháp phát triển có ích, gọi prototyping, bao gồm phần cài đặt chương trình theo cách đơn giản để hiểu xem thiết kế có làm việc thực tế không Sau thiết kế kiểm chứng theo cách đó, cải tiến phần chương trình cách độc lập cách cài đặt chúng Quá trình thực tiến triển bước chuỗi prototypes tỉ mỉ để phát triển hệ thống đáp ứng yêu cầu Ở có phương pháp thiết kế hướng đối tượng mà bàn đến chương sau oạAn toàn bảo mật thông itn 17 Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại Một cách quan trọng để ngôn ngữ lập trình hỗ trợ phương pháp lập trình modular giúp lập trình viên theo dõi phụ thuộc phần khác hệ thống Để dễ tranh luận, gọi phần có ý nghĩa chương trình phần chương trình tách độc lập với phần khác Hai khái niệm quan trọng phát triển phần mềm modular giao diện đặc tả: • Giao diện: mô tả phần thành phần mà nhìn thấy thành phần khác chương trình • Đặc tả: mô tả hành vi thành phần, quan sát qua giao diện Khi chương trình thiết kế moduraity, thay đổi cấu trúc bên thành phần bất kỳ, hành vi nhìn thấy qua giao diện giữ không thay đổi Ví dụ đơn giản thành phần chương trình hàm Giao diện hàm gồm tên hàm, số kiểu tham số, kiểu kết trả Giao diện hàm gọi function header Đặc tả hàm thường mô tả quan hệ đối số hàm số giá trị trả tương ứng Nếu hàm số làm việc đắn số đối số, hạn chế cần phải phần đặc tả hàm Chẳng hạn, giao diện hàm khai bậc hai sau: Còn đặc tả hàm viết dạng: Trong dấu gần sử dụng theo nghĩa tính toán với số dấu phảy động thực với độ xác Trong số dạng lập trình modular, người thiết kế hệ thống viết đặc tả cho thành phần Khi thành phần cài đặt, cần thiết kế để làm việc đắn tương tác với thành phần thỏa đặc tả chúng Nói cách khác, tính đắn thành phần không phụ thuộc vào chi tiết cài đặt thành phần khác Một lý để cố gắng đạt mức độ độc lập là, cho phép thành phần cài đặt lại cách độc lập Đặc biệt, hệ thống mà thành phần dựa đặc tả phát biểu thành phần khác, thay thành phần khác mà thỏa mãn đặc tả Điều cho phép tối ưu thành phần cách độc lập bổ sung chức mà không vi phạm đặc tả ban đầu 18 An toàn bảo mật thông tin Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại Có nhiều ngôn ngữ lập trình phương pháp khác để viết đặc tả, trải rộng từ tiếng Anh ký hiệu đồ họa mà có cấu trúc ngôn ngữ hình thức, mà thao tác với công cụ đặc tả Vấn đề gắn với đặc tả chương trình phương pháp có tính thuật toán để kiểm tra module có thỏa mãn đặc tả không Điều hệ hạn chế toán học tảng, tương tự tính không giải toán dừng Vì lập trình với đặc tả đòi hỏi nỗ lực to lớn tính kỷ luật Để mô tả việc sử dụng cấu trúc liệu đặc tả, xét thuật toán xếp mà sử dụng cấu trúc liệu tổng quan phục vụ mục đích khác Ví dụ 9.3 Thuật toán xếp modular Hàng đợi ưu tiên nguyên cấu trúc liệu với ba thao tác: Diễn tả lời, cách thể hàng đợi ưu tiên rỗng, thao tác insert mà bổ sung số nguyên vào hàng đợi ưu tiên, thao tác deletemax mà loại bỏ phần tử từ hàng đợi ưu tiên Ba thao tác tạo thành giao diện đến hàng đợi ưu tiên Để làm chi tiết hơn, có đặc tả sau: • Mỗi hàng đợi có multiset phần tử Có thứ tự ≤ phần tử mà sử dụng để đặt hàng đợi ưu tiên (Đối với hàng đợi ưu tiên nguyên, sử dụng thứ tự ≤ thông thường số nguyên) • Hàng đợi ưu tiên rỗng phần tử • Insert (elt, pq) trả hàng đợi ưu tiên có phần tử elt phần tử pq • deletemax(pq) trả phần tử pq mà lớn phần tử khác pq, đồng thời với cấu trúc liệu thể hàng đợi nhận phần tử bị loại bỏ Các đặc tả không buộc hạn chế việc cài đặt hàng đợi ưu tiên khác với tính chất mà quan sát quan giao diện hàng đợi ưu tiên Biết trước sử dụng hàng đợi ưu tiên thuật toán xếp, bắt đầu trình thiết kế xuống việc trình bày toán dạng chương trình: Chương trình 1: oạAn toàn bảo mật thông itn 19 Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại Bước làm mịn câu lệnh sort mảng số nguyên thành toán Một cách để làm điều mà sử dụng hàng đợi ưu tiên truyền phần tử mảng vào hàng đợi ưu tiên sau loại bỏ chúng lần phần tử Thêm vào đó, định điểm hàm có nhận mảng độ dài nguyên đối số độc lập Chương trình 2: • Cuối cùng, chuyển câu lệnh mô tả tiếng Anh sang dạng mã chương trình (Ở đây, chương trình viết ký hiệu tựa Algol hay Pascal) Chương trình 3: Một ưu điểm thuật toán xếp có tách biệt rõ ràng cấu trúc điều khiển thuật toán cấu trúc liệu cho hàng đợi ưu tiên Chúng ta cài đặt hàng đợi ưu tiên không hiệu bắt đầu với việc sử dụng thuật toán dễ lập trình sau tối ưu cài đặt thấy cần thiết 20 An toàn bảo mật thông tin Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại Như viết, trông khó xếp mảng chỗ thuật toán Tuy nhiên, đến gần với ý tưởng thuật toán heapsort 2.2 Ngôn ngữ hỗ trợ trừu tượng Các lập trình viên thiết kế phần mềm thường nói ‘tìm trừu tượng đắn’ cho toán Điều có nghĩa họ tìm khái niệm tổng quan, cấu trúc liệu metaphores xử lý mà làm cho toán chi tiết, phức tạp trông có trật tự có hệ thống Một cách mà ngôn ngữ lập trình giúp lập trình viên tìm trừu tượng đắn cung cấp nhiều cách tổ chức liệu tính toán Một cách khác, mà ngôn ngữ lập trình giúp ích tìm trừu tượng làm cho xây dựng thành phần chương trình mà bao quát mẫu có nghĩa tính toán 2.2.1 Trừu tượng Trong ngôn ngữ lập trình trừu tượng chế mà nhấn mạnh tính chất tổng quan đoạn mã giấu chi tiết Các chế trừu tượng nói chung bao gồm tách chương trình thành phần nhỏ mà chứa chi tiết phần mà chi tiết giấu Các thuật ngữ chung liên kết với trừu tượng • Client: phần chương trình mà sử dụng thành phần chương trình • Cài đặt: phần chương trình mà xác định thành phần chương trình Sự tương tác client trừu tượng cài đặt trừu tượng thường hạn chế đến giao diện chuyên biệt Trừu tượng thủ tục Một chế trừu tượng lâu đời ngôn ngữ lập trình thủ tục hàm Client hàm chương trình có lời gọi hàm Cài đặt hàm thân hàm, mà gồm lệnh mà thực thi hàm gọi Chẳng hạn, ta có vài dòng code mà lưu bậc hai biến x biến y, ta cần phải đóng gói đoạn code thành hàm Nó kèm theo số thứ: Hàm có giao diện định nghĩa rõ ràng tường minh đoạn code Giao diện gồm tên hàm, mà sử dụng để gọi hàm, tham số đầu vào (và kiểu chúng, ngôn ngữ lập trình có kiểu) kiểu đầu Nếu đoạn code để tính toán giá trị hàm sử dụng biến khác, chúng cần phải biến cục hàm Nếu biến khai báo bên thân hàm, chúng không nhìn thấy phần khác chương trình mà sử dụng hàm Nói cách khác, không phép gán việc sử dụng khác biến cục có ảnh hưởng phụ đến phần khác chương trình Điều oạAn toàn bảo mật thông itn 21 Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại cung cấp dạng thông tin ẩn, thông tin cách hàm tính kết chứa khai báo hàm, giấu với chương trình mà sử dụng hàm Hàm gọi nhiều đối số khác Nếu đoạn code tính toán viết dòng, tính toán thực biến đặc biệt Bằng cách đóng đoạn code khai báo hàm, nhận thực thể trừu tượng, mà có ý nghĩa tách rời khỏi việc sử dụng biến đặc biệt Nói cách khác, code đóng hàm làm cho code tổng quát tái sử dụng Đây mô tả lý tưởng ưu điểm code đóng gói bên hàm Trong hầu hết ngôn ngữ lập trình, hàm đọc gán cho biến tổng thể Các biến tổng thể không liệt kê giao diện hàm Do đó, hành vi hàm luôn xác định giao diện Chính lý này, số nhà thiết kế chương trình đề xuất phản đối việc sử dụng biến tổng thể hàm Trừu tượng liệu Trừu tượng liệu hướng tới việc giấu thông tin cách liệu thể Cơ chế ngôn ngữ chung trừu tượng liệu khai báo kiểu liệu trừu tượng (bàn đến 5.2.2) modules (bàn đến 5.3) Chúng ta thấy mục 9.1.2 thuật toán xếp sử dụng cấu trúc liệu gọi hàng đợi ưu tien Nếu chương trình sử dụng hàng đợi ưu tiên, người viết chương trình cần biết có thao tác hàng đợi giao diện chúng Do đó, tập thao tác giao diện chúng gọi giao diện trừu tượng liệu Về nguyên tắc, chương trình sử dụng hàng đợi ưu tiên không phụ thuộc vào hàng đợi ưu tiên biểu diễn tìm kiến nhị phân hay mảng xếp Các chi tiết cài đặt giấu tốt chế đóng gói liệu Như trừu tượng thủ tục, có ba mục đích trừu tượng liệu: Xác định giao diện cấu trúc liệu Giao diện trừu tượng liệu gồm thao tác cấu trúc liệu, đối số kết trả Cung cấp thông tin giấu việc tách định cài đặt khỏi phần chương trình sử dụng cấu trúc Cho phép cấu trúc liệu sử dụng theo nhiều cách khác nhiều chương trình khác Mục tiêu hỗ trợ tốt trừu tượng mẫu chung bàn đến 5.4 2.2.2 Các kiểu liệu trừu tượng Mối quan tâm trừu tượng liệu đến từ trước năm 1970 Nó dẫn đến việc phát triển cấu trúc ngôn ngữ lập trình gọi khai báo kiểu liệu trừu tượng Đây định nghĩa ngắn gọn chung kiểu liệu trừu tượng: Kiểu liệu trừu tượng bao gồm kiểu với tập thao tác chuyên biệt 22 An toàn bảo mật thông tin Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại Đây code cho cấu trúc Point, Circle Rect: 36 An toàn bảo mật thông tin Trần Văn Dũng BM Khoa học máy tính 2.4 Bài 4: Mã khối đại Trừu tượng tổng quát Kiểu liệu trừu tượng ngăn xếp hang đợi có ích để lưu trữ nhiều kiểu liệu Tuy nhiên, ngôn ngữ lập trình có kiểu, code cho ngăn xếp số nguyên khác với code cho ngăn xếp xâu Hai phiên khác ngăn xếp viết với hai khai báo kiểu khác dịch sang code mà chiếm kích cỡ không gian khác cho biến cục Tuy nhiên, tốn thời gian để viết phiên khác cho ngăn xếp có kiểu phần tử khác vô nghĩa mã cho hai trường hợp giống Vì vậy, hầu hết ngôn ngữ kiểu mà nhấn mạnh tính trừu tượng đóng gói có dạng tham số kiểu 2.4.1 C++ Function Templates Đối với nhiều bạn đọc, chế tham số kiểu quen thuộc chế template C+ + Tuy số lập trình viên C++ gắn kết templates với lớp lập trình hướng đối oạAn toàn bảo mật thông itn 37 Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại tượng, templates hàm có ích cho chương trình mà không khai báo lớp Chúng ta xem xét templates hàm trước tìm hiểu chế tham số hóa module ngôn ngữ khác Hàm đa hình đơn giản Giả sử bạn viết hàm đơn giản đảo giá trị hai biến nguyên: Mặc dù đoạn code dùng để đảo giá trị hai biến nguyên, không viết cách tổng quát Nếu bạn muốn đảo giá trị hai biến kiểu bất kỳ, bạn cần định nghĩa template hàm mà sử dụng biến kiểu T thay cho tên kiểu int: Ý tưởng nghĩ tên kiểu T tham số hàm từ kiểu truyền cho hàm Khi áp dụng khởi tạo cho kiểu cụ thể đó, kết phiên swap mà có kiểu int thay kiểu khác Nói cách khác, swap hàm tổng quát mà làm việc hoàn toàn cho nhiều kiểu đối số Template cho phép ta coi swap hàm với đối số kiểu Trong C++, templates hàm khởi tạo tự động cần thiết, sử dụng kiểu đối số hàm để xác định khởi tạo cần thiết Nó mô tả dòng code sau: Bạn nhận thấy từ khóa C++ gắn kết với biến kiểu lớp C++, số kiểu lớp số int, float, lớp Như mô tả đây, từ khóa lớp bỏ qua, template sử dụng với kiểu lớp int float Templates C++ khởi tạo link chương trình Cụ thể hơn, giả sử template hàm swap lưu file dịch, chương trình gọi swap lưu file khác dịch riêng rẽ Các tệp gọi đối tượng tái định vị tạo 38 An toàn bảo mật thông tin Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại chương trình gọi dịch bao gồm thông tin code dịch gọi hàm swap kiểu Chương trình linker thiết kế để kết nối hai phần chương trình việc gắn kết lời gọi hàm swap chương trình gọi đến định nghĩa swap phần dịch riêng Nó việc khởi tạo code dịch cho swap dạng mà tạo code phù hợp với lời gọi đến swap Nếu chương trình gọi swap với số kiểu khác nhau, số khởi tạo khác tạo Mỗi khác cần cho kiểu lời gọi swap khai báo biến cục tmp kiểu T Không gian cho tmp cần cấp ghi kích hoạt swap Do code dịch swap cần chỉnh sửa cho phù hợp với kích thước biến kiểu T Chẳng hạn, T cấu trúc đối tượng, kích thước tương đối lớn Mặt khác, t int, kích thước nhỏ Trong trường hợp, code dịch cần biết kích thước liệu để việc tham chiếu đến ghi kích hoạt thực Các thao tác tham số kiểu Ví dụ swap đơn giản đa số hàm theo nhiều khía cạnh Quan trọng than swap không đòi hỏi thao tác tham số kiểu T, ngoại trừ khai báo biến phép gán Ví dụ thể rõ template hàm hàm sort tổng quát sau: Nếu A mảng kiểu T, sort(n, A) hoạt động phép toán < định nghĩa kiểu T Tính chất sort không khai báo đâu mã C++ Tuy nhiên, template hàm khởi tạo thời gian link, kiểu thực tế T cần phải có phép toán < định nghĩa lỗi thời gian link thông báo mã đối tượng thực thi tạo Quá trình link C++ tương đối phức tạp Chúng ta không nghiên cứu chi tiết việc Tuy nhiên, cần lưu ý < phép toán overloaded, phiên < cần xác định code dịch cho sort link với chương trình gọi Như nguyên lý lập trình tổng quan, thuận tiện lỗi chương trình báo cáo thời gian dịch thời gian link Một lý modules chương trình riêng biệt dịch độc lập, link toàn hệ thống thiết lập Do đó, dịch trình “cục bộ” mà cần tiến hành người thiết kế người lập trình thành phần riêng rẽ Ngược lại, lỗi thời gian link thể tính chất hệ thống tổng thể mà chưa biết trước toàn hệ oạAn toàn bảo mật thông itn 39 Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại thống thiết lập Vì lý này, lỗi thời gian link C++ gắn kết với thao tác templates cần xem xét nguồn gốc thất bại Báo cáo lỗi cho templates C++ đạt kết tốt hơn, cú pháp template bao gồm mô tả phép toán cần thiết tham số kiểu Tuy nhiên, điều tương đối phức tạp C++, tính ghi đè tính chất khác ngôn ngữ Ngược lại, ML có tính ghi đè đơn giản chứa nhiều thông tin cấu trúc tham số, mô tả mục sau So sánh với đa hình ML Sau code ML cho hàm đa hình sort Thuật toán sử dụng đoạn code insertion sort, mà sử dụng hàm insert phụ trợ xuất từ đầu: Trong hàm sort đa hình, thao tác less-than truyền đối số hàm sort Không khởi tạo cần thiết, danh sách biểu diễn theo cách Biểu diễn liệu thống có ưu nhược điểm Vì không cần lặp lại code cho kiểu đối số khác nhau, biểu diễn liệu đồng kéo theo kích cỡ code nhỏ tránh phức tạp gắn kết với kiểu link C++ Mặt khác, code kết hiệu hơn, biểu diễn liệu đồng thường bao hàm việc sử dụng trỏ thay lưu trữ cấu trúc liệu trực tiếp 2.4.2 Functor ML chuẩn Trong hệ thống module ML, cấu trúc tham số hóa theo nhiều cách linh hoạt Chúng ta xem phần hệ thống kiểu ML ví dụ tốt cách mà modules cần tham số hóa cách có ích ngôn ngữ lập trình Tham số hóa Module khác với đa hình ML chất độc lập với Cụ thể hơn, thiết kế module ML thích nghi với ngôn ngữ mà đa hình suy luận kiểu Trong ML chuẩn, cấu trúc tham số hóa gọi funtor Các funtor viết dạng giống hàm số với danh sách tham số chứa tên đặc trưng (signatures) cấu trúc Sau ví dụ mà sử dụng signature SIG định nghĩa mục trước đảo giá trị Một ngôn ngữ có hàm bậc hàm 40 An toàn bảo mật thông tin Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại Đoạn code khai báo functor F mà nhận cấu trúc sánh với signature SIG đối số tạo cấu trúc sánh với cấu trúc Khi áp dụng cho cấu trúc phù hợp S, functor F tạo kết cấu trúc, mà thành phần kiểu t gắn với tích S.t với thành phần giá trị x nó, cặp thành phần tính toán cho giá trị S.x Khi biến cấu trúc tự signature sử dụng, dạng phụ thuộc vào kết functor đối số functor thể rõ ràng Chẳng hạn, khai báo sau nêu rõ kiểu y signature kết G thuật ngữ thành phần kiểu t đối số S: Phần lại mục gồm ví dụ tham số hóa module ML sử dụng để giải số vấn đề lập trình Ví dụ 5.10 thảo luận dạng cấu trúc container ví dụ 5.11 hoàn thiện ví dụ geometry 5.9 Ví dụ 5.10 Module Hàng đợi Ưu tiên tham số hóa Cấu trúc container tập hợp, hang đợi, từ điển,… sử dụng nhiều chương trình Ví dụ cách định nghĩa cấu trúc container hàng đợi, nhiều thao tác container đòi hỏi thao tác kiểu đối tượng lưu container Vì hàng đợi ưu tiên yêu cầu đảm bảo thứ tự phần tử oạAn toàn bảo mật thông itn 41 Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại lưu trữ hàng đợi, định nghĩa hàng đợi tham số hóa cấu trúc gồm kiểu quan hệ thứ tự Chúng ta bắt đầu định nghĩa signature kiểu với quan hệ thứ tự: Bất cấu trúc mà sánh với signature Ordered cần phải có kiểu t quan hệ hai lessep Chúng ta giả thiết định nghĩa hàng đợi ưu tiên quan hệ thứ tự tổng thể kiểu t Trong định nghĩa functor này, khai báo thao tác hàng đợi ưu tiên cài đặt kiểu tập thao tác hàng đợi ưu tiên Vì thao tác insert deletemax cần kiểm tra phần tử có nhỏ phần tử khác không, tối thiểu thao tác sử dụng thao tác elem.lesseq cung cấp cấu trúc tham số elem: Ví dụ 5.11 Hoàn thiện ví dụ Geometry Ví dụ làm cấu trúc Point, Circle Rect Ví dụ 5.9 kết hợp để tạo nên cấu trúc Hình học với thao tác ba kiểu đối tượng hình học Để làm thao tác khác bổ sung module kết hợp, signature Geom chứa tất kiểu thao tác hình học, thêm vào hàm bounding box bbox với mục đích ánh xạ đường tròn vào hình chữ nhật nhỏ chứa 42 An toàn bảo mật thông tin Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại Cấu trúc hình học xây dựng với functor mà nhận cấu trúc Circle Rect đối số Signatures Circle Rect hai đặt tên cho kiểu Point Hai kiểu point cần phải cài đặt theo cách Nếu không, thao tác mà bao gồm circles rectangles không làm việc Ràng buộc hai cấu trúc (Circle Rect) cần phải chia sẻ cấu trúc chung (point) khẳng định cách tường minh ràng buộc chung danh sách tham số functor oạAn toàn bảo mật thông itn 43 Trần Văn Dũng BM Khoa học máy tính 2.4.3 44 Bài 4: Mã khối đại Thư viện Template chuẩn C++ (C++ Standard Template Library) An toàn bảo mật thông tin Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại STL C++ thư viện chương trình lớn phát triển Alex Stepanov cộng cấp nhận phần chuẩn C++ STL cung cấp họ lớp containers, lists, vectors, sets maps, thuật toán thành phần khác liên quan Vì STL ví dụ tốt thư viện thực tế, lớn với cấu trúc tổng quát, tóm tắt vài khái niệm Mục đích phần dạy đủ dùng để sử dụng STL, mà giải thích khái niệm để bạn đánh giá số ý tưởng thiết kế sức mạnh hệ thống Một đặc trưng ấn tượng STL tính hiệu thời gian chạy mã tạo STL không làm cho dễ dàng viết chương trình việc cung cấp cấu trúc hữu dụng, mà STL làm cho viết code dựa thư viện mà chạy nhanh nhanh so với code mà bạn viết, bạn bỏ nhiều công sức không sử dụng STL Một lý để STL hiệu templates C++ triển khai thời gian dịch/link, với code riêng biệt sinh (và tối ưu) cho khởi tạo Lý khác việc sử dụng tải chồng, mà hóa giải thời gian dịch, cho phép compiler tối ưu code mà chọn xác cho kiểu liệu sử dụng chương trình Mặt khác, việc lặp code kết việc triển khai template, mã dịch chương trình sử dụng STL lớn Trong mục này, thuật ngữ object sử dụng muốn nói giá trị lưu nhớ Điều phù hợp với việc sử dụng thuật ngữ tài liệu C, C++ STL STL dựa templates C++, thuật toán tải chồng kiểu mà tìm tham số kiểu cho templates STL không sử dụng hàm ảo theo người phát triển nó, không ví dụ lập trình hướng đối tượng Có sáu loại thực thể STL: • oạAn toàn bảo mật thông itn Containers, họ đối tượng kiểu 45 Trần Văn Dũng BM Khoa học máy tính • • • • • Bài 4: Mã khối đại Iterators, mà cho truy cập đến đối tượng container Về trực quan, iterator khái quát trỏ cho địa đến vị trí container Thuật toán Adapters, mà cho chuyển đổi dạng thực thể dạng khác Ví dụ iterator ngược, mà duyệt ngược hướng iterartor Đối tượng hàm (Function objects) mà dạng closure (mã hàm môi trường gắn kết) Chúng sử dụng nhiều dạng cho phép đối số hàm cho template dạng in-line Cụ thể hơn, đối tượng hàm truyền hai đối số riêng biệt, đối số template mang code đối số run-time mang trạng thái hàm Hệ thống kiểu sử dụng để tin tưởng code trạng thái phù hợp với Allocators, mà đóng gói vùng nhớ Các allocators khác cung cấp nhớ có khả dọn rác, nhớ tham chiếu đếm, nhớ bền,… Ví dụ sau cho bạn cảm giác STL làm việc nào: Ví dụ 5.12 Danh sách STL Danh sách kiểu container đơn giản định nghĩa STL Đây code mẫu khai báo danh sách xâu gọi wordlist: Đoạn code list khởi tạo template class list sau tạo đối tượng kiểu STL cho bạn thao tác đặt phần tử vào trước sau danh sách Đây ví dụ bổ sung từ vào word list chúng ta: Chúng ta có danh sách list với bốn xâu Như tên rõ, hàm thành viên danh sách push_back() đặt đối tượng vào cuối danh sách hàm push_front() đặt phần tử vào đầu danh sách Chúng ta cần phải in từ danh sách việc sử dụng duyệt iterator Đây khai báo iterator cho danh sách xâu: 46 An toàn bảo mật thông tin Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại Như nêu phần đầu, iterator STL giống trỏ - iterator trỏ tới phần tử container, tham chiếu đến iterator khác null tạo đối tượng container Iterator STL khai báo có kiểu chuyên biệt; Điều quan trọng việc di chuyển trỏ duyệt qua container làm việc khác kiểu container khác Đây ví dụ mẫu in từ wordlist: Chúng ta xác định biên this cho vòng lặp việc gọi wordlist.begin(), mà trả iterator trỏ đến đầu container, wordlist.end(), mà trả iterator trỏ đến vị trí container Biến vòng lặp tăng phép toán ++, mà định nghĩa iterator dịch chuyển iterator từ phần tử danh sách đến phần tử Trong thân vòng lặp, tham chiếu iterator để nhận phần tử danh sách vị trí Như ví dụ 5.12 ra, iterator cần thiết lập trình với containers STL Hầu hết thuật toán STL sử dụng iterator kiểu đó, có số kiểu iterator khác Dạng đơn giản nhất, gọi iterator hiển nhiên, dùng tham chiếu đến đối tượng đó, thao tác tăng so sánh không đảm bảo hỗ trợ, iterator đầu vào dùng để tham chiếu đến đối tượng tăng để nhận iterator container Iterator đầu dạng hạn chế iterator mà sử dụng để xếp (nhưng không thiết tăng dần) dãy giá trị Một số dạng khác iterator forward iterator, bidirectional iterator random-access iterator Các thuật toán STL chuyên biệt đòi hỏi kiểu iterator chuyên biệt, phụ thuộc vào việc thuật toán đọc từ container lưu giá trị vào containaer việc truy cập (giống đọc viết lên băng) hay truy cập ngẫu nhiên oạAn toàn bảo mật thông itn 47 Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại Khái niệm khác STL phạm vi (range) Phạm vi phần container định nghĩa hai iterator Các phần tử phạm vi đối tượng đạt cách tăng iterator thứ đạt giá trị iterator thứ hai Nếu bạn nghĩ mảng ví dụ container, phạm vi cặp số nguyên, mà số thứ nhỏ số thứ hai hai nhỏ độ dài mảng, biểu diễn vị trí mảng nằm số thứ số thứ hai Ví dụ sau bàn hàm trộn merge STL, mà sử dụng phạm vi ranges đầu vào đầu Nói chung, thao tác trộn kết hợp hai cấu trúc xếp tạo thứ ba Chẳng hạn, merge sort pha trộn kết hợp hai danh sách xếp thành danh sách xếp dài mà chứa phần tử hai danh sách đầu vào Ví dụ 5.13 Hàm Merge tổng quát Hàm merge tổng quát STL nhận hai phạm vi đầu vào trả phạm vi khác Về khái niệm, kiểu merge range(s) có nghĩa phạm vi container mà chứa đối tượng kiểu s Vì C++ có kiểu con, kiểu s, t u không cần giống Tuy nhiên, kiểu s t cần kiểu u, có nghĩa đối tượng kiểu s t cần phải xem chuyển sang đối tượng kiểu u Ký hiệu không hình thức comparison(u) có nghĩa hàm merge đòi hỏi phép so sánh comparison (nhỏ bằng) kiểu u, cho merge kết hợp hai cấu trúc theo thứ tự Trên thực tế, phạm vi đầu vào STL truyền hai iterator phạm vi đầu truyền iterator Lý cần hai iterator cho phạm vi đầu vào cần phải biết có phần tử phạm vi Vì đầu merge xác định đầu vào, nên phạm vi đầu biểu diễn iterator đầu nhất, đánh đấu vị trí bắt đầu viết container trộn Do merge có tham số sau: Nói lời, hai đối số đầu cung cấp phạm đầu vào thứ nhất, hai đối số sau cho ta phạm vi đầu vào thứ hai, đối số thứ năm cho phạm vi đầu đối số thứ sáu cung cấp hàm so sánh comparison 48 An toàn bảo mật thông tin Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại Merge hàm đa hình, trộn hai phạm vi mà chứa kiểu đối tượng, cho kiểu tương thích với Tính đa hình merge cài đặt template với tham số Template yêu cầu hai kiểu iterator, cho hai cấu trúc trộn, với kiểu cấu trúc đầu kiểu so sánh Nó cho ta tiêu đề đầy dduer merge sau: Có thể gọi merge mà không cung cấp đối tượng hàm so sánh Trong trường hợp này, phép toán < sử dụng mặc định Sau chương trình ngắn mà sử dụng merge, lấy từ Standard Template Library Programmer’s Guide: Như bạn thấy từ đoạn code ví dụ này, khái niệm thiết kế STL tinh tế phức tạp, việc sử dụng STL cần phải dễ trực tiếp hiểu rõ khái niệm 2.5 Tóm tắt chương oạAn toàn bảo mật thông itn 49 Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại Trong chương này, tìm hiểu số cách chương trình chia thành phần có ý nghĩa cách mà ngôn ngữ lập trình hỗ trợ cách chia Chủ đề lập trình có cấu trúc, hỗ trợ cho trừu tượng modules Hai ví dụ sử dụng để nghiên cứu hệ thống modules lập trình tổng quan: hệ thống kiểu ML chuẩn Thư viện template chuẩn STL C++ Lập trình cấu trúc Về mặt lịch sử, mối quan tâm đến tổ chức chương trình phát triển với phong trào lập trình cấu trúc 50 An toàn bảo mật thông tin [...]... cạnh của các kiểu dữ liệu trừu tượng bằng việc hiểu ý tưởng lịch sử tại thời điểm phát triển của chúng Vào đầu những năm 1970, khi đó có phong trào nghiên cứu các ngôn ngữ có thể mở rộng được Mục đích của phong trào này này là tạo ra ngôn ngữ lập trình ở đó lập trình viên có thể định nghĩa các cấu trúc với độ linh hoạt như những người thiết kế ngôn ngữ Ví dụ, một người nào đó trong nhóm các lập trình. .. Trong hệ thống module ML, các cấu trúc có thể được tham số hóa theo nhiều cách rất linh hoạt Chúng ta xem phần này của hệ thống kiểu ML như ví dụ tốt về các cách mà các modules cần được tham số hóa một cách có ích trong các ngôn ngữ lập trình Tham số hóa Module khác với đa hình ML và về bản chất độc lập với nó Cụ thể hơn, thiết kế module ML có thể thích nghi với các ngôn ngữ mà không có đa hình hoặc... Tổng quát hơn, một tập hợp các kiểu, các hàm, các ngoại lệ và một số thực thể do người sử dụng định nghĩa có thể liên quan nhau và có các cài đặt phụ thuộc vào nhau oạAn toàn và bảo mật thông itn 31 Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối hiện đại Module là cấu trúc ngôn ngữ lập trình mà cho phép một số các khai báo nhóm với nhau Dạng ban đầu của Module như trong ngôn ngữ Modula, cung cấp việc... này, nếu qui tắc kiển tra kiểu không đảm bảo rằng chỉ có các thao tác tập hợp có thể áp dụng cho tập hợp Trên thực tế, tuy nhiên, ý tưởng thể hiện ở đây có thể có ích cho việc lập trình trong các ngôn ngữ lập trình như C mà không ép buộc trừu tượng dữ liệu, như các chương trình thực tế được xây dựng không thao tác trên các cấu trúc dữ liệu trừ các thao tác được thiết kế cho mục đích này “Chứng minh”... isMember’(n, s’) Một khía cạnh thú vị của cách lập luận này là chúng ta đã chứng minh một điều gì đó về mọi chương trình có thể mà sử dụng một kiểu dữ liệu bằng cách chỉ sử dụng qui nạp thông thường trên các constructors Nguyên nhân để điều này có thể là giả thiết rằng trong ngôn ngữ với các kiểu dữ liệu trừu tượng, chỉ có thao tác của một kiểu dữ liệu có thể được áp dụng cho các giá trị của kiểu dữ liệu đó... cho phép lập trình viên kiểm soát tính nhìn thấy của một số cái khai báo trong module Thêm vào đó,module tham số hóa, như mô tả trong mục sau, là cho nó có thể khái quát tập hợp các khai báo và khởi tạo chúng theo các cách khác nhau với các mục đích khác nhau 2.3.1 ML Modules Hệ thống module ML chuẩn được thiết kế vào giữa 1980 như một phần thiết kế lại và nỗ lực chuẩn hóa cho ngôn ngữ lập trình ML... hầu hết các ngôn ngữ kiểu mà nhấn mạnh tính trừu tượng và đóng gói có dạng nào đó của tham số kiểu 2.4.1 C++ Function Templates Đối với nhiều bạn đọc, cơ chế tham số kiểu quen thuộc nhất là cơ chế template của C+ + Tuy một số lập trình viên C++ gắn kết templates với các lớp và lập trình hướng đối oạAn toàn và bảo mật thông itn 37 Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối hiện đại tượng, các templates... Văn Dũng BM Khoa học máy tính Bài 4: Mã khối hiện đại Ngôn ngữ tốt cho việc lập trình với kiểu dữ liệu trừu tượng không những cho phép lập trình viên nhóm kiểu và các thao tác, mà còn sử dụng kiểm tra kiểu để hạn chế truy cập đến biểu diễn của cấu trúc dữ liệu Nói cách khác, không chỉ kiểu dữ liệu trừu tượng giao diện đặc thù mà có thể được sử dụng như một phần của chương trình, nhưng truy cập được hạn... dùng để biểu diễn các phần tử của kiểu trừu tượng Sự khác nhau giữa abstype và kiểu dữ liệu nằm ở phần sau của cú pháp trước đó Giá trị và các khai báo hàm xảy ra giữa các từ khóa with và end chỉ là các thao tác mà có thể được viết với hàm tạo Các phần khác của chương trình có thể tham chiếu đến tên kiểu t và các giá trị được khai báo giữa with và end Tuy nhiên, các phần khác của chương trình mà nằm ngoài... nhiều kiểu dữ liệu Tuy nhiên, trong các ngôn ngữ lập trình có kiểu, code cho ngăn xếp số nguyên khác với code cho ngăn xếp xâu Hai phiên bản khác nhau của ngăn xếp được viết với hai khai báo kiểu khác nhau và có thể được dịch sang code mà chiếm kích cỡ không gian khác nhau cho các biến cục bộ Tuy nhiên, sẽ tốn thời gian để viết các phiên bản khác nhau cho ngăn xếp có các kiểu phần tử khác nhau và là vô

Ngày đăng: 03/04/2016, 20:35

Từ khóa liên quan

Mục lục

  • Các lập trình viên máy tính phải mất thời gian khá lâu mới công nhận giá trị của việc xây dựng của các hệ thống phần mềm mà bao gồm một số các modules. Trong thiết kế hiệu quả, mỗi module cần được thiết kế và kiểm chứng độc lập. Hai mục tiêu quan trọng trong tính module là cho phép một module được viết với rất ít kiến thức về code trong một module khác và cho phép một module được thiết kế và cài đặt lại mà không sửa các phần khác của hệ thống. Các ngôn ngữ lập trình và môi trường phát triển phần mềm hiện đại hỗ trợ tính module theo nhiều cách khác nhau.

  • Trong chương này, chúng ta xét một số cách mà chương trình được chia ra các phần có ý nghĩa và cách mà các ngôn ngữ lập trình có thể được thiết kế để hỗ trợ việc chia đó. Trong chương này chúng ta chỉ xét đến các cơ chế module mà không nói đến các đối tượng. Chủ đề chính là lập trình cấu trúc hỗ trợ trừu tượng hóa và modules. Hai ví dụ được sử dụng để mô tả hệ thống module và lập trình khái quát là hệ thống module ML chuẩn và thư viện mẫu chuẩn C++ (Standard Template Library – STL).

  • 2.1. Lập trình cấu trúc

  • Sự quan tâm về công cụ toán học được minh chứng trong EWDs, mỗi cái phát triển một giải pháp đẹp đẽ cho một bài toán hấp dẫn trong một vài trang.

  • Như nhiều trường phái Châu âu cổ, và không giống như nhiều người Mỹ, Dijkstra coi trọng việc viết tay. Một phần như vui đùa và một phần như để tỏ lòng kính trọng Dijkstra, nhà nghiên cứu ngôn ngữ lập trình Luca Cardelli đã sao chép cẩn thận các bản viết tay từ tập EWDs và tạo thành font EWD. Nếu bạn có thể tìm thấy font này trên web, bạn có thể viết các ghi chú ngắn theo cách viết tay nổi tiếng của Dijkstra.

  • Ví dụ 9.1

  • Dijkstra xét bài toán tính và in 1000 số nguyên tố đầu tiên. Phiên bản đầu tiên của chương trình có chứa một chút cú pháp cho ta suy nghĩ về việc viết chương trình. Ngược lại, nó trông giống như mô tả tiếng Anh về bài toán mà chúng ta muốn giải.

  • Chương trình 1:

  • Bài toán này bây giờ được làm mịn thành các bài toán nhỏ. Để chia bài toán này thành hai, một cấu trúc dữ liệu nào đó cần phải được chọn để truyền kết quả của bài toán thứ nhất cho bài toán thứ hai. Trong ví dụ Dijkstra, cấu trúc dữ liệu này là bảng, mà sẽ diền 1000 số nguyên tố đầu tiên.

  • Chương trình 2 :

  • Trong phần làm mịn tiếp theo, mỗi bài toán sẽ được xét tiếp. Một ý tưởng quan trọng trong lập trình cấu trúc là mỗi bài toán được xét độc lập. Trong ví dụ trên, bài toán điền vào bảng các số nguyên tố là độc lập với bài toán in bảng. Do đó mỗi bài toán có thể giao cho lập trình viên khác nhau, cho phép các bài toán được giải vào cùng một thời điểm bởi những người khác nhau. Ngay cả nếu chương trình được viết bởi một người duy nhất, ở đây có lợi ích quan trọng là tách bài toán phức tạp thành các bài toán nhỏ độc lập. Đặc biệt lắm, một người có thể nghĩ về nhiều chi tiết cùng một lúc. Chia bài toán thành các bài toán con làm cho có thể chỉ nghĩ về một bài toán tại mỗi thời điểm, giảm số chi tiết mà cần phải xét tại mỗi thời điểm.

  • Chương trình 3.

  • Tại điểm này, cấu trúc chương trình cơ bản đã được xác định và lập trình có thể tập trung về thuật toán tính số nguyên tố tiếp theo. Mặc dù ví dụ này rất đơn giản, nó cho một ý tưởng cơ bản nào đó về lập trình bằng việc làm mịn từng bước. Làm mịn từng bước nói chung đưa về chương trình với cấu trúc giống khái niệm cây.

  • Một khía cạnh khó của việc phát triển chương trình trên-xuống là làm cho bài toán trở nên đơn giản hơn trên mỗi bước làm mịn. Nếu không, có thể làm mịn bài toán và tạo ra một danh sách các bài toán lập trình mà mỗi một trong chúng khó hơn bài toán gốc. Điều đó có nghĩa là người thiết kế mà sử dụng việc làm mịn từng bước cần phải có ý tưởng tốt trước các bài toán sẽ được thực hiện như thế nào.

    • 2.1.1. Làm mịn dữ liệu

    • 2.1.2. Tính modularity

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

Tài liệu liên quan