Phân tích một ngôn ngữ lập trình


10

Trong SICP , các tác giả tuyên bố ( Phần 1.1 ) rằng có ba "cơ chế" cơ bản của ngôn ngữ lập trình:

  • biểu thức nguyên thủy , đại diện cho các thực thể đơn giản nhất mà ngôn ngữ quan tâm đến

  • phương tiện kết hợp , theo đó các yếu tố ghép được xây dựng từ những yếu tố đơn giản hơn

  • phương tiện trừu tượng hóa , theo đó các phần tử ghép có thể được đặt tên và thao tác như các đơn vị

Làm cách nào tôi có thể phân tích một ngôn ngữ lập trình chính thống (ví dụ Java) theo các yếu tố hoặc cơ chế này?


Bạn đã từng tìm hiểu về Extended Backus-Naur Form, EBNF hay Backus-Naur Form, BNF trước đây chưa? Nó có thể phá vỡ một ngữ pháp tương tự như ba khái niệm này, mặc dù tôi không thực sự chắc chắn ý định của bạn là gì nên tôi không biết liệu nó có giúp ích hay không.
Jetti

@Jetti - vâng, tôi có, và không, đó không phải là điều tôi quan tâm. Tôi thực sự muốn phân tích ngữ nghĩa (câu hỏi: đó có thực sự là từ tôi đang tìm kiếm không?) hình thức viết của họ (tức là cú pháp).

Câu trả lời:


1

Sự khác biệt giữa các biểu thức nguyên thủy, phương tiện kết hợp và phương tiện trừu tượng là một điều hữu ích khi mô hình hóa các ngôn ngữ lập trình. Lưu ý rằng đây không phải là một thuộc tính nội tại của ngôn ngữ: bạn không thể chỉ ra bất kỳ định nghĩa ngôn ngữ nào và nói rằng tính năng này rõ ràng là một biểu thức nguyên thủy, tính năng đó rõ ràng là một phương tiện kết hợp. Sự khác biệt là một thuộc tính của mô hình và các mô hình phức tạp có thể chống lại sự phân loại.

Một ví dụ trong sách giáo khoa của ba khái niệm này là phép tính lambda , có chính xác một trong số đó:

  • Các biến x , y , tầm là các biểu thức nguyên thủy duy nhất.
  • Ứng dụng chức năng MN là một phương tiện kết hợp.
  • Trừu tượng Lambda λx.M là một phương tiện trừu tượng.

Khi bạn đến các ngôn ngữ có nhiều tính năng hơn, mô hình hóa có thể trở nên mơ hồ hơn. Nói chung, một biểu thức nguyên thủy là một biểu thức mà bạn không thể hoặc sẽ không phân chia thành các thành phần nguyên thủy. Nhưng nó giống như nguyên tử : nó nguyên thủy cho đến khi khoa học tiến hành. Ví dụ, có một biến thể của phép tính lambda trong đó các biến sử dụng số thay vì tên ( chỉ số de Bruijn ), đặc biệt thuận tiện khi mô hình hóa các thuật ngữ lambda cho bằng chứng máy tính; và trong bằng chứng máy tính, số nguyên được chia thành các phần cấu thành . Vì vậy, trong các mô hình này, các biến không phải là biểu thức nguyên thủy.

Trong (một mô hình điển hình của) Java, các biểu thức nguyên thủy chủ yếu là các hằng và biến. Phương tiện kết hợp bao gồm nhiều nhà khai thác; chính xác hơn, biểu thức cộng gộp của Hồi giáo là một phương tiện kết hợp với hai vị trí (bên trái và bên phải) hoặc với ba vị trí (hai bên cộng với toán tử) nếu bạn bao gồm cả A + BA - B dưới tên đó (trong trường hợp đó là các toán tử +-sẽ là các cấu trúc nguyên thủy theo quyền riêng của chúng). Các phương tiện kết hợp khác bao gồm các chuỗi lệnh I ; J , các cấu trúc vòng lặpwhile (…) {…}, và như thế. Sau đó, bạn có các cấu trúc như khai báo biến, định nghĩa hàm, định nghĩa lớp và cả hai đều là phương tiện kết hợp (chúng kết hợp tên tham số và kiểu, phần thân, bộ khởi tạo, hàm) và phương tiện trừu tượng (vì chúng xác định tên để sử dụng lại). Trên thực tế khá phổ biến là phương tiện trừu tượng cũng là phương tiện kết hợp: chúng kết hợp một tên với định nghĩa của nó.


Câu trả lời tốt đẹp; bạn gặp phải những vấn đề mà tôi đang phải vật lộn - sự phân biệt mơ hồ giữa người nguyên thủy, sự kết hợp, v.v.

Bạn có ý nghĩa gì bởi "biến" chính xác? Chúng không thể được mô tả như là phương tiện trừu tượng bởi vì chúng có tên?
morbidCode

@morbidCode Khái niệm về biến là một từ phức tạp và từ này có ý nghĩa khác nhau nhưng có liên quan trong phép tính lambda và trong Java. Một biến có thể được coi là một bản tóm tắt của người dùng vì nó đề cập đến một giá trị không xác định. Tuy nhiên, nó không phải là một phương tiện trừu tượng: nó không tạo ra tài liệu tham khảo, nó chỉ là một cách để sử dụng sự trừu tượng hiện có. Một trừu tượng lambda tạo ra một cách để sử dụng một khối mã như một đối tượng có thể được thao tác.
Gilles 'SO- ngừng trở nên xấu xa'

4

Đâm thô:

Biểu hiện chỉ là vậy; cái gì tạo thành một biểu thức trong Java. Tôi không biết nếu điều đó sẽ mở rộng để bao gồm các tuyên bố hay không.

Các kết hợp sẽ bao gồm các biểu thức ghép, (biến?,) Câu lệnh, phương thức, cơ chế lớp và gói. Các mô-đun cũng vậy, một khi chúng ở trong ngôn ngữ.

Trong Java, phương tiện trừu tượng đơn giản nhất là một lớp: không có gì có thể tồn tại bên ngoài một lớp. Có lẽ, có các "lớp" trừu tượng: một phương thức tĩnh được cho là đơn giản hơn phương thức cá thể, bởi vì nó không yêu cầu một thể hiện.

Generics cung cấp một lớp trừu tượng bổ sung (và sự thất vọng).


@MattFenwick Một biểu thức có thể bao gồm một nguyên thủy duy nhất, sự kết hợp của các nguyên thủy và các thực thể khác tạo thành một biểu thức ghép (vẫn là một biểu thức, nhưng không phải là một tuyên bố).
Dave Newton

@MattFenwick Tôi không, tôi không nói một biểu thức nguyên thủy, tôi đang nói một biểu thức có thể chỉ bao gồm một nguyên thủy duy nhất. Không có cách nào Chuỗi là nguyên thủy chỉ vì ngôn ngữ cung cấp đường cú pháp cho nó, trừ khi bạn muốn phân biệt giữa một chuỗi ngay lập tức và tham chiếu mà nó tạo ra. Tôi muốn nói là + bởi vì nó không thể được hành động theo bất kỳ cách nào.
Dave Newton

Về phía bạn: Có vấn đề gì với việc triển khai khái quát của Java không?
Steven Evers

2

Đây là phân loại cơ bản của tôi. Tôi đang cố gắng vẽ một paralel với LISP.

Biểu hiện nguyên thủy

  • Tất cả các giá trị nguyên thủy, những thứ bạn có thể biểu diễn bằng chữ (số, booleans, ...)

Song song trong LISP : nguyên tử, số và danh sách.

Phương tiện kết hợp (Cách bạn có thể xây dựng cấu trúc dữ liệu hỗn hợp)

  • Mảng
  • Đối tượng / cấu trúc.

Song song trong LISP : Nhược điểm, danh sách

Phương tiện trừu tượng

  • Tất cả cú pháp luồng điều khiển (nếu, trong khi cho)
  • Tất cả các nhà khai thác được xây dựng trong ( +, -, *, /, ...)
  • Tất cả các hàm (trong thể loại này, chúng tôi bao gồm các lớp và phương thức)

Song song trong LISP : Chức năng, cú pháp đường như let,define


Câu trả lời tốt đẹp! Tôi đã nghĩ rằng có lẽ một số cấu trúc dòng điều khiển sẽ phù hợp với phương tiện kết hợp, mặc dù. Song song tốt đẹp với LISP, điều đó giúp rất nhiều.

Không hẳn. Mảng và đối tượng chơi ở một cấp độ khác nhau, chúng là một phần của biểu diễn dữ liệu, không phải của ngôn ngữ. Công cụ khởi tạo mảng là một phần của ngôn ngữ và chúng là phương tiện kết hợp. Các toán tử và các cấu trúc dòng điều khiển không phải là phương tiện trừu tượng, bởi vì chúng không lưu trữ bất cứ thứ gì để sử dụng lại. Các phương tiện trừu tượng thường đặt tên cho một thực thể để tái sử dụng trong tương lai dưới tên đó.
Gilles 'SO- ngừng trở nên xấu xa'

0

Một ngôn ngữ lập trình thường được xác định bởi cú phápngữ nghĩa của nó . Cả hai điều này sẽ được xác định trong các tiêu chuẩn cho ngôn ngữ.

Cú pháp phác thảo cách viết một chương trình hợp lệ và ngữ nghĩa xác định ý nghĩa của chương trình hợp lệ đó.

Trong trường hợp của bạn, cú pháp sẽ cho bạn biết nguyên thủy của bạn là gì, cách bạn kết hợp chúng và cách bạn trừu tượng hóa chúng. Các ngữ nghĩa sẽ cho bạn biết các kết hợp và trừu tượng có nghĩa là gì.

Ví dụ, cú pháp sẽ cho bạn biết cách viết một forvòng lặp hợp lệ . Các ngữ nghĩa sẽ cho bạn biết vòng lặp for làm gì.

Nếu bạn thực sự muốn bắt đầu phân tích một ngôn ngữ lập trình, hãy lấy một bản sao của tiêu chuẩn và xem những gì có trong đó. Tôi thực sự sẽ bắt đầu với một ngôn ngữ đơn giản, như C, trước khi đào sâu vào Java. Tôi cũng sẽ đọc phần còn lại của cuốn sách. Tìm hiểu lý do tại sao langau lập trình hoạt động theo cách họ làm đã giúp tôi trở thành một lập trình viên tốt hơn, mặc dù tôi không triển khai trình biên dịch.


1
Đợi đã, cái gì? "Đơn giản như C trước khi đào sâu vào Java." Bạn đã mất tôi tại "Đơn giản như C".
corsiKa

Matt, tôi đoán tôi không thực sự hiểu những gì bạn đang làm sau đó. Cuốn sách bạn trích dẫn từ các cuộc nói chuyện về cả hai điều này cho dù các tác giả rõ ràng gọi chúng là cú pháp và ngữ nghĩa hay không.
mpdon Arena

Trong thực tế, "cú pháp" mô tả chính xác những điều "đơn giản nhất" trong các ngôn ngữ, các nguyên tử được cấu tạo.
Ira Baxter

Cú pháp không hoàn toàn nắm bắt được một chương trình hợp lệ là gì, cách xa đó. Ví dụ, một chương trình đúng về mặt cú pháp có thể không kiểm tra kiểu. Chương trình AC thực thi câu lệnh x = ++x;không hợp lệ ngay cả khi một trình biên dịch điển hình sẽ chấp nhận nó.
Gilles 'SO- ngừng trở nên xấu xa'

0

Tôi không biết có đúng không, nhưng cách tôi hiểu cách phân chia như sau:

các biểu thức nguyên thủy , Đây sẽ là, những thứ như >>, +, *, /, int, boolean, biến, phương thức, v.v.

phương tiện kết hợp, Điều này có thể gây tranh cãi, hoặc những thứ như + và chính xác, hoặc nói về những ý tưởng tiên tiến hơn như kế thừa so với thành phần và phương pháp để thực hiện điều đó. Tiêm, toán tử mới, mở rộng, vv

phương tiện trừu tượng hóa, Đây sẽ là cú pháp được sử dụng để đặt tên biến và phương thức, cũng như phương tiện tạo giao diện, lớp, lớp tĩnh, phương thức nạp chồng, v.v.

Tuy nhiên, có thể bạn cần cung cấp cho chúng tôi thêm thông tin từ cuốn sách để chúng tôi biết chính xác ý nghĩa của nó ở đó.


Cuốn sách miễn phí trực tuyến; một liên kết được đưa ra trong OP. Tôi cũng cảm thấy như vậy means of combination- thật khó để biết chính xác cái gì thuộc về nó. Câu trả lời tốt đẹp, mặc dù.

Bạn có biết những chương khác mà anh ấy nói về sự kết hợp và trừu tượng không?
Bob
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.