Các tính năng cơ bản cho một ngôn ngữ cơ bản? Đề xuất DSL?


9

Cuối cùng tôi đã bắt đầu hiểu được sự phức tạp đằng sau việc tạo một trình thông dịch và trình biên dịch. Tôi đã xây dựng một số phiên bản TinyBasic, 1964 (Dartmouth) Basic và bản mở rộng của riêng tôi về các ngôn ngữ đó trước khi đến thời điểm này. Dự án gần đây nhất là dự án mà tôi gọi là Open Source Basic ... bởi vì tôi không thể nghĩ ra được tính năng nào khác của ngôn ngữ mà mọi người sẽ quan tâm. Để có thể mở nguồn ngôn ngữ và hiểu cách thực hiện một số điều phức tạp (cách quét, phân tích cú pháp, giải thích và biên dịch)

Open Source Basic trước tiên được hiểu thành ngôn ngữ dựa trên ngăn xếp. Ngôn ngữ dựa trên ngăn xếp đó sau đó được diễn giải và thực thi ngay lập tức hoặc biến thành tệp thực thi CLR.

Tất cả các câu hỏi của tôi đều sôi sục về điều này:

  • Các tính năng / cấu trúc cơ bản của ngôn ngữ cơ bản là gì? Tôi đã có sẵn các cấu trúc cơ bản này: Bài tập, Biểu thức, Biến, một số chức năng (Ngẫu nhiên, ToUpper, ToLower), Looping (for và do-while / Until), If (block và one-line) Khác ) và đầu ra (In) và các thường trình con (chưa có tham số).
  • Khi tôi 'hoàn thành' việc thêm các cấu trúc cơ bản vào ngôn ngữ của mình - tôi nên phân nhánh như thế nào? Vào miền nào? Nói cách khác, ngôn ngữ cơ bản nguồn mở của tôi nên đi theo hướng nào khi tôi có tất cả các cấu trúc chung hoạt động?

Cảm ơn bạn đã dành thời gian,

Thống lĩnh


3
Tôi luôn muốn có một ngôn ngữ có chức năng AOP tích hợp, hỗ trợ cú pháp.
Thất vọngWithFormsDesigner

@Dominick: Làm thế nào về chức năng LINQ?
Động vật ăn thịt

@Frustrated ... AOP - Chức năng lập trình định hướng theo khía cạnh? Bạn có thể cho một ví dụ?
Dominick

5
Bạn không nên bắt đầu phát minh một ngôn ngữ cụ thể miền từ các tính năng bắt buộc cơ bản. Chính thức hóa tên miền của bạn trước tiên, biến kiến ​​thức này thành ngôn ngữ và chỉ sau đó thêm các tính năng cơ bản, nếu chúng hoàn toàn cần thiết. Có khả năng bạn thậm chí sẽ kết thúc với một DSL hoàn hảo không hoàn thành Turing và đó là một trong những đặc tính tốt nhất của DSL.
SK-logic

1
Chắc chắn "goto" là một tính năng bắt buộc của bất kỳ BASIC nào?
Perry

Câu trả lời:


1

Trải nghiệm của tôi với BASIC ban đầu trên Hàng hóa [Vic-20, C-64] đã cho tôi ấn tượng rằng số dòng là một "tính năng" cốt lõi của BASIC. Có vẻ như chúng không còn được sử dụng trong các triển khai hiện đại, mà đối với tôi nó là một điều bất lợi vì quan điểm chính của tôi về BASIC là một ngôn ngữ học tập để chuyển sang một thứ khác.


1

Chắc chắn là một nỗ lực cao quý, nhưng tôi nghĩ rằng bạn đã đảo ngược các ưu tiên của bạn.

Mối quan tâm đầu tiên của bạn phải là vấn đề "tên miền" mà ngôn ngữ của bạn được nhắm mục tiêu để giải quyết. Đó là lý do tại sao nó được gọi là "Ngôn ngữ cụ thể miền" ở vị trí đầu tiên. DSL chỉ có thể chấp nhận được khi nó nhỏ, đơn giản và tập trung rất hẹp để giải quyết các vấn đề cụ thể như dao qua bơ.

Sau khi bạn đã xác định tên miền và cách ngôn ngữ của bạn sẽ hoạt động trong miền, bạn có thể đặt các cấu trúc hoặc tính năng cụ thể.

Cuối cùng, có thể hữu ích để xem xét liệu bạn muốn có DSL bên trong hay bên ngoài .


0

Tôi đã phát triển ngôn ngữ kịch bản cho ứng dụng CAE / FEA và một số tính năng mà tôi thấy hữu ích cho người dùng cuối là: Biến cục bộ và toàn cầu Ma trận với phân bổ động và mở rộng Hàm với các đối số và bằng cách chuyển tham chiếu Cấu trúc (loại do người dùng xác định) Cùng với các tính năng bạn đề cập đến bản thân nên tạo ra một ngôn ngữ khá mạnh mẽ để bắt đầu. Sau đó, bạn sẽ phát triển theo yêu cầu người dùng.


Đó là một ngôn ngữ cụ thể và rất miền cụ thể (Phân tích phần tử hỗ trợ máy tính / Phân tích phần tử hữu hạn). Tôi có thể thấy lý do tại sao bạn cần ma trận. Tất cả các đề xuất của bạn là những người khá tốt và tôi sẽ ghi nhớ chúng. Cảm ơn.
Dominick

0

Có một số tính năng có thể được thêm hoặc mở rộng nếu đã tồn tại, nhưng ...

... Các ngôn ngữ lập trình giống như cơ bản, rất giống với ngôn ngữ script và một tính năng mà nhiều người bỏ lỡ hoặc đưa vào sau này, là không gian tên hoặc mô-đun.

C, C ++, PHP, Visual Basic, đã bắt đầu mà không có mô-đun / không gian tên và được thêm vào sau.

Tiếp theo có thể là chương trình con (thủ tục hoặc hàm không trả về giá trị) và hàm (chương trình con trả về giá trị đặc biệt).


0

hiểu làm thế nào một số điều phức tạp được thực hiện (cách quét, phân tích cú pháp, giải thích và biên dịch được thực hiện)

Có một câu hỏi hay trên trang web Stack Overflow về tài nguyên để hiểu trình biên dịch. Bạn cũng có thể xem trang lớp Trình biên dịch của tôi .

Khi tôi 'hoàn thành' việc thêm các cấu trúc cơ bản vào ngôn ngữ của mình - tôi nên phân nhánh như thế nào?

Với các tính năng bạn đã xây dựng, tôi khuyên bạn nên thêm ba loại dữ liệu: int, chuỗi, boolean. Bạn sẽ cần phải làm ba việc, mỗi việc khó hơn một chút so với trước:

  1. Sửa đổi ngữ pháp để bạn có thể phân tích các từ khóa đó. Kiểm tra.
  2. Tạo (hoặc thêm vào bảng biểu tượng hiện có của bạn) để bạn có thể bao gồm kiểu dữ liệu cùng với tên biến và các thuộc tính khác. Sau đó thực hiện một công tắc gỡ lỗi để bạn có thể kiểm tra điều này và xem bảng biểu tượng.
  3. Kiểm tra các loại tương thích trước khi tạo mã thành MsIL hoặc trong khi giải thích. Kiểm tra cả hai trường hợp lỗi và không lỗi trong mỗi chế độ thực thi cho tất cả các loại.

Nếu điều đó diễn ra tốt đẹp, thì tôi khuyên bạn nên làm việc trên phạm vi (cục bộ trong các thói quen phụ so với toàn cầu). Hãy cho tôi biết nếu bạn muốn một số lời khuyên về điều đó.

Chúc may mắn. Và tận hưởng!

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.