- TLA+ là một ngôn ngữ để mô hình hóa phần mềm ở mức cao hơn mức mã nguồn, và mô hình hóa phần cứng ở mức cao hơn mức mạch
- Cung cấp môi trường phát triển tích hợp (IDE) để viết và kiểm tra mô hình
- Công cụ được các kỹ sư dùng nhiều nhất là bộ kiểm tra mô hình TLC, ngoài ra cũng có bộ kiểm tra chứng minh
- TLA+ dựa trên toán học và không giống với bất kỳ ngôn ngữ lập trình nào
- Với đa số kỹ sư, bắt đầu bằng PlusCal thường dễ hơn là đi thẳng vào TLA+
- Mô hình TLA+ thường được gọi là "đặc tả (Specification)". Trong phần giới thiệu dưới đây, chúng được gọi là
mô hình
PlusCal
- PlusCal là ngôn ngữ để viết thuật toán, đặc biệt là các thuật toán song song và phân tán
- Được dùng để viết thuật toán bằng mã chính xác, có thể kiểm thử, thay vì mã giả
- Trông giống một ngôn ngữ lập trình đơn giản, đồng thời cung cấp cấu trúc để biểu diễn tính đồng thời và tính bất định
- Có tính biểu đạt rất cao vì có thể dùng công thức toán học làm biểu thức
- Thuật toán PlusCal được chuyển thành mô hình TLA+ và có thể được xác minh bằng các công cụ TLA+
- Vì trông giống ngôn ngữ lập trình nên dễ học hơn, nhưng để cấu trúc các mô hình phức tạp thì TLA+ phù hợp hơn
Mô hình là gì
- Máy tính và mạng tuân theo các quy luật vật lý liên tục, nhưng việc mô hình hóa hành vi của chúng như một tập hợp các sự kiện rời rạc là tự nhiên hơn
- Không có mô hình nào mô tả hoàn hảo hệ thống thực, mô hình chỉ mô tả một số khía cạnh của hệ thống phục vụ cho một mục đích cụ thể
- TLA+ là ngôn ngữ mô hình hóa dựa trên trạng thái, biểu diễn việc thực thi của hệ thống dưới dạng một chuỗi các trạng thái
- Sự kiện được biểu diễn bằng một cặp hai trạng thái liên tiếp, gọi là một 'bước' (step)
- Hệ thống được mô hình hóa như một tập hợp các hành vi mô tả mọi cách thực thi có thể xảy ra
Mô hình hóa vượt trên mức mã nguồn
- TLA+ được dùng để mô hình hóa hệ thống ở mức cao hơn mức mã nguồn
- Ví dụ, thuật toán Euclid có thể được mô tả như một quy trình tính ước chung lớn nhất (GCD), chứ không phải như mã
- Đặt biến x thành M, y thành N
- Lặp đi lặp lại việc trừ giá trị nhỏ hơn khỏi giá trị lớn hơn giữa x và y
- Lặp cho đến khi x và y bằng nhau, và giá trị đó chính là GCD
- Cách mô tả này bỏ qua các chi tiết như kiểu biến hay xử lý ngoại lệ, và chỉ thể hiện ý tưởng cốt lõi của thuật toán
- Nếu chỉ tập trung vào việc viết mã thì rất khó tìm ra thuật toán tốt → cần tư duy trừu tượng
- Phần lớn lập trình viên bắt đầu viết mã mà không có mô hình mức cao, và điều này dẫn đến lỗi thiết kế
- TLA+ là ngôn ngữ mô hình mức cao có thể mô tả rõ ràng hành vi và cách thức vận hành của mã
- Hệ thống càng phức tạp thì việc đơn giản hóa càng quan trọng, và điều này đạt được bằng tư duy ở cấp độ cao chứ không phải kỹ thuật viết mã
- Trong một dự án công nghiệp, đã có trường hợp mô hình hóa bằng TLA+ giúp giảm kích thước mã của hệ điều hành thời gian thực xuống còn một phần mười
- Mô hình hóa rất hiệu quả trong việc phát hiện lỗi thiết kế từ sớm, và đáng tin cậy hơn so với kiểm thử hoặc sửa mã
Mô hình hóa hệ thống song song
- Hệ thống song song gồm nhiều thành phần (tiến trình) hoạt động đồng thời
- Hệ thống phân tán gồm các tiến trình tách biệt về mặt không gian giao tiếp với nhau qua thông điệp
- TLA+ mô hình hóa toàn bộ trạng thái của hệ thống như một trạng thái toàn cục
- Theo hơn 40 năm kinh nghiệm, mô hình hóa hệ thống phân tán dựa trên trạng thái toàn cục là cách hữu ích nhất nói chung
Máy trạng thái (State Machine)
- TLA+ định nghĩa tập hợp hành vi bằng hai yếu tố sau:
- Điều kiện khởi đầu: chỉ định các trạng thái bắt đầu có thể có
- Quan hệ trạng thái kế tiếp: chỉ định các bước có thể xảy ra (các cặp trạng thái liên tiếp)
- Tập hợp các hành vi thỏa hai điều kiện này chính là mô hình
- Kiểu mô hình này được gọi là máy trạng thái (state machine)
- Máy trạng thái hữu hạn (finite-state machine) là máy trạng thái có số lượng trạng thái hữu hạn
- Máy Turing là một ví dụ của máy trạng thái; với máy Turing tất định, mỗi trạng thái có nhiều nhất một trạng thái kế tiếp
- Cách thực tiễn để mô tả chính xác ngữ nghĩa của ngôn ngữ lập trình là ngữ nghĩa thao tác, tức chuyển nó thành máy trạng thái
- Hành động trạng thái kế tiếp chỉ chỉ định các bước có thể xảy ra, không có nghĩa là chúng nhất thiết phải xảy ra
- Muốn chỉ rõ rằng một bước bắt buộc phải xảy ra thì cần thêm điều kiện công bằng (fairness property)
- Ngay cả khi không có công bằng vẫn đủ để tìm lỗi do thực hiện sai (commission), nhưng sẽ không phát hiện được lỗi do bỏ sót (omission)
- Trong đa số trường hợp, lỗi commission phổ biến hơn, và người mới nên bắt đầu bằng việc viết điều kiện khởi đầu và quan hệ trạng thái kế tiếp
Kiểm chứng thuộc tính
- Mô hình được viết ra để kiểm tra xem hệ thống có hoạt động như mong muốn hay không
- Có thể dùng công cụ TLA+ để kiểm chứng liệu mô hình có thỏa một thuộc tính nhất định trên mọi hành vi có thể hay không
- Ví dụ: dù hành vi kết thúc bình thường ở 99% trạng thái khởi đầu, vẫn cần kiểm chứng rằng mọi hành vi đều phải kết thúc bình thường
- Thuộc tính phổ biến nhất là bất biến (invariance property), tức luôn phải đúng ở mọi trạng thái
- Với mô hình có điều kiện công bằng, cũng cần kiểm chứng thuộc tính sống (liveness property) → ví dụ: việc thực thi nhất định sẽ kết thúc
- Các thuộc tính phức tạp hơn có thể được biểu diễn bằng máy trạng thái, và có thể kiểm chứng xem một máy trạng thái khác có triển khai chúng hay không
- Trong TLA+, không có sự phân biệt hình thức giữa máy trạng thái và thuộc tính; cả hai đều được biểu diễn giống nhau bằng công thức toán học
- Việc một máy trạng thái triển khai một máy trạng thái khác có nghĩa là công thức tương ứng được bao hàm về mặt logic
- Trên thực tế, đa số chỉ kiểm tra bất biến và các thuộc tính sống đơn giản, nhưng hiểu các khái niệm phức tạp hơn cũng giúp ngăn ngừa lỗi mã
Bản thân ngôn ngữ TLA+
- TLA+ là ngôn ngữ dựa trên toán học và không trông giống ngôn ngữ lập trình
- Lập trình viên quen với biểu đạt của ngôn ngữ lập trình hơn là ký pháp toán học, nên lúc đầu có thể thấy khó
- Nhưng trên thực tế, toán học có khả năng biểu đạt tốt hơn ngôn ngữ lập trình
- Ví dụ: có thể định nghĩa GCD là số nguyên dương lớn nhất chia hết cho cả hai số (có thể bỏ qua cách tính)
- Định nghĩa toán học có thể giữ lại đúng phần cốt lõi cần cho mục đích, đồng thời trừu tượng hóa các chi tiết triển khai không cần thiết
- Việc thủ tục hóa không cung cấp sự trừu tượng, mà chỉ giấu mã ở một vị trí khác
- PlusCal phù hợp để nhập môn TLA+, và ngay cả người dùng thành thạo cũng thích PlusCal cho các mô hình đơn giản
- Nhưng để tư duy theo hướng toán học và mô hình hóa ở mức cao, việc học chính TLA+ là điều quan trọng
3 bình luận
https://cacm.acm.org/research/… Ở AWS cũng dùng rất hiệu quả.
Viết code không phải là lập trình
Vì bài viết đó có nhắc đến nên tôi đã tìm thử.
Tôi cũng mới thấy nó lần đầu trong bài viết này nên đã tìm thử.