9

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.

+3

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

Trả lời

6

Nó thực sự phụ thuộc vào cách hoàn thành ngôn ngữ bạn muốn xây dựng và bạn muốn làm gì với ngôn ngữ đó. Nếu bạn muốn tạo một ngôn ngữ toàn diện cho các dự án thực tương tác với các ngôn ngữ khác, nhu cầu của bạn sẽ lớn hơn nhiều nếu bạn chỉ muốn thử nghiệm với sự phức tạp của việc biên dịch các tính năng ngôn ngữ cụ thể.

Đầu ra cho tệp ngôn ngữ lắp ráp là một lựa chọn phổ biến. Bạn có thể chú thích các tập tin ngôn ngữ lắp ráp với mã thực tế từ chương trình của bạn (trong ý kiến). Bằng cách đó, bạn có thể thấy chính xác trình biên dịch của bạn đã làm gì cho mỗi cấu trúc ngôn ngữ. Nó có thể là có thể (nó đã được một thời gian dài kể từ khi tôi làm việc với các công cụ này) để chú thích các tập tin ASM trong một cách mà làm cho cấp nguồn gỡ lỗi có thể.

Nếu bạn định làm việc trong thiết kế ngôn ngữ, bạn chắc chắn sẽ cần biết ngôn ngữ lắp ráp x86. Vì vậy, thời gian bạn dành cho việc học nó sẽ không bị lãng phí. Và hướng dẫn CISC thực sự không phải là vấn đề. Nó sẽ đưa bạn một vài giờ học để hiểu sổ đăng ký và các chế độ địa chỉ khác nhau, và có lẽ ít hơn một tuần là hơi thành thạo, miễn là bạn đã làm việc với một số ngôn ngữ lắp ráp khác (mà nó xuất hiện bạn có).

Xuất mã byte cho JVM, lua hoặc .NET là một cách tiếp cận hợp lý khác, mặc dù nếu bạn làm điều đó, bạn tự buộc mình vào các giả định do VM thực hiện. Và, như bạn nói, nó sẽ yêu cầu kiến ​​thức chi tiết về máy ảo. Có khả năng là bất kỳ máy ảo phổ biến nào cũng có các tính năng bạn cần, do đó việc lựa chọn thực sự là vấn đề ưu tiên hơn là khả năng.

LLVM là lựa chọn tốt. Nó mạnh mẽ và ngày càng trở nên phổ biến. Nếu bạn xuất ra LLVM IR, bạn có nhiều khả năng tương tác với mã của người khác và tương tác với mã của họ. Biết hoạt động của LLVM là một cộng thêm rõ ràng nếu bạn đang tìm kiếm một công việc trong lĩnh vực biên dịch hoặc thiết kế ngôn ngữ.

Tôi sẽ không khuyên bạn nên thiết kế và triển khai máy ảo của riêng bạn trước khi bạn có thêm một chút kinh nghiệm với các máy ảo khác để bạn có thể xem và hiểu được sự cân bằng mà họ đã thực hiện. Nếu bạn đi xuống con đường này, bạn sẽ học được JVM, lua, .NET và nhiều máy ảo khác. Tôi không nói không làm điều đó, mà đúng hơn là làm như vậy sẽ đưa bạn ra khỏi mục đích khai thác thiết kế ngôn ngữ của bạn.

Kiến thức hiếm khi vô ích. Dù bạn quyết định sử dụng sẽ yêu cầu bạn phải học những điều mới. Và đó là tất cả để tốt. Nhưng nếu bạn muốn tập trung vào thiết kế ngôn ngữ, hãy chọn định dạng đầu ra yêu cầu số lượng công việc ít nhất không phải là thiết kế ngôn ngữ cụ thể. Nhất quán, tất nhiên, với khả năng.

Trong số các tùy chọn của bạn, có vẻ như tôi giống như máy ảo của trường đại học của bạn đã hết. Tôi sẽ nói rằng thiết kế máy ảo của riêng bạn cũng vậy. Trong số ba người kia, tôi có thể đi với LLVM. Nhưng sau đó, tôi rất quen thuộc với x86 lắp ráp nên ý tưởng học LLVM là hơi hấp dẫn.

+2

Cảm ơn bạn đã phản hồi rất kỹ lưỡng! Tôi hiện đang nghiêng về LLVM IR. Tôi có lẽ sẽ xem xét riêng việc làm phụ trợ x86 của riêng tôi sau này. Tôi không có kế hoạch để làm công việc chuyên nghiệp trong thiết kế ngôn ngữ hoặc trình biên dịch, nhưng x86 lắp ráp là một kiến ​​thức có giá trị cho bất kỳ lập trình viên, tôi con số. –

5

Hãy xem số Programming Languages ZOO của tôi. Nó có một số đồ chơi thực hiện các ngôn ngữ, bao gồm một số máy ảo và lắp ráp (một máy xếp chồng). Nó sẽ giúp bạn bắt đầu.

+0

Điều đó sẽ không làm hỏng hoàn toàn yếu tố thú vị sao? Bạn không thể có được sự hồi hộp của Man over Machine bằng cách sao chép trình biên dịch của người khác. –

+1

Tôi chưa bao giờ nói anh ấy nên sao chép nó, nhưng điểm sáng tạo lại bánh xe là gì? Những triển khai này rất ngắn, theo thứ tự 500 dòng, bao gồm nhiều nhận xét. Họ không phải là ngôn ngữ lập trình thực sự. –

+0

Tôi nghĩ đây là những điều tuyệt vời! Hoàn toàn thiếu kinh nghiệm trong thiết kế ngôn ngữ ngoại trừ việc nắm bắt một cách đơn giản những gì tôi nghĩ là một loạt các mô hình và nguyên tắc hợp lý, tôi chắc chắn không mong muốn phát minh ra bất cứ điều gì hoàn toàn mới lạ trong lần thử đầu tiên của tôi. Tôi quan tâm nhiều hơn đến việc chơi đùa với những ý tưởng khác nhau, nhìn thấy những cái nào kết hợp tốt với nhau, và nhìn thấy những gì nó cần để thực hiện chúng. Để kết thúc, tôi nghĩ rằng những ví dụ này có thể rất hữu ích. Cảm ơn, Andrej! –

1

Nếu bạn vừa mới chơi với thiết kế ngôn ngữ thì ngôn ngữ thông dịch thì sao? Có toàn bộ AST vẫn còn xung quanh trong thời gian chạy cho phép bạn làm một số điều rất mát mẻ.

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