Có ngôn ngữ lập trình cá nhân hóa nào bạn có thể sử dụng để chuyển đổi sang ngôn ngữ khác không?


13

Có ngôn ngữ lập trình nào trong đó bạn có thể đặt cấu hình cú pháp của riêng mình và nó sẽ chuyển đổi mã thành ngôn ngữ bạn chọn không?

Chẳng hạn, bạn sẽ chọn các cấu hình cụ thể như "Các khối được lập chỉ mục của Python", [a,b,c]khởi tạo các mảng, ^để lũy thừa và các cấu hình khác. Một tập lệnh sẽ chuyển đổi nó thành ngôn ngữ tương đương với sự lựa chọn của bạn.


1
Tôi chắc chắn hy vọng không. TIMTOWTDI được cho là xấu, nhưng "phát minh ra nhiều cách không tương thích như bạn muốn" chắc chắn sẽ có cùng một nhược điểm gấp trăm lần, và thậm chí còn ít hữu ích hơn. DSL đôi khi đáng giá, nhưng xác định lại một nửa cú pháp (hoặc tệ hơn - hoán đổi hai toán tử, mang lại khả năng tương thích rõ ràng nhưng ngữ nghĩa khác nhau) chỉ vì sự tàn phá của nó ...

Tôi hỏi điều này bởi vì cụ thể tôi đang lập trình trên javascript và thực sự, thực sự muốn có thể thiết lập một vài loại đường cú pháp trên mã của tôi nhưng ngôn ngữ sẽ không cho phép. Thậm chí không quá tải nhà điều hành là có thể.
Dokkat

2
Ở một mức độ nào đó, những gì bạn mô tả âm thanh như macro tiền xử lý . Bây giờ nếu chỉ chúng ta có thể có một tính năng tương tự cho perl ...
yannis

5
@Dokkat: Vui lòng cập nhật câu hỏi để nói cụ thể rằng đây là về JavaScript. Câu hỏi - như đã hỏi - là một cơn ác mộng bảo trì và hỗ trợ. Thêm cú pháp mới vào một ngôn ngữ hiện có (hoặc sử dụng bộ xử lý trước để thay đổi ngôn ngữ riêng tư của bạn thành ngôn ngữ chung) thực sự khủng khiếp. Tuy nhiên. Nếu bạn liệt kê các vấn đề đường cú pháp JavaScript cụ thể , bạn có thể nhận được trợ giúp cụ thể .
S.Lott

3
Các "ngôn ngữ lập trình được cá nhân hóa" này thường được gọi là "ngôn ngữ dành riêng cho miền" hoặc DSL.
Michael Dillon

Câu trả lời:


14

Có, nhưng có lẽ không phải theo cách bạn đang nghĩ.

Lisp và họ hàng của nó có các hệ thống macro mạnh mẽ cho phép bạn thực hiện các phép biến đổi tùy ý trên nguồn của mình, vì vậy về nguyên tắc, bạn có thể sử dụng macro (và macro đọc, ở cấp độ ký tự) để thực hiện bất kỳ tiện ích mở rộng nào bạn muốn. Các ngôn ngữ kết hợp (và ngôn ngữ của các tác giả trong các lĩnh vực liên quan) có tiềm năng cho sức mạnh lập trình siêu hình tương tự . Một ví dụ điển hình cho điều này là Forth , trong đó rất nhiều cấu trúc cú pháp (như nhận xét) có thể do người dùng định nghĩa. Đối với một ví dụ hiện đại, không bí truyền, có một nỗ lực để cung cấp hỗ trợ cải tiến Perl 6 so với Perl 5 cho cú pháp do người dùng xác định .


8
Tôi bằng cách nào đó biết Perl sẽ là (một phần) câu trả lời. Tôi đoán các macro tiền xử lý C cũng phù hợp với mô tả, đến một phần mở rộng nhỏ.
yannis

Ngoài ra toán tử quá tải trong C ++ có thể được tốt đẹp. Ví dụ thế giới xin chào đến với tâm trí. cout << "Chào";
Lord Tydus

@LordTydus: Thật vậy, và thậm chí chỉ là quá tải toán tử cho phép bạn thực hiện khá nhiều phép thuật đằng sau một giao diện lành mạnh. Sẽ thật tuyệt nếu C ++ có nhiều khả năng nạp chồng chung hơn, giả sử, quá tải operator[]cho nhiều đối số hoặc giới thiệu các toán tử mới như trong Haskell; nhưng tôi nghi ngờ ủy ban sẽ nhìn thấy các vấn đề phân tích cú pháp.
Jon Purdy

3

Âm thanh như lập trình khái niệm .

Tôi không quen thuộc với nó, nhưng XL là ngôn ngữ được thiết kế dành riêng cho nó.

XL có cú pháp và ngữ nghĩa có thể cấu hình lại của lập trình viên. Trình cắm trình biên dịch có thể được sử dụng để thêm các tính năng mới cho ngôn ngữ.

Lisp và Forth cũng hỗ trợ lập trình khái niệm, mặc dù ít hơn XL. Tôi đề nghị Lisp vì nó rất thiết thực và hiệu quả. Điều quan trọng nhất là một cú pháp rõ ràng và linh hoạt, không phải ký hiệu, mà Lisp cung cấp.


Chẳng hạn, bạn sẽ chọn các cấu hình cụ thể như "Các khối được lập chỉ mục của Python", "[a, b, c]" khởi tạo các mảng, "^" để lũy thừa và các khối khác.

Bạn có thể quan tâm đến một ngôn ngữ như Haskell có cú pháp đồng bộ nhưng rất linh hoạt.


Đây là những gì tôi đang tìm kiếm.
Dokkat

2

Không phải kiến ​​thức của tôi.

Tôi cũng không nghĩ đó là một ý tưởng đặc biệt hay - một trong những lợi ích chính của cú pháp ngôn ngữ chuẩn là nhiều người có thể đọc nó và nếu mọi người phát minh ra cú pháp của riêng họ thì không ai có thể hiểu được mã của ai khác. .... vì vậy ngôn ngữ này có thể thú vị cho một người có sở thích nhưng không sử dụng nhiều cho bất cứ điều gì thiết thực.

Thứ gần nhất tồn tại có lẽ là Lisp, nơi hệ thống macro cho phép bạn viết các cấu trúc ngôn ngữ mới của riêng bạn một cách rất linh hoạt. Thông thường bạn vẫn sẽ sử dụng cú pháp Lisp, nhưng bạn có thể xác định lại mọi thứ một cách hiệu quả nếu bạn thực sự muốn.

Do đó, Lisps có xu hướng đặc biệt phổ biến để triển khai DSL. Một ví dụ điển hình là dữ liệu này truy cập DSL trong Clojure (Korma) , nó đảm nhiệm tất cả các mã soạn sẵn cần thiết cho truy cập cơ sở dữ liệu.


2

Scala thường được sử dụng theo cách này để tạo DSL, Ngôn ngữ cụ thể cho miền.

Chủ yếu điều này là do Scala không có toán tử và cú pháp gọi phương thức Scala có thể được viết tắt. Ví dụ:

5 là một đối tượng Integer. Để tính 5 cộng 7 bạn có thể viết

val ans = 5.add (7) ngoại trừ phương thức bổ sung thực sự được đặt tên là "+" vì vậy bạn sẽ viết:

val ans = 5. + (7) nhưng trong Scala, bạn không cần bao gồm "." trong các cuộc gọi phương thức hoặc dấu ngoặc đơn "()" xung quanh các đối số để gọi phương thức + trên đối tượng 5, bạn sẽ viết

val ans = 5 + 7 hoạt động hoàn hảo vì Scala không có toán tử nào can thiệp vào sơ đồ đặt tên phương thức thông minh của bạn. Bây giờ hãy mở rộng ý tưởng đó đến các lớp và đối tượng của riêng bạn, bao gồm cả việc bạn có thể "ghi đè" các phương thức như + cũng như tạo các phương thức của riêng bạn có tên >>> hoặc ::! hoặc @ * @ hoặc chỉ tên văn bản đơn giản như fancify.


Điều này thật tuyệt. Tôi sẽ đưa ra một cái nhìn về scala.
Dokkat

1

Không nói rằng bạn nên sử dụng nó vì nó vẫn chủ yếu là thử nghiệm, nhưng một mô hình lập trình thú vị gần đây là Lập trình hướng ngôn ngữ (LOP).

Khái niệm Lập trình hướng ngôn ngữ sử dụng cách tiếp cận để nắm bắt các yêu cầu theo thuật ngữ của người dùng và sau đó cố gắng tạo một ngôn ngữ triển khai càng đồng nhất với mô tả của người dùng, sao cho việc ánh xạ giữa các yêu cầu và triển khai càng trực tiếp càng tốt.

Sergey Dmitriev giải thích chi tiết hơn .

Đó là ý thức hệ của nó, nhưng thực tế nó cho thấy rằng nó hỗ trợ cho hành vi mà bạn đang yêu cầu. Bạn có thể:

  • Mở rộng một ngôn ngữ hiện có.
  • Soạn các ngôn ngữ khác nhau.
  • Sử dụng một 'ngôn ngữ chuyển đổi' hiện có để chuyển đổi các từ khóa mới được xác định của bạn sang ngôn ngữ cơ bản.

Môi trường lập trình tích cực nhất mà tôi biết theo mô hình này là Hệ thống lập trình Meta (MPS) miễn phí của JetBrains.

Nó thực sự bắt đầu được sử dụng trong phần mềm thương mại, vì vậy có lẽ nó bắt đầu thoát khỏi giai đoạn 'thử nghiệm':

  • Real Wax là một trình soạn thảo Actioncript được xây dựng hoàn toàn trên MPS. Sử dụng sức mạnh của LOP, họ có thể thực hiện, ví dụ như đóng cửa cho AS3.
  • mbeddr C là ngôn ngữ C có thể mở rộng dựa trên MPS.

1

Các ngôn ngữ dành riêng cho tên miền được sử dụng khá phổ biến trong cộng đồng Tcl. Ví dụ, không có gì lạ khi thấy chương trình Tcl chứa cả C và SQL dưới dạng DSL nhúng (thông qua các gói Critcl và Sqlite). Về hạn chế duy nhất đối với DSL nhúng là sẽ tốt hơn nhiều nếu ngôn ngữ nhúng cân bằng các dấu ngoặc nhọn của nó và hóa ra đó là một yêu cầu thực sự không phổ biến trong thực tế!

Một ngôn ngữ khác giúp DSL dễ dàng là Standard ML, cho phép bạn có quyền truy cập vào các mã thông báo thô từ mã thông báo hệ thống chung (từ trước thời điểm nhận dạng được chuyển đổi thành từ khóa). Điều này làm cho việc thực hiện một lớp DSL rộng dễ dàng - miễn là chúng tuân theo một số quy tắc cú pháp cơ bản của SML, đặc biệt là liên quan đến các nhận xét, chuỗi và ranh giới mã thông báo - và thực tế được sử dụng rất nhiều trong một số ứng dụng lái xe chính cho ngôn ngữ (định lý provers, v.v.)

Không phải tất cả các ngôn ngữ làm cho điều này rất dễ dàng. Cụ thể, các ngôn ngữ tự động phân tích nội dung của các thuật ngữ giằng (nhiều trong số chúng!) Không thể thực hiện được điều này, vì vậy chúng yêu cầu DSL được xây dựng bởi các toán tử ghi đè, thông qua việc đặt ngôn ngữ phụ vào trong chuỗi hoặc bằng cách sử dụng bộ xử lý trước viết lại DSL thành thứ gì đó có thể được xử lý bên trong ngôn ngữ máy chủ.


0

AFAIU bạn đang tìm kiếm các ngôn ngữ có thể giúp bạn viết DSL (Ngôn ngữ cụ thể miền) của riêng bạn. Có nhiều ứng cử viên tốt. Cá nhân tôi muốn giới thiệu Ruby hoặc Io, vì họ cung cấp 1) quá tải toán tử dễ dàng, 2) lập trình meta và 3) cơ chế dự phòng như method_missingbạn có thể sử dụng để tạo API của riêng mình. Ví dụ: hãy xem sqldsl , DSL được viết bằng Ruby tạo SQL bằng cách đọc mã Ruby.


0

Tôi chưa thực sự sử dụng nó mỗi lần, nhưng nếu tôi nhớ chính xác, TXL được thiết kế đặc biệt để dịch mã nguồn. Vì vậy, bạn sẽ có thể sử dụng nó để chỉ định cách dịch từ ngôn ngữ của bạn và / hoặc phần mở rộng ngôn ngữ sang bất kỳ ngôn ngữ thực nào.

Dường như có một ngữ pháp có sẵn cho Javascript. Nhưng, chưa từng sử dụng nó trước đây, tôi không chắc chính xác nó sẽ giúp bạn như thế nào.


0

Có một bộ tiền xử lý tốt đẹp được gọi là PPWizard, khá mạnh mẽ. Khi bạn đã học được cú pháp của nó, bạn có thể tạo các macro macro để nhắm mục tiêu các ngôn ngữ khác nhau - không phải là nó sẽ dễ hiểu hay thú vị cho vấn đề đó, nhưng nó là một công cụ hữu ích.


ở đây một số liên kết: NỘI DUNG PPWIZARD (tài liệu chính thức), PPWizard - EDM2 (một tài liệu tham khảo bên ngoài). Công cụ này rất mạnh, nhưng tài liệu của nó không dễ đọc (có thể do sức mạnh của nó).
Sói


0

Một cách phổ biến để cá nhân hóa một phần ngôn ngữ lập trình là sử dụng bộ xử lý trước macro. Chẳng hạn, bạn có thể chạy "dokkat-lang" mặc dù bộ tiền xử lý C trước khi đưa kết quả vào đó một số môi trường javascript sẽ tải xuống.

Bạn có thể làm được bao nhiêu tùy thuộc vào độ tinh vi của bộ tiền xử lý của bạn. Lưu ý rằng các phiên bản đầu tiên của C ++, Objective C và các ngôn ngữ thử nghiệm khác nhau đã được thực hiện bằng cách tiền xử lý mã nguồn trước khi cung cấp cho chuỗi công cụ trình biên dịch C stock.

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.