2013-03-27 36 views
17

Tôi đã thấy một vài chủ đề liên quan đến lập trình GUI trong OCaml nhưng tôi không cảm thấy rõ ràng chúng dẫn đến một giải pháp rõ ràng khi cần giao diện GUI.OCaml: Con đường hiệu quả để lập trình GUI?

Câu hỏi của tôi, cụ thể hơn, như sau: Cách tiếp cận hiệu quả nhất (và dễ nhận) trong lập trình GUI cho phần mềm OCaml là gì? Có ai tiếp xúc với các mô-đun GUI đơn giản và hiệu quả trong OCaml hay tìm thấy một ngôn ngữ hiệu quả hoặc gói phần mềm miễn phí trong đó có thể thực hiện và giao tiếp/chơi độc đáo với OCaml?

Tôi đã viết một thông dịch viên trong OCaml, do đó, trình lexer, parser, các chức năng thông dịch cốt lõi, vv là các mô-đun OCaml. Hiện tại, tôi có giải pháp dòng lệnh ("main.ml") cho phép người dùng tương tác với trình thông dịch bằng cách nhập các biểu thức vào dòng lệnh và nhận đầu ra đầu ra được in hiển thị biểu thức được phân tích cú pháp và giảm, v.v. Tuy nhiên, giải pháp dòng lệnh chỉ dành cho mục đích thử nghiệm. Tôi muốn người dùng tương tác thông qua một GUI, nó có thể đơn giản (các khung Java đến từ tâm trí của các eons trước đây), nhưng cần phải bằng cách nào đó giao tiếp với các mô-đun OCaml mà tôi đã mã hóa. Có một thư viện trong OCaml mà tôi đã tìm thấy cho đến nay: http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual042.html. Có ai biết nếu điều này là có hiệu quả và hữu ích? (Tôi nghĩ rằng tôi đã nhận được những nhận xét tiêu cực về thư viện này)

Nếu tôi chọn lập trình GUI theo ngôn ngữ tối ưu hơn, tương tác phần mềm có thể: viết GUI bằng ngôn ngữ phù hợp (có lẽ C++, Python, v.v.) , sau đó biên dịch trình thông dịch văn bản OCaml thành một tệp thực thi, sau đó kết nối GUI bằng cách nào đó với tệp thực thi? Tôi không quan tâm đến một số giải pháp kết nối lỏng lẻo, thông qua các đường ống (tôi liên tục nghĩ đến việc liên lạc giữa các quá trình này, như những gì có liên quan trong thiết kế hệ điều hành) hoặc ổ cắm (tôi có xu hướng nghĩ về các lập trình mạng), Tôi tưởng tượng có một số cách để "nhà" thông dịch viên mã hóa OCaml của tôi trong mã GUI của ngôn ngữ khác nếu không phải là OCaml. Bất kỳ suy nghĩ, hướng dẫn hoặc đề xuất nào?

EDIT: Tôi sẽ rất vui nếu tôi có thể có GUI cho hệ điều hành giống Linux (ví dụ: Linux RedHat). Nếu tôi có thể có được GUI để làm việc trên Windows mà sẽ là tuyệt vời, nhưng ở mức tối thiểu tôi đang nhắm đến Linux.

CHỈNH SỬA 2: Chỉ tìm thấy điều này, có ai có suy nghĩ về "OCaml-Java" không? http://ocamljava.x9c.fr/ Nghe có vẻ khá thú vị, vì nó có, "... khả năng chạy các nguồn mục tiêu Caml đã được biên dịch bằng ocamlc; thứ hai, khả năng biên dịch các nguồn mục tiêu Caml thành các tệp jar thực thi." Mối quan tâm của tôi là nó không bao giờ đánh tôi rằng Java sẽ là cách tốt nhất để có được một giao diện nhanh nhưng hữu ích ...

GIẢI PHÁP HIỆN TẠI: Sau khi kiểm tra các tùy chọn khác nhau trong bài giải pháp mà @Jeffrey Scofield đặt xuống dưới đây , Tôi đã chọn để nhìn sâu hơn vào LablGtk (cho phép tôi ở lại trong OCaml). Lựa chọn đầy hứa hẹn tiếp theo cho những người đang xem bài đăng này là xem xét giao tiếp ngoại ngữ với C, vì C và OCaml đã có một mối quan hệ để bắt đầu. Dường như có cách gọi mã C trong OCaml và OCaml trong C (mặc dù điều này có thể thực sự khó khăn, nhưng về cơ bản bạn kết thúc gói các hàm gọi hàm OCaml với các hàm wrapper hơi phức tạp sẽ cụ thể hơn cho kiểu hàm bạn gọi từ trong OCaml -> nghĩa là bạn sẽ phải đối phó với "ánh xạ" của mỗi hàm OCaml và các đối số của nó trong C). Hãy xem: http://www.mega-nerd.com/erikd/Blog/CodeHacking/Ocaml/calling_ocaml.html, để biết thêm thông tin. OCaml-Java ban đầu được coi là một ý tưởng tuyệt vời, vì tôi thấy thoải mái với lập trình Java GUI, nhưng sự tương tác giữa hai ngôn ngữ không trực tiếp như với C và OCaml, tài liệu này có vẻ mỏng (và sử dụng OCaml) -Java không phải là thứ mà bạn vừa mới nhặt và chuyển đến công cụ Java GUI ...). OCaml-JavaScript có vẻ thú vị, nhưng hãy nhớ rằng bạn sẽ có nhiều khả năng phải đầu tư thời gian vào việc thiết lập mã HTML 5 tốt ngoài một số JavaScript nếu bạn chọn đường dẫn này. Ngoài ra, có một số bài viết ở đây trong SO nói về ống và ổ cắm, đó là các phương pháp hợp lệ để tạo ra một hệ thống GUI-back-end.Tuy nhiên, đây là một ý tưởng hay nếu bạn không nhớ rằng hệ thống/sản phẩm chương trình của bạn sẽ được "ghép đôi lỏng lẻo". Tôi sẽ cập nhật giải pháp này khi tôi tìm ra LablGtk và đảm bảo rằng nó mang lại giao diện người dùng có thể chấp nhận được cho mã back-end OCaml của tôi.

+0

Nó sẽ giúp biết nền tảng hoặc nền tảng mục tiêu của bạn là gì. Đối với những gì nó có giá trị, nó hoàn toàn hợp lý để sử dụng ổ cắm trong một máy chủ duy nhất. Nếu bạn đang sử dụng hệ thống giống Unix, có "các ổ cắm miền Unix". –

+0

Chỉ cần cập nhật bài đăng của tôi với thông tin liên quan đến nền tảng mục tiêu theo nhận xét của bạn! Hơn nữa, @JeffreyScofield, trong khi bạn nói đúng rằng ổ cắm có thể không phải là thứ để loại trừ, tôi sẽ rất quan tâm nếu có một số giải pháp mà tôi có thể gói GUI và trình diễn (viết bằng OCaml) trong một loại Chương trình/thực thi, nhưng nếu đó không phải là một con đường có thể, thì ổ cắm có thể là con đường để đi ... nhưng đó là một hệ thống lỏng lẻo hơn tôi nghĩ, nếu tôi có thể giữ mọi thứ kết hợp chặt chẽ hơn, điều đó sẽ là lý tưởng! – 9codeMan9

Trả lời

8

Tôi nghĩ rằng bộ công cụ LablGtk được cập nhật hợp lý và duy trì hiện tại. Vì vậy, đó sẽ là một lựa chọn. Tôi đã không sử dụng nó bản thân mình, tuy nhiên. Không quá khó để liên kết một tập các mô-đun OCaml thành một chương trình chính được viết bằng C, C++ hoặc Mục tiêu C. Bạn có thể thực hiện nhiều cuộc gọi trực tiếp đến các chức năng OCaml của bạn và lấy lại kết quả. Đối với điều này, bạn cần phải tìm hiểu giao diện chức năng nước ngoài, mà không phải là quá khó khăn khi bạn nhận được trong các rãnh. Sau đó, bạn có thể sử dụng bất kỳ thư viện GUI nào bạn thích từ phía gia đình C. Nếu bạn quan tâm đến phương pháp này, bạn có thể bắt đầu với Chapter 19 hướng dẫn sử dụng OCaml.

Bạn có thể liên kết các ngôn ngữ khác bằng cách sử dụng trung gian C, tùy thuộc vào ngôn ngữ. Đối với một ngôn ngữ thông dịch, bạn có thể thêm các hàm OCaml của bạn làm các nguyên thủy mới. (Thông dịch viên thường được viết bằng C hoặc C++ theo kinh nghiệm của tôi.)

Đối với Java, có OCaml-Java (như bạn đề cập đến). Tôi đã không sử dụng nó bản thân mình, nhưng nó là hấp dẫn. Tôi tin rằng có một vài hạn chế áp đặt bởi JVM, vì vậy bạn có thể cần phải cẩn thận hơn một chút trong mã hóa của bạn.

Đối với ứng dụng web, có js-of-ocaml, biên dịch OCaml thành JavaScript.

+0

Trong khi tất cả các tùy chọn này là hấp dẫn, tôi thực sự thích các chức năng ngoại giao interfacing của OCaml vào C. Nguồn lực nào bạn khuyên rằng tôi tham khảo ý kiến ​​để tìm hiểu FFI bằng văn bản trong C? Tôi biết làm thế nào để chương trình trong C, nhưng làm thế nào để đi về việc tích hợp một FFI? Tôi bắt đầu học cách làm điều này ở đâu? – 9codeMan9

+0

Tôi đã học mọi thứ tôi biết về nó từ [Chương 19] (http://caml.inria.fr/pub/docs/manual-ocaml/manual033.html) của hướng dẫn OCaml! –

+0

Đường dẫn giải pháp bạn đã trình bày là tốt. Tôi sẽ thêm vào một ghi chú ở đầu những gì tôi đã chọn để làm. Cảm ơn thông tin chi tiết của bạn! – 9codeMan9

1

Hiện tại trong dự án của tôi trong công ty của tôi, tôi đang sử dụng C++ và OCaml với Qt, với phần C được thêm vào OCaml cho interop. Phần OCaml được gọi bởi C++ như là quá trình, hai giao tiếp với bộ nhớ chia sẻ của Qt. Nó hoạt động cho dự án của chúng tôi nhưng để trao đổi dữ liệu thường xuyên hơn, nó sẽ không hiệu quả.

Đây có lẽ giải pháp khác, sử dụng một transpilator: https://github.com/bloomberg/bucklescript

Dự án này dịch mã OCaml của bạn trong JavaScript, vì vậy bạn có thể làm GUI trên HTML5 cơ sở GUI khuôn khổ theo cách này.

Tác giả chính của bộ phát này đã đóng vai trò là cộng tác viên chính cho bộ xử lý OCaml trong một thời gian. Nhóm React cũng đã đưa ra rất nhiều phản hồi về dự án này.

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