Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Tự tạo Toy Language bằng Ruby: Hướng dẫn từng bước

Bạn có thấy ngôn ngữ lập trình là công cụ kỳ diệu nhưng bí ẩn? Nếu có cơ hội nhìn dưới "capô" và hiểu điều gì khiến chúng hoạt động? Nếu bạn quan tâm đến việc bốc tay áo lên và phát triển ngôn ngữ lập trình từ con số không, thì bài viết này và các bài tiếp theo trong loạt bài sẽ hữu ích.

Trong loạt bài, chúng ta sẽ xây dựng một ngôn ngữ lập trình interpreted, dynamically typed rất đơn giản từng bước. Tuy nhiên, hiện tại đừng lo nếu bạn hơi băn khoăn về ý nghĩa chính xác của các thuật ngữ này hoặc hơi e ngại trước nhiệm vụ. Chúng ta sẽ dùng Ruby tuyệt vời để triển khai interpreter và giải thích từng bước rõ ràng để cả dev mới và senior đều theo dõi được. Chúng ta đặt tên ngôn ngữ là 'Stoffle' để tưởng nhớ một con râtel (honey badger) Nam Phi dễ thương mang tên này.

Tại sao xây dựng ngôn ngữ lập trình?

Stoffle có lẽ không bao giờ thay thế Python hay Ruby. Vậy tại sao còn xây dựng nó? Ngoài việc vui, hy vọng loạt bài chỉ ra rằng xây dựng ngôn ngữ là bài tập lập trình tuyệt vời. Nhiều lợi ích từ trải nghiệm này:

  • Nó giải mã ngôn ngữ lập trình (và công cụ dev, gián tiếp) và cho phép chúng ta thấy mình không chỉ là người tiêu dùng công cụ mà còn là người tạo ra có thể thiết kế ngôn ngữ riêng nếu nhu cầu hoặc mong muốn quy định;

  • Bài tập này trình diện những 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ờ gặp trong đời thường;

  • Chúng ta cũng sẽ học về thành phần hữu ích ngoài phạm vi triển khai ngôn ngữ lập trình. Parser có thể dùng thay cho hàng triệu regex khó hiểu để xử lý, ví dụ, file text legacy khó chịu mà sếp bảo phải hỗ trợ như cơ chế import dữ liệu mới vào hệ thống bạn đang làm.

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

Trước khi nhìn thấy phía trước, hãy zoom out và hiểu chương trình chạy trên máy tính như thế nào. Như bạn tưởng tượng, CPU không trực tiếp hỗ trợ ngôn ngữ high-level như Ruby. CPU có, tuy nhiên, chuỗi instruction rất low-level mà chúng hỗ trợ tùy kiến trúc.

Nếu tò mò, hãy research, ví dụ, kiến trúc x86, rất có thể chạy máy tính bạn nếu đọc bài này trên PC hoặc Mac.

Vì vậy, nhiệm vụ của ngôn ngữ lập trình là biến code high-level thành machine code CPU hiểu. Nhiều chiến lược dùng để hoàn thành nhiệm vụ. Stoffle sẽ là interpreted language, nghĩa là interpreter sẽ dịch source code Stoffle thành machine code trong khi chương trình chạy.

Compiled language như C là khác. Chúng có bước compilation dịch và sinh binary (tức source chuyển thành machine code) sẵn sàng chạy trên CPU target. Chiến lược khác là compile source file thành ngôn ngữ (thường high-level) đã tồn tại; chiến lược này thường gọi là 'transpilation'.

Tuy nhiên, nhớ rằng thực tế không rõ ràng như vậy với ngôn ngữ thật. Chúng thường áp dụng, theo cách này hoặc khác, khía cạnh và kỹ thuật của tất cả chiến lược này (và khác). Tôi khuyến khích research thêm về con đường ngôn ngữ ưa thích bạn đi sau khi nắm cơ bản.

Tầm nhìn tổng quan Stoffle

Như đã nói, Stoffle sẽ là ngôn ngữ cơ bản, interpreted, dynamically typed. Nó chỉ bao gồm vài kiểu dữ liệu cơ bản, bốn phép toán số học cơ bản, so sánh và equality, toán tử logic, if/else, while loop, hàm, và in ra console.

Trivia: Ngôn ngữ giống Stoffle mà mục đích chính là học tập và thí nghiệm thường gọi là toy languages.

Interpreter Stoffle sẽ triển khai bằng Ruby, như đã nói. Khi chạy interpreter (stoffle hello_world.sfe), các thành phần và giai đoạn file source trải qua trước khi chạy:

Tự tạo Toy Language bằng Ruby: Hướng dẫn từng bước

Các phần của interpreter và điều xảy ra khi chạy file .sfe.

Lexer

Còn gọi là scanner, nhiệm vụ lexer là chuyển chuỗi ký tự thô thành nhóm hợp lý thường gọi là 'token'. Ví dụ khai báo biến my_var. Lexer đọc ký tự và sinh token Token::VARIABLE.

Parser

Khi nghĩ đến source code, bản chất lồng nhau của nó không thể chối cãi. Xét biểu thức điều kiện, ví dụ; nhánh true và false lồng nhau và thực thi tùy kết quả đánh giá điều kiện.

Nhiệm vụ chính của parser là biến chuỗi token phẳng thành cấu trúc dữ liệu biểu diễn mối quan hệ giữa chúng. Chức năng quan trọng khác của parser là báo lỗi cú pháp khi chúng ta sai.

Interpreter

Interpreter Stoffle sẽ đơn giản và làm việc trực tiếp với cấu trúc dữ liệu parser sinh ra. Interpreter sẽ phân tích cấu trúc này từng mảnh và thực thi khi đi.

Trong ngôn ngữ Stoffle, việc chuyển thành machine code sẽ xảy ra vì chính interpreter sẽ là chương trình Ruby (vì vậy được interpret bởi interpreter của Ruby khi chạy nó!).

Kết thúc

Trong bài hôm nay, chúng ta trình bày cái nhìn khái quát các bước đưa Stoffle ra đời. Tôi hy vọng bạn hào hứng như tôi và tôi đã truyền cảm hứng tự tin cho những ai ban đầu nghĩ triển khai ngôn ngữ lập trình là việc khó với người thường.

Trong bài tiếp theo của loạt bài, chúng ta sẽ bắt đầu bốc tay áo bằng cách triển khai lexer Stoffle, nghĩa là cuối bài sau, chúng ta sẽ có chương trình Ruby đọc source code Stoffle và biến chuỗi ký tự đơn điệu thành chuỗi token có cấu trúc (và thú vị hơn)!

Gặp lại bạn sớm trong phần tiếp theo của loạt bài!