Tạo ngôn ngữ lập trình của riêng bạn (I)

Sự phát triển của ngôn ngữ lập trình

Sau khi viết bài báo đầu tiên trên cách tạo hệ điều hành của riêng bạn, ai đó đã nói với tôi rằng nếu tôi có thể làm một bài báo về cách tạo một ngôn ngữ lập trình. Lúc đầu tôi không chú ý lắm, nhưng bây giờ và thông qua những cách khác, tôi đã học được nhiều hơn về việc tạo ra các ngôn ngữ lập trình. Vì vậy, chúng ta hãy làm một ngôn ngữ lập trình cơ bản, có thể dễ dàng nhúng vào các chương trình khác và hoạt động với một máy ảo mà chúng tôi cũng sẽ thiết kế. Hôm nay chúng ta phải tạo một máy ảo cơ bản nhất.

Có thể bạn đang tự hỏi: «Một máy ảo? Nhưng điều đó không quá khó và nó cũng làm chậm các chương trình phải không? " Ngược lại, một máy ảo đơn giản rất đơn giản và tương đối nhanh. tôi đã chọn Rust làm ngôn ngữ cho máy ảo. Nhưng nó là gì Rust?

Rust Nó là một ngôn ngữ lập trình tập trung vào bảo mật thực thi, vì vậy việc sử dụng nó trên thực tế sẽ không thể có người đóng máy ảo. Nó là một ngôn ngữ biên dịch trong quá trình phát triển được tạo ra bởi Mozilla. Servo, thay thế cho Con cắc kè, đang phát triển trong anh ấy. Bạn vẫn có thể thay đổi cú pháp của mình nhưng mã tôi sẽ sử dụng sẽ được giữ cho đến khi có bản phát hành ổn định đầu tiên.

Rust cài đặt trong Linux Theo một cách đơn giản. Tuy nhiên, không có bưu kiện chính thức. Người dùng của Ubuntu có thể thêm hai cái này PPA: ppa: hansjorg / gỉ  y ppa: cmrx64 / hàng hóa, người dùng của Arch co thể sử dụng AUR (hàng-git là gói cài đặt mọi thứ). Phần còn lại có thể sử dụng:

curl -s https://static.rust-lang.org/rustup.sh | sudo sh

Máy ảo hoạt động như thế nào?

Nếu bạn biết cách thức hoạt động của thế giới lắp ráp thì nó hoàn toàn giống nhau, với ngăn xếp hoặc ngăn xếp. Nếu không, tôi sẽ giải thích cho bạn. Hãy tưởng tượng đoạn mã sau:

in 2 + 3

Máy tính không hiểu 2 + 3 nghĩa là gì, cũng không biết phải tuân theo thứ tự nào. Máy tính hoạt động với pin hoặc ngăn xếp, trong đó dữ liệu được tích lũy và trích xuất liên tục. Mã đó trong máy ảo của chúng tôi sẽ trông giống như sau:

PUSH 2 PUSH 3 THÊM IN

Về cơ bản, chúng tôi sẽ đặt 2 cái trên chồng lên trên, 3 cái cũng vậy. ADD sẽ kéo (tức là xóa nó khỏi ngăn xếp và nhận giá trị của nó) 2 mục cuối cùng trên ngăn xếp và thêm kết quả vào đầu ngăn xếp. PRINT sẽ lấy mục cuối cùng trên ngăn xếp và sử dụng nó để hiển thị cho chúng tôi. Bây giờ hãy làm điều đó trong Rust.

Trước tiên, chúng ta phải xác định một ngôn ngữ cho mã byte, chúng tôi có thể sử dụng một cái hiện có giống cái trong Java o el CLR .NET / Mono, nhưng chúng tôi sẽ tạo một cái cơ bản hơn.

https://gist.github.com/a01de8904fd39a442c20

Chúng tôi sử dụng ký hiệu thập lục phân cho mỗi lệnh. Trên cao, chúng tôi đã đặt # [dẫn xuất (FromPrimitive)], là một đặc thù của Rust và nó sẽ giúp chúng ta sau này có thể so sánh trực tiếp kiểu liệt kê với byte.

Bây giờ chúng ta phải tạo một hàm thực thi từng lệnh đó. Đối với điều này, chúng ta phải đọc một byte và so sánh nó với các hướng dẫn mà chúng ta có trong bảng liệt kê. Nếu bạn tìm thấy bất kỳ tồn tại nào, bạn phải thực hiện hành động của mình.

https://gist.github.com/8950ce212a2de2f397f9

Chúng tôi làm điều đó để đọc từng byte riêng lẻ và thực thi chúng:

https://gist.github.com/12e24a1f0dd65e4cd65d

Như bạn có thể thấy, chúng ta phân biệt nếu trước đó chúng ta đã được cung cấp lệnh PUSH (lệnh INTEGER của chúng ta), thì byte tiếp theo sẽ hoàn toàn được đưa vào ngăn xếp. Ở đó, chúng tôi đang sử dụng hai chức năng mà tôi chưa dạy bạn, self.pop () y self.push (), rõ ràng là phụ trách xử lý ngăn xếp.

https://gist.github.com/54147f853a8a2b8c01d9

Chúng không phức tạp lắm, nhưng hàm pop có cơ chế phát hiện lỗi. Trên thực tế, trong Rust, nếu chúng tôi loại bỏ các cơ chế đó, nó sẽ gây ra lỗi biên dịch. Bây giờ chúng ta chỉ cần gọi trong một chương trình perin (máy ảo của chúng tôi) và thực thi một mã bytecode.

https://gist.github.com/99b1ab461318b3a644d0

Bytecode đó có thể được đọc từ một tệp, nhưng ở đây để đơn giản, tôi đã lưu trữ nó trong một biến. Nếu chúng tôi thực hiện nó, nó sẽ cho chúng tôi kết quả mong đợi:

Perin v0.1 Perin VM thực thi FlopFlip bytecode Bắt đầu phiên bản PerinVM PerinVM v0.1.0 Giá trị nguyên 5

Tất cả mã có sẵn tại GitHub dưới Giấy phép Apache 2.0: https://github.com/AdrianArroyoCalle/perin. Để biên dịch họ phải có Cargo đã cài đặt và đặt:

tính phí bản dựng && ./target/main

Trong chương tiếp theo, chúng ta sẽ xem thêm về ngôn ngữ lập trình của chúng ta.


Để lại bình luận của bạn

địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu bằng *

*

*

  1. Chịu trách nhiệm về dữ liệu: Miguel Ángel Gatón
  2. Mục đích của dữ liệu: Kiểm soát SPAM, quản lý bình luận.
  3. Hợp pháp: Sự đồng ý của bạn
  4. Truyền thông dữ liệu: Dữ liệu sẽ không được thông báo cho các bên thứ ba trừ khi có nghĩa vụ pháp lý.
  5. Lưu trữ dữ liệu: Cơ sở dữ liệu do Occentus Networks (EU) lưu trữ
  6. Quyền: Bất cứ lúc nào bạn có thể giới hạn, khôi phục và xóa thông tin của mình.

  1.   người đi đường dijo

    Sự tò mò thú vị, mặc dù nó không hữu ích lắm trên thực tế, nhưng cũng chẳng hại gì khi biết.

    Thật tuyệt khi bạn quảng cáo Rust, nó là một ngôn ngữ hứa hẹn rất nhiều, nó không chỉ an toàn hơn c ++, mà còn rõ ràng hơn trong cú pháp của nó.

    Đối với hình ảnh, tôi sẽ không xem xét java tiến hóa XD.

    1.    người đi đường dijo

      Và từ fortran, tôi chưa bao giờ sử dụng nó, nhưng tôi chưa nghe nhiều điều hay về nó ...

      1.    Khét tiếng dijo

        Tôi làm, và nó đặc biệt hữu ích trong lĩnh vực kỹ thuật mặc dù Python đang dần phát triển.

      2.    John dijo

        Fortran có lẽ là ngôn ngữ tuyệt vời khác cùng với C. Ngay cả ngày nay trong những câu hỏi thực sự quan trọng sẽ là ngôn ngữ này hay câu hỏi khác.

        Và sẽ có thể tranh luận rằng Fortran là một 'sự tiến hóa' của C, khi có lẽ nó phải theo chiều ngược lại, vì C mới hơn, hiện đại hơn và có nhiều khả năng hơn; mặc dù ít nhất một cái không bị tách rời khỏi cái kia.

        Mặc dù các vị trí cuối cùng đều được tranh luận từ một số quan điểm.

    2.    Francisco dijo

      +1 tới Java

  2.   người khuân vác dijo

    Các bạn xem mình thích cái này mình sẽ đưa ra cái gì đó về lập trình nhưng cơ bản để xem mình có hiểu thêm không nhé.

  3.   người dùnggnulinux dijo

    Mục đích thực sự của việc tạo ra một ngôn ngữ lập trình mới là gì? Đối với cá nhân tôi, có vẻ như đó là một mưu đồ che giấu mã nguồn.

  4.   Yeilly dijo

    Bạn bè điều gì đã xảy ra với sự tiếp tục của "hệ điều hành của riêng bạn"? Xin đừng để nó ở đó, hãy tiếp tục nó.

    Thực sự, bạn là một bậc thầy và hai bài hát này đã hoàn toàn thu hút sự chú ý của tôi, nhưng tôi sẽ không muốn chúng ở lại giữa chừng.

    Tôi biết rằng nhiều người trong chúng ta cũng nghĩ như vậy và chúng ta đang chờ đợi sự liên tục và kết luận của những chủ đề rất thú vị này.

  5.   Christian David dijo

    Rất thú vị, cảm ơn bạn rất nhiều. 🙂

  6.   Franco dijo

    Tôi không coi java là một ngôn ngữ lập trình mà là một trình thông dịch lệnh, vì nó không thể biên dịch được

    1.    Mario dijo

      [Ngôn ngữ lập trình là một ngôn ngữ chính thức được thiết kế để diễn đạt các quy trình có thể được thực hiện bởi các máy móc như máy tính.]

      Vì lý do này, Java là một ngôn ngữ lập trình. Ngay cả ngôn ngữ Bash (ngôn ngữ trình bao linux) cũng là một ngôn ngữ lập trình.

      Có hai loại ngôn ngữ:
      - Tổng hợp
      - Đã thông dịch
      - Hỗn hợp (Máy ảo, các thư viện gốc được biên dịch và mã chức năng được thông dịch)

      Các trình thông dịch rất hữu ích khi nói đến đa định dạng và không có hiệu suất thảm hại cho điều đó. Java, VB.NET, C ++ .NET, F #, C # là tất cả các ngôn ngữ hỗn hợp. Ngôn ngữ bash, bat, PHP, Javascript và nhiều ngôn ngữ khác là các ngôn ngữ thông dịch.

      Nếu bạn không coi Java là một ngôn ngữ vì nó được thông dịch (mà nó không phải), bạn không nên xem xét nhiều ngôn ngữ khác được sử dụng để tạo chương trình. Hơn nữa, theo quy tắc ba đó, bạn không nên coi rằng không có ngôn ngữ lập trình nào ngoại trừ ngôn ngữ máy.

      Và tại sao không? Ngay cả ngôn ngữ máy cũng không thể được coi là một ngôn ngữ vì nó thực sự chỉ là một tập hợp các lệnh được "thông dịch" bởi bộ xử lý.

      Bởi vì một cách hiệu quả, TẤT CẢ các ngôn ngữ chỉ là một tập hợp các lệnh được thông dịch bởi một bộ xử lý.

      Bạn có thể thích một ngôn ngữ ít nhiều (trong trường hợp này là Java), có vẻ ít nhiều hữu ích và mạnh mẽ nhưng để nói rằng nó không phải là ngôn ngữ lập trình vì nó không được biên dịch ... nó đi ngược lại tất cả các định nghĩa về ngôn ngữ lập trình.

    2.    Mario dijo

      😐 Tôi hy vọng tôi không có vẻ quá thô lỗ

      1.    Maria Antoinette của Manuela Cardenas dijo

        không yên lặng bạn chỉ phá hủy cuộc sống của chúng tôi

      2.    Mario dijo

        hahahahaha, perdoooon. nó không phải là ý định của tôi xD

    3.    carlos dijo

      java là một ngôn ngữ lập trình. bởi vì bạn có thể phát triển một ứng dụng và khi bạn biên dịch, bạn tạo một .jar được JVM thông dịch. Sau đó, theo logic python của bạn, nó cũng không được thông dịch nhưng nó được biên dịch sang các tệp thực thi khác nhau ...

  7.   Elijah Mongelos dijo

    Thông tin rất tốt

  8.   Carlos Arturo dijo

    thông tin tốt nhưng tôi nghi ngờ, sẽ có thể tạo ra một ngôn ngữ lập trình mới từ đầu mà không cần phải dựa vào các phép loại suy hoặc phần mềm khác. Tôi nói theo cùng một cách mà các ngôn ngữ khác được tạo ra như java hoặc HTML.
    Tôi đánh giá rất cao sự giúp đỡ của bạn về câu hỏi này.