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 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.
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.
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ó ...
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.
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.
+1 tới Java
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é.
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.
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.
Rất thú vị, cảm ơn bạn rất nhiều. 🙂
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
[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.
😐 Tôi hy vọng tôi không có vẻ quá thô lỗ
không yên lặng bạn chỉ phá hủy cuộc sống của chúng tôi
hahahahaha, perdoooon. nó không phải là ý định của tôi xD
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 ...
Thông tin rất tốt
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.