Một loại trong ngữ nghĩa ngôn ngữ lập trình là gì?


9

Trong Chương 1 của Cơ sở thực tiễn cho các ngôn ngữ lập trình , tác giả đã đề cập rằng các cây cú pháp trừu tượng được liên kết với các loại .

Theo trực giác, các loại giống như các loại, nhưng tôi muốn biết nếu chúng có một định nghĩa chính xác. Tôi rất vui nếu một số tài liệu tham khảo được cung cấp là tốt.

Câu trả lời:


4

Nó phụ thuộc vào ngữ nghĩa mà chúng ta sẽ sử dụng cho các loại và loại. - Tuy nhiên, một định nghĩa ngắn gọn - không chính thức - có thể là - Sắp xếp là các lớp của AST và các loại là các lớp của các giá trị .


4

Thực sự có nhiều sự tương đồng giữa các loại cho cú pháp kiêng và các loại như thường được hiểu. Nhưng các loại là một khái niệm cú pháp chính thức và cây AS cũng là cú pháp, trong khi các loại là một khái niệm ngữ nghĩa .

Thuật ngữ này xuất phát từ thuật ngữ đại số (còn gọi là đại số tự do ) và đại số phổ quát . Đây thực chất là những lý thuyết cú pháp của các cấu trúc đại số, được phân tích độc lập với bất kỳ diễn giải nào. Chúng được phát triển vào nửa đầu thế kỷ 20.

Một thuật ngữ có thể được xem như một cái cây, trong đó các nút được gắn nhãn từ một tập hợp toán tử hữu hạn, mỗi toán tử có một mức độ cố định xác định số lượng con gái trong cây. Arity 0 là cho lá. Trong các đại số đa sắp xếp, phần này được tinh chỉnh bằng các loại, sao cho mỗi toán tử thuộc về một loại và các giá trị được thay thế bằng một danh sách sắp xếp theo thứ tự, sửa cho mỗi con gái loại toán tử đầu. Loại toán tử, cùng với danh sách các loại con gái của nó, được gọi là chữ ký của toán tử.

Trong đại số phổ quát, điều này được tiếp tục hoàn thiện bằng cách đưa ra các mối quan hệ tương đương được xác định theo phương trình giữa các thuật ngữ.

Mặc dù dường như đã mờ đi một chút, những khái niệm này khá phổ biến và được nghiên cứu nhiều về khoa học máy tính vào cuối thế kỷ 20, như các đại số trừu tượng, sau đó được coi là cơ sở cho các loại dữ liệu trừu tượng, một phần, là tiền thân của những gì các lớp nos trong lập trình hướng đối tượng.

Đại số phổ quát có liên quan đến sự phát triển của lý thuyết thể loại, cũng là nền tảng trong tầm nhìn hiện tại của các loại và ngôn ngữ lập trình.

Đại số là đối tượng cú pháp và được dự định sẽ được sử dụng với một diễn giải trong một số miền ngữ nghĩa tương ứng với các loại. Giải thích là một phép đồng hình ánh xạ sắp xếp thành các miền của các giá trị (loại) và toán tử thành các hàm giữa các miền đó, do đó chữ ký được tôn trọng và phương trình cũng trong trường hợp đại số phương trình. Đây là cách bạn có thể áp dụng kết quả của lý thuyết nhóm cho bất kỳ miền nào có hoạt động tôn trọng định nghĩa của nhóm.

Tổ chức này được các nhà nghiên cứu đầu tiên về ngôn ngữ lập trình coi là rất thuận tiện, đặc biệt là những người quan tâm đến việc chính thức hóa ngôn ngữ lập trình. Nó có lợi thế của việc cô lập cú pháp và ngữ nghĩa, và được hiểu rõ về mặt toán học.

Một lý do khác để áp dụng nó là mối quan tâm với việc phát triển công cụ để thao túng các chương trình, trong môi trường phát triển hoặc trong các hệ thống chính thức để chứng minh các thuộc tính của chương trình (hóa ra ngày càng có nhiều vấn đề sinh đôi).

Điều này dẫn đến sự xuất hiện của khái niệm cây cú pháp trừu tượng (AST) cho các ngôn ngữ lập trình, về cơ bản là các thuật ngữ của đại số đa sắp xếp (đôi khi được tinh chỉnh với việc sử dụng liên kết sắp xếp trong một số sytems). AST là cú pháp tham chiếu cho một ngôn ngữ, từ đó ngữ nghĩa có thể được định nghĩa bằng phép đồng hình như trong ngữ nghĩa học biểu thị.

Điều này không chỉ thuận tiện cho việc nghiên cứu ngữ nghĩa của các ngôn ngữ, mà cây còn có cấu trúc chuỗi tốt hơn và do đó là cơ sở tốt hơn để phát triển các công cụ lập trình và môi trường lập trình.

Nó cho phép cô lập phân tích cú pháp vốn là một phần lộn xộn vì những hạn chế của công nghệ phân tích cú pháp buộc phải sử dụng các ngữ pháp bị biến dạng. Nó cũng là yếu tố ra vấn đề trình bày.

Nó cho phép biểu diễn nhiều chương trình (chuỗi hoặc đồ họa) cụ thể, đôi khi có thể thuận tiện (không có lý do tại sao sử dụng dấu câu thay vì các tab hoặc ngược lại, trong cú pháp chương trình nên bắt buộc mọi người).

Nó giúp dễ dàng xác định nhiều cách hiểu về chương trình và các loại , để phân tích sự phù hợp của chương trình với các diễn giải trừu tượng.

Nó thuận tiện cho việc viết (bán) các công cụ thao tác chương trình tự động, ví dụ để chuyển đổi chương trình tự động hoặc dịch giữa các ngôn ngữ.

Mọi thứ đôi khi có thể phức tạp hơn một chút trong thực tế, bởi vì một số dạng Tóm tắt Cú pháp cho phép một số toán tử đưa cây (biểu thức) thuộc một số loại (một cách không chính thức để xem xét nó). Ví dụ, có thể có một loại sắp xếp cú pháp đại diện cho các biến (các thực thể có thể gán) và một loại khác cho các biểu thức. Nhưng bất kỳ biến nào cũng có thể được sử dụng như một biểu thức, ngược lại là sai.

Những bài báo ban đầu về điều này, đối với các ngôn ngữ lập trình, có từ giữa những năm bảy mươi. Việc khái niệm hóa tại thời điểm đó được dành cho việc tạo ra các môi trường lập trình có ý thức cú pháp (từ "hướng" sau đó được sử dụng). Tìm kiếm Mentor và Centaur ở Châu Âu và cho Tổng hợp chương trình Cornell ở Hoa Kỳ. Họ là hai hệ thống đầu tiên thực sự sử dụng các khái niệm như vậy một cách thực tế. Nhiều người khác đã được phát triển sau đó.

Nhưng cú pháp trừu tượng có trước các hệ thống này. Ngôn ngữ Lisp (1958) có cú pháp trừu tượng, không có gì ngạc nhiên khi nó được phát triển bởi một nhà logic học và với mục đích tạo ra các chương trình thao túng các chương trình (xem thêm ML và LCF ... xuất hiện sau). Nhưng Lisp không được sắp xếp: mọi thứ về mặt cú pháp đều có cấu trúc và cấu trúc tinh tế hơn về cơ bản phụ thuộc vào ngữ nghĩa. Điều này dẫn đến một số người xem xét, phần nào không chính xác, rằng Lisp không có cú pháp.


Bạn có thể nói có 2 thứ bậc khác nhau, một trong vùng cú pháp và một thứ bậc khác trong đất ngữ nghĩa. Theo cú pháp, chúng tôi có các AST và sắp xếp và các lớp sắp xếp. Trong ngữ nghĩa, chúng ta có các giá trị, loại, loại ... vv Không có ngôn ngữ nào hợp nhất cả hai thành một môi trường phát triển như Twelf hay Coq?
CMCDragonkai

@CMCDragonkai Tôi sẽ nói (loại bỏ những lỗi có thể xảy ra) chính xác những gì tôi đã nói. Tôi sẽ không gọi những thứ bậc này, mà là các miền của diễn ngôn (meta-). Sự phân tách cú pháp ngữ nghĩa phân biệt những gì chúng ta nói về và cách chúng ta làm điều đó, đòi hỏi phải có đại diện. Bạn không nên trộn lẫn cú pháp và ngữ nghĩa của cùng một ngôn ngữ, nhưng cú pháp của một ngôn ngữ có thể là một đối tượng của diễn ngôn, do đó thuộc về ngữ nghĩa của ngôn ngữ khác. Theo nghĩa đó, bạn có thể thấy một số thống nhất, được xử lý cẩn thận. Cú pháp luôn được tạo ra một cách hữu hạn, trong khi ngữ nghĩa không có ràng buộc như vậy.
babou 2/2/2016

2

Nó xuất hiện trong chương bốn, các loại dành cho cú pháp và các loại dành cho ngữ nghĩa.

Biểu đồ cú pháp ví dụ ở trang 40 đề cập đến các loại trong ngôn ngữ L {num str}. Rõ ràng sắp xếp là các thể loại trong cú pháp của ngôn ngữ.

Cụ thể, "cộng" có một loại, đó là phạm trù cú pháp của kết quả. Loại toán tử "cộng" được đặt tên là "Exp". Điều đó thể hiện một thực tế rằng về mặt cú pháp, một lời gọi của toán tử "cộng" là một biểu thức. Một lời gọi của toán tử "cộng" có thể điền vào một vị trí trong cây cú pháp trừu tượng nơi một biểu thức được cho phép. Đó là loại công trình "cộng" là gì. Đó là cách nó phù hợp với cấu trúc của một văn bản đại diện cho một chương trình.

Hệ thống loại ở trang 41 liên quan đến các loại trong ngôn ngữ L {num str}. Kiểu toán tử "plus", cho rằng toán hạng của nó có kiểu "num", là "num". Phán quyết này là một mô tả một phần về ngữ nghĩa của toán tử "cộng". Đó là, một phần ý nghĩa của toán tử "cộng" là kết hợp hai số để tạo ra một số. Ý nghĩa này phân biệt "cộng" với các biểu thức khác.

Hơn nữa, có một loại có tên "Kiểu" chứa hai loại, "num" và "str".


1
Chà, anh ta sử dụng nó trong khái niệm này, nhưng anh ta không định nghĩa rõ ràng. Tôi tìm thấy thuật ngữ "Logic nhiều sắp xếp" đối với tôi có vẻ như các loại và các loại là các khái niệm thực sự liên quan. Tôi chỉ muốn biết một định nghĩa rõ ràng cho cả hai.
rslima

Đó là một cái gì đó để làm với "hệ thống loại thuần túy". Tôi nghi ngờ chúng ta có thể coi bài thuyết trình trong " Lambda Tính toán với các loại " là thông thường. Nhưng nó không súc tích. Tôi chưa tìm thấy một tài liệu tham khảo cung cấp các định nghĩa rõ ràng, ngắn gọn về thuật ngữ, loại, loại và sắp xếp.
minopret

Những gì về người đứng đầu sản xuất trong một trình phân tích cú pháp? Rất nhiều lần bạn kết thúc việc phân loại ngữ pháp dưới các tên tương tự như Biểu thức hoặc Loại.
CMCDragonkai

1

Vào đầu Chương 1, Harper đưa ra gợi ý về ý nghĩa của từ sắp xếp từ :

Cú pháp của một ngôn ngữ chỉ định các phương tiện theo đó các loại cụm từ khác nhau (biểu thức, lệnh, khai báo, v.v.) có thể được kết hợp để tạo thành các chương trình.

Anh ta định nghĩa cụm từ là một cây cú pháp trừu tượng, sau đó anh ta sẽ thảo luận.


Dường như với tôi như thể "sort" được sử dụng với nghĩa tiếng Anh thông thường ở đây, đồng nghĩa với "các loại".
Raphael

@Raphael Có, nhưng có vẻ như ý nghĩa đó phù hợp với cách sử dụng chính thức sau này, bạn có đồng ý không?
jcora

Không hẳn. Cụm từ "loại X này" có thể xuất hiện thường xuyên trong cuốn sách; câu này không báo hiệu theo bất kỳ cách nào mà một cái gì đó đang được xác định. (Ngoài ra, đoạn văn này không phù hợp với cách tôi hiểu thuật ngữ "sắp xếp").
Raphael

@Raphael OK, vui lòng giải thích cách sử dụng cụ thể này không nhất quán, nó chắc chắn sẽ thông báo cho tôi, vì đó là cách tôi hiện đang hiểu nó.
jcora

Khái niệm "sắp xếp" mà tôi biết được liên kết với các nút riêng lẻ của AST, không phải toàn bộ cây (đó là những gì bạn nói "cụm từ" có nghĩa là trong nguồn của bạn).
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.