.1 Mô tả hai thành phần # liền kề

Một phần của tài liệu (LUẬN văn THẠC sĩ) 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 (Trang 30)

Qui tắc 4.+m #l −n ⇓ +(m-𝜇) #(l+𝜇) (n-𝜇) và +m −n ⇓ +(m-𝜇) #𝜇 (n-𝜇) trong đó 𝜇= 𝑚𝑖𝑛⁡(𝑚,𝑛).

33

Qui tắc này thực hiện tăng số các giao tác đã đƣợc đóng khi có nhiều các cặp đóng mở (các cặp này đƣợc thể hiện bởi +m −n ) bao ngoài các giao tác đƣợc đóng hiện tại (nhƣ #l). Nó cũng giải thích cách thành phần # đƣợc chuẩn hóa (các thành phần này cũng đƣợc chuẩn hóa khi chúng ta áp dụng thao tác gộp đƣợc thể hiện trong Định nghĩa 10).

Ví dụ 3.5 Áp dụng qui tắc cho chuỗi “ +1 −1” chúng ta có: +1 −1 ⇓ +(1-1) #1−(1-1)⇓ #1

+1 và 1 trong chuỗi ban đầu thể hiện quá trình đóng mở tƣơng ứng của một giao tác. Khi chúng ta xử lý chúng, #1 đƣợc tạo thảnh. Nói cách khác #1 chỉ là rút gọn của

+11.

Ví dụ 3.6 Một ví dụ khác:

+1+1 −1 −1 ⇓ +1 #1 −1⇓ #2

Trong ví dụ này, chúng ta có thể nhận thấy rằng chuỗi thể hiện 2 giao tác lồng nhau. Giao tác thứ 2 là đƣợc mở bên trong giao tác thứ nhất. Thứ tự này đƣợc thể hiện bởi

+

1+1. Chúng ta thực hiện rút gọn +1 thứ hai với 1 thứ nhất, bởi theo ngữ nghĩa mới địa phƣơng của TFJ một lệnh commit sẽ đóng giao tác mở muộn nhất (bên phải trong nhất).

Qui tắc 5. +m #l ¬n+(m-1)#(l+𝑛)

Các thành phần ¬ thể hiện hành vi joint commit, cũng mô tả số các luồng bên trong một giao tác mở muộn nhất. Mỗi một luồng sẽ đƣợc sinh ra bên trong một giao tác nó sẽ thực hiện sao chép giao tác đang mở mà chƣa đóng vào trong môi trƣờng cục bộ của nó. Giao tác nhƣ vậy khi đóng sẽ đóng góp số các luồng cùng tham gia của nó vào giá trị lớn nhất. Đó là lý do tại sao chúng ta kết hợp ¬n với +1 của +m để tạo #n và tổng #n với #l. Sự thành lập các thành phần + và – là khá rõ ràng (tức là +1 thể hiện lệnh onacid, 1 thể hiện lệnh commit ).

Ví dụ 3.7: Rút ngắn chuỗi +2#3¬2

Trong ví dụ này, ta có thể hình dung chuỗi +2#3¬2 là một phân đoạn OM trong mô hình giao tác có 2 luồng (thread 1thread 2 có 2 điểm joint commit M và N) nhƣ Hình 3.2 sau:

34

Hình 3.2 Minh họa ý nghĩa thành phần ¬

Theo hình ta chuỗi +2#3¬2 biểu diễn cho phân vùng từ O tới M (điểm joint commit 1). Trong đó phân vùng OA có trị số +2 mở 2 giao tác; phân vùng AB thực thi độc lập đóng mở 1 giao tác trên thread 1 và đóng mở 2 giao tác trên thread 2 luôn luôn có tổng trị số là một thành phần # (ở đây là #3); phân vùng BM chỉ thực hiện hành vi cùng đóng giao tác đang mở sau nhất ở phân vùng OA. Do vậy, thành phần trong chuỗi ¬2 thể hiện 2 thao tác đóng cho một giao ở phân vùng OA, khi loại trừ nó nó sẽ tích lũy thêm vào thành phần # trong chuỗi trị số 2 đơn vị (tức là # (3+2)= #5) và giảm trừ thành phần + trong chuỗi trị số 1 đơn vị (tức là +(2-1)= +1). Theo đó ta có thể rút gọn chuỗi nhƣ sau +2#3¬2 ⇓ +1 #5.

Hoàn toàn có thể hiểu một cách tổng quát với thành phần ¬ theo phƣơng pháp này với các trƣờng hợp phức tạp có nhiều luồng song song nhau. Ta sẽ gặp lại thành phần ¬ và nghĩa của thành phần này sẽ giải thích rõ hơn trong Định nghĩa 10 về phép toán gộp.

Hai chuỗi là tƣơng đƣơng nếu chuỗi chuẩn tắc của chúng trùng nhau.

Đinh nghĩa 8 (Chuỗi tương đương)[17]. Hai chuỗi số có dấu S1 và S2 là tương đương, ký hiệu S1 S2, khi và chỉ khi chúng có thể rút gọn về cùng một chuỗi chuẩn tắc.

Để thể hiện các hành vi giao tác toàn cục, chúng ta cần một vài cấu trúc và các phép toán rút gọn tƣơng ứng. Phép toán đầu tiên, ⊕ đƣợc sử dụng tính tổng 2 chuỗi.

Định nghĩa 9 (Phép toán cộng)[17].Cho 2 chuỗi có dấu S1 = s1…sk và S2 = t1…tk giả sử rằng sign(S1) = sign (S2), phép toán cộng được định nghĩa như sau: S1S2 =

𝑢1… 𝑢𝑘 trong đó 𝑢𝑖=sign(si)( 𝑠𝑖 +𝑡𝑖).

Nhƣ minh họa Hình 1.4 chúng ta cần xác định các điểm joint commit và tổng số tài nguyên tối đa (hay các thành phần #) cho mỗi đoạn joint commit. Chú ý rằng trong biểu thức 𝑠𝑝𝑎𝑤𝑛 𝑒1 ;𝑒2 chúng ta cần định kiểu 𝑒1 trƣớc tiên và nếu một joint commit là cần

35

thiết thì kiểu S1 của 𝑒1 sẽ chứa ít nhất một s với dấu – hoặc ¬. Nhƣng 𝑒1 có thể song song với chuỗi tuần tự 𝑒2 và 𝑒3 (ví dụ, 𝑠𝑝𝑎𝑤𝑛 𝑒1 ;𝑒2;𝑒3), đối với một vài 𝑒3, vậy định kiểu

S2 của 𝑒2 có thể không chứa một s nào với dấu – hoặc ¬, bởi joint commit có thể xuất hiện ở 𝑒3. Phép toán tích sau đây đƣa ra biểu thức kiểu dạng 𝑠𝑝𝑎𝑤𝑛 𝑒1 ;𝑒2.

Định nghĩa 10 (Phép toán gộp)[17]. Giả sử 𝑆1 = 𝑠1… 𝑠𝑘1𝑆2 = 𝑡1… 𝑡𝑘2 là 2 chuỗi chuẩn tắc. Giả sử rằng h1, h2 là 2 chỉ số nhỏ nhất mà 𝑠𝑖𝑔𝑛 𝑠𝑕1 ,𝑠𝑖𝑔𝑛 𝑡𝑕2 ∈ −, ¬ và chúng là 0 nếu các thành phần đó không tồn tại. Đặt 𝜎 = 𝑠𝑖𝑔𝑛(𝑠𝑕1𝑡𝑕2), 𝑛1 = 𝑠𝑕1 , 𝑛2 = 𝑡𝑕2 . Phép toán gộp, ký hiệu S1S2, được định nghĩa đệ qui như sau:

S1S2= ∅𝑛ế𝑢𝑆1 =𝑆2 =∅ 𝑆1⊕ 𝑆2𝑛ế𝑢𝑆𝑖 = #𝑛 đố𝑖𝑣ớ𝑖𝑖 = 1,2 𝑛 # 𝑛ế𝑢 𝑆1 = ∅ 𝑆1 = #𝑛 𝑆1 = #𝑛 𝑆1 =∅ 𝑆1⊗ 𝑆2𝑛ế𝑢𝑕1 > 0 𝑕2 = 0 𝑆¬ 1 +𝑛2 (−(𝑛1−1)𝑆1′ ⊗ 𝑆2′) 𝑛ế𝑢𝜎= −¬ 𝑆¬ 𝑛1+ 1 𝑆1′ ⊗ − 𝑛1−1 𝑆2′ 𝑛ế𝑢𝜎= ¬− 𝑆¬2(− 𝑛1−1 𝑆1′⨂− 𝑛2−1 𝑆2′) 𝑛ế𝑢𝜎= − − 𝑆¬ 𝑠𝑕1 + 𝑡𝑕2 𝑆1′⨂𝑆2′ 𝑣ớ𝑖𝑐á𝑐𝜎𝑘𝑕á𝑐 Trong đó 𝑆 =𝑠′⨁𝑡′ với:

𝑠′ =𝑠𝑕1−1 nếu 𝑕1 > 1 và 𝑠′ = #0 trong trƣờng hợp còn lại.

Tƣơng tự, 𝑡′ =𝑡𝑕2−1 nếu 𝑕2 > 1 và 𝑡′ = #0 trong trƣờng hợp còn lại. Và 𝑆1′ =𝑠𝑕1+1… 𝑠𝑛 và 𝑆2′ =𝑡𝑕2+1… 𝑡𝑚

Trong trƣờng hợp thứ 3, trong đó 𝑕1 > 0 𝑕2 = 0 , 𝑆1 sẽ chứa một vài joint commit, nhƣng 𝑆2 thì không; chúng ta để nguyên 2 chuỗi chƣa thể gộp. Sẽ không có trƣờng hợp rằng 𝑕1 = 0 𝑕2 > 0 (hoặc nếu trƣờng hợp này thể hiện, hệ thống cần đƣợc đƣa ra lỗi để xác định rằng biểu thức không thể đƣợc định kiểu, tức là không well-formed), bởi vì 𝑕2 > 0 thể hiện rằng các joint commit là cần thiết, nhƣng 𝑕1 = 0 thể hiện rằng 𝑆1 không chứa bất cứ joint commit nào, theo ngữ nghĩa của TFJ. Chú ý rằng chúng ta đang xét biểu thức 𝑠𝑝𝑎𝑤𝑛 𝑒1 ;𝑒2;𝑒3 và 𝑆1là kiểu của 𝑒1. Vậy, nếu các joint commit là cần thiết, 𝑆1 luôn phải chứa đủ các commit nhƣ vậy, bởi vì bên trong toán tử 𝑠𝑝𝑎𝑤𝑛, chúng ta không có biểu thức nào khác sau 𝑒1.

Với định nghĩa này, chúng ta xem rằng các thành phần ¬ thể hiện các joint commit

đối với giao tác đƣợc mở muộn nhất. Giá trị của một thành phần ¬ là số các joint commit, tƣơng ứng với số luồng trong giao tác đó và mỗi luồng trong giao tác sẽ làm tăng tổng tài nguyên lên 1. 𝑠𝑕1 và 𝑡𝑕2 xác định điểm joint commit đầu tiên biểu diễn bởi hai chuỗi. Mỗi

36

một thành phần ¬ (trong 4 trƣờng hợp cuối của phép toán gộp). Nó là rõ ràng, chỉ 1 và

¬

n hoặc ¬n1¬n2 có thể đƣợc gộp để thể hiện các joint commit mới trong các biểu thức của thành phần ¬. Đó là lý do tại sao chúng ta chỉ lấy từ 1 đến –n1 hoặc –n2 để tạo các thành phần ¬.

Nhƣ đã nói, phép toán gộp sẽ giải thích một cách khác từ việc tạo thành phần #. Trong định nghĩa của phép toán này, tƣơng ứng thứ tự thành phần # bởi các điểm joint commit đƣợc đƣợc tính tổng bởi phép toán ⨁. Trong thực tế, cho đến thời điểm joint commit thì các luồng song song đƣợc chạy hoàn toàn độc lập. Chúng chỉ chờ và đồng bộ ở các thời điểm joint commit. Vì vậy chúng ta cần tổng các thành phần # tƣơng ứng trong các đoạn của các chuỗi xác định bởi các điểm đồng bộ để thể hiện số lớn nhất của các giao tác đồng thời. Ví dụ 3.8 (#3−2) ⨂ (#5−4#8 −1 )≅ (#3⨁#5) ¬2(−1⨂( #8 −1) ) ≅#8¬2(#0⨁#8) ¬2(∅⨂∅)≅#8¬2#8¬2. Ví dụ 3.9 (#3−2#2) ⨂ (#5¬3#8 −1 )≅ (#3⨁#5) ¬(1+3)((−1#2)⨂( #8 −1) ) ≅#8¬4(#0⨁#8) ¬2(#2⨂∅) ≅ ≅#8¬4#8 ¬2#2.

Phép toán gộp tìm các điểm joint commit từ trái qua phải của các chuỗi. Cho ví dụ, nếu S1 có các joint commit, nhƣng S2 không chứa các joint commit nhƣ vậy, thì phép toán gộp giữ nguyên 2 chuỗi không gộp và chờ cho các joint commit khác ở các biểu thức khác (ví dụ nhƣ trong 𝑒3). Vì vậy chúng ta cần một qui tắc cho phép toán gộp đến mức các

joint commit xa hơn có thể tham gia vào phép gộp không đầy đủ.

Định nghĩa 11 (Phép gộp mở rộng)[17]. Cho S1, S2 và S3 là các chuỗi số có dấu chuẩn tắc, thì 𝑆1⨂𝑆2 𝑆3 =𝑆1⨂(𝑆2𝑆3).

Một cú pháp lựa chọn nếu thỏa mãn một điều kiện logic nào đó thì thực thi chuỗi hành vi này ngƣợc lại thì thực thi chuỗi hành vi khác cũng cần đƣợc định kiểu khi mô tả dựa trên chuỗi số có dấu. Đề xuất cho cú pháp điều kiện 𝑖𝑓𝑣𝑡𝑕𝑒𝑛𝑒1𝑒𝑙𝑠𝑒𝑒2 nhƣ vậy chúng ta cần một phép toán đơn giản nhƣng yêu cầu rằng các hành vi giao tác bên ngoài của 𝑒1 và 𝑒2 là nhƣ nhau – kết quả cuối cùng của chúng sẽ là giá trị lớn nhất.

Định nghĩa 12 (Phép chọn)[17].Cho 𝑆1 = 𝑠1… 𝑠𝑛𝑆2 = 𝑡1… 𝑡𝑚 là 2 chuỗi chuẩn tắc và giả sử rằng h1, h2 là các chỉ số nhỏ nhất mà 𝑠𝑖𝑔𝑛 𝑠𝑕1 ,𝑠𝑖𝑔𝑛 𝑡𝑕2 ∈

+,−, ¬ và chúng là 0 nếu các thành phần đó không tồn tại. Phép toán chọn, ký hiệu

37

𝑆1⨀𝑆2=

#𝑙𝑛ế𝑢 (𝑆1 = #𝑙 ∧ 𝑆2 = ∅)(𝑆1 = ∅ ∧ 𝑆2 = #𝑙)

#max 𝑙1,𝑙2 𝑛ế𝑢𝑆1 = #𝑙1 ∧ 𝑆2 = #𝑙2

#max 𝑚,𝑛 𝑠𝑕1 𝑆1⨀𝑆2 , 𝑡𝑟ườ𝑛𝑔𝑕𝑝𝑘𝑕á𝑐

Trong đó 𝑚 = 𝑠𝑕1−1 nếu 𝑕1 > 1 và 𝑚 = 0 với trường hợp khác, và tương tự 𝑛 = 𝑡𝑕2−1 nếu 𝑕2 > 1 và 𝑛 = 0 với trường hợp khác, và 𝑆1′ = 𝑠𝑕1+1 … 𝑠𝑛, 𝑆2′ =

𝑡𝑕3+1 … 𝑠𝑚.

Bởi vì 𝑒1 và 𝑒2 trong 𝑖𝑓𝑣𝑡𝑕𝑒𝑛𝑒1 𝑒𝑙𝑠𝑒𝑒2 phải có các hành xử giao tác bên ngoài giống nhau, nếu 𝑠𝑕1và 𝑡𝑕2 tồn tại, thì 𝑠𝑖𝑔𝑛 𝑠𝑕1 = 𝑠𝑖𝑔𝑛 𝑡𝑕2 và 𝑠𝑕1 = 𝑡𝑕2 . Trong trƣờng hợp cuối của phép toán, chúng ta chọn giá trị lớn hơn giữa mn với dấu # (nhƣ

#𝑚𝑎𝑥 𝑚,𝑛 ). Tƣơng tự, áp dụng cho 2 trƣờng hợp đầu tiên. Đảm bảo rằng kiểu của câu điều kiện sẽ phản ánh giá trị lớn hơn của tài nguyên tiêu thụ so với một trong những giá trị của 𝑆1 và 𝑆2.#𝑚𝑎𝑥 𝑚,𝑛 có nghĩa là phép toán chọn số lớn nhất từ các thành phần # tƣơng ứng của hai chuỗi liên kết bởi các điểm joint commit.

Ví dụ 3.10: Nếu 𝑆1= −2¬3#4 và 𝑆2= #2−2#4 ¬3#5 thì 𝑆1⨀𝑆2 = #2−2#4 ¬3#5

Trong một chƣơng trình là tổng hợp từ một vài thành phần của các luồng chạy song song độc lập không có joint commit nào chúng ta cần một phép toán có thể biểu diễn kiểu của chƣơng trình phép toán song song, ký hiệu ∥.

Định nghĩa 13 (Phép song song)[17].Nếu S1=#m và S2 =#n thì S1S2=#(m+n).

Chúng ta định nghĩa một hàm, tìm tổng tài nguyên chi phí lớn nhất bởi chuỗi số có dấu chính tắc.

Định nghĩa 14 (Tổng tài nguyên). Cho một chuỗi số có dấu dấu chính tắc 𝑆 = 𝑠1… 𝑠𝑛, giá sử i là chỉ số nhỏ nhất sao cho sign(si) {+,#}, và nó là 0 nếu các thành phần như vậy không tồn tại. Hàm total(S) được định nghĩa qui nạp như sau:

𝑡𝑜𝑡𝑎𝑙(𝑆)=

0 𝑛ế𝑢𝑆= ∅ ∨ 𝑖 = 0 𝑚𝑎𝑥 𝑠𝑖 +𝑚,𝑡𝑜𝑡𝑎𝑙 𝑆 𝑛ế𝑢𝑠𝑖𝑔𝑛 𝑠𝑖 = + 𝑚𝑎𝑥 𝑠𝑖 ,𝑡𝑜𝑡𝑎𝑙 𝑠𝑖+1… 𝑠𝑛 ,𝑡𝑟ườ𝑛𝑔𝑕𝑝𝑘𝑕á𝑐

Trong đó 𝑚 = 𝑠𝑖+1 , 𝑆′ =𝑠𝑖+2… 𝑠𝑛 nếu 𝑖 <𝑛 ∧ 𝑠𝑖𝑔𝑛 𝑠𝑖+1 = #; trường hợp

khác 𝑚 = 0,𝑆′ =𝑠𝑖+1… 𝑠𝑛.

Cho ví dụ, 𝑡𝑜𝑡𝑎𝑙( 2+ #4 1+ #4+3) = 𝑚𝑎𝑥 2 + 4, 1 + 4, 3 + 0, 0 = 6).𝑡𝑜𝑡𝑎𝑙(𝑆) sẽ trả về tổng tài nguyên tiêu thụ lớn nhất thể hiện bởi S bởi vì một vài lý do sau. Đầu tiên, khi lệnh onacid (tƣơng ứng +1) đƣợc thực hiện, lƣợng bộ nhớ cấp phát sẽ đƣợc tăng lên 1 (bắt

38

nguyên cấp phát sẽ tăng lên n. Dựa vào định nghĩa tƣơng đƣơng, chúng ta có : #n +n−n. Việc thực thi #n nhƣ vậy sẽ tiêu thụ tối đa n giao tác. Tiêu thụ lớn nhất thể hiện trực tiếp trƣớc khi thực thi –n (nhƣ n lệnh commit) bởi việc chạy 1 lệnh commit sẽ đóng giao tác hiện thời, kích thƣớc của bộ nhớ giảm đi 1. Thứ hai, giả sử một chuỗi chính tắc chứa thành phần dạng: +m#n+m+n−n≅+(m+n)−n. Việc thực thi thành phần nhƣ vậy cũng tiêu tốn tối đa m+n giao tác. Tiêu thụ tối đa của một chuỗi chính tắc sẽ đƣợc chọn từ tiêu tốn tối đa cục bộ.

3.2. Các qui tắc kiểu

Bây giờ chúng ta định nghĩa các kiểu cho mọi thành phần.

Định nghĩa 15 (Kiểu)[17]. Cho T là kiểu của một thành phần thì T= S| TT |𝑇𝑝| TT| TT | T T.

Thật vậy, mỗi một thành phần có thể là một chuỗi số đánh dấu S hay tổng hợp từ các thành phần khác nhau và mỗi thành phần đó lại có kiểu riêng của nó . TT tạo một thành phần tuần tự từ 2 kiểu. Thành phần với kiểu 𝑇𝑝 sẽ đƣợc thực hiện trong một luồng song song với luồng sinh ra nó. TT, TT, T T có cùng nghĩa với các phép toán chọn, phép toán gộp và phép toán song song. Khi các T thỏa mãn các điều kiện của phép toán, chúng ta có thể áp dụng nó và tính toán kết quả cuối cùng. Mặt khác, chúng ta chỉ bỏ biểu thức không tính toán đƣợc.

Khi hai biểu thức là tuần tự, kiểu của nó cũng sẽ là tuần tự. Cho ví dụ, giả sử 𝑒1 có kiểu 𝑇1 và 𝑒2 có kiểu 𝑇2, thì 𝑒1;𝑒2 có kiểu 𝑇1𝑇2. Nhƣng 𝑒1có thể kết thúc với một vài biểu thức 𝑠𝑝𝑎𝑤𝑛, có nghĩa là 𝑇1 =𝑇𝑆𝑝. Biểu thức mà kiểu của nó là S sẽ chạy song song với luồng chính. Khi kiểu của nó đƣợc kết hợp với 𝑇2, chúng ta cần dùng phép toán gộp. Vậy, chúng ta cần một qui tắc đề cập vấn đề đó.

3.2.1. Qui tắc cục bộ

Tại mức cục bộ [17], các đánh giá kiểu có dạng: 𝐸 ⊢ 𝑒:𝑇

Trong đó T biểu diễn kiểu của biểu thức e; E là môi trƣờng cục bộ. T ở đây giữ thông tin về chi phí tài nguyên của e trong các thành phần bằng số các giao tác đồng thời ở bất kỳ thời điểm nào.

Các qui tắc rút gọn cục bộ cho các biểu thức bằng hệ thống kiểu của chúng ta đƣợc thể hiện ở Bảng 3.1 thông qua các qui tắc:

39

Qui tắc T-ONACID và T-COMMIT đƣợc sử dụng để định kiểu các biểu thức

onacidcommit tƣơng ứng, onacid mở một giao tác sẽ có kiểu +1, commit với kiểu −1 đóng giao tác đƣợc mở gần nhất.

T-LET1 và T-LET2 thể hiện thành phần tuần tự của 𝑒1 và 𝑒2. Khi hai biểu thức là tuần tự, kiểu của nó cũng sẽ là tuần tự. Giả sử 𝑒1 có kiểu 𝑇1 và 𝑒2 có kiểu 𝑇2, trong đó 𝑇1 ở dạng không có spawn thì 𝑒1;𝑒2 có kiểu 𝑇1𝑇2 tƣơng ứng với T-LET1. Nhƣng 𝑒1có thể kết thúc với một vài biểu thức 𝑠𝑝𝑎𝑤𝑛, có nghĩa là 𝑒1 có kiểu 𝑇1𝑝. Khi kiểu của nó đƣợc kết hợp với 𝑇2, chúng ta cần dùng phép toán gộp để tính kiểu của chuỗi tuần tự 𝑒1;𝑒2 và nó sẽ có dạng 𝑇1⊗ 𝑇2.

Qui tắc T-SPAWN định kiểu 1 thành phần dạng spawn(e). Nếu e có kiểu S hoặc 𝑆𝜌

thì spawn(e) sẽ có kiểu 𝑆𝜌. Ở đây, ký hiệu 𝜌 đƣợc sử dụng để chỉ rằng các luồng hiện tại đang chạy song song với luồng cha.

Qui tắc T-COND cho ta thấy rằng, câu điều kiện 𝑖𝑓𝑣𝑡𝑕𝑒𝑛𝑒1 𝑒𝑙𝑠𝑒𝑒2, khi 𝑒1 và 𝑒2 có kiểu 𝑇1 và 𝑇2 tƣơng ứng đƣợc thể hiện bởi qui tắc T-COND thì câu điều kiện sẽ có kiểu 𝑇1⨀𝑇2.

Qui tắc T-CALL nói rằng, nếu một phƣơng thức đƣợc thực hiện trong môi trƣờng

Một phần của tài liệu (LUẬN văn THẠC sĩ) 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 (Trang 30)