Tôi lấy một khóa học trình biên dịch ở trường đại học, và nó rất thông tin và rất nhiều niềm vui, mặc dù cũng có rất nhiều công việc. Vì chúng tôi đã được đưa ra một đặc tả ngôn ngữ để thực hiện, một điều tôi đã không học được nhiều về thiết kế ngôn ngữ. Tôi đang nghĩ đến việc tạo ra một ngôn ngữ đồ chơi đơn giản cho vui, để tôi có thể chơi xung quanh và thử nghiệm với các nguyên tắc thiết kế ngôn ngữ khác nhau.Ngôn ngữ/định dạng đầu ra cho trình biên dịch đồ chơi
Một điều tôi chưa quyết định là ngôn ngữ hoặc định dạng nào tôi muốn trình biên dịch xuất ra. Lý tưởng nhất, tôi muốn sản xuất bytecode cho một máy ảo dễ sử dụng và cũng có một số cơ sở để gỡ lỗi (ví dụ như có thể tạm dừng thực hiện và nhìn vào ngăn xếp tại bất kỳ điểm nào). ưa thích của tôi được nêu ra, mặc dù. Để cung cấp cho bạn một ý tưởng về những gì tôi đang tìm kiếm, đây là một số trong những lựa chọn Tôi đã xem xét, cùng với những ưu và khuyết điểm của họ như tôi nhìn thấy chúng:
tôi có thể đầu ra ngôn ngữ lắp ráp x86 văn bản và sau đó gọi một bộ lắp ráp như NASM hoặc FASM. Điều này sẽ cho tôi một số kinh nghiệm biên dịch cho phần cứng thực tế, như công việc biên dịch trước đây của tôi đã được thực hiện trên một máy ảo. Tôi có lẽ có thể gỡ lỗi các chương trình được tạo ra bằng cách sử dụng gdb, mặc dù nó có thể không dễ dàng như việc sử dụng một máy ảo có hỗ trợ gỡ lỗi. Nhược điểm chính của việc này là tôi có kinh nghiệm hạn chế với việc lắp ráp x86, và như một bộ chỉ dẫn CISC, nó có một chút khó khăn.
Tôi có thể đầu ra bytecode cho máy ảo phổ biến như máy ảo JVM hoặc Lua. Những ưu và nhược điểm của chúng có thể thay đổi tùy theo VM cụ thể mà tôi chọn, nhưng nhìn chung, nhược điểm tôi thấy ở đây là có khả năng học một bytecode có thể có khả năng ứng dụng hạn chế cho các dự án tương lai của tôi. Tôi cũng không chắc VM nào phù hợp nhất với nhu cầu của tôi.
Tôi có thể sử dụng cùng một máy ảo được sử dụng trong khóa học trình biên dịch của tôi, được thiết kế tại trường đại học của tôi dành riêng cho mục đích này. Tôi đã quen thuộc với thiết kế và bộ hướng dẫn của nó, và nó có các tính năng gỡ lỗi phong nha, vì vậy đó là một lợi thế rất lớn. Tuy nhiên, nó rất hạn chế trong khả năng của nó và tôi cảm thấy như tôi sẽ nhanh chóng chạy lên chống lại những giới hạn đó nếu tôi cố gắng làm bất cứ điều gì thậm chí vừa phải nâng cao.
Tôi có thể sử dụng LLVM và đầu ra LLVM Intermediate Representation. LLVM IR có vẻ rất mạnh mẽ và quen thuộc với nó chắc chắn có thể được sử dụng cho tôi trong tương lai. Mặt khác, tôi thực sự không có ý tưởng làm thế nào nó là dễ dàng để làm việc với và gỡ lỗi, vì vậy tôi rất nhiều sẽ đánh giá cao lời khuyên từ một người nào đó có kinh nghiệm trong khu vực đó.
Tôi có thể thiết kế và triển khai máy ảo của riêng mình. Điều này có một nhược điểm rất lớn và rõ ràng: tôi về cơ bản sẽ biến dự án của tôi thành hai dự án, giảm đáng kể khả năng tôi thực sự nhận được bất kỳ điều gì. Tuy nhiên, nó vẫn có phần hấp dẫn vì nó cho phép tôi tạo một máy ảo có hỗ trợ "hạng nhất" cho các tính năng ngôn ngữ tôi muốn - ví dụ, Lua VM có hỗ trợ hạng nhất cho các bảng, giúp dễ dàng làm việc với chúng trong Lua bytecode.
Vì vậy, để tóm tắt, tôi đang tìm máy ảo hoặc bộ hội tụ tôi có thể nhắm mục tiêu tương đối dễ học và làm việc cùng, và dễ dàng gỡ lỗi. Vì đây là một dự án sở thích, lý tưởng tôi cũng muốn giảm thiểu cơ hội mà tôi dành rất nhiều thời gian học một số công cụ hoặc ngôn ngữ mà tôi sẽ không bao giờ sử dụng nữa.Điều chính tôi hy vọng đạt được từ bài tập này là một số hiểu biết đầu tiên về sự phức tạp của thiết kế ngôn ngữ, tuy nhiên, vì vậy bất cứ điều gì tạo điều kiện cho việc thực hiện tương đối nhanh sẽ là tuyệt vời.
Một thiết kế trình biên dịch tốt sẽ cho phép bạn chuyển đổi IR của mình thành bất kỳ thứ gì nếu bạn thay đổi quá trình tạo mã của mình.Tôi chỉ đơn giản là bắt đầu bằng cách chuyển đổi ngôn ngữ của bạn thành một số IR và sau đó tạo một backend đã chuyển đổi nó thành C \ C++. Bằng cách đó bạn có thể tìm hiểu về các thành phần khác nhau của trình biên dịch và không phải lo lắng về việc xác minh một số cấu trúc ngôn ngữ cấp thấp hơn trong asm hoặc bytecode. – linuxuser27