2010-06-02 30 views
12

Tôi đang phát triển một ngôn ngữ mới. Mục tiêu ban đầu của tôi là biên dịch thành x86 bản địa cho nền tảng Windows, nhưng bây giờ tôi nghi ngờ.Nhược điểm của việc nhắm mục tiêu JVM thay vì x86 là gì?

Tôi đã thấy một số ngôn ngữ mới nhắm mục tiêu đến JVM (đáng chú ý nhất là Scala và Clojure). Ofcourse nó không thể port mọi ngôn ngữ dễ dàng cho JVM; để làm như vậy có thể dẫn đến những thay đổi nhỏ đối với ngôn ngữ và thiết kế của nó.

Sau khi đặt câu hỏi này, tôi thậm chí còn nghi ngờ nhiều hơn về quyết định này. Bây giờ tôi biết một số đối số JVM "chuyên nghiệp". Câu hỏi ban đầu là: là nhắm mục tiêu các JVM một ý tưởng tốt, khi tạo một trình biên dịch cho một ngôn ngữ mới?

Cập nhật câu hỏi: Nhược điểm của việc nhắm mục tiêu JVM thay vì x86 trên Windows là gì?

+1

Không gõ động? Điều đó sẽ trở thành một bất ngờ đối với các ngôn ngữ kịch bản được gõ động đang chạy trên JVM ... – skaffman

+0

Câu hỏi hay, rất thú vị. Tôi đề nghị bạn nâng cao tiêu đề, để nó đề cập đến ý định sử dụng JVM cho trình biên dịch. – Marcel

+0

Và không có thứ gì như "gõ động bản địa". Thời gian chạy VM hoặc hỗ trợ nó hoặc nó không, máy tính bản địa là quá mức thấp cho rằng loại khái niệm. – skaffman

Trả lời

5

Nhắm mục tiêu JVM là một cách tiếp cận khá cố gắng và thử nghiệm. Thực tế là Clojure, Scala, JRuby và many other languages đã thực hiện thành công như vậy sẽ giúp bạn yên tâm.

Tầm nhìn của tôi là JVM có lẽ là mục tiêu tốt nhất cho các ngôn ngữ mới/thử nghiệm, đặc biệt nếu bạn hy vọng đạt được khả năng nền tảng chéo trong khi tận dụng trình biên dịch JIT thực sự tuyệt vời và vô số thư viện rất mạnh .

Có nói rằng, những nhược điểm chính bạn có thể gặp phải nhắm mục tiêu các JVM là theo ý kiến ​​của tôi như sau:

  • Thiếu sự hỗ trợ đệ quy đuôi ở cấp bytecode. Có nhiều cách xung quanh việc này (ví dụ: xem biểu mẫu đặc biệt "tái diễn" của Clojure) nhưng nó gây phiền toái cho một số triển khai ngôn ngữ, đặc biệt là các ngôn ngữ chức năng. Có thể cuối cùng sẽ được khắc phục trong các phiên bản tương lai của Java.

  • Hơi rõ ràng, nhưng bạn cần cài đặt JVM trên máy khách của mình. Thường không phải là một vấn đề ngày nay, nhưng vẫn còn những trường hợp mà điều này có thể khó khăn.

  • Nguyên thủy (int, long, float, vv ..) trong Java hoạt động khác với phần còn lại của hệ thống đối tượng. Một lần nữa bạn có thể làm việc xung quanh điều này nhưng nó là một số rắc rối thêm cho người thực hiện ngôn ngữ.

Một số khả năng hữu ích/liên kết thú vị:

+0

Làm thế nào * có thể * đuôi đệ quy được hỗ trợ ở cấp bytecode? Nếu một ngoại lệ xảy ra trong một cuộc gọi đệ quy, stack-trace được cho là bao gồm tất cả các cuộc gọi lồng nhau, phải không? Nếu một ngôn ngữ chỉ ra rằng một cái gì đó trông giống như một cuộc gọi đệ quy đuôi có thể không tạo ra một entry stack-trace, thì thay thế nó bằng một vòng lặp sẽ là hợp pháp, nhưng trừ khi ngôn ngữ chỉ rõ rằng tôi không nghĩ rằng JVM nên đưa ra suy luận đó . – supercat

+0

Tôi đoán JVM có thể triển khai đệ quy đuôi theo cách tương thích ngược nơi người triển khai ngôn ngữ có thể chỉ ra cho JVM (có lẽ ở cấp phương thức) mà họ không quan tâm đến toàn bộ dấu vết. Các ngôn ngữ muốn TCO có thể yêu cầu điều này, mọi người khác sẽ có hành vi cũ. – mikera

+0

Tôi nghĩ sẽ tốt hơn nếu có cấu trúc đuôi gọi cho ngôn ngữ và yêu cầu các chương trình sử dụng tính năng đó để sử dụng phiên bản JVM mới hơn (tương tự như vậy hỗ trợ nó).Không có cách nào một chương trình nhắm mục tiêu JVM cũ có thể hỗ trợ "đệ quy" triệu phú trong khi có các cuộc gọi đuôi hiệu quả như các cuộc gọi thông thường, và việc JVM chuyển đổi cuộc gọi đuôi cũ sang các cuộc gọi thông thường sẽ tệ hơn việc đơn giản là từ chối tải mã. – supercat

3

Nếu bạn tạo ngôn ngữ cho JVM, bạn cũng có lợi thế lớn là một thư viện lớn nằm dưới chân bạn, có thể dễ dàng sử dụng từ bên trong ngôn ngữ của bạn. Điều này rất có thể không phải là trường hợp nếu bạn biên dịch cho x86. Tôi cho rằng bạn sẽ không làm cho nó có thể bao gồm ví dụ C-tiêu đề bằng ngôn ngữ của bạn mà không có trình phân tích cú pháp C.

Vì lý do này Scala, Groovy và những người khác là một thành công như vậy.

Ở giai đoạn phát triển hiện tại của JVM và với tính năng nâng cao mới cho hỗ trợ ngôn ngữ kịch bản, tôi sẽ nhắm mục tiêu JVM, vì tỷ lệ cược là ngôn ngữ của bạn sẽ được thực thi nhanh hơn với mọi thư viện thời gian chạy mà bạn có thể tạo bản thân bạn.

1

Bạn chỉ nên nhắm mục tiêu JVM nếu bạn vui khi có phần thời gian chạy của mã hoàn toàn phụ thuộc vào mã của bên thứ ba và yêu cầu người dùng của bạn cài đặt, , JVM sẽ cung cấp các tính năng đáng kể mà bạn có thể phát triển hợp lý hoặc yêu cầu mọi người mở rộng cho mục đích này (ví dụ: tiêu đề hệ điều hành trong C++), , bạn hài lòng với JNI làm giao diện của bạn với mã gốc (và do đó, mã được quản lý khác như .NET).

Cuối cùng, nó hoàn toàn phụ thuộc vào tài nguyên có sẵn cho bạn và cách bạn hình dung ngôn ngữ interop. Nếu bạn định sử dụng JVM để cung cấp nhiều tính năng, và bạn hài lòng vì sự tương tác quá đáng sợ, hãy sử dụng nó. Khác, tôi nghĩ bạn nên xem xét lại.

7

Bạn có thể muốn xem xét nhắm mục tiêu LLVM thay vì JVM. LLVM có thể được sử dụng để nhắm mục tiêu một số kiến ​​trúc, bao gồm x86.

Có nhiều tính di động hơn hỗ trợ CPU đơn giản, nhưng LLVM có thể giúp ích rất nhiều và vẫn cung cấp cho bạn mã gốc, nếu bạn muốn.

+0

+1 Tôi không xem xét điều này, nhưng đây cũng là một cách tiếp cận tốt. – Daniel

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