8

Để sử dụng với một lớp học tôi sẽ dạy, tôi đang tìm kiếm trình biên dịch nhanh hoặc trình thông dịch bytecode cho Standard ML. Tôi đang tìm thời gian biên dịch nhanh; mọi thời gian chạy hợp lý sẽ thực hiện. Tiền thưởng nếu mô hình biên dịch đơn giản và rõ ràng. Sinh viên trong lớp cũng sẽ sử dụng MLton để tạo ra các tệp nhị phân tốt, nhưng MLton chậm biên dịch và có những lúc sinh viên cần một thứ gì đó mà họ có thể tương tác.Trình biên dịch ML chuẩn hoặc trình biên dịch bytecode, với vòng lặp đọc-eval-in, cho Linux?

Dưới đây là những gì tôi biết đã:

  • Standard ML New Jersey có một tương tác đọc eval-print-loop, nhưng quy tắc biên soạn của nó là một chút lạ, và đó là một chút chậm. Tuy nhiên, nó có thể là ứng cử viên hàng đầu.

  • Moscow ML từng là lý tưởng, nhưng nó vẫn chưa được cập nhật với Thư viện cơ sở tiêu chuẩn năm 2004. Đáng tiếc nhất, bởi vì ngoài nhiều tính chất tốt khác của nó, Moscow ML cũng có một hệ thống trợ giúp tương tác — nhưng tôi không thể gây ra cho sinh viên một trình biên dịch có thư viện làm điều gì đó khác với tất cả các tài liệu trực tuyến nói.

  • Poly/ML có thể phù hợp với hóa đơn, ngoại trừ việc xem tài liệu trực tuyến, tôi không thể tìm ra cách để biên dịch. Điều đó có thể được.

Hiện tại có vẻ như SML/NJ hoặc Poly/ML sẽ là thỏa hiệp tốt nhất. Đã nhiều năm trôi qua kể từ khi tôi thực hiện bất kỳ công việc nghiêm túc nào trong Standard ML và tôi sẽ chào đón thông tin về các trình biên dịch khác hoặc các giải pháp thay thế này, theo kinh nghiệm của bạn, nhanh nhất để tương tác và dễ học nhất.

Trả lời

10

Poly/ML có vẻ nhanh hơn SML/NJ một chút. Ví dụ, biên soạn HaMLet (. Khoảng 25.850 dòng SML nhận xét) với Poly/ML, SML/NJ, và MLton, tôi nhận được như sau:

[[email protected] hamlet-1.3.1.polyml]$ /usr/bin/time make with-poly 
... 
     2.92 real   2.31 user   0.55 sys 
[[email protected] hamlet-1.3.1.smlnj]$ /usr/bin/time make with-smlnj 
... 
     11.98 real  11.08 user   0.78 sys 
[[email protected] hamlet-1.3.1.mlton]$ /usr/bin/time make with-mlton 
... 
     24.51 real  21.04 user   3.05 sys 

Sự khác biệt giữa Poly/ML và SML/NJ isn' t khá rõ ràng khi biên dịch MLton (khoảng 175779 dòng nhận xét SML):

[[email protected] mlton.polyml]$ /usr/bin/time make polyml-mlton 
... 
     117.67 real  112.12 user   4.87 sys 
[[email protected] mlton.smlnj]$ /usr/bin/time make smlnj-mlton 
... 
     123.31 real  116.24 user   6.38 sys 
[[email protected] mlton.mlton]$ /usr/bin/time make mlton-compile 
... 
     238.44 real  232.01 user   5.49 sys 

Như REPLs, Poly/ML và SML/NJ gần như tương đương. Tôi tìm thấy các thông báo lỗi từ SML/NJ để tốt hơn một chút; họ có xu hướng có nhiều vị trí nguồn cụ thể hơn. Tất nhiên, khi được sử dụng như một vị trí nguồn REPL, SML/NJ là theo điều kiện của stdIn, mà số dòng không phải là hữu ích khủng khiếp.

Nếu học sinh của bạn chỉ sử dụng REPL hoặc biên dịch các chương trình một tệp, thì tôi sẽ tưởng tượng rằng Poly/ML hoặc SML/NJ sẽ phục vụ cho mục đích của bạn. Cả hai đều cung cấp hàm SML use. Các chương trình nhiều tập tin có thể được phục vụ tốt nhất bởi Trình quản lý biên dịch của SML/NJ hoặc Hệ thống ML Basis của MLton; Poly/ML cung cấp một hệ thống biên dịch khác (PolyML.make), nhưng tôi chưa bao giờ sử dụng nó.

Bạn gặp khó khăn gì trong việc biên dịch Poly/ML? Kể từ phiên bản 5.0, Poly/ML đã hỗ trợ xây dựng đơn giản ./configure ; make ; make install. Sử dụng Poly/ML 5.X để biên dịch một tệp thực thi độc lập yêu cầu sử dụng PolyML.export và gọi trình biên dịch C, nhưng được mô tả khá tốt trong ghi chú phát hành phiên bản 5.0.

+0

Tôi không gặp khó khăn khi biên dịch Poly/ML; Tôi vừa cài đặt gói Debian. Đó là "một hệ thống biên dịch khác" mà tôi đang gặp khó khăn trong việc tìm ra. Tôi rất muốn các sinh viên có thể sử dụng một mô hình mà họ quen thuộc với --- biên dịch nguồn để có được một nhị phân thực thi --- nhưng với một cái gì đó nhanh hơn một chút so với MLton. Có lẽ tôi nên tải về HaMLet và xem cách Makefile được thiết lập. +1 –

+1

Cả hai HaMLet và MLton (và Isabelle AFAICT) đều điều khiển Poly/ML thông qua chức năng 'use'. Tôi không biết bất kỳ dự án nào (ngoài chính Poly/ML) sử dụng cơ sở PolyML.make. Bạn có thể yêu cầu con trỏ trên danh sách gửi thư của Poly/ML; lưu lượng truy cập thấp nhưng đáp ứng. –

+1

Isabelle/ML sử dụng cấu trúc PolyML.Compiler rất thuận tiện để triển khai biến thể 'sử dụng' của riêng nó, sao cho hiệu ứng trên môi trường ML được quản lý nội bộ, ví dụ: để cho phép hoàn tác/khôi phục môi trường tĩnh. – Makarius

1

Có một số LLVM port của Moscow ML.Tôi không biết nếu nó có thể sử dụng cho tất cả các mục đích được nêu ra, nhưng đối với tốc độ nó nên được tốt hơn so với camlrunm cũ.

Có thể đáng để bạn chuyển tính năng mà bạn nghĩ khác với mã trong tài liệu. Tôi chắc rằng các nhà bảo trì của Moscow ML sẽ đánh giá cao nó.

Tôi không tìm thấy sự khác biệt trong tài liệu đi kèm với Moscow ML và triển khai thực tế, nhưng tôi không thực hiện bất kỳ dự án lớn nào trong Standard ML. Tôi nghĩ rằng sẽ hữu ích nếu bạn có thể đưa ra một ví dụ trong đó tài liệu của Moscow ML khác với việc thực hiện. Điều này cũng sẽ khiến tôi quan tâm.

+0

Mô-đun thư viện 'TextIO',' Array' và 'Vector' không phù hợp với tiêu chuẩn. Tôi đã theo dõi những người ML ở Moscow về điều này trong * năm *, và về cơ bản họ không quan tâm. Nếu họ không quan tâm đến việc cải thiện phần mềm của họ, tại sao tôi nên? Trên một lưu ý khác, có thể câu hỏi của tôi không rõ ràng, nhưng tôi quan tâm đến ** thời gian biên dịch nhanh **. Bất kỳ thời gian chạy hợp lý nào cũng tốt với tôi. –

+0

Tôi sẽ thấy những gì tôi có thể làm về sự phù hợp tiêu chuẩn của các thư viện chuẩn. Nó có vẻ là một công việc hữu ích. Tôi nghĩ vấn đề chính với Moscow ML là dường như nó bị bỏ rơi bởi những người bảo trì ban đầu của nó. Với cảng LLVM, nó đã đạt được một chút động lực khi hai sinh viên Đan Mạch bắt đầu chạm vào nó sau gần một thập kỷ, nhưng điều này cũng có vẻ đã bị đình trệ. Tôi nghĩ rằng tiêu chuẩn ML mất rất nhiều (tiềm năng) người dùng và các nhà nghiên cứu để Haskell. Có lẽ đây là lý do tại sao không ai quan tâm nhiều đến thế nữa. –

+0

Tôi thực sự đã cung cấp liên kết sai đến kho lưu trữ exsml. Tôi sửa nó rồi. –

3

Tôi đánh giá cao đây là câu trả lời rất muộn cho câu hỏi, nhưng có một dự án Moscow ML trên github với Thư viện cơ sở cập nhật. Đó là tại https://github.com/kfl/mosml/ (với bản cập nhật vào tháng 11 năm 2012!)

Tôi cũng có mã thực hiện nhiều Thư viện cơ sở mới cho Moscow ML để tôi có thể sử dụng cả hai và Poly/ML để triển khai HOL4. Mã cho điều đó là tất cả bên trong http://github.com/mn200/HOL và có thể được đào ra nếu bạn muốn.

Các vấn đề liên quan