2010-01-30 27 views
8

Tôi đang nghĩ về việc viết một ngôn ngữ nhỏ của riêng mình.Máy ảo tốt để phát triển ngôn ngữ sở thích là gì?

Tôi đã tìm thấy một vài tùy chọn, nhưng vui lòng đề xuất thêm.

  • JVM
  • Parrot
  • OSA

Rất nhiều ngôn ngữ đang sử dụng JVM, nhưng trừ khi bạn viết một ngôn ngữ Java-ish, tất cả sức mạnh stdlib mang đến cho bạn sẽ cảm thấy xấu xí; Nó không phải là rất tốt ở các công cụ năng động, hoặc.

Vẹt có vẻ là một máy ảo tốt để phát triển ngôn ngữ, nhưng nó có một chút mùi bỏ hoang/chưa hoàn thành/sở thích của dự án đối với nó.

OSA là thứ cung cấp năng lực cho Applescript, không phải là một VM đặc biệt nổi tiếng, nhưng tôi sử dụng Mac và nó cung cấp tích hợp hệ thống tốt.

CLR + Mac dường như không phải là một sự kết hợp tốt ...

Ngôn ngữ của tôi sẽ được một đối tượng định hướng chức năng ngôn ngữ dataflow đồng thời với gõ mạnh và một kết hợp của Python và cú pháp Lisp. Âm thanh tốt, eh?

[sửa]
Tôi đã chấp nhận Python bây giờ, nhưng tôi muốn nghe thêm về OSA và Parrot.

+0

Làm thế nào về Đề án? –

+0

Điều gì về yêu cầu về hiệu suất và khả năng mở rộng? – skaffman

+0

Tôi thích sử dụng Python hoặc Lua hơn là Scheme mà tôi nghĩ. Hầu như không có yêu cầu về hiệu suất và khả năng mở rộng, nó chỉ được sử dụng cho các công cụ nhỏ mà tôi viết. – Pepijn

Trả lời

5

Một phương pháp tôi đã sử dụng là sử dụng mô-đun Python ast để tạo một cây cú pháp trừu tượng biểu thị mã để chạy. Hàm Python compile có thể biên dịch một AST thành mã byte bytecode, sau đó có thể chạy exec. Đây là cấp cao hơn một chút so với trực tiếp tạo bytecode, nhưng bạn sẽ phải đối phó với một số quirks của ngôn ngữ Python (ví dụ, sự khác biệt cơ bản giữa các câu lệnh và các biểu thức).

Khi thực hiện việc này, tôi cũng đã viết mô-đun "không hoạt động" cố gắng chuyển đổi AST trở về mã nguồn Python tương đương, chỉ để gỡ lỗi. Bạn có thể tìm thấy mã trong kho lưu trữ psil nếu bạn quan tâm.

+0

Điều đó có nghĩa là viết ngôn ngữ của tôi bằng Python, phải không? Điều đó sẽ rất vui ... Tôi sẽ phải suy nghĩ về những hạn chế. – Pepijn

+0

Đúng, sử dụng thư viện Python 'ast' chắc chắn là dễ nhất từ ​​Python. Bạn chắc chắn có thể làm tồi tệ hơn việc chọn Python. –

+0

Làm thế nào là 'ast' để tạo ra một hệ thống kiểu tĩnh và đặc biệt là để viết các hàm kiểu dataflow (gọi ngay khi dữ liệu đến)? – Pepijn

2
  • Lua có một nhỏ, được viết tốt và nhanh VM
  • Python VM - bạn thực sự có thể đính kèm một ngôn ngữ mới để nó nếu bạn muốn. Hoặc viết (sử dụng?) Một cái gì đó như tinypy đó là một thực hiện nhỏ và đơn giản của máy ảo Python.

Cả hai tùy chọn trên đều có quyền truy cập vào thư viện chuẩn hữu ích sẽ giúp bạn làm việc và được mã hóa trong C tương đối sạch và mô-đun, vì vậy không khó để kết nối.

Điều đó nói rằng, tôi không đồng ý rằng Parrot bị bỏ rơi/sở thích. Nó khá trưởng thành, và có một số nhà phát triển rất mạnh làm việc trên nó. Hơn nữa, nó đặc biệt là một máy ảo được thiết kế để được nhắm mục tiêu bởi nhiều ngôn ngữ động. Vì vậy, được thiết kế với sự linh hoạt trong tâm trí.

+0

Tôi muốn biết thêm về lý do tại sao bạn cho rằng máy ảo Lua hoặc Python phù hợp với tôi. Vẹt có thể trưởng thành, ít nhất hầu hết các ngôn ngữ trên đó không đầy đủ hoặc bị bỏ rơi. – Pepijn

+0

@Pepijn: Tôi đã cập nhật câu trả lời. Bạn không chắc chắn nên đề xuất điều gì khác, trừ khi bạn có câu hỏi cụ thể hơn? –

+0

Tôi muốn truyền các hàm và các đối tượng xung quanh như các giá trị và tôi đang nghĩ về một hệ thống kiểu tĩnh hoặc ít hơn, tôi cũng cần các công cụ dataflow. Python có một sự phân biệt rõ ràng giữa các hàm, giá trị, biểu thức và câu lệnh, nhưng hệ thống kiểu của nó là khá năng động. Điều đó có cản trở tôi không? Làm thế nào là cho Lua, Parrot, JVM hoặc OSA? – Pepijn

4

Hãy xem LLVM. Nó không phải là một máy ảo thuần túy như vậy, một khung công tác với IR của chính nó cho phép bạn xây dựng các máy ảo mức cao. Có những nội dung thú vị như phân tích mã tĩnh và hỗ trợ JIT

+0

Tôi biết LLVM từ nuốt unladen. Bởi vì ngôn ngữ của tôi chỉ là một dự án sở thích, tôi nghĩ tốt hơn là mượn một máy ảo với một stdlib. – Pepijn

1

Bạn đã xem Pypy chưa?Từ những gì tôi đã đọc, ngoài việc là một trình biên dịch JIT của Python, nó cũng có khả năng xử lý các ngôn ngữ khác. Ví dụ: a tutorial giải thích cách tạo trình biên dịch Jit Brainfuck bằng Pypy.

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