Những người khác đã áp dụng DAG cho dữ liệu, nhưng tôi nghĩ rằng nó ít nhất là có thể áp dụng (nếu không muốn nói là như vậy) cho mã. Mahbubur R Aaman đề cập đến điều này, vì vậy thực sự đây là phần phụ lục cho câu trả lời của anh ta hơn là một câu trả lời hoàn chỉnh.
Nó xảy ra với tôi hơn bất kỳ chương trình máy tính bắt buộc nào không có vòng lặp vô hạn (cảm ơn @AndresF.) Là một đồ thị theo chu kỳ có hướng (DAG). Có nghĩa là các đường dẫn thực thi mã có thể được định hướng (đầu tiên là sau đó) và theo chu kỳ (không tạo thành các vòng lặp vô hạn). Chúng là một biểu đồ vì đường dẫn qua bất kỳ mã quan trọng nào hiếm khi đơn giản như một danh sách hoặc một cây.
Tôi đã làm việc trong XSLT được khoảng 4 năm. Tôi đã có một thời gian khủng khiếp khi cố gắng giải thích tại sao nó không phải là một ngôn ngữ lập trình mục đích chung tốt, nhưng DAG là lý do. Cụ thể, XSLT là ngôn ngữ điều khiển dữ liệu. Bạn xác định các hàm (có, theo nghĩa lập trình hàm) nhưng bạn không nhất thiết phải gọi các hàm này từ mã của mình. Thay vào đó, XSLT thiết lập một sự kết hợp của lựa chọn và lặp qua các nút của một tài liệu XML đầu vào. Điều này cho phép cấu trúc của dữ liệu đầu vào xác định chức năng nào được gọi và theo thứ tự nào.
Điều này rất thú vị và rất tuyệt vời cho đến khi chương trình của bạn gặp phải tình trạng dữ liệu mà bạn không kiểm tra vào lúc 2:30 sáng và bạn phải thức dậy và sửa nó. Khi bạn để dữ liệu xác định DAG, thì định nghĩa của DAG sẽ trở thành tất cả các điều kiện đầu vào có thể - điều mà đối với bất kỳ ứng dụng kinh doanh không tầm thường nào là vượt quá; họ không thể tưởng tượng được.
Lúc đầu, tôi nghĩ rằng lập trình chức năng có thể không phải là DAG vì thứ tự thực thi đôi khi không rõ ràng hoặc thậm chí là do người lập trình nghĩ. Nhưng một chương trình chức năng không xác định phụ thuộc. Trong thực tế, bản chất khai báo của lập trình chức năng có thể được coi là chỉ xác định các phụ thuộc (a ^ 2 = b ^ 2 + c ^ 2) mà không chỉ định thứ tự thực hiện (không quan trọng là 'b' hay 'c' được bình phương trước , miễn là cả hai đều bình phương trước khi được thêm vào với nhau).
Nhưng trong khi lập trình Chức năng có thể mơ hồ về thứ tự các hoạt động ở mức chi tiết, thì rõ ràng là rất rõ ràng về các phụ thuộc. Đây là những tính năng rất phù hợp với sự đồng nhất. Trong mọi trường hợp, vẫn còn một biểu đồ đường dẫn thông qua mã và biểu đồ đó vẫn được định hướng (phải phụ thuộc vào các nhiệm vụ phụ thuộc), vì vậy tôi nghĩ DAG cũng áp dụng ở đó.
Câu hỏi hay - cảm ơn bạn đã đăng bài!