Là trình biên dịch cho loại phụ thuộc khó hơn nhiều so với một intepreter?


11

Tôi đã học được điều gì đó về việc triển khai các loại phụ thuộc, như hướng dẫn này , nhưng hầu hết trong số họ đang triển khai các trình thông dịch. Câu hỏi của tôi là, có vẻ như việc thực hiện một trình biên dịch cho loại phụ thuộc khó hơn nhiều so với trình biên dịch, bởi vì bạn thực sự có thể đánh giá các đối số loại phụ thuộc để kiểm tra loại.

Vì thế

  • Là ấn tượng ngây thơ của tôi phải không?
  • Nếu đúng, bất kỳ ví dụ / tài nguyên nào về việc triển khai ngôn ngữ được kiểm tra tĩnh hỗ trợ loại phụ thuộc?

Không, vì bạn có thể giảm vấn đề biên dịch các loại phụ thuộc thành vấn đề đã biết: (1) loại kiểm tra chương trình bằng trình thông dịch; (2) trích xuất chương trình sang OCaml / Haskell / bất cứ điều gì; (3) biên dịch bằng cách sử dụng ocamlopthoặc GHC :-) (Đây là cách tiếp cận Coq và Agda.)
xrq

Câu trả lời:


12

Đây là một câu hỏi thú vị! Như câu trả lời của Anthony cho thấy, người ta có thể sử dụng các cách tiếp cận thông thường để biên dịch ngôn ngữ chức năng không phụ thuộc, miễn là bạn đã có một trình thông dịch để đánh giá các thuật ngữ để kiểm tra loại .

Đây là cách tiếp cận của Edwin Brady. Bây giờ điều này về mặt khái niệm đơn giản hơn, nhưng nó làm mất đi lợi thế tốc độ của quá trình biên dịch khi thực hiện kiểm tra kiểu. Điều này đã được giải quyết trong một số cách cư xử.

Đầu tiên, người ta có thể thực hiện một máy ảo biên dịch các thuật ngữ thành mã byte khi đang di chuyển để thực hiện kiểm tra chuyển đổi. Đây là ý tưởng đằng sau được vm_computethực hiện trong Coq bởi Benjamin Gregoire . Rõ ràng cũng có luận điểm này của Dirk Kleeblatt về chủ đề chính xác này, nhưng giảm mã máy thực tế hơn là một máy ảo.

Thứ hai, người ta có thể tạo mã bằng một ngôn ngữ thông thường hơn, khi thực hiện, kiểm tra tất cả các chuyển đổi cần thiết để kiểm tra loại chương trình được gõ phụ thuộc. Điều này có nghĩa là chúng ta có thể sử dụng Haskell, giả sử, để kiểm tra loại mô-đun Agda. Mã có thể được biên dịch và chạy, và nếu nó chấp nhận, thì mã trong ngôn ngữ kiểu phụ thuộc có thể được coi là được gõ tốt (thực thi chặn và lỗi trình biên dịch). Lần đầu tiên tôi nghe phương pháp này được đề xuất bởi Mathieu Boesflug .


1
Một chút tặc lưỡi: tại sao bạn lại bận tâm viết trình biên dịch nếu bạn có một trình thông dịch thực hiện kiểm tra kiểu? Rốt cuộc, hầu hết (tất cả?) Người dùng nghiêm túc của các ngôn ngữ lập trình được gõ phụ thuộc chỉ quan tâm đến trình kiểm tra loại, sử dụng ngôn ngữ làm trợ lý chứng minh. Tôi chắc chắn chưa bao giờ thực sự chạy bất kỳ chương trình Agda hoặc Coq nào của tôi. Vì vậy, nếu bạn quan tâm đến tốc độ, bạn có muốn biên dịch chuyển đổi loại không?
Martin Berger

2
Các giải pháp 2 và 3 giải quyết vấn đề này: bạn biên dịch mã để kiểm tra mức độ đánh máy tốt (và đặc biệt thực hiện chuyển đổi loại). Nhận xét thứ hai của tôi là bạn thực sự muốn chạy mã được gõ phụ thuộc trong một số trường hợp (xem Idris, Ur / Web).
cody

1
Ngoài ra: ở một mức độ nhất định, giải pháp 1 cũng giải quyết nó, bằng cách làm mờ các dòng giữa trình thông dịch và trình biên dịch.
cody

1
Tôi tự hỏi nếu kỹ thuật dự đoán Futurama có thể được sử dụng để tăng tốc trình thông dịch, kết thúc hiệu quả với trình biên dịch?
Steven Shaw

1
Điều duy nhất tôi thấy là Unison unisonweb.org/2017-10-13/scala-world.html
Steven Shaw

10

Luận án Tiến sĩ của Edwin Brady phác thảo cách xây dựng trình biên dịch cho ngôn ngữ lập trình được gõ phụ thuộc. Tôi không phải là một chuyên gia, nhưng tôi nói nó không cực kỳ khó hơn so với việc thực hiện trình biên dịch giống như System F. Nhiều nguyên tắc khá giống nhau và một số nguyên tắc giống nhau (ví dụ: biên dịch supercombinator.) Luận án bao gồm nhiều mối quan tâm khác.

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.