Một ngôn ngữ chương trình có thể dễ uốn đủ để cho phép các chương trình mở rộng ngữ nghĩa ngôn ngữ


15

Với tham chiếu đến các tính năng trong các ngôn ngữ như ruby ​​(và javascript), cho phép lập trình viên mở rộng / ghi đè các lớp bất cứ lúc nào sau khi xác định nó (bao gồm các lớp như String), về mặt lý thuyết có thể thiết kế một ngôn ngữ có thể cho phép các chương trình mở rộng sau này ngữ nghĩa của nó.

ví dụ: Ruby không cho phép nhiều kế thừa, nhưng tôi có thể mở rộng / ghi đè hành vi ngôn ngữ mặc định để cho phép thực hiện nhiều kế thừa.

Có ngôn ngữ nào khác cho phép điều này không? Đây thực sự là một chủ đề quan tâm cho các nhà thiết kế ngôn ngữ? Nhìn vào sự lựa chọn sử dụng ruby ​​để xây dựng khung đường ray để phát triển ứng dụng web, các ngôn ngữ như vậy có thể rất mạnh mẽ để cho phép thiết kế khung (hoặc DSL) cho nhiều ứng dụng.


2
Bạn có tính là phần mở rộng ngữ nghĩa Các macro hợp vệ sinh hoặc phản chiếu của tờ báo cho phép các ngoại lệ được triển khai dưới dạng mã thư viện không? Còn các phần mở rộng cú pháp như Perligata: Romana thì sao?

Đây dường như là một câu hỏi yêu cầu một danh sách các ngôn ngữ hơn là các khái niệm. Trong khi chờ chỉnh sửa thay đổi hướng của câu hỏi, tôi hầu như bỏ phiếu để đóng là không chính thức.
Raphael

Nếu tôi nhớ chính xác, ngay cả Java cũng sẽ có được các tính năng cho phép các chương trình mở rộng hệ thống loại.
Raphael

1
@Raphael, bạn có nghĩ đến JSR 305 không? Các chú thích Java được thiết kế (một phần) bởi Gilad Bracha, người đã thiết kế dịch báo mà tôi đã liên kết trong câu trả lời của mình dưới đây và cũng vô địch các hệ thống loại có thể cắm được . JSR 305 cung cấp các chú thích hệ thống kiểu như @Nullable@NonNullđược sử dụng bởi các trình kiểm tra bên ngoài như findbugs.
Mike Samuel

Không rõ ý nghĩa của việc "mở rộng ngữ nghĩa của nó". Nếu tôi nhìn vào Boost.Sprite , điều đó đã vượt qua ngưỡng "mở rộng ngữ nghĩa" cá nhân của tôi : Các toán tử toán học của C ++ được sử dụng để mô tả một cú pháp ngôn ngữ thay vào đó, trình biên dịch sau đó biến thành trình phân tích cú pháp cho ngôn ngữ nói. Tôi biết điều này không có nghĩa là "mở rộng ngữ nghĩa ngôn ngữ" của những con chuột thí nghiệm, nhưng tôi nghĩ nó khá ấn tượng.
DevSolar

Câu trả lời:


12

Converge có một số cơ sở lập trình meta khá ấn tượng.

Ở mức độ đơn giản, đây có thể được coi là một cơ sở giống như macro, mặc dù nó mạnh hơn hầu hết các cơ sở vĩ mô hiện tại vì mã tùy ý có thể được chạy trong thời gian biên dịch. Sử dụng cái này, người ta có thể tương tác với trình biên dịch và tạo mã một cách an toàn và dễ dàng như ITrees (còn gọi là cây cú pháp trừu tượng).

đó là một bước tiến lên từ Scheme's các macro vệ sinh cho phép các định nghĩa macro minh bạch tham chiếu.

Các cơ chế như chuẩn tinh đã cho phép xây dựng và phá hủy các cây phân tích cú pháp trong các ngôn ngữ khác, nhưng chúng thường được sử dụng để tương tác với các ngôn ngữ cụ thể miền (DSL) thay vì tự sửa đổi.


Sự phản ánh của Drameak cho phép các ngoại lệ được thực thi dưới dạng mã thư viện.

7.6 Xử lý ngoại lệ

Bởi vì Drameak cung cấp quyền truy cập phản chiếu (7.2) vào các bản ghi kích hoạt (3.6), xử lý ngoại lệ hoàn toàn là vấn đề của thư viện. Nền tảng sẽ cung cấp một thư viện tiêu chuẩn hỗ trợ ném, bắt và tiếp tục các ngoại lệ, giống như trong Smalltalk.


Perligata: Romana chứng minh làm thế nào một cú pháp hoàn toàn mới có thể được hiển thị trên một ngôn ngữ.

Bài viết này mô tả một mô-đun Perl - Lingua :: Romana :: Perligata - cho phép viết các chương trình Perl bằng tiếng Latin.


Có thể cho rằng không có ý nghĩa về mặt ngữ nghĩa, PyPy là trình tạo trình thông dịch cho các ngôn ngữ có ngữ nghĩa được chỉ định trong một tập hợp con có thể phân tích tĩnh của Python và họ sử dụng nó để thử nghiệm các cấu trúc ngôn ngữ mới trong Python như thêm thunks với ngôn ngữ.


Cũng có thể quan tâm có thể là Ometa .

Luận án này tập trung vào thử nghiệm trong khoa học máy tính. Cụ thể, tôi sẽ chỉ ra rằng các ngôn ngữ lập trình và cấu trúc mới được thiết kế đặc biệt để hỗ trợ thử nghiệm có thể đơn giản hóa đáng kể công việc của các nhà nghiên cứu và lập trình viên.

Tôi trình bày công việc đề cập đến hai loại thử nghiệm rất khác nhau. Mục tiêu đầu tiên là giúp các nhà nghiên cứu ngôn ngữ lập trình thử nghiệm ý tưởng của họ, bằng cách giúp họ dễ dàng tạo nguyên mẫu ngôn ngữ lập trình mới và mở rộng sang các ngôn ngữ hiện có. Các nghiên cứu khác điều tra thử nghiệm như một mô hình lập trình, bằng cách cho phép các chương trình tự thử nghiệm các hành động và khả năng khác nhau, nói cách khác, đó là một nỗ lực để cung cấp hỗ trợ ngôn ngữ cho điều gì nếu ...? hoặc thế giới có thể lý luận.

Luận án của Alex Warth chứng minh bằng cách sử dụng Ometa để xác định ngữ nghĩa mới đáng kể (ngữ nghĩa giao dịch qua các thế giới) trong JavaScript + Ometa.


8

"Về mặt lý thuyết có khả thi không? *

LS ) và viết chương trình bằng ngôn ngữ mới. Mọi người thường không làm điều này bởi vì nó có thể đòi hỏi rất nhiều công việc để viết một trình thông dịch như vậy và sẽ có một cú đánh hiệu suất (hệ số 10 - 100) cho lớp phiên dịch bổ sung.

L có thể được thiết kế với các phương tiện siêu lập trình mạnh mẽ để dễ dàng thực hiện các trình thông dịch. Các ngôn ngữ như Scheme có điều này.

SL ). Sau đó, bạn không nhận được hiệu suất vì lớp giải thích bổ sung đã bị loại bỏ.

Ngôn ngữ mới vẫn có thể chạy chậm nếu mô hình thời gian chạy của nó khác biệt đáng kể so với ngôn ngữ thực hiện. Trong trường hợp đó, các bit của trình thông dịch sẽ hiển thị trong mã được dịch và nó sẽ tiếp tục chạy chậm. Tuy nhiên, nếu ngôn ngữ mới hầu hết giống với ngôn ngữ gốc, chỉ với một vài điều chỉnh, thì có thể loại bỏ hầu hết các bit trình thông dịch trong mã đích bằng cách điều chỉnh cẩn thận đánh giá từng phần. Sau đó, hit hiệu suất sẽ chỉ có ở đó cho các tính năng mới.

Trên thực tế, đây là công nghệ "ảo hóa" cho các ngôn ngữ lập trình.


6

Trong lịch sử, Lisp là ngôn ngữ lập trình lớn đầu tiên giới thiệu các phương tiện siêu lập trình. Hệ thống macro của Lisp cho phép lập trình viên xác định cấu trúc điều khiển mới, mẫu dữ liệu mới, v.v. Ví dụ, Hệ thống đối tượng Lisp chung có thể được định nghĩa hoàn toàn với các macro bên trên ngôn ngữ cốt lõi không biết gì về các đối tượng hoặc lớp. Hệ thống vĩ mô cũng cho phép định nghĩa các ngôn ngữ dành riêng cho tên miền .

Ruby có rất nhiều cảm hứng từ Lisp, bao gồm khả năng phản xạ và siêu lập trình của nó. Rất nhiều ngôn ngữ được gõ động đã lấy cảm hứng từ Lisp về mặt này. (Gõ tĩnh làm phức tạp mọi thứ, vì nhiều tiện ích mở rộng không phù hợp với hệ thống loại ban đầu.)


4

Chưa được đề cập trong câu trả lời / ý kiến:

cuộc khảo sát:

Trừu tượng: Ngôn ngữ mở rộng là ngôn ngữ lập trình cho phép người dùng sửa đổi hoặc thêm cú pháp và liên kết các hình thức cú pháp mới với ngữ nghĩa. Những ngôn ngữ này tốt cho cái gì? Những loại tính năng nào dễ dàng để thêm, và những tính năng nào không? Họ có đủ mạnh mẽ để được thực hiện nghiêm túc? Trong khảo sát này, chúng tôi sẽ cố gắng trả lời các câu hỏi như chúng tôi xem xét các ngôn ngữ mở rộng theo quy trình, hướng đối tượng, chức năng và mục đích chung. Chúng tôi chủ yếu quan tâm đến sức mạnh biểu cảm (thường xuyên, không ngữ cảnh), các cảnh báo liên quan (không phổ biến, mơ hồ) và dễ sử dụng các cơ chế khác nhau.

Tóm tắt: Khả năng mở rộng một ngôn ngữ với các hình thức cú pháp mới là một công cụ mạnh mẽ. Một hệ thống macro đủ linh hoạt cho phép các lập trình viên xây dựng từ một cơ sở chung hướng tới một ngôn ngữ được thiết kế riêng cho miền vấn đề của họ. Tuy nhiên, các cơ sở vĩ mô được tích hợp, có khả năng và đồng thời đủ đơn giản để được sử dụng rộng rãi đã bị giới hạn trong họ ngôn ngữ Lisp cho đến nay. Trong bài báo này, chúng tôi giới thiệu một cơ sở vĩ mô, được gọi là Trình mở rộng cú pháp Java (JSE), với sức mạnh vượt trội và dễ sử dụng của các hệ thống macro Lisp, nhưng đối với Java, một ngôn ngữ có cú pháp đại số thông thường hơn. ...


1
Vui lòng viết một hoặc hai câu tóm tắt cho mỗi tài liệu tham khảo; bộ sưu tập liên kết thuần túy hầu như không bao giờ là câu trả lời "tốt".
Raphael
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.