Có ai đã sử dụng chức năng khử đa hình của Pottier và Gauthier trong trình biên dịch mô-đun chưa?


15

Khử nhiễu là một chuyển đổi chương trình chuyển đổi các chương trình bậc cao thành chương trình bậc nhất. Ý tưởng là đưa ra một chương trình, chỉ có rất nhiều tóm tắt lambda, vì vậy bạn có thể thay thế mỗi lambda bằng một id và mỗi ứng dụng chức năng bằng một lệnh gọi đến một thủ tục áp dụng phân nhánh trên id đó. Điều này đôi khi được sử dụng trong các trình biên dịch cho các ngôn ngữ chức năng, nhưng khả năng ứng dụng của nó bị hạn chế bởi thực tế là chức năng chuyển đổi là một chuyển đổi toàn bộ chương trình (bạn phải biết một cách tĩnh tất cả các chức năng trong chương trình), và vì vậy chỉ các trình biên dịch toàn chương trình mới sử dụng nó

Tuy nhiên, Pottier và Gauthier có một thuật toán phân rã đánh máy đa hình đã cho bằng cách sử dụng một kiểu gõ phức tạp hơn liên quan đến GADT. Bây giờ, với mã hóa của họ, có thể thêm trường hợp bắt tất cả vào kiểu dữ liệu lambda của họ không phải là thẻ, nhưng có chứa hàm bậc cao hơn. Điều này có nghĩa là có thể sử dụng mã hóa của chúng để phân rã trên cơ sở từng mô-đun.

Có ai đã làm điều này, và chỉ cho tôi một trình biên dịch sử dụng ý tưởng này? (Trình biên dịch đồ chơi là ổn, và trên thực tế được ưa thích.)

Câu trả lời:


6

Một cách tiếp cận được mô tả bởi

Georgios Fourtounis và Nikolaos S. Papaspyrou. 2013. Hỗ trợ biên dịch riêng trong trình biên dịch khử chức năng. THỜI GIAN 2013.

Như @gasche đề cập:

Một cách tiếp cận khác nhau trong vấn đề sẽ là xem xét rằng mỗi mô-đun có thể định nghĩa loại "hàm hủy chức năng" riêng và bộ điều phối / xử lý.

Bạn có thể "liên kết" các loại và trình xử lý với một trình liên kết chuyên dụng. Không giống như sử dụng các kiểu dữ liệu mở, bạn ghép nối danh sách các hàm tạo và các hàm trường hợp. Nhưng trình liên kết phải thêm các trường hợp cho ứng dụng một phần: Không có phân tích toàn bộ chương trình, bạn không thể dự đoán ứng dụng một phần nào có thể được sử dụng cho chức năng nào, vì vậy bạn thêm tất cả các trường hợp. Một chức năng -ary có thể được áp dụng một phần để đối số (với ) và tạo ra một chức năng của arity , có thể được áp dụng một phần nữa.nTôi0<Tôi<nn-Tôi


4

Bây giờ, với mã hóa của họ, có thể thêm trường hợp bắt tất cả vào kiểu dữ liệu lambda của họ không phải là thẻ, nhưng có chứa hàm bậc cao hơn. Điều này có nghĩa là có thể sử dụng mã hóa của chúng để phân rã trên cơ sở từng mô-đun.

Bạn có thể nói rõ hơn một chút về ý của bạn ở đây không? Tôi không hiểu cách thêm trường hợp cơ sở (sẽ là kiểu dữ liệu, vào khớp mẫu của hàm gửi hoặc cả hai?) Giúp mô đun hóa theo cách bạn mô tả; Nhân tiện, tại sao bạn có nghĩa chính xác bởi cơ sở "mô-đun theo mô-đun"?

Tôi có thể tưởng tượng một "trường hợp cơ sở" đang được sử dụng, bên trong một mô-đun / chương trình nhất định, để khử chức năng chọn lọc : bạn sẽ có một hàm tạo bổ sung cho loại hàm thống nhất không phải là thẻ, mà chỉ cần nhúng tất cả các 'a -> 'bhàm, để đóng gói một hàm trong hàm tạo này, thay vì cung cấp cho nó một thẻ thống nhất, sẽ ngăn chặn chức năng khử của nó.

Một cách tiếp cận khác nhau trong vấn đề sẽ là xem xét rằng mỗi mô-đun có thể định nghĩa loại "hàm hủy chức năng" riêng và bộ điều phối / xử lý. Các hàm từ mô-đun M1sẽ có loại M1.arrowvà được áp dụng bằng cách sử dụng M1.apply, v.v. Mặc dù hoạt động tốt cho việc sử dụng các hàm thứ nhất, tôi không hiểu rõ làm thế nào bạn có thể mở rộng nó sang hàm bậc cao hơn (không cần phải biết đối số chức năng của chúng đến từ đâu): nếu bạn kết hợp một hàm với bộ điều phối của nó, bạn sẽ nhập lại vào vùng gọi của các lệnh gọi hàm gián tiếp.

Cuối cùng, có trong bài báo mà bạn tham khảo đề cập nhanh về phương pháp toàn bộ chương trình so với mô đun, nhưng tôi không thấy nó liên quan đến đề xuất của bạn như thế nào. Những gì họ mô tả được thể hiện dưới dạng "tiện ích mở rộng" của cả chức năng và loại dữ liệu (chức năng và loại có thể được xác định qua một số mô-đun độc lập). Đây chủ yếu là một cách ML để mô tả thực tế rằng bạn có thể trì hoãn sự kết hợp phân tích / biến đổi của các mô-đun độc lập tại thời điểm liên kết, làm giảm sự cần thiết của chuyển đổi toàn bộ chương trình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.