Computer >> Máy Tính >  >> Lập trình >> Ruby

Xây dựng ngôn ngữ lập trình đồ chơi trong Ruby

Bạn có thấy ngôn ngữ lập trình là công cụ kỳ diệu nhưng bí ẩn không? Điều gì sẽ xảy ra nếu bạn có cơ hội nhìn trộm chúng và hiểu điều gì khiến chúng hoạt động? Nếu bạn quan tâm đến viễn cảnh bắt tay vào phát triển ngôn ngữ lập trình từ đầu, thì bài đăng trên blog này và các bài đăng sau trong loạt bài này sẽ rất hữu ích.

Trong một loạt các bài viết, chúng tôi sẽ xây dựng một ngôn ngữ lập trình động, thông dịch rất đơn giản theo từng bước. Tuy nhiên, hiện tại, đừng lo lắng nếu bạn hơi không chắc về ý nghĩa chính xác của những thuật ngữ này hoặc cảm thấy hơi lo sợ bởi nhiệm vụ trước mắt. Chúng tôi sẽ sử dụng ngôn ngữ lập trình Ruby đáng yêu để triển khai trình thông dịch và giải thích rõ ràng từng bước để đảm bảo cả các nhà phát triển mới và nâng cao đều có thể làm theo. Chúng tôi đặt tên cho ngôn ngữ này là 'Stoffle' để tưởng nhớ một chú lửng mật đáng yêu của Nam Phi có tên này.

Tại sao nên Xây dựng Ngôn ngữ Lập trình?

Stoffle có thể sẽ không bao giờ thay thế Python hoặc Ruby. Vì vậy, tại sao phải bận tâm phát triển nó? Ngoài niềm vui, điều mà tôi hy vọng sẽ thể hiện trong loạt bài này là việc xây dựng một ngôn ngữ là một bài tập lập trình tuyệt vời. Nhiều lợi ích có thể đạt được từ trải nghiệm này:

  • làm sáng tỏ các ngôn ngữ lập trình (và các công cụ dành cho nhà phát triển, bằng proxy) và cho phép chúng tôi thấy mình không chỉ là người tiêu dùng những công cụ này mà còn là người sáng tạo có khả năng tạo ra công cụ của riêng chúng tôi nếu nhu cầu hoặc mong muốn của chúng tôi;

  • Bài tập này sẽ đưa ra một số thách thức lập trình không phổ biến mà hầu hết chúng ta không bao giờ phải đối mặt trong cuộc sống hàng ngày của mình;

  • Chúng ta cũng sẽ tìm hiểu về các thành phần hữu ích bên ngoài lĩnh vực triển khai ngôn ngữ lập trình . Một trình phân tích cú pháp có thể được sử dụng thay vì hàng triệu biểu thức chính quy khó hiểu để xử lý, chẳng hạn như tệp văn bản kế thừa có vấn đề mà sếp của bạn nói giờ đây phải được hỗ trợ như một cơ chế mới để nhập dữ liệu vào hệ thống mà bạn làm việc.

Ngôn ngữ lập trình hoạt động như thế nào?

Trước khi xem xét những gì ở phía trước của chúng ta trong dự án này, trước tiên chúng ta hãy thu nhỏ và hiểu cách một chương trình chạy trên máy tính. Như bạn có thể tưởng tượng, CPU không hỗ trợ trực tiếp một ngôn ngữ cấp cao như Ruby. Tuy nhiên, CPU có một loạt các lệnh cấp rất thấp mà chúng hỗ trợ tùy thuộc vào kiến ​​trúc của chúng.

Nếu bạn tò mò, hãy nghiên cứu, chẳng hạn như kiến ​​trúc x86, kiến ​​trúc này rất có thể cung cấp năng lượng cho máy tính của bạn nếu bạn đang đọc bài viết này trên PC hoặc Mac.

Vì vậy, nhiệm vụ của một ngôn ngữ lập trình là biến mã cấp cao của nó thành mã máy mà CPU hiểu được. Rất nhiều chiến lược được sử dụng để thực hiện nhiệm vụ này. Stoffle sẽ là một ngôn ngữ thông dịch, có nghĩa là trình thông dịch sẽ dịch mã nguồn của Stoffle thành mã máy trong khi chương trình đang chạy.

Các ngôn ngữ biên dịch, chẳng hạn như C, là một con thú khác. Chúng có một bước biên dịch để dịch và tạo ra mã nhị phân (tức là nguồn được chuyển đổi thành mã máy) sẵn sàng được thực thi bởi CPU đích. Một chiến lược khác là biên dịch một tệp nguồn sang một ngôn ngữ khác (thường là cấp cao) đã tồn tại; chiến lược này thường được gọi là 'chuyển đổi'.

Tuy nhiên, hãy nhớ rằng mọi thứ không rõ ràng như khi xử lý các ngôn ngữ trong thế giới thực. Họ thường nắm lấy, theo cách này hay cách khác, các khía cạnh và kỹ thuật của tất cả (và các) chiến lược thực hiện khác nhau này. Tôi khuyến khích bạn nghiên cứu thêm về con đường mà ngôn ngữ ưa thích của bạn đi theo sau khi chúng tôi nắm được kiến ​​thức cơ bản.

Khung cảnh của Bird's eye of Stoffle

Như đã đề cập trước đây, Stoffle sẽ là một ngôn ngữ lập trình cơ bản, được thông dịch, được gõ động. Nó sẽ chỉ bao gồm một số kiểu dữ liệu cơ bản, bốn toán tử số học cơ bản, so sánh và bình đẳng, toán tử logic, if / else, vòng lặp while, các hàm và khả năng in ra bảng điều khiển.

Thông tin bên lề:Các ngôn ngữ tương tự như Stoffle có mục đích chính là học tập và thử nghiệm thường được gọi là ngôn ngữ đồ chơi .

Trình thông dịch của Stoffle sẽ được thực hiện bằng cách sử dụng Ruby đáng tin cậy và được yêu thích của chúng tôi, như đã đề cập trước đây. Khi chúng tôi kích hoạt trình thông dịch của mình (stoffle hello_world.sfe ), các thành phần và giai đoạn tệp nguồn của chúng tôi sẽ trải qua trước khi chạy như sau:

Xây dựng ngôn ngữ lập trình đồ chơi trong Ruby

Các phần của trình thông dịch của chúng tôi và điều gì xảy ra khi chạy tệp .sfe.

Lexer

Còn được gọi là máy quét, nhiệm vụ của lexer là chuyển đổi một chuỗi ký tự đơn giản thành các nhóm hợp lý thường được gọi là 'mã thông báo'. Hãy tưởng tượng chúng ta khai báo một biến có tên là my_var. Lexer của chúng tôi sẽ đọc các ký tự này và tạo ra một Token::VARIABLE mã thông báo.

Trình phân tích cú pháp

Khi chúng ta nghĩ về mã nguồn, bản chất lồng vào nhau của nó là không thể phủ nhận. Hãy xem xét một biểu thức điều kiện, chẳng hạn; Các nhánh true và false của nó được lồng vào nhau và được thực thi tùy thuộc vào kết quả của việc đánh giá điều kiện.

Công việc chính của trình phân tích cú pháp là biến đổi một chuỗi mã thông báo phẳng thành một cấu trúc dữ liệu có thể đại diện cho các mối quan hệ tồn tại giữa chúng. Một chức năng quan trọng khác của trình phân tích cú pháp là cho chúng tôi biết khi nào chúng tôi đã nhầm lẫn bằng cách báo cáo lỗi cú pháp.

Thông dịch viên

Trình thông dịch của Stoffle sẽ đơn giản và hoạt động trực tiếp với cấu trúc dữ liệu do trình phân tích cú pháp tạo ra. Trình thông dịch sẽ phân tích từng phần cấu trúc này và thực thi nó khi nó diễn ra.

Trong ngôn ngữ lập trình Stoffle, việc chuyển đổi thành mã máy sẽ xảy ra vì bản thân trình thông dịch sẽ là một chương trình Ruby (và do đó được trình thông dịch của Ruby thông dịch khi chúng ta chạy nó!).

Kết thúc

Trong bài viết hôm nay, chúng tôi đã trình bày tổng quan sơ bộ về các bước chúng tôi sẽ thực hiện để đưa Stoffle vào cuộc sống. Tôi hy vọng các bạn cũng hào hứng như tôi và tôi đã có thể truyền niềm tin cho những người trong số các bạn, những người ban đầu nghĩ rằng việc triển khai một ngôn ngữ lập trình là một điều gì đó ngoài tầm với đối với những người bình thường.

Trong bài đăng blog tiếp theo của loạt bài này, chúng ta sẽ bắt đầu làm bẩn bằng cách triển khai Stoffle's lexer, có nghĩa là vào cuối bài viết tiếp theo, chúng ta sẽ phát triển một chương trình Ruby có khả năng đọc mã nguồn Stoffle và chuyển đổi chuỗi ký tự nhạt nhẽo thành một chuỗi mã thông báo có cấu trúc hơn (và thú vị hơn!).

Hẹn gặp lại các bạn trong phần tiếp theo của loạt bài viết này!