Câu hỏi về việc tạo một ngôn ngữ kịch bản


12

Ví dụ, tôi muốn trả tiền cho ai đó để tạo ngôn ngữ lập trình hoặc ngôn ngữ kịch bản cho tôi. Họ cần loại tài liệu nào, để hiểu đầy đủ chính xác những gì tôi muốn.

Ý tôi là, có tài liệu tiêu chuẩn nào mô tả ngôn ngữ lập trình / kịch bản mới trong câu hỏi không?


vì đây là về lập trình chứ không phải lập trình viên, điều này có lẽ phù hợp hơn với StackOverflow.
Muad'Dib

14
Tôi không đồng ý với Muad'Dib. Tôi nghĩ rằng đây là một nơi tốt cho câu hỏi này.
Chris

5
Tôi nghĩ thay vì phát minh ra ngôn ngữ kịch bản của riêng bạn, với chi phí rất lớn cho bạn và người dùng của bạn phải học một ngôn ngữ mới, bạn nên nhúng một ngôn ngữ kịch bản hiện có. Một số ngôn ngữ, ví dụ Python, Javascript / ECMAScript, được thiết kế để nó có thể được nhúng vào một khung lớn hơn. Nói tóm lại, bạn sẽ chỉ cần thiết kế API và tìm ra cách nhúng trình thông dịch kịch bản vào chương trình của riêng bạn.
Nói dối Ryan

1
Có lợi thế trong việc này nếu ngôn ngữ được coi là DSL. cho một ngôn ngữ chung không quá nhiều. Tất nhiên một số ngôn ngữ chung là cơ sở rất tốt cho DSL, ví dụ Lisp hoặc TCL
jk.

Câu trả lời:


16

Những gì bạn cần viết được gọi là một đặc tả ngôn ngữ .

Nó nên chứa một mô tả về ngữ pháp của ngôn ngữ (tốt nhất là trong Extended Backus-Naur-Form ) và ngữ nghĩa của nó.

Đối với phần sau, bạn có thể viết một mô tả bằng từ của riêng bạn (nhưng hãy cẩn thận để chính xác) hoặc một ngữ nghĩa chính thức .


1
BNF chỉ hữu ích cho ngữ pháp miễn phí nội dung, ngôn ngữ kịch bản không phải lúc nào cũng không có ngữ cảnh, ví dụ như TCL (mặc dù tôi nghĩ bạn vẫn có thể tranh luận rằng nên có ngôn ngữ không ngữ cảnh trong hầu hết các trường hợp)
jk.

@jk. Tôi sẽ không nói BNF hoàn toàn vô dụng đối với các ngôn ngữ phi ngữ cảnh. Tùy thuộc vào cách cú pháp không ngữ cảnh miễn phí, nó vẫn có thể có ý nghĩa để chỉ định nó trong EBNF và sau đó giải quyết sự mơ hồ trong các từ. Đó là những gì mà tiêu chuẩn C ++ làm. Trong hầu hết các trường hợp, tôi tưởng tượng điều đó vẫn rõ ràng hơn là giải thích mọi thứ bằng từ ngữ hoặc chỉ định nó bằng cách sử dụng một ngữ pháp nhạy cảm theo ngữ cảnh hoặc không bị hạn chế.
sepp2k

đúng, quan điểm của tôi là có nhiều ngôn ngữ như lisp, tcl hoặc out (thực sự rất tốt để xác định DSL trong) có các cú pháp suy biến và do đó BNF cho bạn biết rất ít
jk.

@jk. Chắc chắn, nhưng trong trường hợp đó, bất kỳ phương tiện nào khác để mô tả cú pháp sẽ cho bạn biết ít như nhau, đơn giản vì có quá ít để nói. Điều đó chỉ có nghĩa là phần cú pháp của đặc tả sẽ rất ngắn.
sepp2k

13

Bạn sẽ cần những điều sau đây:

  • Một lý do để tạo ra một ngôn ngữ mới
  • Một triết lý
  • Một định nghĩa ngữ nghĩa
  • Mô tả từ vựng về mã thông báo của bạn
  • Một định nghĩa phân tích cú pháp

Ngôn ngữ của bạn sẽ khác như thế nào? Nhiệm vụ của nó là gì? Nó có chức năng không? Là đối tượng định hướng? Nó có phải là một ngôn ngữ meta? Các tính năng độc đáo của nó là gì? Điều gì sẽ mang lại cho thế giới không tồn tại (hoặc tồn tại một cách xấu xí)? Bạn muốn thay đổi mọi thứ như thế nào? Nó được biên soạn hoặc giải thích? Một DSL hoặc ngôn ngữ mục đích chung? Đây là của bạn triết lý và ra lệnh rất nhiều về thiết kế ngôn ngữ của bạn.

Tiếp theo, làm việc trên đầu ra cú pháp thô và ngữ nghĩa trên giấy. Đây sẽ là của bạn định nghĩa ngữ nghĩa ... viết mã giả là một cách tuyệt vời để phát triển suy nghĩ của bạn. Đọc "Ngôn ngữ lập trình C" để biết ví dụ tuyệt vời về cách thực hiện. Chơi với nó.

Sau đó, bạn sẽ cần xác định mã thông báo và cú pháp của mình theo một cách nào đó. Các chương trình sau đó xử lý chúng thành automata có khả năng đọc theo chuỗi và xử lý cú pháp. Yacc và Bison sử dụng Biểu thức chính quy và cú pháp kiểu BNF để phân tích từ vựng và cú pháp tương ứng. Ngoài ra còn có Yacc và Bison giống như các công cụ trong các ngôn ngữ khác.

Bạn cũng sẽ cần một nền tảng trong lý thuyết / trình biên dịch ngôn ngữ để biết những gì KHÔNG nên làm. Các ví dụ bao gồm các ngữ pháp mơ hồ, các vấn đề về thao tác và tạo AST và nói chung làm thế nào để làm cho cuộc sống trở nên đơn giản cho chính bạn. Biết lý thuyết là rất quan trọng. Tôi sẽ xem xét để có được những điều sau đây để bắt đầu:

Trình biên dịch: Nguyên tắc, Kỹ thuật và Công cụ (Sách rồng)
Triển khai trình biên dịch hiện đại trong C hoặc Triển khai trình biên dịch hiện đại trong Java


1
+1 cho triết lý, đối với DSL bạn rõ ràng muốn xác định tên miền ở đây
jk.

8

99,9% thời gian tạo ra một ngôn ngữ mới là hoàn toàn không cần thiết. Lợi tức đầu tư rất có thể sẽ rất nhỏ và bạn sẽ lãng phí thời gian của mình.

Nhiều khả năng bạn có thể sử dụng Javascript làm ngôn ngữ kịch bản dễ bị tấn công và đã có sẵn các trình phân tích cú pháp cho hầu hết các ngôn ngữ. Bạn cũng có thể sử dụng các ngôn ngữ kịch bản khác mà bạn thích nếu bạn có thể tìm thấy một trình phân tích cú pháp phù hợp cho chúng. Việc thực hiện những điều đó vào chương trình của bạn sẽ đòi hỏi ít công việc hơn và có lợi nhuận lớn hơn. Mọi người không phải học ngôn ngữ khác, họ chỉ cần học API của bạn. Đó là một giải pháp tốt hơn nhiều.

Tạo một ngôn ngữ mới hầu như luôn luôn xấu.


9
Ngoại trừ vô số lần khi nó không tệ. Tạo DSL đơn giản của riêng bạn có thể rất hữu ích. Bây giờ, việc tạo ngôn ngữ cho mục đích chung của riêng bạn sẽ phù hợp hơn với câu trả lời của bạn.
ChaosPandion

@ChaosPandion nhưng rất nhiều ngôn ngữ đã vượt trội trong việc tạo DSL sử dụng mã từ ngôn ngữ đó (ví dụ như ruby ​​rất tốt trong việc này)
thay thế vào

2
Tôi đồng ý với câu trả lời của bạn nhưng tôi tin rằng nó không phải là câu trả lời đúng cho câu hỏi này. Tôi tin rằng người hỏi đang xem xét các đặc điểm chung của việc tạo ra một ngôn ngữ kịch bản không dành cho những ưu / nhược điểm của việc tạo ra một ngôn ngữ.
Tim Murphy

Tạo một ngôn ngữ mới hầu như luôn là giải pháp tốt nhất. vi.wikipedia.org/wiki/L Language
SK-logic

3

Bạn có thể mô tả ngữ pháp ngôn ngữ của bạn trong BNF .

Chẳng hạn, đây là ngữ pháp của Python .


6
Ngữ pháp tự nó không đủ thông tin để thực hiện một ngôn ngữ mặc dù. Anh ta cũng sẽ phải xác định ngữ nghĩa theo cách này hay cách khác.
sepp2k

0

nếu bạn đang sử dụng .NET, đây là điều mà tôi tình cờ gặp lại. Tôi chỉ cho nó một cái nhìn tò mò, nhưng có lẽ nó sẽ được sử dụng cho bạn: trớ trêu .

Irony là một bộ phát triển để thực hiện các ngôn ngữ trên nền tảng .NET.

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.