3
MỤC LỤC
LỜI CAM ĐOAN 1
LỜI CẢM ƠN 2
MỤC LỤC 3
DANH MỤC CÁC KÝ HIỆU , THUẬT NGỮ, CHỮ VIẾT TẮT 5
DANH MỤC CÁC BẢNG 7
DANH MỤC CÁC HÌNH VẼ 7
PHẦ N MỞ ĐẦ U 8
Tính cấp thiết của đề tài 8
Mục tiêu của luận văn 9
Công cụ phần mềm 9
Phƣơng pháp nghiên cƣ́ u 9
Bố cục của luận văn 9
CHƢƠNG 1. MỘT SỐ KIẾN THỨC CƠ SỞ 10
1.1. Các lý thuyết nền tảng về hệ thống kiểu 10
1.1.1. Khái niệm hệ thống kiểu 10
1.1.2. Vai trò củ a hệ thố ng kiể u 11
1.1.3. Các thuộc tính cơ bản của hệ thống kiểu 13
1.1.4. Các ứng dụng và ý ngha kinh tế của hệ thống kiểu 14
1.1.5. Hệ thố ng kiể u trong việc chính thức hóa ngôn ngữ kiểu 16
1.2. Bộ nhớ giao tác phần mềm 18
1.2.1. Khái niệm và các thuộc tính cơ bản của giao tác 18
1.2.2. Bộ nhớ giao tác phần mềm 19
CHƢƠNG 2. FEATHERWEIGHT JAVA CÓ GIAO TÁC 23
2.1. Cú pháp 23
2.2. Các ngữ ngha 24
2.2.1. Ngữ ngha cục bộ 24
2.2.2. Ngữ ngha toàn cục 26
CHƢƠNG 3. HỆ THỐ NG KIỂ U CHO TFJ 30
3.1. Các kiểu 30
3.2. Các qui tắc kiểu 38
3.2.1. Qui tắc cụ c bộ 38
3.2.2. Qui tắc toà n cụ c 41
CHƢƠNG 4. THUẬT TOÁN KIỂU VÀ CÔNG CỤ 44
4.1. Xây dựng bộ cú pháp cho TFJ với ANTLR 44
4.1.1. Cơ sở lý thuyết về cú pháp đƣợc hỗ trợ bởi ANTLR 44
4.1.2. Bộ đặc tả cú pháp cho TFJ với ANTLR V3 45
4
4.2. Xây dựng thuật toán tính kiểu 48
4.2.1. Rút gọn một chuỗi số có dấu bất kỳ về chuỗi số chính tắc 48
4.2.2. Mô tả phép toán cộng của 2 chuỗi số có dấu chính tắc 49
4.2.3. Mô tả phép toán gộp của 2 chuỗi số có dấu chính tắc 50
4.2.4. Mô tả phép toán điều kiện , phép toán chọn , của 2 chuỗi số có dấu chính tắc 50
4.2.5. Tính toán giá trị mức giới hạn trên tổng chi phí tài nguyên cho một chƣơng trình TFJ 51
CHƢƠNG 5. THỰC NGHIỆM 58
KẾ T LUẬ N 63
TÀI LIỆU THAM KHẢO 64
PHỤ LỤC 65
PHỤ LỤC 1. CÁC CÔNG CỤ HỖ TRỢ CÀI ĐẶT THỰC NGHIỆM 65
PHỤ LỤC 2. BẢNG MÔ TẢ CHI TIẾT ĐẶC TẢ CÚ PHÁP TFJ TRÊN ANTLR V3 69
PHỤ LỤC 3. BẢNG MÔ TẢ CÁC PHƢƠNG THỨC TRONG CHƢƠNG TRÌNH 85
5
DANH MỤC CÁC KÝ HIỆU , THUẬT NGỮ, CHỮ VIẾT TẮT
STT
CHỮ VIẾT TẮT, THUẬT
NGỮ, KÝ HIỆU
GIẢI NGHĨA
CHỮ VIẾT TẮT
1
FJ –Featherweigh Java
Một ngôn ngữ Java tối giản để nghiên cứu các
tính chất của Java.
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 – Transactional
Featherweight Java
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
Excution errors
Lỗi thực thi
5
Syntactic mechanism
Cơ chế cú pháp
6
Type checker
Bộ kiểm tra kiểu
7
Well-behaved
Tính chất hành xử đúng của chƣơng trình.
8
Well-formed
Tính chất thiế t lậ p đú ng của chƣơng trình.
9
Ill-behaved
Tính chất hành xử yếu của chƣơng trình.
10
Execution error
Lỗi thực thi
11
Well-typed
Mộ t chƣơng trình khi đƣợc thông qua bởi bộ
kiể m tra kiể u đƣợ c gọ i là kiể u tố t.
12
Ill-typed
Mộ t chƣơng trì nh không đƣợ c thông qua bở i bộ
kiể m tra kiể u đƣợ c gọ i là kiể u yếu.
13
ADT-Abstract Data Type
Kiểu dữ liệu trừu tƣợng
14
Efficiency
Hiệu suất chƣơng trình
15
Compositionality
Tính thành phần
16
Guarantee
Tính đảm bảo
17
Static phase
Pha tnh, đặ c tả bở i tậ p cá c qui tắ c đánh giá kiể u
mộ t biể u thƣ́ c nói riêng và một chƣơng trình nói
chung có là well-formed.
18
Dynamic phase
Pha độ ng, là một mô tả chƣơng trình đƣợc thực
hiệ n nhƣ thế nà o.
6
19
Atomicity
Tính nguyên tử
20
Consistency
Tính nhất quán
21
Isolation
Tính độc lập
22
Durability
Tính bền vững
23
Onacid
Trạng thái mở một giao tác
24
Commit
Trạng thái kết thúc một giao tác
25
Lock-based synchronization
Đồng bộ hóa dựa trên khóa
26
Nested transactions
Các giao tác lồng
27
Multi-threaded
Đa luồng
28
Spawn
Sinh luồng
29
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.
30
Local semantics
Ngữ ngha cục bộ
31
Global semantics
Ngữ ngha toàn cục
32
Local enviroments
Môi trƣờng cục bộ
33
Global enviroments
Môi trƣờng toàn cục
34
Syntax
Cú pháp
35
Term
Các thành phần trong biểu thức 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ó
dấu.
7
DANH MỤC CÁC BẢNG
Bảng 2.1 Cú pháp TFJ [17] 23
Bảng 2.2 Ngữ ngha cục bộ [17] 25
Bảng 2.3 Ngữ ngha toàn cục [17] 27
Bảng 3.1 Hệ thống kiểu mức cục bộ[17] 40
Bảng 3.2 Hệ thống kiểu mức toàn cục[17] 41
Bảng 4.1 Tổng quát hóa các rule của EBNF [18] 44
Bảng 4.2 Bảng kết quả kiểm thử phép toán chính tắc chuỗi số có dấu 49
Bảng 4.3 Bảng kết quả kiểm thử phép toán cộng 2 chuỗi số có dấu chính tắc 50
Bảng 4.4 Bảng kết quả kiểm thử phép toán gộp 2 chuỗi số có dấu chính tắc 50
Bảng 4.5 Bảng kết quả kiểm thử phép toán chọn 2 chuỗi số có dấu chính tắc 51
Bảng PL-0 1 Chú giải chi tiết các rule trong cú pháp của ngôn ngữ TFJ 69
Bảng PL-0 2 Mô tả các phƣơng thức dùng để tính toán giới hạn trên chi phí tài nguyên . 85
DANH MỤC CÁC HÌNH VẼ
Hình 1.1 Hệ thống kiểu trong trình biên dịch[10] 17
Hình 1.2 Sơ đồ các trạng thái của giao tác 18
Hình 1.3 Ví dụ giả mã cho mô hình giao tác lồng và đa luồng 20
Hình 1.4 Ví dụ mô hình giao tác lồng, đa luồng và joint 20
Hình 1.5 Ví dụ mô hình giao tác thể hiện tính phụ thuộc các luồng song song 21
Hình 3.1 Mô tả hai thành phần # liền kề 32
Hình 3.2 Minh họa ý ngha thành phần ¬ 34
Hình 3.3 Mô hình mô tả spawn ở thời điểm cuối của biểu thức 40
Hình 4.1 Mô tả các bƣớc lấy đƣợc chuỗi StringTFJPrimitive 47
Hình 4.2 Mô tả các giai đoạn để tính giá trị giới hạn trên tài nguyên 51
Hình 4.3 Mô hình chƣơng trình TFJ cho Ví dụ 4.3 53
Hình 4.4 Minh họa ví dụ các giai đoạn để tính giới hạn trên tổng chi phí tài nguyên 53
Hình 5.1 Mô hình giao tác Thực nghiệm 1 58
Hình 5.2 Chạy mã Thực nghiệm 1 trên công cụ 59
Hình 5.3 Mô hình giao tác cho Thực nghiệm 2 61
Hình 5.4 Chạy mã Thực nghiệm 2 trên công cụ tính kiểu tự động 62
Hình PL-0 1 Tạo mới một Project 66
Hình PL-0 2 Tạo một tệp ngữ pháp trong ANTLR 68
8
PHẦ N MỞ ĐẦ U
Tính cấp thiết của đề tài
Gần đây các máy tính và điện thoại đƣợc trang bị nhiều bộ xử lý hay các bộ xử lý
có nhiều nhân (core). Để khai thác hết khả năng chạy song song của các bộ xử lý này cần
có các tiến trình hoặc luồng (process, thread) có khả năng tính toán song song. Các ngôn
ngữ lập trình truyền thống sử dụng cơ chế khóa và đồng bộ (lock, synchronization) để các
tiến trình cùng hoạt động và truy cập đến các biến dùng chung. Tuy nhiên, phƣơng pháp
này dễ gây ra các khóa chết (deadlock) hoặc các lỗi tiềm ẩn rất khó phát hiện và sửa chữa.
Software Transactional Memory (STM- bộ nhớ giao tác phần mềm) [15], là một giải pháp
mới để viết các chƣơng trình song song sử dụng cơ chế giao tác (transaction) của các hệ
quản trị cơ sở dữ liệu thay cho cơ chế đồng bộ dựa trên khóa đối với việc chia sẻ bộ nhớ
đồng thời.
STM xử lý với bộ nhớ thông qua các giao tác, mỗi giao tác cho phép tự do đọc và
ghi để chia sẻ các biến khi đƣợc khởi động (onacid) và một log đƣợc sử dụng để ghi các
hoạt động này cho tới thời điểm kết thúc (commit). Tuy nhiên, một vấn đề phát sinh mô
hình STM này sử dụng thêm khá nhiều tài nguyên (bộ nhớ, xử lý), do các log là các bản
sao của thông tin, biến, khi tính toán để thực hiện commit hoặc rollback khi tính toán bị
thất bại xong.
Hệ thống kiểu là một phƣơng pháp phân tích tnh dựa trên các qui tắc kiểu đã đặt ra
để đƣa ra các khẳng định chƣơng trình có thành lập đúng hoặc an toàn hay không, từ đó,
nó hạn chế các lỗi tiềm tàng có thể xảy ra. Hệ thống kiểu cũng có thể ƣớc lƣợng an toàn
thông tin về tài nguyên sử dụng của chƣơng trình mà không cần thực thi nó[5]. Việc này
có ý ngha thực tiễn vì với một chƣơng trình đã cho ta biết đƣợc trong trƣờng hợp xấu
nhất nó có thể cần bao nhiêu bộ nhớ.
Một số hệ thống kiểu trƣớc kia khi giải quyết vấn đề tính toán tài nguyên tnh cho
một chƣơng trình có giao tác thông qua thể hiện cây phân cấp [13] và tổng tài nguyên
đƣợc tính theo nguyên tắc cộng dồn, khi đó giới hạn trên tổng tài nguyên đƣa ra là con số
khá lớn. Luận văn nghiên cứu một hệ thống kiểu mới [17] sử dụng các chƣơng trình
Featherweight Java có giao tác (Transactional Featherweight Java, gọi tắt là TFJ). Hệ
thống kiểu ƣớc lƣợng tài nguyên tiêu tốn chính xác hơn so với các nghiên cứu trƣớc đó [6,
13]. Những vấn đề nêu trên là cơ sở khoa học và thực tiễn để tôi thực hiện đề tài “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”.
9
Mục tiêu của luận văn
Trên cơ sở nghiên cứu lý thuyết về hệ thố ng kiể u, để xác định tài nguyên của các
chƣơng trình Featherweight Java có giao tác (TFJ) [17], đề tài đƣa ra phƣơng pháp tính tài
nguyên của các chƣơng trình TFJ và cài đặt một công cụ phần mềm có khả năng tính tài
nguyên sử dụng của các chƣơng trình TFJ đó.
Công cụ phần mềm
Sử dụng thƣ viện và công cụ hỗ trợ ANTLR để phân tích mã nguồn của chƣơng
trình TFJ. Các công cụ lập trình trên nền .NET và ngôn ngữ C # để cài đặt thuật toán
chƣơng trình.
Phƣơng pháp nghiên cƣ́ u
Để đề tài đạ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 tài liệu: Nghiên cứu hệ thống kiểu nói chung và tập trung vào hệ thống
kiểu cho các chƣơng trình TFJ nhƣ đã nêu trong [17]. Đây là mảng kiến thức mới,
không đƣợc học ở trƣờng và đòi hỏi nhiều kiến thức nền tảng liên quan. Đồng thời
ở đây tôi cũng phải nghiên cứu các thuật toán dựa trên hệ thống kiểu đã đề xuất để
có thể tính tài nguyên cho một chƣơng trình TFJ.
- Cài đặt, thực nghiệm: Nghiên cứu các công cụ phân tích chƣơng trình và thƣ viện
hỗ trợ (ANTLR) để sử dụng phân tích một chƣơng trình đầu vào. Từ đó cài đặt
thuật toán đề xuất, đồng thời chạy thử, kiểm tra tính đúng đắn của công cụ.
Bố cục của luận văn
Trong luậ n văn sẽ đƣợ c thƣ̣ c hiệ n bở i cá c phầ n cơ bả n:
- Phầ n mở đầu: Đƣa ra tính cấp thiết của đề tài, công cụ phần mềm sử dụng, phƣơng
pháp nghiên cứu và bố cục của luận văn.
- Chƣơng 1: Nghiên cƣ́ u một số các kiến thức cơ sở về hệ thống kiểu và bộ nhớ giao
tác phần mềm.
- Chƣơng 2: Nghiên cứu về cú pháp và các ngữ ngha tổng quát của chƣơng trình
Featherweight Java có giao tác.
- Chƣơng 3: Nghiên cứu hệ thống kiểu cho các chƣơng trình TFJ: Đị nh ngha, tập các
qui tắc kiểu dựa trên chuỗi số có dấu.
- Chƣơng 4: Xây dựng thuật toán tính kiểu và công cụ: Các phép toán tính toán kiểu,
tính giới hạn trên tổng chi phí tài nguyên cho các chƣơng trình TFJ.
- Chƣơng 5: Thực nghiệm: Kiểm tra chƣơng trình tính kiểu xây dựng ở Chƣơng 4 là
đúng thông qua các ví dụ thực nghiệm với các chƣơng trình TFJ.
- Kết luận: Tổng hợp các kết quả đạt đƣợc, tồn tại và hƣớng mở rộng của đề tài.
10
CHƢƠNG 1. MỘT SỐ KIẾN THỨC CƠ SỞ
1.1. Các lý thuyết nền tảng về hệ thống kiểu
1.1.1. Khái niệm hệ thống kiểu
Hệ thống kiểu (type system) trong toán học đã xuất hiện từ đầu thế kỷ 19. Đến nay
hệ thống kiểu có sức ảnh hƣởng và có ý ngha to lớn [1]. Đã có rất nhiều quan điểm khác
nhau về hệ thống kiểu:
Một hệ thống kiểu là một phƣơng pháp kiểm soát cú pháp cho việc chứng minh sự
vắng mặt của các hành vi nào đó của chƣơng trình bằng cách phân loại các thành phần
theo kiểu cho các giá trị nó tính toán [1].
Luca Cardelli phát biểu rằng: Hệ thống kiểu là một phƣơng pháp chính thức ngăn
chặn các lỗi thực thi trong quá trình chạy của chƣơng trình [3, 5].
Dƣới góc độ của ngƣời lập trình, mộ t hệ thố ng kiể u là tậ p cá c chú thí ch kiểu và cơ
chế kiểm tra trợ giúp cho ngƣời lập trình. Với ngƣờ i viế t trì nh dị ch, mộ t hệ thố ng kiể u là
nguồ n thông tin có thể đƣợ c sƣ̉ dụ ng để tối ƣu mã máy sinh ra . Theo lý thuyết ngôn ngữ,
mộ t hệ thố ng kiể u là mộ t bộ qui tắ c để qui định cấu trúc và lập luận về ngôn ngƣ̃ . Nói tóm
lại hệ thống kiể u đó ng vai trò quan trọng với các ngôn ngữ lập trình [8].
Ta có thể khái quát hóa khái niệm hệ thống kiểu nhƣ sau: Hệ thố ng kiể u là mộ t cơ
chế cú phá p (syntactic mechanism) ràng buc cu trc của mt chương trình bi việc kt
hợ p cá c thông tin ngữ nghĩa vớ i cá c thà nh phầ n trong chương trình và gii hn phm vi
của cá c thà nh phần đó. Theo đó đặc trƣng của ngôn ngữ đƣợc thiết kế trên hệ thống kiểu
đò i hỏ i mỗ i biế n trong chƣơng trì nh phả i có miề n giá trị cụ thể mà nó có thể tham chiế u ,
mỗ i khai bá o hà m cũ ng phả i thao tá c trên cá c kiể u đố i số cụ thể và trả về giá trị củ a kiể u
cụ thể. Thông tin nà y có thể đƣợ c khai bá o rõ rà ng bằ ng cá ch sƣ̉ dụ ng cá c chú thí ch kiể u
hoặ c suy ra bở i bộ kiể m tra kiể u (type checker). Khi mộ t chƣơng trình đƣợ c biên dịch ,
mộ t bộ kiể m tra kiể u nà y đả m bả o rằ ng mỗ i biế n chỉ đƣợ c gá n đú ng kiể u củ a giá trị và cá c
hàm ch đƣợc gọi với các tham số đúng kiểu.
Các ngôn ngữ hạn chế phạm vi của các biến đƣợc gọi là ngôn ngữ kiểu , nhƣ ML
hoặc C. Ngƣợc lại, ta hiểu đó là ngôn ngữ phi kiểu, nhƣ LISP, Assembler. Mộ t hệ thố ng
kiể u là thà nh phầ n củ a mộ t ngôn ngƣ̃ kiể u, có vai trò theo di các kiểu của các biến và các
kiể u củ a tấ t cả cá c biể u thƣ́ c trong chƣơng trình.
Trong một ngôn ngữ có hệ thống kiểu mà giƣ̃ cho tấ t cả chƣơng trì nh chạy đƣợc
trên ngôn ngƣ̃ lậ p trình cụ thể, chúng ta nói rằng ngôn ngữ là kiểu tốt (well typed). Nó ch
ra rằ ng, mộ t phân tí ch cẩ n thậ n là cầ n thiế t để trá nh nhƣ̃ ng tuyên bố sai cho cá c ngôn ngƣ̃
lậ p trì nh. Mộ t hệ thố ng kiể u đƣợ c sƣ̉ dụ ng để xá c đị nh liệ u chƣơng trình có đƣợc coi là
well-behaved (hành xử đúng). Do vậ y, các chƣơng trình đƣợc thực hiện theo một hệ thống
11
kiể u nên đƣợ c xem xé t là cá c chƣơng trình thƣ̣ c sƣ̣ củ a ngôn ngƣ̃ kiể u , các chƣơng trình
khác nên đƣợc loại bỏ trƣớc khi chạy.
Khi phá t triể n mộ t cá ch đú ng đắ n , các hệ thống kiểu cung cấp các công cụ khái
niệ m để đá nh giá mộ t cá ch đầ y đủ cá c khí a cạ nh quan trọ ng củ a cá c đị nh nghĩ a ngôn ngƣ̃ .
Mô tả ngôn ngƣ̃ chí nh thƣ́ c thƣờ ng không xá c định cấ u trú c củ a mộ t ngôn ngƣ̃ đầ y đủ chi
tiế t để cho phé p thƣ̣ c thi rõ rà ng . Thƣờ ng xả y ra vớ i cá c trì nh biên dị ch khá c nhau cho
cùng một ngôn ngữ cài đặt các hệ thống kiểu khác nhau . Hơn nƣ̃ a, nhiề u đị nh nghĩ a ngôn
ngƣ̃ đã đƣợ c tìm thấ y là kiể u không đú ng đắ n , theo đó mộ t chƣơng trì nh có thể sụ p đổ
mặ c dù cá c đá nh giá đƣợ c chấ p nhậ n bở i bộ k iể m tra kiể u. Lý tƣởng nhất, hệ thố ng kiể u
chính thức nên là một phần định ngha tất cả các ngôn ngữ lập trình đƣợc định kiểu . Bằ ng
cách này, các thuật toán kiểm tra kiểu có thể đƣợc đo đạc một cách r ràng dựa vào các
thông số kỹ thuậ t chí nh xá c nế u tấ t cả có thể và khả thi , ngôn ngƣ̃ có thể đƣợ c thể hiệ n là
kiể u đú ng đắ n.
Mộ t ngôn ngƣ̃ đƣợ c định kiể u bở i sƣ̣ tồ n tạ i củ a hệ thố ng kiể u cho nó , có hay
không cá c kiể u trong cú phá p chƣơng trì nh . Các ngôn ngữ kiểu đƣợc định kiểu r ràng
nế u cá c kiể u là thà nh phầ n củ a cú phá p . Tuy vậy, ta cũng phải khẳng định rằng không có
ngôn ngƣ̃ chính thố ng hoà n toà n đƣợ c đị nh kiể u , các ngôn ngữ nhƣ ML và Haskell hỗ trợ
viế t cá c đoạ n chƣơng trì nh lớ n, nơi cá c thông tin kiể u đƣợ c bỏ qua, các hệ thống kiểu của
ngôn ngƣ̃ tƣ̣ độ ng gá n cá c kiể u cho cá c đoạ n chƣơng trì nh nhƣ vậ y . Do đó tùy từng bài
toán mà có thể áp dụng một ngôn ngữ định kiểu hay ngôn ngữ không định kiểu để cài đặt.
1.1.2. Vai trò củ a hệ thố ng kiể u
Hệ thố ng kiể u là cần thiết cho các ngôn ngữ lập trình. Thông thƣờ ng hệ thố ng kiể u
trong cá c ngôn ngƣ̃ lậ p trì nh có 4 vai trò chính [8] thể hiệ n:
a) Phát hiện li
Trong quá trình thực thi có thể xảy ra các loại lỗi khác nhau, có lỗi có tác động
ngay lập tức đến kết quả của chƣơng trình hoặc có những lỗi trong đó kết quả có thể làm
thay đổi dữ liệu mà không có tác động ngay lập tức. Ví dụ nhƣ:
Ví dụ 1.1 Lỗ i lệ nh không hợ p lệ khai báo biến trong C#.
Trong khai báo từ biến của C#.
int x;
Lỗi này không hợp lệ vì trong C# không cho phép khai báo một biến mà không
gán trị. Và lỗi này sẽ gây tác động dừng thực thi ngay lập tức. Ta có thể sửa cho đúng
bằng cách gán trị cho nó nhƣ:
int x=0;
12
Ví dụ 1.2 Lỗi không hợp lệ khai báo tham số không phù hợp trong C#.
private static int sum(String x, String y)
{
int result = x+y;
return result;
}
Lỗi này hoàn toàn không hợp lệ bởi lẽ biến result của chúng ta là biến kiểu int
trong khi đó x,y là hai biến có kiểu String. Điều này trong ngôn ngữ C# không cho
phép và lỗi này cũng dẫn đến dừng chƣơng trình ngay lập tức. Ta có thể sửa lại cho
đúng thành:
private static int sum(String x, String y)
{
int result = Int32.Parse(x)+ Int32.Parse(y);
return result;
}
Tuy nhiên có nhiề u dạ ng lỗ i thƣ̣ c thi mà kế t quả thay đổ i dƣ̃ liệ u mà không có
tác động ngay lập tƣ́ c. Ví dụ nhƣ phƣơng thức tính giai thừa trong C# cho nhƣ sau:
Ví dụ 1.3 Tính giai thừa của số nguyên n.
private int fact(int n)
{
if(n>0)
return n * fact(n – 1);
return 1;
}
Đối với chƣơng trình trên thì trình biên dịch hoàn toàn không phát hiện ra lỗi
nếu nhƣ chúng ta đƣa giá trị đầu vào hợp lý nhƣ n=2 hoặc n=5, … Tuy nhiên, nếu
n=27 thì chƣơng trình sẽ thông báo lỗi vì quá phạm vi cho phép của kiểu int trong C#
(32bit).
Một trong các mục đích cơ bản của hệ thống kiểu là ngăn chặn sự xuất hiệ n củ a
các lỗi thực thi (Ví dụ 1.1 và Ví dụ 1.2), lỗi mà có thể xảy ra trong thời gian chạy chƣơng
trình. Bên cạnh đó, cũng có khi lỗi thực thi có thể là tiềm tàng, hệ thống kiểu không thể
phát hiện ra nhƣ Ví dụ 1.3 . Do đó, độ chính xác của hệ thống kiểu phụ thuộc vào vấn đề
khá tinh tế của những gì tạo ra một lỗi thực thi (execution error).
Hệ thố ng kiể u theo dõ i cá c kiể u củ a cá c đố i số , chúng có thể phát hiện từng phần
mã lệnh gán giá trị không hợp lệ . Hệ thố ng kiể u có thể phá t hiệ n lỗ i luồ ng dƣ̃ liệ u logic
trong chƣơng trình.Vì vậy, chúng có thể đảm bả o sƣ̣ vắ ng mặ t củ a lớ p nà o đó củ a cá c lỗ i
lậ p trì nh tƣ̀ cá c chƣơng trì nh.
Nhiề u lỗ i lậ p trì nh chung qui là sƣ̉ dụ ng dƣ̃ liệ u sai ở cá c vị trí sai . Hệ thố ng kiể u
phân chia vù ng giá trị hợ p lệ có thể xuấ t hiệ n trong ngƣ̃ cả nh củ a chƣơng trì nh và kiể m tra
13
cho phù hợ p phân vù ng nà y ở thờ i gian biên dị ch . Ngƣờ i lậ p trì nh có thể dƣ̣ a trên nó để
phát hiện lỗi chƣơng trình trƣớc khi chƣơng trình đƣợc thực hiện.
b) Trừ u tượ ng hó a
Các kiểu đƣợ c sƣ̉ dụ ng để trƣ̀ u tƣợ ng cá c thà nh phầ n củ a mộ t chƣơng trình . Nhiề u
nghiên cƣ́ u đã đƣợ c thƣ̣ c hiệ n trên cá c kiể u dƣ̃ liệ u trƣ̀ u tƣợ ng (ADT-Abstract Data
Type), cơ sở cho định nghĩa cá c kiể u mớ i , đi cấ u trú c bên trong củ a nó vớ i phầ n cò n lạ i
của một chƣơng trình. Kiể u dƣ̃ liệ u trƣ̀ u tƣợ ng có thể có c ác giao diện cơ bản của nó , che
dấ u thông tin hạ n chế sƣ̣ phụ thuộ c cá c modul e của chƣơng trình, làm cho nó có thể thay
đổ i việ c thƣ̣ c hiệ n cơ bả n tƣ̀ mộ t ADT miễ n là tí nh bấ t biế n đƣợ c bả o tồ n . Các kiểu dữ
liệ u trƣ̀ u tƣợ ng trong hệ thố ng kiể u đƣợ c dù ng cho cá c ngôn ngƣ̃ hƣớ ng đố i tƣợ ng.
Mộ t hì nh thƣ́ c trƣ̀ u tƣợ ng khá c đƣợ c trì nh bà y bở i hệ thố ng kiể u là tính đa h ình,
cung cấ p cá c đị nh nghĩ a vớ i cá c đị nh danh giố ng nhau có thể đƣợ c hợ p thà nh mộ t dƣ̣ a
trên cá c kiể u củ a cá c biể u thƣ́ c con trong ngƣ̃ cả nh nơi nó đƣợ c sƣ̉ dụ ng . Ví dụ, nhiề u
ngôn ngƣ̃ cung cấ p tính đa hì nh đơn giả n nhƣ cá c phé p toá n giố ng nhƣ phé p cộ ng và phé p
nhân đƣợ c định nghĩa cho cả số nguyên, số thậ p phân, con trỏ số thƣ̣ c.
c) Tài liệu
Nhiề u ngôn ngƣ̃ kiể u tĩ nh yêu cầ u cá c lậ p trì nh viên nhập chú thích một số thành
phầ n củ a chƣơng trìn h vớ i kiể u thông tin . Ví dụ trong ngôn ngữ lập trình C , tấ t cả cá c
biế n phải khai báo kiểu của giá trị cho nó, mọi định ngha hàm tƣơng ứng phải đƣợc khai
báo kiểu của các đối số và kiểu trả về. Việ c chú thí ch là rấ t hƣ̃ u í ch.
d) Tăng hiệu quả
Mộ t chƣơng trình đƣợ c thiế t lậ p kiể u tố t (well-type) cung cấ p mộ t trì nh biên dị ch ,
vớ i thông tin mà trì nh biên dị ch có thể sƣ̉ dụ ng mụ c đích cả i thiệ n quá trì nh dị ch chƣơng
trình. Ngay cả cá c biế n có kiể u tĩnh , trình biên dịch có thể quyết định vị trí thể hiệ n cá c
biế n này nhƣ thế nào trong mã máy. Điề u nà y đặ c biệ t hƣ̃ u í ch khi mộ t biế n chỉ có thể giƣ̃
mộ t giá trị kiể u cố đị nh. Ví dụ, hầ u hế t cá c kiế n trú c má y tí nh hiệ n đạ i cung cấ p cá c thanh
ghi đặ c biệ t xƣ̉ lý cá c dấ u phẩ y độ ng nhƣng chú ng chỉ có thể đƣợ c sƣ̉ dụ ng khi giá trị là
có dấu phẩy động. Cho mộ t thông tin kiể u, trình biên dịch có thể xác định một tham số từ
một hàm luôn là một số có dấu phẩy động . Trình biên dịch có thể dịch hàm cũn g nhƣ
nhậ n đố i số dấ u phẩ y độ ng trong mộ t thanh ghi chƣ́ không phả i trong bộ nhớ . Hệ thố ng
kiể u không đả m bả o chƣơng trì nh sẽ hoạ t độ ng nhƣ thế nà o.
1.1.3. Các thuộc tnh cơ bản của hệ thống kiểu
Hầu hết các hệ thống kiểu đều thể hiện các thuộc tính chung nhƣ sau [8]:
a) Thuộ c tí nh kiể u (types)
14
Mỗ i mộ t ngôn ngƣ̃ định kiểu có một tập các kiểu , nó là những thực thể cơ bản đại
điệ n cho tí nh chấ t ngƣ̃ nghĩ a . Các ngôn ngữ cơ bản cung cấp một tập các kiểu nguyên
thủy, nhƣ số nguyên , logic, hoặc các kiểu định ngha từ kiểu nguyên thủy nhƣ mảng số
nguyên, danh sá ch. Trong trƣờ ng hợ p đơn giả n , tấ t cả cá c kiể u đƣợ c biể u thị bở i mộ t tên
đặ c biệ t và duy nhấ t . Các ngôn ngữ phức tạp hơn cho phép lập trình viên khai báo giả
kiể u, thay thế tên cho cù ng mộ t kiể u . Hầ u hế t cá c ngôn ngƣ̃ cũ ng cung cấ p cá c cấ u trú c ,
cho phé p lậ p trì nh viên có thể đị nh nghĩa kiể u tổ ng hợ p tƣ̀ cá c kiể u khá c. Cấ u trú c củ a cá c
tên kiể u thƣờ ng mã hó a mộ t số thông tin ngƣ̃ nghĩa về loạ i giá trị có thể có kiể u nhấ t đị nh.
Ví dụ kiểu hàm AB mô tả mộ t hà m lấ y giá trị kiể u A và giá trị trả về kiể u B.
b) Tính kt hợp (compositionality)
Trong ngôn ngƣ̃ kiể u, mỗ i biể u thƣ́ c có mộ t kiể u và kiể u đó là kiể u trả về tƣ̀ cá c
biể u thƣ́ c con củ a nó . Cho ví dụ , hãy xem xét biểu thức if a then b else c. Trong mộ t ngôn
ngƣ̃ cá c biể u thƣ́ c nà y đƣợ c xá c đị nh đầ y đủ 3 biể u thƣ́ c con a, b,c. Đầu tiên a có kiểu
logic và b, c phả i cù ng kiể u.Vớ i nhƣ̃ ng hạ n chế nà y toà n bộ biể u thƣ́ c có cù ng kiể u vớ i cả
b và c. Qui tắ c nà y cho biế t biể u thƣ́ c trả về hoặ c là b hoặ c là c.
Mặ c dù có kiể u biể u thƣ́ c well-type đƣa ra mối quan hệ thà nh phầ n, việ c gá n cá c
kiể u phụ thuộ c và o ngƣ̃ cả nh.
c) Tính bảo đảm (guarantee)
Các hệ thống kiểu hiện đại cố gắng làm nhiều hơn so với các cơ chế lộn xộn hiện
tại cho các ràng buộc giá trị mà các biến có thể nhận. Các nhà lý thuyết ngôn ngữ lập trình
đã phá t triển kỹ thuậ t ngƣ̃ nghĩa thể hiệ n các liên hệ giữa ngôn ngữ lập trình và kiểu của
nó. Đặc tả chính thức ngôn ngữ dƣ̣ a trên cá c ngƣ̃ nghĩ a tĩ nh (đả m bả o chƣơng trì nh là
thiế t lậ p đú ng cá ch hay không ) và ngữ ngha động (đả m bả o chƣơng trì nh hà nh xƣ̉ đú ng
hay không) của nó. Để liên hệ cá c ngƣ̃ nghĩ a độ ng vớ i ngƣ̃ nghĩ a tĩ nh , các nhà thiết kế
ngôn ngƣ̃ chƣ́ ng minh mộ t tậ p cá c đị nh lý để thiế t lậ p cá c thuộ c tí nh độ ng củ a cá c chƣơng
trình này, cái mà là well-type bở i cá c ngƣ̃ n gha tnh. Ý tƣởng này đảm bảo chƣơng trình
duy trì đồ ng bộ well-type nhƣ nó thƣ̣ c thi và mộ t chƣơng trình well-type sẽ không nằm
ngoài phạm vi ngữ ngha động.
1.1.4. Các ứng dụng v ngha kinh tế của hệ thống kiểu
Hệ thống kiểu đóng vai trò lớn trong phần mềm máy tính và bảo mật mạng : Kiể u
tnh nằm ở nhân của các mô hình bảo mật , của Java và JINI là mộ t ví dụ . Hệ thố ng kiể u
đƣợ c sƣ̉ dụ ng trong các trình biên dịch , xác minh các giao thức , cấ u trú c thông tin trên
web và thậ m chí mô hì nh cá c ngôn ngƣ̃ tƣ̣ nhiên . Mộ t số ứng dụng mà hệ thống kiểu
thƣờng có mặt nhƣ: Trong lậ p trì nh hệ thố ng lớ n (chứa hệ thống các module), trong biên
15
dịch và tối ƣu hóa (các phân tích tnh, các ngôn ngữ kiểu trung gian), trong bả o mậ t, trong
chƣ́ ng minh cá c đị nh lý và trong cơ sở dƣ̃ liệ u.
Vấ n đề về cá c ngôn ngƣ̃ lậ p trình nên có kiể u vẫ n cò n là mộ t số tranh luậ n , có rấ t í t
nghi ngờ rằ ng mã đƣợ c viế t bằ ng ngôn ngƣ̃ không đị nh kiể u có thể đƣợ c duy trì chỉ vớ i
khó khăn rất lớn . Tƣ̀ quan điể m củ a bả o trì , thậ m chí ngôn ngƣ̃ kiể m tra yế u không an
toàn vƣợt trội so với các ngôn ngữ an toà n nhƣng không định kiể u (ví dụ C so với LISP ).
Dƣớ i đây là cá c lậ p luậ n đã đƣợ c đƣa ra trong lợ i ích củ a ngôn ngƣ̃ định kiể u tƣ̀ mộ t quan
điể m kỹ thuậ t [3]:
- Tính kinh tế củ a việ c thƣ̣ c hiệ n : Thông tin kiể u lầ n đầ u tiên đƣợ c giớ i thiệ u trong
chƣơng trình để cả i thiệ n hệ mã và hiệ u quả thờ i gian chạ y cho tí nh toá n số , ví dụ nhƣ
trong FORTRAN. Trong ML thông tin kiể u chí nh xá c giú p loạ i bỏ sƣ̣ kiể m tra cầ n
thiế t con số 0 . Nói chung, thông tin kiể u chính xá c tạ i thờ i gian biên dị ch dẫ n đế n việ c
áp dụng các phép toán thích hợp thời gian chạy mà không cần chi phí kiểm thử.
- Kinh tế cho phát triển qui mô nhỏ : Khi mộ t hệ thố ng kiể u đƣợ c thiế t kế tố t, việ c kiể m
tra kiể u có thể lắ m bắ t phầ n lớ n lỗ i lậ p trì nh thƣờ ng xuyên , loại bỏ các phiên g lỗi .
Các lỗi xảy ra đƣợc dễ dàng g lỗi , đơn giả n chỉ vì cá c phân lớ p lớ n củ a lỗ i đƣợ c loạ i
trƣ̀ . Hơn nƣ̃ a cá c lậ p trì nh viên già u kinh nghiệ m á p dụ ng mộ t phong cá ch mã hó a gây
ra mộ t số lỗ i logic hiể n thị nhƣ cá c lỗ i trong quá trì nh kiể m tra kiể u : Họ sử dụng các
bộ công cụ kiể m tra kiể u n hƣ mộ t công cụ phá t triể n . Cho ví dụ , bằ ng cá ch thay đổ i
tên mộ t trƣờ ng khi miề n bấ t biế n củ a nó thay đổ i mặ c dù kiể u củ a nó vẫ n là nhƣ nhau ,
khi đó ta có đƣợ c cá c thông báo lỗ i trên tấ t cả nhƣ̃ ng cá i sƣ̉ dụ ng nó .
- Kinh tế về mặ t biên dịch: Thông tin kiể u có thể đƣợc tổ chức trong các giao diện giao
tiếp giữa các module chƣơng trình . Các module sau đó có thể đƣợc biên dịch độc lập
vớ i nhau, vớ i mỗ i module chỉ tù y thuộ c và o giao diệ n củ a cá c module khá c . Việ c biên
dịch các hệ thống lớn đƣợ c thƣ̣ c hiệ n hiệ u quả hơn vì í t nhấ t khi cá c giao diệ n ổ n đị nh,
thay đổ i mộ t modul e không là m cho cá c modul e khác phải biên dịch lại . Kinh tế củ a
việ c phá t triể n quy mô lớ n . Các giao diện và các module có phƣơng thức log ic thuậ n
lợ i cho phá t triể n mã . Mộ t nhó m lớ n cá c lậ p trì nh viên có thể thố ng nhấ t chung về mặ t
giao diệ n sau đó tiế n hà nh mộ t cá ch riêng biệ t để thƣ̣ c hiệ n mã tƣơng ƣ́ ng tƣ̀ ng
module. Phụ thuộc giữa các phần của mã đƣợc g iảm thiểu và mã bên trong mỗi
module có thể đƣợc các sắp xếp lại mà không ảnh hƣởng đến mã toàn cục.
- Kinh tế củ a cá c tí nh năng ngôn ngƣ̃ : Cấ u trú c kiể u là đƣợ c tạ o tƣ̣ nhiên theo cá c hƣớ ng
trƣ̣ c giao. Ví dụ, Pascal mộ t mả ng củ a cá c mảng mô hình mảng hai chiều hoặc trong
ML mộ t thủ tụ c vớ i mộ t đố i số duy nhấ t là mộ t bộ n các tham số mô hình một thủ tục
của n đố i số . Vì vậy hệ thống kiểu thúc đẩy trực giao của các tính năng ngôn ngữ , có
xu hƣớ ng giả m bớ t sƣ̣ phƣ́ c tạ p củ a ngôn ngƣ̃ lậ p trì nh.
16
1.1.5. Hệ thống kiểu trong việc chính thức hóa ngôn ngữ kiểu
Nhƣ chú ng ta đã thả o luậ n , các hệ thố ng kiể u đƣợ c sƣ̉ dụ ng để khẳng định ngôn
ngữ định kiể u là tố t (well-type), bản thân nó là tnh với hành xử đúng và nó đảm bảo
chƣơng trình là an toà n. An toà n tạ o điề u kiệ n gỡ lỗ i bởi hành vi ngăn chặn lỗi của nó.
Nhƣng làm thế nào chúng ta có thể đảm bảo rằng các chƣơng trình định kiểu tốt là đang
thƣ̣ c sƣ̣ hà nh xƣ̉ đú ng? Đó là , làm thế nào chúng ta có thể chắc chắn rằng các qui tắc kiểu
của một ngôn ngữ vô tình cho phép các chƣơng trình hành xử kém thông qua?
Khi mộ t hệ thố ng kiể u đƣợ c chính thƣ́ c hó a , chúng ta có thể cố gắng để chứng
minh tính đúng đắn định lý kiểu , các chƣơng trình kiểu tốt đƣợc hành xử đúng . Nế u nhƣ
tính đúng đắn của định lý đạ t đƣợ c chú ng ta nó i rằ ng hệ thố ng kiể u là đú ng đắ n . Tớ i đây
ta có thể cho rằ ng , hành xử đúng của tất cả các chƣơng trình của một ngôn ngữ định kiểu
và tính đúng đắn của hệ thống kiểu của nó có ngha giống nhau.
Việc chính thức hóa một hệ th ống kiểu là một pha trong chính thức hóa toàn bộ
ngôn ngƣ̃ định kiểu. Mỗi một ngôn ngữ có bộ mô tả cú phá p củ a riêng nó. Qua bộ cú pháp
thể hiện các thành phần đặc trƣng trong một chƣơng trình phần mềm và các kiểu của các
thành phần đó. Các kiểu thể hiện hiểu biết tnh về chƣơng trình , trong khi cá c thà nh phầ n
(các câu lệnh, biể u thƣ́ c và các đoạn chƣơng trình khác) thể hiệ n hà nh vi củ a thuậ t toá n.
Hầ u hế t cá c ngôn ngƣ̃ kiểu phân tá ch rõ rà ng hai pha tĩ nh và độ ng củ a quá trì nh xƣ̉
lý. Pha tĩ nh, chính thức hóa hệ thống kiểu, chƣ́ a cá c phân tí ch và kiể m tra kiể u để đả m
bảo rằng chƣơng trình là thiết lậ p đú ng (well-formed); pha độ ng bao gồ m các mô tả thƣ̣ c
thi cá c chƣơng trình thiết lập đúng. Mộ t ngôn ngƣ̃ đƣợ c nó i là an toà n khi cá c chƣơng
trình thiết lập đúng là hành xử đúng (well-behaved) khi thƣ̣ c thi.
- Pha tĩ nh (static phase): Đƣợc đặc tả bở i cá c thà nh phầ n tĩ nh bao gồ m mộ t tậ p cá c
qui tắ c xuấ t phá t tƣ̀ cá c đánh giá kiể u với mộ t biể u thƣ́ c nói riêng và một chƣơng
trình nói chung có đƣợc thiết lập đúng hay không.
Phạm vi kiểu cầ n cho cá c ngôn ngƣ̃ kiể u là tĩ nh, các ràng buộ c vị trí củ a cá c
đị nh danh phả i đƣợ c xá c đị nh trƣớ c thờ i gian chạ y . Các vị trí ràng buộc có thể
thƣờ ng đƣợ c xá c đị nh hoà n toà n tƣ̀ cú phá p củ a ngôn ngƣ̃ mà không có bất kỳ
phân tí ch sâu hơn , phạm vi tnh sau đó đƣợ c gọ i là phạ m vi tƣ̀ vƣ̣ ng . Phạm vi có
thể đƣợ c đặ c tả chí nh thƣ́ c bở i xá c đị nh cá c thiế t lậ p cá c biế n tƣ̣ do củ a mộ t đoạ n
chƣơng trình (liên quan đế n việ c xá c định biế n bị rà ng buộ c nhƣ thế nà o bở i cá c
khai bá o).
Chúng ta có thể tiế n hà nh đị nh nghĩa cá c qui tắ c kiể u củ a ngôn ngƣ̃ mô tả
mộ t mố i quan hệ có kiể u củ a dạ ng M:A giƣ̃ a cá c thà nh phầ n M và các kiểu A. Mộ t
vài ngôn ngữ cũng yêu cầu một mối liên quan kiểu con theo dạng A<:B giƣ̃ a cá c
17
kiể u và thƣờng một mối liên hệ kiểu tƣơng đƣơng đƣợc qui ƣớc AB. Tậ p cá c qui
tắ c kiể u củ a ngôn ngƣ̃ tạo thành hệ thống kiểu.
Các qui tắc kiểu không thể đƣợc chính thức hóa mà không cần các thành
phầ n cơ bả n đầ u tiên đƣợ c phả n á nh trong cú phá p củ a ngôn ngƣ̃ , nói cách khác là
trong môi trƣờ ng kiể u . Chúng đƣợc sử dụng để lƣu các kiểu của các biến tự do
trong quá trì nh xƣ̉ lý cá c đoạ n chƣơng trì nh , chúng tƣơng ứng chặt chẽ với các
bảng ký hiệ u (TOKEN table) của một trình biên dịch trong pha kiểm tra kiểu . Các
quy tắc kiể u đƣợ c xây dƣ̣ ng vớ i mộ t môi trƣờ ng cho đoạ n chƣơng trì nh sẽ đƣợ c
kiể m tra kiể u. Cho ví dụ , có mối quan hệ kiểu M:A là liên kết với môi trƣờng tnh
chƣ́ a thông tin về cá c biế n tƣ̣ do M. Mố i liên hệ đƣợ c viế t đầ y đủ là : , có
ngha là M có kiểu A trong môi trƣờ ng .
- Pha độ ng (dynamic phase) của một ngôn ngữ là một mô tả chƣơng trìn h đƣợ c thƣ̣ c
hiệ n nhƣ thế nà o . đị nh nghĩ a cá c ngƣ̃ nghĩ a nhƣ mộ t rà ng buộ c có giá trị giƣ̃ a cá c
thành phần và tập các kết quả . Các quan hệ hình thƣ́ c nà y phụ thuộ c mạ nh mẽ và o
phong cá ch củ a cá c ngƣ̃ nghĩa đƣợ c thông qua . Trong bấ t kỳ trƣờ ng hợ p nà o , các
ngƣ̃ nghĩa và hệ thố ng kiể u củ a mộ t ngôn ngƣ̃ đƣợ c kế t nố i vớ i nhau.
Hệ thống kiểu đƣợc cài đặt nhƣ một phần của trình biên dịch trong ngôn ngữ [10]. Nó
trong bộ Semantic routine sau trạng thái Syntactic analysis nhƣ ở Hình 1.1:
Hình 1.1 Hệ thống kiểu trong trình biên dịch[10]
Có 3 trạng thái của trình biên dịch: scanning, syntactic analysis và type analysis có
thể xem nhƣ ba thành chức năng: scanner, parser, typechecker. Đầu vào là chƣơng trình
mà các lập trình viên xây dựng từ các ngôn ngữ lập trình. scanner sử dụng hữu hạn các
trạng thái và ánh xạ chuỗi ký tự vào bảng TOKEN. Bằng việc sử dụng một vài thuật toán,
parser ánh xạ bảng TOKEN vào một cấu trúc trừu tƣợng của chƣơng trình (thƣờng là một
cây cú pháp trừu tƣợng).
Mộ t ngôn ngƣ̃ kiể u có thể hà nh xƣ̉ tố t (chƣ́ a đƣ̣ ng tính an toà n ) bằ ng cá ch thƣ̣ c
hiệ n kiể m tra tĩ nh (tƣ́ c là kiể m tra trƣớc ở thời điểm biên dị ch chƣơng trình sang mã máy)
để ngăn chặn các chƣơng trình không an toàn và hành xử kém trong từng lần chạy . Các
18
mã chƣơng trình đƣợ c kiể m tra tĩ nh, quá trình kiểm tra đƣợc gọi là quá trình kiểm tra kiểu
và bộ các thuật toán thực hiện kiể m tra nà y gọ i là bộ kiể m tra kiể u (type checker). Mộ t
chƣơng trình khi đƣợ c thông qua bở i bộ kiể m tra kiể u đƣợ c gọ i là kiể u tố t (well typed),
ngƣợ c lạ i, là kiểu yếu (ill typed), có ngha rằng nó nó hành xử yếu hoặc đơn g iản là nó
không đả m bả o hà nh xƣ̉ tố t . Typechecker đƣa các kiểu vào cấu trúc cú pháp trừu tƣợng.
Typechecker là một thành phần gọi là semantic subroutine của bộ biên dịch. Và phần thực
nghiệm của chúng ta ở Chƣơng 4, ta sẽ đi xây dựng một dạng Typechecker, kiểm tra và
tính kiểu cho một chƣơng trình nguồn TFJ.
1.2. Bộ nhớ giao tác phần mềm
1.2.1. Khái niệm v các thuộc tnh cơ bản của giao tá c
Giao tá c (transaction) là tập hợp thứ tự các thao tác tạo thành một đơn vị làm việc
logic thỏ a mã n hoặ c thƣ̣ c hiệ n đầ y đủ hoặ c là hủ y bỏ hoà n toà n.
Hiệ n nay khá i niệ m giao tá c đƣợ c tí ch hợ p phổ biế n và o trong cá c bộ má y là m việ c
của các ngôn ngữ lập trình để cung cấ p cá c giá trị an toà n và đả m bả o cá c thuộ c tí nh nhƣ
tính nguyên tử, nhấ t quá n, độ c lậ p, bề n vƣ̃ ng đƣợ c viế t tắ t là ACID [16] :
- Tính nguyên tử (atomicity): Mộ t giao tá c là mộ t chuỗ i cá c thao tá c đƣợ c thƣ̣ c thi
mộ t cá ch nguyên tƣ̉ , hoặ c toà n bộ đƣợ c thƣ̣ c hiệ n hoặ c không . Mộ t giao tá c đƣợ c
gọi là thành công khi nó thực hiện toàn bộ hoạt động (commit), ngƣợ c lạ i nó sẽ bị
hủy bỏ (abort).
- Tính nhất quán (consistency): Tấ t cả cá c giao tá c có cùng cách nhìn về dữ liệu
đƣợ c chia sẻ .
- Tính độc lập (isolation): Khi mộ t giao tá c đang thƣ̣ c hiệ n thì cá c giao tá c khá c
không đƣợ c phé p can thiệ p và o quá trì nh thƣ̣ c hiệ n củ a nó (tức là không có tình
huống một phần công việc của giao tác này sẽ làm một phần công việc của giao tác
khác).
- Tính bền vững (durability): Các trạng thái thay đổi sau khi thƣ̣ c hiệ n thà nh công
luôn đƣợ c duy trì.
Hình 1.2 Sơ đồ các trng thái của giao tác
19
Hoạt động của giao tác đƣợc mô tả trong sơ đồ trạng thái ở Hình 1.2. Giao tá c
đƣợ c bắ t đầ u vớ i trạ ng thá i Active với thao tác mở giao tác (onacid), sau đó nó có thể thực
hiệ n các thao tá c đọ c, ghi các mục dữ liệu , kế t thú c thao tá c cuố i cù ng trong giao tá c thì
giao tá c chuyể n tớ i trạ ng thá i Partially Commit (cam kết cục bộ). Ở trạng thái này giao
tác chƣa thực sự hoàn tất hoàn toàn mặc dù nó đã th ực thi hết các thao tác , bở i lẽ kế t quả
đầ u ra củ a nó có thể đƣợ c lƣu trú trên bộ nhớ chí nh , do vậ y khi có mộ t sƣ̣ cố về phầ n
cƣ́ ng (bộ nhớ chính) thì giao tác hoàn toàn có thể bị ngăn cản và dẫn tới hủy bỏ . Trong
tình huố ng thuậ n lợ i không có sƣ̣ cố xả y ra đố i vớ i trạ ng thá i Partially Commit thì giao
tác đi vào trạng thái Commit (hay gọ i là cam kế t ). Tại trạng thái này giao tác đƣợc hoàn
tấ t, kế t quả sẽ đƣợ c bả o toà n và duy trì (thể hiệ n tính bề n vƣ̃ ng). Không phả i bấ t kỳ giao
tác nào cũng thực hiện mà không thể xảy ra sự cố , do vậ y khi xả y ra mộ t sƣ̣ cố là m cho
giao tá c không thể thƣ̣ c hiệ n đƣợ c nƣ̃ a thì khi đó giao tá c sẽ ở trạ ng thá i Failed. Đối với
nhƣ̃ ng trƣờ ng hợ p giao tá c bị Failed để đảm bảo tính nguyên tử và tất cả các dữ liệu đã bị
biế n đổ i trong quá trì nh thƣ̣ c hiệ n cho tớ i thờ i điể m Failed thì giao tác cần phải khôi phục
trạng thái (Rollback) trƣớ c khi khở i độ ng, cuố i củ a quá trình nà y giao tá c đạ t trạ ng thá i
Abort.
1.2.2. Bộ nhớ giao tác phần mềm
Nhƣ chúng ta đã nói ở phần giới thiệu, bộ nhớ giao tác phần mềm, Software
Transactional Memory (viết tắt là STM), đƣợc xem nhƣ một giải pháp viết các chƣơng
trình song song, thay cho cơ chế đồng bộ hóa dựa trên khóa (lock-based synchronization)
đối với việc chia sẻ bộ nhớ đồng thời [12]. Trong đó mỗi giao tác cho phép tự do đọc và
ghi để chia sẻ các biến và một log đƣợc sử dụng để ghi các hoạt động này cho tới thời
điểm commit [15].
Một trong các mô hình giao tác gần đây hỗ trợ tính năng cao cấp nhƣ giao tác lồng
và đa luồng (nested and multi-threaded transactions) đƣợc mô tả trong [10]. Trong mô
hình này, một giao tác đƣợc lồng nếu nó chứa một số các giao tác khác, các giao tác con,
các giao tác con này phải đƣợc commit trƣớc giao tác cha của chúng. Hơn nữa, một giao
tác là multi-threaded khi các luồng đƣợc phép chạy bên trong giao tác và song song với
luồng cha đang thực thi giao tác đó. Các luồng sinh ra bên trong một giao tác sẽ kế thừa
các giao tác đang mở và sao chép bộ nhớ sử dụng của luồng cha của nó. Khi luồng cha
thực hiện commit một giao tác thì tất cả các luồng con phải tham gia commit cùng cha
chúng. Chúng ta gọi các commit của các luồng con và luồng cha cùng tham gia đó là các
joint commit, tại mỗi thời điểm đó gọi là một điểm joint commit. Vì đồng bộ hóa, các
luồng song song bên trong một giao tác không chạy độc lập.
Mỗi giao tác có bản sao bộ nhớ cục bộ của chính nó đƣợc gọi là log để lƣu giữ bộ
nhớ truy cập trong quá trình thực thi. Mỗi luồng có thể thực hiện một số các giao tác và
20
nhƣ thế có thể chứa một số các log. Đặc biệt, một luồng con cũng sẽ lƣu trữ một bản sao
các log của cha nó, vì vậy luồng con cũng có thể đƣợc thực thi độc lập với cha của chúng
ở các thời điểm khác thời điểm joint commit. Ở thời điểm khi tất cả các luồng con và cha
của chúng đồng bộ thông qua các joint commit, các log và bản sao của chúng đƣợc kiểm
tra xem có xung đột tiềm tàng nếu có thì tiến hành thực thi rollback. Một vấn đề phức tạp
hơn cho phân tích tnh là bộ nhớ xác định là hoàn toàn đƣợc sao chép vào trong log cục
bộ, tài nguyên đƣợc sử dụng bởi một chƣơng trình giao tác là khó để đánh giá.
Một ví dụ đƣợc xem nhƣ minh họa cho mô hình giao tác có tích hợp tính năng giao
tác lồng và đa luồng. Cho một đoạn giả mã nhƣ sau:
Hình 1.3 Ví dụ giả mã cho mô hình giao tác lồng và đa luồng [17]
Trong chƣơng trình minh họa ở Hình 1.3, bắt đầu một giao tác với lệnh onacid và
kết thúc giao tác bởi lệnh commit đƣợc ký hiệu bằng [ và ] tƣơng ứng. Lệnh spawn tạo
một luồng mới chạy song song với luồng cha. Luồng mới tạo một bản sao các biến cục bộ
của luồng cha vào trong môi trƣờng của nó. Trong ví dụ của chúng ta khi sinh
1
, luồng
chính Thread 0 đã mở 2 giao tác, vậy Thread 1 thực hiện
1
bên trong 2 giao tác này và
phải thực hiện 2 commit để đóng chúng. Đó là lý do tại sao sau
1
, Thread 1 cần thực thi 2
lệnh commit. Hình 1.4 minh họa rằng các luồng song song phải commit một giao tác ở
cùng một thời điểm.
Hình 1.4 Ví dụ mô hình giao tác lồng, đa luồng và joint[17]
Mô hình của chúng ta bàn đến nó phá v ràng buộc giới hạn về ngữ ngha của ngôn
ngữ đặt ra, giới hạn mà không cho phép các giao tác đƣợc mở bên trong các luồng đã
21
đƣợc sinh ra sau một joint commit với cha chúng, theo [14]. Ở đây chúng ta phát triển một
hệ thống kiểu để đánh giá tnh tổng chi phí bộ nhớ dành cho chƣơng trình bằng số các log
lớn nhất, các log tồn tại ở cùng một thời điểm.
Theo ví dụ, giả sử e
1
mở và đóng 1 giao tác, e
2
mở và đóng 2 giao tác, e
3
mở và
đóng 3 giao tác, e
4
mở và đóng 4 giao tác. Chi phí tài nguyên lớn nhất thể hiện sau khi
sinh e
2
. Ở thời điểm đó, e
1
đóng góp 3 giao tác (2 giao tác kế thừa từ Thread 0, 1 giao tác
của bản thân), e
2
góp 5 giao tác (3 giao tác từ Thread 0 và 2 giao tác là của chính nó), bản
thân Thread 0 đóng góp 3 giao tác. Và tổng sẽ là 3+5+3=11 giao tác.
Nhƣ đã nhấn mạnh, các luồng song song không hoàn toàn là độc lập. Các luồng
con liên kết với luồng cha của chúng thông qua các joint commit ở thời điểm mà một
điểm đồng bộ hóa hoàn toàn. Đây cũng là điểm mới mà hƣớng nghiên cứu xem xét đến để
cải thiện việc tính toán tổng chi phí tài nguyên, làm sao đƣa ra một lƣợng tổng tài nguyên
thực sự sát thực nhất (tức là càng nhỏ càng tốt mà vẫn đáp ứng mọi hoạt động của chƣơng
trình) so với các nghiên cứu trƣớc đó [13]. Thật vậy, ta có thể xét một ví dụ sau:
Ví dụ 1.4 Cho một mô hình giao tác đơn giản nhƣ hình
Hình 1.5 Ví dụ mô hình giao tác thể hiện tính phụ thuc các luồng song song
Áp dụng 1, theo các nghiên cứu trƣớc việc tính toán tài nguyên hoàn toàn dựa trên
các luồng song song độc lập. Với luồng thread1 tài nguyên lớn nhất mà nó sử dụng là ở
thời điểm maxt1 (có giá trị bằng 4). Mặt khác, với luồng thread 2, tài nguyên lớn nhất nó
sử dụng là tại maxt2 (có giá trị bằng 4). Nhƣ vậy, với cách này tổng tài nguyên công lại là
maxt1 + maxt2 = 4+4=8.
Áp dụng 2, theo lý thuyết có suy xét đến sự phụ thuộc các luồng thông qua các
điểm joint commit chúng ta thấy việc cộng dồn trên là hoàn toàn không triệt để và luôn
thu đƣợc con số chƣa đạt mức tối ƣu. Thứ nhất, giả sử nếu luồng thread 2 sử dụng đạt đến
mức độ maxt1 thì khi đó luồng thread 1 vẫn chƣa sử dụng tài nguyên đạt đến mức maxt2
bởi lẽ lúc đó chƣa xảy ra điểm joint commit 1 (cũng có ngha là thread 1 chƣa đóng cả
thao tác commit ở thời điểm joint commit 1). Và nhƣ vậy cả 2 thread 1 và thread 2 vẫn
đang làm việc ở Phân vùng đc lập 1. Nếu ta gọi S
1
là tổng chi phí lớn nhất tại Phân vùng
22
đc lập 1 này thì S
1
= 3+4 =7. Trong đó, thread 1 đóng góp 3 thao tác mở mà chƣa đóng
giao tác, thread 2 đóng góp 4 thao tác mở mà chƣa đóng (2 kế thừa từ cha và 2 của bản
thân trong thời điểm lớn nhất). Thứ hai, nếu giả sử rằng thread 2 sử dụng tài nguyên đạt
đến mức độ maxt2 thì khi đó luồng thread 1 đã qua giai đoạn sử dụng đến mức tối đa, lúc
này nó sử dụng nhỏ hơn (cụ thể là tối đa bằng 2), tức là thread 1 và thread 2 đã đồng loạt
qua giai đoạn sau điểm joint commit 1 và sau điểm joint commit 2 (tức là nằm trong Phân
vùng đc lập 2). Nếu ta gọi S
2
là tổng chi phí tối đa nó phải tiêu tốn thì ta có S
2
= 4+2 =6,
trong đó thread 1 góp 4, thread 2 góp 2. Nhƣ vậy tổng tài nguyên S tổng hợp cho cả mô
hình phải là giá trị lớn nhất của tài nguyên tại các phân vùng độc lập, tức là , S = max(S
1
,
S
2
)=max(7, 6)=7 < 8.
Một điều nhận thấy rằng, kết quả thu đƣợc từ Áp dụng 2 luôn luôn nhỏ hơn Áp
dụng 1, có ngha là con số này nó đã đƣợc tối ƣu. Do đó việc suy xét đến thông tin các
luồng phụ thuộc nhau thông qua các điểm joint commit là rất cần thiết trong việc tính toán
giới hạn trên chi phí tài nguyên cho chƣơng trình và đây cũng thể hiện mặt hạn chế về
phƣơng thức tính toán nhƣ các nghiên cứu trƣớc [13] mà chúng ta đã nói ở trên.
Khó khăn cho phân tích là phải bắt đƣợc các điểm đồng bộ ở thời điểm biên dịch,
khi cú pháp không đƣợc thể hiện r ràng. Hơn nữa, phân tích cần chứa đủ thông tin hợp lệ
để phân tích chi phí tài nguyên một cách tổng thể. Tất cả sẽ đƣợc đáp ứng với hệ thống
kiểu ở Chƣơng 3.
Nói tóm lại, trong Chƣơng 1 chúng ta tìm hiểu một số quan điểm về khái niệm hệ
thống kiểu, các thuộc tính và vai trò của hệ thống kiểu trong ứng dụng sản xuất phần
mềm. Đồng thời chúng ta cũng nghiên cứu vị trí của hệ thống kiểu trong giai đoạn xây
dựng chính thức hóa ngôn ngữ kiểu. Đây cũng là khối kiến thức ban đầu, nền tảng cho các
lý thuyết và thực nghiệm của các chƣơng về sau. Trong chƣơng tiếp theo chúng ta sẽ giới
thiệu cú pháp cũng nhƣ ngữ ngha của ngôn ngữ có sử dụng yếu tố giao tác.
23
CHƢƠNG 2. FEATHERWEIGHT JAVA CÓ GIAO TÁC
Featherweight Java (FJ) là ngôn ngữ Java tối giản để nghiên cứu các tính chất của
Java, nhƣ khai báo lớp, biến, phƣơng thức, khởi tạo đối tƣợng, truy cập phƣơng thức và
trƣờng dữ liệu, cập nhật trƣờng dữ liệu và các phép gán [7, 11]. Transactional
Featherweight Java (TFJ) là ngôn ngữ mở rộng của FJ tích hợp mô hình giao tác phần
mềm [6, 7, 13,17 ]. Khởi đầu của một giao tác trong chƣơng trình TFJ đƣợc đánh dấu bởi
từ khóa và kết thúc bởi từ khóa . Mô hình giao tác của TFJ là khá tổng
quát, nó chứa giao tác lồng, một giao tác có thể chứa một hoặc nhiều giao tác con. Mặt
khác, nó cũng hỗ trợ tính năng đa luồng (multi-thread transaction), một chƣơng trình có
thể đƣợc thực hiện từ việc kết hợp nhiều các luồng, một giao tác có thể chứa các commit
đồng thời. Các luồng của TFJ trong một giao tác cha có thể thực thi đồng thời với các
luồng trong các giao tác con. Để thực thi đầy đủ một giao tác cha, tất cả các luồng con của
nó phải đồng thời thực hiện , nói cách khác, tất cả các luồng trong giao tác cha,
bao gồm cả luồng cha phải tại cùng một thời điểm.
2.1. Cú pháp
Cú pháp của TFJ đƣợc thể hiện trong Bảng 2.1 [17]. Một chƣơng trình P có thể là
rỗng 0 hoặc một luồng hoặc một số của luồng song song, trong đó thành phần song song
đƣợc viết nhƣ . Mỗi một luồng đƣợc ký hiệu là (), với p là định danh và biểu thức
sẽ đƣợc thực thi.
Bảng 2.1 Cú pháp TFJ [17]
= 0
()
Các chƣơng trình
= {
,
}
Định ngha lớp
=
{}
Các phƣơng thức
=
Các giá trị
=
.
. |
| =
| . (
)
|
|
Các biểu thức
Một định ngha cho lớp thể hiện dạng {
,
}, trong đó là tên của lớp,
là danh sách các trƣờng (thừa nhận rằng tất cả
là khác nhau),
mô tả danh sách các
phƣơng thức. Chúng ta thừa nhận rằng tất cả các phƣơng thức đƣợc định ngha trong một
lớp có các tên khác nhau. Kế thừa không đƣợc hỗ trợ trong ngôn ngữ này. Một phƣơng
24
thức đƣợc định ngha =
{} bao gồm tên , danh sách các tham số , thân
phƣơng thức là một biểu thức .
Trong cú pháp, đại diện cho các giá trị có thể là đối tƣợng tham chiếu , biến
hoặc là . Các giá trị là các biểu thức không còn phải định giá trị. Trong tính toán của
chúng ta, chúng ta loại bỏ các giá trị chuẩn không đặc tả nhƣ bool, int hay float.
Cú pháp cuối cùng định ngha một biểu thức. Nó có thể là một giá trị , một truy
cập trƣờng dữ liệu . , một cập nhật trƣờng dữ liệu .
một cấu trúc điều kiện
, một thành phần tuần tự đặc tả bởi cấu trúc LET = , một
lời gọi phƣơng thức . (
), một đối tƣợng khởi tạo (), một luồng đƣợc sinh ra
nhờ (), một giao tác bắt đầu bằng lệnh hoặc kết thúc bởi lệnh .
Bên trong mọi luồng , thực thi các biểu thức () tạo một luồng
để đánh
giá . Việc thực thi của diễn ra bên trong các giao tác lồng nhau giống nhƣ trong khi
thực thi (). Tức là việc thực hiện () làm cho môi trƣờng hiện tại sẽ đƣợc
sao chép vào một luồng mới. Ý ngha biểu thức đƣợc giải thích nhiều ở qui tắc G-
SPAWN của phần ngữ ngha sẽ đƣợc giới thiệu phía dƣới.
Trong biểu thức truy cập trƣờng dữ liệu, là một đối tƣợng tham chiếu, là tên
của một trƣờng trong , . trả về giá trị của trƣờng trong . Biểu thức =
1
2
sẽ nối
1
và
2
để tạo một biểu thức mới, thể hiện tính tuần tự của
1
và
2
.
2.2. Các ngữ ngha
Một chƣơng trình TFJ đƣợc cấu thành từ một hoặc nhiều luồng song song. Ngữ
ngha một chƣơng trình thể hiện cách thức một chƣơng trình sẽ thực thi nhƣ thế nào. Do
đó ta cũng xét ngữ ngha của TFJ trong phạm vi cục bộ (luồng đơn) và phạm vi toàn cục
(tổng thể các luồng song song) đƣợc thể hiện ở Bảng 2.2 và Bảng 2.3 tƣơng ứng [17].
2.2.1. Ngữ ngha cục bộ
Các ngữ ngha cục bộ tƣơng ứng với việc đánh giá một luồng đơn và các giao tác
cục bộ bên trong phạm vi luồng đó. Ngữ ngha sẽ biểu diễn ở dạng ,
,
. và
ở đây là các môi trƣờng cục bộ, trong khi và
là các biểu thức sẽ đƣợc thực thi bởi
luồng, có ngha là một biểu thức đƣợc đánh giá trong môi trƣờng cục bộ E thì nó sẽ
đƣợc chuyển thành một biểu thức
môi trƣờng lúc này sẽ chuyển thành môi trƣờng cục
bộ
. Chúng ta bắt đầu bằng định ngha môi trƣờng cục bộ.
Định nghĩa 1(Local environment – Môi trường cục b)[17]. Mt môi trường cục
b là mt chui tuần tự không lặp
1
:
1
; ;
:
,tức là, chui các cặp nhãn giao
25
tác
và tương ứng
. Chng ta định nghĩa kích thưc của là số các cặp : ,
ký hiệu là
.
Dãy các nhãn và log của giao tác đƣợc sử dụng để biểu diễn cấu trúc lồng. Các
giao tác cuối trong chuỗi đƣợc thực thi sau giao tác đứng trƣớc nó. Do vậy, việc commit
các giao tác đƣợc thực hiện từ phải sang trái và cũng loại bỏ thứ tự tƣơng ứng trong môi
trƣờng cục bộ. Số
đặc tả độ sâu lồng nhau của luồng, tức là số các giao tác đã đƣợc
bắt đầu nhƣng chƣa đƣợc kết thúc.
trong phân tích của chúng ta là lƣợng bộ nhớ hiện
tại xác định dành cho luồng. Một
ch lƣu vết những thay đổi từ bộ nhớ cục bộ của
một luồng đối với giao tác
. đó có thể coi nhƣ bản sao cục bộ.
sẽ đƣợc giải
phóng ngay khi giao tác có nhãn
thực thi xong. Mức cục bộ ch quan tâm đến luồng
hiện tại và chứa các qui tắc (Bảng 2.2) đối với các lệnh đọc, ghi, lời gọi phƣơng thức và
tạo các đối tƣợng mới.
Bảng 2.2 Ngữ nghĩa cục b [17]
, = , |
=
,
2
=
1
=
1
,
1
=
1
2
=
, =
1
2
, =
1
1
, =
1
2
, =
2
2
,
=
;
=
, = .
, =
,
=
;
,
=
, = .
, =
Bốn qui tắc đầu tiên khá dễ hiểu, các luồng tuần tự không làm thay đổi môi trƣờng
cục bộ. R-RED cập nhật môi trƣờng cục bộ và biểu thức khi phép gán = đƣợc thực
thi. R-LET cho chúng ta biết cách để thực thi một cấu trúc lồng . Vì cấu trúc biểu
diễn thành phần tuần tự của các biểu thức, việc đánh giá
2
=
1
=
1
là giống nhƣ đánh giá
1
=
1
2
=
. Các qui tắc R-COND1 và R-
COND2 là khá r ràng; trong đó chúng ta chọn
1
nếu biểu thức điều kiện trả về
ngƣợc lại chọn
2
.
Không giống nhƣ 4 qui tắc đầu, các qui tắc còn lại dùng để truy cập bộ nhớ heap.
Môi trƣờng cục bộ đƣợc tham chiếu tới đối tƣợng và sau đó thay đổi từng bƣớc. Ch có
các log của giao tác bị thay đổi, nhãn giao tác đƣợc bảo toàn, tức là,
đƣợc giữ không
26
thay đổi. Việc truy cập hay cập nhật đƣợc đƣa ra trừu tƣợng bởi các hàm , .
Hàm (, ) đọc tham chiếu , trả về một môi trƣờng mới
và đối tƣợng (
). R-
LOOKUP đọc các thuộc tính của một đối tƣợng. Lập luận cho rằng bảng lớp đƣa ra trong
đó () ch danh sách các trƣờng của lớp . R-UPD bao gồm 2 hàm và
để cập nhật một thuộc tính của đối tƣợng. Hàm (
, ) cập nhật giá trị
của trƣờng thứ của
với giá trị mới
và cũng trả về một môi trƣờng mới
.
2.2.2. Ngữ ngha ton cục
Ở mức toàn cục xét phạm vi ở mức chƣơng trình, tổng hợp một hoặc nhiều các
luồng song song. Ngữ ngha toàn cục sẽ có dạng: ,
,
hoặc ,
trong đó: là môi trƣờng toàn cục và là một tiến trình.
Định ngha 2 (Global environment – Môi trường toàn cục)[17]. Mt môi trường
toàn cục là mt tập các ánh x, vit như :
1
:
1
; ;
:
, từ luồng có tên
ti môi
trường cục b
. Chng ta vit
cho ký hiệu kích thưc của , và
=
=0
.
Nhƣ chúng ta đã thảo luận ở trên mỗi chƣơng trình là tổng hợp các luồng chạy
song song. Mỗi luồng lại đƣợc thực thi một biểu thức trong một môi trƣờng cục bộ
tƣơng ứng. Tập hợp các cặp ràng buộc dạng : bởi các luồng chạy song song đƣợc gọi
là môi trƣờng toàn cục . Ta gọi
thể hiện số các giao tác đồng thời vào một thời điểm
tƣơng ứng với tổng số các giao tác đang mở ở mỗi môi trƣờng cục bộ
.
Tiếp theo chúng ta định ngha lƣợng tài nguyên tiêu thụ thực tế của chƣơng trình.
Định ngha 3 (Tài nguyên tiêu thụ). Cho mt chương trình trng thái của môi
trường toàn cục , tổng tài nguyên thực t của chương trình thời điểm đó là
.
Các bƣớc toàn cục sử dụng một số các hàm truy cập và thay đổi môi trƣờng toàn
cục.
Định ngha 4 (Các thuộc tnh hm). Các thuc tính của các hàm trừu tượng được
đặc tả như sau:
1. Hàm bin đổi từ môi trường cục b sang môi trường toàn cục: nu
,
,
=
và =
1
:
1
; ;
:
;
:
thì
=
1
:
1
; ;
:
;
:
vi
=
.
2. Hàm (,
, ) to mt luồng mi
từ mt luồng cha : Giả sử =
: ;
và
:
và
,
,
=
thì = : ;
:
;
và
=
.
27
3. Hàm (,
, ) m mt giao tác trong luồng
: Nu
,
,
=
cho =
1
:
1
; ;
:
;
:
và cho mt fresh thì
=
1
:
1
; ;
:
;
:
vi
=
; : và vì vậy
=
+ 1
4. Hàm (, ) trả về mt tập các luồng hiện thời có cùng giao tác : Giả
sử =
; : vi = ; : và
,
= thì:
(a) và
(b) cho mọi
chúng ta có = ;
:
;
:
;
(c) cho mọi luồng
vi
và trong đó = ;
:
;
:
;
chúng ta có
5. Hàm đóng mt giao tác. Chú ý rằng, ảnh hưng của mt giao tác có
thể được sao chép vào trong mọi luồng thông qua hàm , vì vậy khi giao tác
này đóng, tt cả các luồng chứa trong nó phải đồng thời xảy ra qua các joint
commit: Nu ,
, =
cho = ;
:
; ;
:
; và cho
= (, ),
,
thì = ;
:
; ;
:
; vi
=
1 và
=
.
Bảng 2.3 Ngữ nghĩa toàn cục [17]
, =
;
: ( ,
, ) =
, ()
, (
)
(,
, ) =
, ( =
1
2
)
, ( =
2
) (
1
)
(,
, ) =
, ( = )
, ( = )
= ; : = ; : ;
,
= =
1
,
, =
,
1
=
1
=
,
1
=
1
( =
)
=
; :
= 0
,
=
Hàm sản sinh một hành động thực hiện làm các luồng khác thực thi trong
giao tác hiện tại.