2009-01-15 28 views
11

Tôi có một vài ngôn ngữ mà tôi đã xây dựng làm phiên dịch viên. Khi tôi đã sẵn sàng để thực hiện "bước tiếp theo", các tùy chọn nào là tốt nhất cho các định dạng được biên dịch không có nguồn gốc ... những ưu và nhược điểm của mỗi loại là gì?Điểm đến tốt nhất của trình biên dịch

Tôi đã xem xét biên dịch cho CLR hoặc LLVM, và dự tính C-midcompile một vài lần, nhưng tôi không hoàn toàn chắc chắn.

Một vài tính năng mà tôi đang hy vọng để có thể cảng như sau:

  1. REPL - Một trong những ngôn ngữ tôi xây dựng hỗ trợ đánh giá khối cấp trong thời gian chạy.
  2. Macro mạnh mẽ - Một trong những ngôn ngữ mà tôi đang xây dựng yêu cầu khả năng lọc qua mã riêng biệt trước khi mã thông báo và ở giữa bước giữa mã thông báo và phân tích cú pháp.

Ok, không thực sự là "một vài", chỉ hai. Tôi thích nghĩ rằng tôi có thể chuyển bất kỳ tính năng nào khác mà ngôn ngữ của tôi hỗ trợ cho "bất kỳ thứ gì".

Tùy chọn tốt nhất của tôi và ưu điểm/khuyết điểm của họ là gì?

Trả lời

16

pro/nhược điểm:

  • CLR:

    • pro: CLR môi trường có sẵn; nhiều thứ để liên kết với
    • con: bị ràng buộc với CLR (;-); nhắm mục tiêu một số hệ thống sẽ rất khó hoặc không thể (. nhúng, máy tính lớn, vv CLR impl có thể chưa trưởng thành trên các hệ thống phi MS)
  • LLVM:

    • pro: độc lập từ MS.
    • con: nhắm mục tiêu một số hệ thống có thể liên quan đến việc chuyển LLVM (?); interfacing để DOT-net, Java vv có thể trở nên khó chịu (có thể cần FFI)
  • C như ngôn ngữ mục tiêu:

    • pro: hầu hết các mục tiêu có thể; tạo mã dễ dàng
    • con: bạn sẽ phải triển khai một số công cụ VM làm thư viện thời gian chạy (GC, dynload, dyn compilation, v.v.); một số điều khó làm trong C (tiếp tục, backtracking, stack tracing, exceptions); một số điều khó làm hiệu quả và di động trong C (GC, các loại động, phụ thuộc bố trí chồng).
  • Java bytecode như mục tiêu:

    • pro: có lẽ là bộ lớn nhất của nền tảng mục tiêu càng tốt (ngay cả điện thoại mobil và các công cụ nhúng); rất nhiều công cụ hiện có xung quanh; dễ dàng interfacing để thư viện hiện có
    • con: một số điều rất khó thực hiện hoặc khó thực hiện một cách hiệu quả (loại năng động, continuations, backtracking)

Từ tất cả các việc trên, tôi nghĩ rằng nhắm mục tiêu bytecode Java có lẽ sẽ là tốt nhất cho bạn.

EDIT: thực sự là câu trả lời cho nhận xét nhưng 300chars không đủ.

JByteCode iffy - Tôi đồng ý (là Smalltalker, JBytecode quá hạn chế đối với tôi). VM-wise, tôi nghĩ rằng có một phạm vi tương đối rộng về hiệu suất mà bạn có thể nhận được như JVM, bắt đầu từ việc dịch mã byte bytecode chậm đến các máy ảo JITting tinh vi cao cấp (IBM). Tôi đoán, CLR VM sẽ bắt kịp, vì MS đang ăn cắp và tích hợp tất cả các cải tiến dù sớm hay muộn, và các kỹ thuật để tăng tốc dịch động được công bố (đọc các giấy tờ tự, ví dụ). LLVM có lẽ sẽ tiến triển chậm hơn một chút, nhưng ai biết được. Với C, bạn sẽ được hưởng lợi từ các trình biên dịch tốt hơn miễn phí, nhưng những thứ như truyền lại động vv rất khó thực hiện với C là mục tiêu. Hệ thống của riêng tôi sử dụng một hỗn hợp mã biên dịch sẵn và được biên dịch động (có tất cả: một trình thông dịch bytecode chậm, JITter và mã C tĩnh tĩnh biên dịch sẵn trong một không gian bộ nhớ).

+2

Java ByteCode là thứ mà tôi luôn luôn biết. Gọi nó là kinh nghiệm quá khứ xấu. Có ai trong số họ có bất kỳ đặc quyền nào liên quan đến quyền lực của máy ảo nội bộ của họ (ngoài các cuộc gọi thư viện không?) – user54650

+6

Tạo mã C có vẻ dễ dàng cho đến khi bạn thực hiện nó trong vòng 6 đến 18 tháng. Thế thì bỗng nhiên mọi thứ trở thành không thể được. –

3

LLVM có vẻ đầy hứa hẹn. Nhóm nghiên cứu tuyên bố hiệu suất thời gian chạy tốt hơn trên gcc với phần phụ trợ của họ so với gốc. Khả năng biên dịch từ AST thực sự thú vị (hãy xem hướng dẫn). Nó có thể biên dịch và tối ưu hóa tại thời gian chạy, đó là một phải cho năng động. Nó cũng có thể chạy như một thông dịch viên thuần khiết.

Tôi xem xét việc sử dụng LLVM trong một dự án liên quan đến việc tạo một ngôn ngữ giống như Tcl. Tcl rất năng động, vì vậy tôi không biết điều này ngụ ý ở giai đoạn này, nhưng tôi tự tin rằng tôi sẽ có được hiệu suất tốt hơn so với lõi dựa trên bytecode hiện tại.

25

thế hệ Mã là doanh nghiệp của tôi :-)

Các bình luận về một vài lựa chọn:

  • CLR:

    • Pro: hỗ trợ công nghiệp
    • Côn: bạn phải mua vào hệ thống kiểu của họ khá nhiều; tùy thuộc vào những gì bạn muốn làm gì với loại, điều này có thể không quan trọng
    • Côn: Chỉ có nền tảng Windows thực sự là số nguyên tố thời gian chất lượng
  • LLVM:

    • Pro: nhiệt tình của cộng đồng người dùng với lôi cuốn người lãnh đạo
    • Pro: sự ủng hộ nghiêm túc từ Apple
    • Pro: nhiều cải tiến hiệu suất thú vị
    • Con: hơi comple x giao diện
    • Con: lịch sử lỗ hổng trong kỹ thuật; như LLVM trưởng thành hy vọng các lỗ hổng trong các kỹ thuật để được cắm bằng cách thêm vào sự phức tạp của giao diện
  • C--

    • Pro: mục tiêu là một ngôn ngữ viết thực tế, không phải là một API; bạn có thể dễ dàng kiểm tra, gỡ lỗi, và chỉnh sửa mã C-- bạn
    • Pro: thiết kế là hợp lý trưởng thành và hợp lý sạch
    • Pro: hỗ trợ thu gom rác thải chính xác
    • Pro: hầu hết người dùng báo cáo nó là rất dễ sử dụng
    • Côn: nhóm phát triển rất nhỏ
    • Côn: vào thời điểm đầu năm 2009, chỉ hỗ trợ ba nền tảng phần cứng (x86, PPC, ARM)
    • Côn: không tàu với một bộ thu rác
    • Côn: dự án không có người tương lai
  • C như ngôn ngữ mục tiêu

    • Pro: trông dễ
    • Côn: gần như không thể có được hiệu suất khá
    • Côn: sẽ đưa bạn hạt trong thời gian dài; hãy hỏi những người dài đã cố gắng biên dịch Haskell, ML, Modula-3, Scheme và nhiều hơn nữa bằng cách sử dụng kỹ thuật này. Tại một thời điểm nào đó, mỗi người trong số những người này đã từ bỏ và xây dựng bộ tạo mã gốc riêng của họ.

Tóm tắt: bất cứ điều gì ngoại trừ C là một lựa chọn hợp lý. Để có sự kết hợp tốt nhất về tính linh hoạt, chất lượng và tuổi thọ dự kiến, tôi có thể đề nghị LLVM.

Tiết lộ đầy đủ: Tôi liên kết với dự án C--.

+2

Chỉ cần một chút Lưu ý: Bạn không phải sử dụng API của LLVM, bạn có thể nhắm mục tiêu ngôn ngữ giống như trình biên dịch của nó thay thế. – Frank

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