2009-03-21 27 views
7

Tôi đã tạo trình biên dịch tạo mã trung gian. Tôi không có thời gian để viết phụ trợ cho dự án của tôi.Cần trình biên dịch phụ trợ

Có phần mềm nào tôi có thể sử dụng để đánh giá mã trung gian được tạo không? Tôi có thể tải phần mềm này ở đâu?

Kết quả trông giống như sau:

t1 = 0.67596e-7 
    sum = t1 

    t1 = 2 
    t2 = 3 
    t3 = t2 + t1 
    i = t3 

L0: 
    t1 = sum 
    t2 = 20 
t3 = compare(t1 <= t2) 
    t4 = sum 
    t5 = 12 
t6 = compare(t4 ~= t5) 
t7 = t3 | t6 
    t8 = sum 
    t9 = 20 
t10 = compare(t8 > t9) 
t11 = t7 & t10 
if t11 true then goto L1 else goto L2 
L1: 
    t1 = 2 
    t2 = sum 
    t3 = t2 + t1 
    sum = t3 

    t1 = 1 
    t2 = i 
    t3 = t2 + t1 
    i = t3 
    goto L0 
L2: 

Cảm ơn bạn đã đọc.

+0

Không trùng lặp chính xác nhưng rất gần với http://stackoverflow.com/questions/446883/best-compiler-destination/ –

Trả lời

6

Mã được phát ra của bạn trông khá gần với C - không được trình biên dịch của bạn phát ra C và sử dụng trình biên dịch C làm phần phụ trợ - đó là cách trình biên dịch C++ gốc C++ hoạt động.

11

Hãy xem qua số llvm compiler infrastructure project. Nó được sử dụng trong rất nhiều dự án thế giới thực. LLVM là một máy ảo mức thấp, dễ tạo mã và dễ dịch sang mã gốc.

2

Tại sao không nhắm mục tiêu ngôn ngữ cấp cao khác làm đầu ra trung gian, ví dụ bạn có thể tạo mã C và sử dụng bất kỳ trình biên dịch C nào để biên dịch. Điều này đã được sử dụng bởi một số ngôn ngữ cấp cao trong quá khứ.

Một tùy chọn cấp thấp hơn một chút là tạo mã IL và sử dụng thời gian chạy .NET. Nếu trình biên dịch được viết bằng .NET, bạn có thể sử dụng không gian tên Reflection.Emit để tạo ra một assembly .NET có thể được chạy trong bất kỳ môi trường .NET nào.

2

Bạn có thể có may mắn hơn khi chọn ngăn xếp trình biên dịch và sử dụng mã trung gian được hỗ trợ bởi ngăn xếp đó. Ví dụ: gcc sử dụng RTL, đăng ký ngôn ngữ chuyển giao làm mẫu số chung cho tất cả các ngôn ngữ được gcc hỗ trợ. Tôi nghi ngờ rằng .net có một cái gì đó tương tự được sử dụng cho những thứ như IronPython.

Nếu bạn muốn sử dụng thứ gì đó cung cấp máy ảo để đánh giá mã, SPIM MIPS vm hỗ trợ kiến ​​trúc Motorola 68000 và rất dễ làm việc.

1

NekoVM được thiết kế để chấp nhận mức IL cao tương tự như của bạn và sau đó chạy nó. Đề nghị sử dụng C của Neil Butterworth cũng là một lựa chọn tốt.

1

Nếu bạn có thể chịu đựng sự phụ thuộc vào JVM, thì việc tạo mã byte bằng cách sử dụng ASM là khá đơn giản.

Nếu bạn không thể, thì gnu lightning có thể được sử dụng để tạo mã trực tiếp (nhỏ hơn và đơn giản hơn LLVM, nhưng không có sự tối ưu).

0

Vì mã của bạn là C, bạn có thể thử C--. Nó là C như ngôn ngữ cho trình phụ trợ trình biên dịch. IIRC, nó được sử dụng bởi một trong các trình biên dịch Haskell chính.

13

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: nhiều cải tiến hiệu suất thú vị
    • Con: giao diện hơi phức tạp
    • Con: lịch sử lỗ s 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: tương lai của dự án không chắc chắn
  • 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. Nhưng mã ví dụ của bạn rất gần với C--, vì vậy đó có thể là một lợi thế.

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

3

Tôi khuyên bạn nên nhổ mã Pascal và sử dụng Free pascal.

Nó được biên dịch một cách tự nhiên, biên dịch nhanh chóng và bạn có thể nhắm mục tiêu rất nhiều nền tảng.

0

khuyên bạn nên llvm, cơ sở hạ tầng nền tảng, hỗ trợ tạo mã máy và nhiều lần tối ưu hóa. Hướng dẫn trên llvm.org rất đơn giản.

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