Chúng ta có tạo ra một ngôn ngữ lập trình bằng cách viết một trình biên dịch không?


8

Nói rằng, tôi muốn tạo ngôn ngữ lập trình của riêng tôi. Giả sử rằng tôi đã đưa ra tất cả các quyết định về cách tôi muốn nó nhìn và hành động, tôi chỉ cần viết một trình biên dịch cho nó?

Ví dụ, mã Java cấp cao có gì khác ngoài văn bản không và văn bản này có định dạng đúng để trình biên dịch chấp nhận và biến nó thành một thứ khác không?

Câu hỏi của tôi là, việc tạo ra một ngôn ngữ lập trình được thực hiện thông qua một trình biên dịch? Cấp cao là ổn.



Không hẳn vậy. Về mặt lý thuyết, tôi có thể làm cho ngôn ngữ duy nhất của mình hoàn toàn bằng cách tạo ra một trình biên dịch phân tích cú pháp một số văn bản không? Trường hợp văn bản này là ngôn ngữ tạo thành trong cú pháp của tôi. Ví dụ, là System.out.println()Java vì trình biên dịch Java chấp nhận điều đó hoặc có một số thứ khác đang hoạt động ở đây.
Haych

3
Bạn có ý nghĩa gì bởi "việc tạo ra một ngôn ngữ lập trình"? Bạn có ý nghĩa gì khi "thực hiện thông qua"? Thật khó cho tôi để nói chính xác những gì bạn đang hỏi. Bạn nói rằng bạn đã đưa ra tất cả các quyết định về cách bạn muốn ngôn ngữ nhìn và hành động; còn gì nữa để tạo ra một ngôn ngữ lập trình, từ quan điểm của bạn? Nếu bạn cố gắng xây dựng những gì bạn đang cố gắng để đạt được, có lẽ sẽ có thể cung cấp cho bạn câu trả lời hữu ích hơn về cách có thể đạt được. Ngay bây giờ có vẻ như chúng tôi phải đoán những gì bạn có thể yêu cầu.
DW

Câu trả lời:


10

Câu trả lời ngắn gọn là không .

Bạn có thể nghĩ về một ngôn ngữ lập trình như một chủ nghĩa hình thức toán học được sử dụng để thể hiện tính toán. Trình biên dịch / trình thông dịch chỉ là một phần của một phần mềm thực tế thực hiện tính toán đó và không nên dùng làm đặc tả ngôn ngữ.

Điều đó đang được nói, ngoài đặc tả từ vựng và cú pháp của một ngôn ngữ, bạn cũng nên xác định đặc tả ngữ nghĩa, nghĩa là chương trình (chính xác về mặt cú pháp) được viết bằng ngôn ngữ của bạn thực sự có ý nghĩa gì. Các ngữ nghĩa rõ ràng để bắt đầu là ngữ nghĩa hoạt động , trong đó ý nghĩa của một chương trình được đưa ra theo cách thức chương trình thực sự chạy. Đó là, nó (về mặt toán học) xác định chính xác cách thức các chương trình thực thi. Trên đầu ngữ nghĩa này, bạn nên xây dựng một trình biên dịch / trình thông dịch thực tế với các tối ưu hóa và vv.

Chỉ định ngữ nghĩa hoạt động đầy đủ của ngôn ngữ của bạn sẽ cung cấp cho bạn một tài liệu ngôn ngữ chính thức và nó sẽ khiến bạn hiểu ngôn ngữ của bạn đến từng chi tiết. Ngoài ra, nó sẽ cho phép bạn chính thức lý luận về một số khía cạnh của ngôn ngữ. Viết ra ngữ nghĩa hoạt động thực sự là một thói quen tốt.

Ngoài ra còn có các ngữ nghĩa hữu ích khác, chẳng hạn như tiên đề , biểu thị và ngữ nghĩa trò chơi . Tuy nhiên, chúng tiên tiến hơn và thường không đi vào trình biên dịch / trình thông dịch.


3
Cái này sai. Một ngôn ngữ lập trình không có đặc tả chính thức vẫn là ngôn ngữ lập trình.
rebierpost

3
@reinierpost Vì vậy, câu trả lời của bạn cho câu hỏi "là việc tạo ra một ngôn ngữ lập trình được thực hiện thông qua trình biên dịch" là có? Nếu vậy, thì tôi tin rằng bạn nên viết nó như một câu trả lời.
bellpeace

4
@reinierpost: Một ngôi nhà không được thiết kế bởi kiến ​​trúc sư vẫn là một ngôi nhà. Nhưng loại nhà nào bạn thích sống?
Andrej Bauer

1
Câu hỏi như đã nêu là mơ hồ. Một ngôn ngữ lập trình có thể được tạo ra bằng cách tạo một trình biên dịch cho nó không? Chắc chắn rồi. Đây có phải là cách để tạo ra một ngôn ngữ lập trình? Không, nó chỉ là một cách có thể.
Revierpost

2
@johan Một ngôn ngữ lập trình có tầm quan trọng lý thuyết và thực tiễn quá lớn không thể bỏ qua như một khái niệm không được xác định chính xác. Chẳng hạn, làm thế nào bạn giải thích chính xác cho ai đó C là gì hoặc nó hoạt động chính xác như thế nào? Bằng cách cho cô ấy một trình biên dịch C? Nhưng có rất nhiều trong số họ và họ là khác nhau! Hơn nữa, trong nhiều trường hợp, chúng ta thậm chí không biết trình biên dịch C sẽ làm gì (gợi ý: đồng thời, mô hình bộ nhớ). Nói một cách chính xác, một trình biên dịch / intepreter `` tạo ra "một ngôn ngữ lập trình, nhưng nghĩ về ngôn ngữ lập trình như là một triển khai đơn thuần sẽ gây ra nhiều vấn đề hơn nó giải quyết.
bellpeace

5

Nói rằng, tôi muốn tạo ngôn ngữ lập trình của riêng tôi. Giả sử rằng tôi đã đưa ra tất cả các quyết định về cách tôi muốn nó nhìn và hành động, tôi chỉ cần viết một trình biên dịch cho nó?

Không. Đưa ra tất cả các quyết định về cách bạn muốn ngôn ngữ nhìn và hành động tạo ra ngôn ngữ lập trình của riêng bạn. Bạn không cần một trình biên dịch hoặc trình thông dịch để tạo ngôn ngữ lập trình. Bạn không cần một trình biên dịch hoặc trình thông dịch để viết chương trình bằng ngôn ngữ lập trình của bạn.

Bạn chỉ cần một trình biên dịch hoặc một trình thông dịch nếu bạn thực sự muốn chạy các chương trình bạn viết.

Câu hỏi của tôi là, việc tạo ra một ngôn ngữ lập trình được thực hiện thông qua một trình biên dịch? Cấp cao là ổn.

Không. Việc tạo ra một ngôn ngữ lập trình được thực hiện thông qua việc đưa ra hai bộ quy tắc:

  1. một chương trình pháp lý trông như thế nào (cú pháp)
  2. những gì một chương trình pháp lý làm (ngữ nghĩa)

Đó là nó.

Có những ngôn ngữ lập trình không có triển khai. Hoặc không có thực hiện trong một thời gian dài.

Ví dụ, Konrad Zuse đã tạo ra Plankalkül vào giữa những năm 1940, nhưng do chiến tranh, ông không bao giờ có thể thực hiện được. Nó lần đầu tiên được thực hiện như một phần của luận văn vào năm 1975. Nhưng nó chắc chắn đã tồn tại vào những năm 1950 và 1960.

LISP ban đầu được thiết kế như một giải pháp thay thế dễ dàng hơn cho tính toán for để nghiên cứu tính toán. Nó được thực hiện bởi Steve Russell, một sinh viên của John McCarthy. Chính McCarthy thậm chí còn nghi ngờ rằng LISP có thể được thực hiện!

APL ban đầu được thiết kế như một ký hiệu cho việc dạy toán. Sau đó, nó đã được mở rộng để phục vụ như ngôn ngữ đặc tả cho Hệ thống IBM / 360. Việc triển khai đến sau, sau khi ngôn ngữ đã được sử dụng.

PLANNER là một ngôn ngữ có ảnh hưởng rất lớn, nó thực sự chỉ được thực hiện sau khi nó đã ảnh hưởng đến các ngôn ngữ khác; nó được thiết kế vào năm 1969 và được thực hiện vào năm 1973, tại thời điểm đó nó đã ảnh hưởng đến Smalltalk và Prolog (cả năm 1972).

Cấu trúc và giải thích cơ học cổ điển là một cuốn sách giáo khoa vật lý sử dụng sơ đồ thay vì toán học để mô tả các hệ thống động; thực tế là Scheme có các thông dịch viên và trình biên dịch là không cần thiết cho cuốn sách, nó được sử dụng như một ngôn ngữ để truyền đạt ý nghĩ, không chạy các chương trình.

Như bạn có thể thấy, ngôn ngữ lập trình có thể hữu ích ngay cả khi không triển khai. "Các chương trình nên được viết cho con người đọc và chỉ tình cờ cho máy tính thực thi" là một câu nói nổi tiếng từ Cấu trúc và Giải thích các Chương trình Máy tính. Ngôn ngữ lập trình là ngôn ngữ chính thức để mô tả rõ ràng các quy trình phức tạp. Thực tế là nếu bạn mô tả một quá trình đủ chính xác để con người hiểu, thì nó cũng có thể được thực thi bởi một máy là một tác dụng phụ. Đó là một tác dụng phụ rất mong muốn, hữu ích, mạnh mẽ, nhưng nó là một tác dụng phụ.

Các "ngôn ngữ lập trình" đầu tiên, calcul-compus, SKI-compus, Turing Machines,-hàm đệ quy, không được tạo để thực thi. Chúng được tạo ra để hiểu các câu hỏi cơ bản về logic và toán học.


0

Là việc tạo ra một ngôn ngữ lập trình được thực hiện thông qua một trình biên dịch?

Có 3 lựa chọn.

  • Một người lắp ráp
  • Thông dịch viên
  • Một trình biên dịch

Trình
biên dịch mã nguồn được viết bởi con người chuyển từ 1 sang 1 thành mã máy được CPU sử dụng.

Thông dịch viên
Một chương trình đọc từng dòng mã, làm theo các hướng dẫn và thực hiện chúng theo thứ tự.

Trình biên dịch
Một chương trình phân tích cú pháp các câu lệnh thường sử dụng Cây cú pháp trừu tượng và sử dụng câu lệnh đó để tạo mã đối tượng.
Trình biên dịch tạo ra một số dạng mã đối tượng có thể được sử dụng bởi một máy thật hoặc ảo.

Làm mờ các dòng
Có rất nhiều trung gian ở đây.
Ruby chạy từ AST của nó. Java nổi tiếng chạy mã byte cho CPU hư cấu.
SQL được diễn giải, nhưng không được thực thi như được viết, nó được dịch thành một kế hoạch truy vấn.

Javascript tồn tại trong một khu vực hoàng hôn kỳ lạ. Nó được hiểu cho hầu hết các phần, nhưng các phần quan trọng được chạy qua trình biên dịch JIT tạo mã byte không được chuẩn hóa và nó cũng được sử dụng làm mã đối tượng cho một số trình biên dịch.
Php từng là một ngôn ngữ được dịch thuần túy, nhưng Facebook sử dụng trình biên dịch php của riêng nó.

Đề nghị của tôi
Nếu bạn muốn thử nghiệm viết một ngôn ngữ lập trình.
Bắt đầu với một thông dịch viên.

Nếu bạn muốn hiểu trình biên dịch, hãy nghiên cứu AST!
Một ngôn ngữ như Pascal được thiết kế riêng cho AST, nó có thể đi từ mã nguồn đến mã máy trong một lần chạy và do đó tương đối dễ thực hiện trong trình biên dịch.
Nếu bạn khăng khăng nghiên cứu các trình biên dịch và không phải là thông dịch viên, tôi khuyên bạn nên nghiên cứu các tác phẩm của Wirth về chủ đề này.


Có nhiều hơn ba lựa chọn. Ví dụ, một lựa chọn là: không làm gì cả. Bạn có thể tạo một ngôn ngữ lập trình đơn giản bằng cách nêu các quy tắc của nó. Bạn không cần phải thực hiện chúng cả. Plankalkül đã không được thực hiện cho đến 60 năm (?) Sau khi nó được tạo ra. LISP và APL ban đầu không có ý định thực hiện, LISP được thiết kế như một phiên bản dễ tính hơn của-tính toán để nghiên cứu tính toán, APL được thiết kế như một ký hiệu cho việc dạy toán. Cuốn sách Cấu trúc và diễn giải Cơ học cổ điển sử dụng Lược đồ như một ký hiệu để mô tả các hệ thống động, chứ không phải là một
Jörg W Mittag

ngôn ngữ để viết các chương trình thực sự được thực hiện.
Jörg W Mittag

0

Tất cả một trình biên dịch làm là để đảm bảo rằng đầu vào mà nó đưa ra sử dụng ngôn ngữ mà trình biên dịch hiểu và nó mang cấu trúc ngữ nghĩa giống như ngôn ngữ.

Trình biên dịch giả mạo trí thông minh bằng cách sử dụng một lexer và một trình phân tích cú pháp để phân tích từ vựng đầu vào và cố gắng phân tích các mã thông báo thành một thứ tự có ý nghĩa dự định mà không đưa ra sự mơ hồ.

Để trả lời câu hỏi của bạn, bạn CÓ THỂ tạo ngôn ngữ lập trình bằng cách tạo trình biên dịch, nhưng khi làm như vậy, ngôn ngữ lập trình thực sự được tạo trước khi trình biên dịch hoàn tất.

Hãy nghĩ về các ngôn ngữ lập trình như bất kỳ ngôn ngữ nào khác ngoài đó - tiếng Anh, tiếng Pháp, tiếng Đức, v.v. chắc chắn rằng thứ tự của các từ có ý nghĩa trong ngôn ngữ mà nó được xây dựng và cuối cùng dịch đầu vào đó thành ngôn ngữ mà máy có thể hiểu


Điều này không thực sự đúng. Có rất nhiều ví dụ về các ngôn ngữ được tạo ra cùng với các chương trình được viết để xử lý chúng. FORTRAN là tên của trình biên dịch, không phải ngôn ngữ.
rebierpost

@reinierpost Quan điểm của tôi là trước khi trình biên dịch có thể nhận ra một tập hợp các mã thông báo trong ngôn ngữ đã cho, các mã thông báo đó phải tồn tại trước tiên ... do đó ngôn ngữ đã tồn tại trước khi trình biên dịch hoàn thành. Một ngôn ngữ không thể tồn tại mà không có các thành phần cơ bản nhất là các từ / cụm từ trong ngôn ngữ đó. Ngữ nghĩa có thể đến sau. Theo cách tương tự, một trình biên dịch thậm chí không thể bắt đầu giả vờ nó biên dịch một ngôn ngữ nếu nó không biết các từ tạo nên ngôn ngữ đó
smac89

Không cần phải có một ngôn ngữ 'nhất định'. Trình biên dịch có thể xử lý đầu vào mà không có bất kỳ định nghĩa cụ thể nào về yếu tố cấu thành đầu vào hợp lệ cho nó. Cố gắng làm cho đám đông lập trình viên C đồng ý về chính xác và không phải là chương trình C. Chúc may mắn!
rebierpost
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.