Phân loại hệ thống loại (mạnh / yếu, động / tĩnh)


23

Tóm lại: làm thế nào các hệ thống loại được phân loại trong bối cảnh học thuật; đặc biệt, tôi có thể tìm các nguồn có uy tín ở đâu để làm rõ sự khác biệt giữa các loại hệ thống loại khác nhau?

Theo một nghĩa nào đó, khó khăn với câu hỏi này không phải là tôi không thể tìm thấy câu trả lời, mà là tôi có thể tìm thấy quá nhiều, và không có gì nổi bật là chính xác. Bối cảnh là tôi đang cố gắng cải thiện một bài viết trên wiki Haskell về việc , hiện đang tuyên bố những điểm khác biệt sau:

  • Không gõ: Ngôn ngữ không có khái niệm về loại hoặc theo quan điểm đánh máy: Có chính xác một loại trong ngôn ngữ. Ngôn ngữ hội chỉ có loại 'mẫu bit', Rexx và Tk chỉ có loại 'văn bản', MatLab lõi chỉ có loại 'ma trận có giá trị phức tạp'.
  • Gõ yếu: Chỉ có một vài loại phân biệt và có thể loại từ đồng nghĩa cho một số loại. Ví dụ C sử dụng số nguyên cho booleans, số nguyên, ký tự, tập bit và liệt kê.
  • Gõ mạnh: Tập hợp các loại tốt như trong ngôn ngữ Ada, Wirthian (Pascal, Modula-2), Eiffel

Điều này hoàn toàn trái ngược với nhận thức cá nhân của tôi, vốn nằm dọc theo dòng:

  • Gõ yếu: Các đối tượng có các loại, nhưng được chuyển đổi hoàn toàn sang các loại khác khi bối cảnh yêu cầu. Ví dụ, Perl, PHP và JavaScript là tất cả các ngôn ngữ "1"có thể được sử dụng trong nhiều hoặc ít hơn bất kỳ ngữ cảnh nào 1có thể.
  • Gõ mạnh: Các đối tượng có các loại và không có chuyển đổi ngầm định (mặc dù quá tải có thể được sử dụng để mô phỏng chúng), vì vậy sử dụng một đối tượng trong ngữ cảnh sai là một lỗi. Trong Python, lập chỉ mục một mảng bằng chuỗi hoặc float sẽ ném ngoại lệ TypeError; trong Haskell nó sẽ thất bại tại thời gian biên dịch.

Tôi đã hỏi ý kiến ​​về điều này từ những người khác có nhiều kinh nghiệm trong lĩnh vực này hơn tôi và một người đã đưa ra đặc điểm này:

  • Gõ yếu: Thực hiện các thao tác không hợp lệ trên dữ liệu không được kiểm soát hoặc từ chối mà chỉ tạo ra kết quả không hợp lệ / tùy ý.
  • Gõ mạnh: Thao tác trên dữ liệu chỉ được phép nếu dữ liệu tương thích với thao tác.

Theo tôi hiểu, các đặc điểm đầu tiên và cuối cùng sẽ gọi C là đánh máy yếu, thứ hai sẽ gọi nó là gõ mạnh. Đầu tiên và thứ hai sẽ gọi Perl và PHP gõ yếu, thứ ba sẽ gọi chúng là gõ mạnh. Cả ba sẽ mô tả Python như được gõ mạnh.

Tôi nghĩ rằng hầu hết mọi người sẽ nói với tôi "tốt, không có sự đồng thuận, không có ý nghĩa được chấp nhận của các điều khoản". Nếu những người đó sai, tôi rất vui khi nghe về điều đó, nhưng nếu họ đúng, thì làm thế nào để các nhà nghiên cứu CS mô tả và so sánh các hệ thống loại? Tôi có thể sử dụng thuật ngữ nào ít vấn đề hơn?

Là một câu hỏi liên quan, tôi cảm thấy sự phân biệt động / tĩnh thường được đưa ra theo nghĩa "thời gian biên dịch" và "thời gian chạy", điều mà tôi thấy không thỏa đáng khi cho rằng một ngôn ngữ được biên dịch hay không không phải là một đặc tính của ngôn ngữ đó như việc thực hiện của nó. Tôi cảm thấy nên có một mô tả thuần túy về ngữ nghĩa của kiểu gõ động so với tĩnh; một cái gì đó dọc theo dòng chữ "một ngôn ngữ tĩnh là một ngôn ngữ trong đó mọi biểu hiện phụ có thể được gõ". Tôi sẽ đánh giá cao bất kỳ suy nghĩ, đặc biệt là tài liệu tham khảo, mang lại sự rõ ràng cho khái niệm này.


6
Tôi nghĩ rằng bạn đã có câu trả lời của bạn: không có định nghĩa được chấp nhận về gõ yếu và mạnh.
Svick

Tôi sẽ không thấy khó tin, nhưng tôi đặt câu hỏi với hy vọng rằng có một điều tôi chưa từng nghe đến :) hoặc ít nhất là một định nghĩa có thẩm quyền hơn những gì một người đã chỉnh sửa wiki nghĩ là trường hợp .
Ben Millwood

3
Đối với một số thảo luận thêm về điều này, xem câu hỏi liên quan này trên SO .
Svick

1
Để củng cố quan điểm của Svick, không thể tìm thấy một tài liệu tham khảo chính quyền về một cái gì đó không được chấp nhận. Bất cứ điều gì tự xưng là có thẩm quyền đơn giản là sai (vì bất kỳ số lượng ví dụ phản biện nào cũng có thể được cung cấp).
edA-qa mort-ora-y

Chà, có một sự khác biệt giữa ai đó viết một bài báo có nội dung "đây là Định nghĩa đúng mà mọi người đồng ý" và ai đó viết một bài báo "đây là những định nghĩa mà tôi sẽ sử dụng cho bài báo này, mặc dù tôi biết có khác". Ngay cả sau này sẽ tốt hơn những gì tôi biết cho đến nay. Tôi nghĩ rằng bạn có thể đúng tuy nhiên, trong trường hợp này, những gì làm mọi người phải nói về các loại khác nhau của hệ thống kiểu? Là sự phân biệt động / tĩnh, ít nhất, cụ thể?
Ben Millwood

Câu trả lời:


18

Trong lịch sử, thuật ngữ "ngôn ngữ lập trình được gõ mạnh" được sử dụng vào những năm 70 để phản ứng với các ngôn ngữ lập trình được sử dụng rộng rãi hiện có, hầu hết đều có lỗ hổng loại. Vài ví dụ:

  • Ở Fortran, có những thứ được gọi là vùng lưu trữ "CommON", có thể được chia sẻ giữa các mô-đun, nhưng không có kiểm tra xem liệu mỗi mô-đun có khai báo nội dung của bộ lưu trữ CommON với cùng loại không. Vì vậy, một mô-đun có thể tuyên bố rằng một khối lưu trữ CommON cụ thể có một số nguyên và một số khác có dấu phẩy động và dữ liệu sẽ bị hỏng do kết quả. Fortran cũng có các câu lệnh "THIẾT BỊ", theo đó cùng một bộ lưu trữ có thể được khai báo để chứa hai đối tượng khác nhau thuộc các loại khác nhau.

  • Trong Algol 60, loại tham số thủ tục được khai báo là "thủ tục", mà không chỉ định loại tham số của thủ tục. Vì vậy, người ta có thể giả sử rằng một tham số thủ tục là một thủ tục chấp nhận số nguyên, nhưng chuyển vào một thủ tục chấp nhận thực làm đối số. Điều này sẽ dẫn đến loại tham nhũng tương tự như các tuyên bố CỘNG ĐỒNG và THIẾT BỊ. (Tuy nhiên, Algol 60 đã loại bỏ các vấn đề cũ hơn.)

  • Trong Pascal, "các bản ghi biến thể" đã được thêm vào gần giống như các câu lệnh THIẾT BỊ cũ.

  • Trong C, "kiểu phôi" đã được thêm vào, theo đó bất kỳ loại dữ liệu nào cũng có thể được giải thích lại dưới dạng dữ liệu thuộc loại khác. Đây là một lỗ loại khá có chủ ý dành cho các lập trình viên, những người được cho là biết họ đang làm gì.

Các ngôn ngữ được gõ mạnh được thiết kế trong những năm 70 có nghĩa là để loại bỏ tất cả các loại lỗ như vậy. Nếu bạn đi sâu vào ý nghĩa của điều này, điều đó có nghĩa là về cơ bản các biểu diễn dữ liệu được bảo vệ. Không thể xem đối tượng dữ liệu của một loại là một đối tượng của loại khác xảy ra có cùng mẫu bit với biểu diễn bên trong của nó. Các nhà lý luận bắt đầu sử dụng thuật ngữ "độc lập đại diện" để mô tả đặc tính này thay vì ý tưởng mơ hồ về "gõ mạnh".

Lưu ý rằng các ngôn ngữ được gõ động như Lisp thực hiện kiểm tra loại thời gian chạy hoàn chỉnh là "gõ mạnh" theo nghĩa bảo vệ các biểu diễn. Đồng thời, các ngôn ngữ được nhập tĩnh sẽ mất tính độc lập đại diện trừ khi chúng kiểm tra giới hạn mảng. Vì vậy, họ không "gõ mạnh" theo nghĩa chặt chẽ của thuật ngữ này. Do những hậu quả bất thường này, thuật ngữ "đánh mạnh" đã rơi vào tình trạng không sử dụng được sau những năm 70. Khi Bộ Quốc phòng Hoa Kỳ phát triển các yêu cầu khắt khe đối với thiết kế của Ada, họ đã đưa vào yêu cầu rằng ngôn ngữ phải được "gõ mạnh". (Có vẻ như người ta đã tin vào thời điểm đó rằng ý tưởng "gõ mạnh" là hiển nhiên. Không có định nghĩa nào được đưa ra. ) Tất cả các đề xuất ngôn ngữ được gửi trong phản hồi được cho là "gõ mạnh". Khi Dijkstra phân tích tất cả các đề xuất ngôn ngữ, ông thấy rằng không ai trong số chúng được đánh máy mạnh mẽ và trên thực tế, thậm chí còn không rõ thuật ngữ này có nghĩa gì. Xem báo cáoEWD663 . Tuy nhiên, tôi thấy rằng thuật ngữ này hiện đang được sử dụng trở lại, thông qua một thế hệ các nhà nghiên cứu trẻ chưa biết về lịch sử rô của thuật ngữ này.

Thuật ngữ "gõ tĩnh" có nghĩa là tất cả kiểm tra kiểu được thực hiện tĩnh và không có lỗi loại nào phát sinh trong thời gian chạy. Nếu ngôn ngữ cũng được gõ mạnh, điều đó có nghĩa là thực sự không có lỗi loại trong khi thực hiện. Mặt khác, nếu có các loại lỗ trong hệ thống loại, việc không có lỗi loại thời gian chạy có nghĩa là không có gì. Kết quả có thể bị hỏng hoàn toàn.

Cuộc tranh luận mới về "gõ mạnh và gõ yếu" dường như là về việc có nên cho phép chuyển đổi loại nhất định hay không. Cho phép một chuỗi trong đó một số nguyên được yêu cầu là "gõ yếu" theo những người này. Có một số ý nghĩa bởi vì cố gắng chuyển đổi một chuỗi thành một số nguyên có thể thất bại, nếu chuỗi không xảy ra để đại diện cho một số nguyên. Tuy nhiên, chuyển đổi một số nguyên thành một chuỗi không có vấn đề đó. Đó có phải là một ví dụ của "gõ yếu" theo những người này? Tôi không có ý kiến. Tôi nhận thấy rằng các cuộc thảo luận trên Wikipedia về "gõ yếu" không trích dẫn bất kỳ ấn phẩm được giới thiệu nào. Tôi không tin rằng đó là một ý tưởng mạch lạc.

Lưu ý thêm : Điểm cơ bản là thuật ngữ "gõ mạnh" không được sử dụng như một thuật ngữ kỹ thuật với định nghĩa nghiêm ngặt. Nó giống như một số nhà thiết kế ngôn ngữ cảm thấy: "hệ thống loại của chúng tôi rất mạnh, nó bắt được tất cả các lỗi loại, nó không có lỗ loại" và vì vậy, khi họ công bố thiết kế ngôn ngữ của mình, họ tuyên bố rằng nó "được gõ mạnh" . Đó là một từ buzz nghe có vẻ tốt và mọi người bắt đầu sử dụng nó. Bài báo Cardelli-Wegner là bài báo đầu tiên mà tôi đã thấy nơi một số phân tích được cung cấp vào ý nghĩa của nó. Bài viết của tôi ở đây nên được coi là một công phu của vị trí của họ.


Bạn có thể đưa ra một số tài liệu tham khảo cho sự phát triển lịch sử? "Việc không có lỗi loại thời gian chạy có nghĩa là không có gì" - bạn có nghĩa là thời gian biên dịch ở đây không?
Raphael

Đây là một bài báo về Euclid xuất hiện trên Google Scholar. Tôi nhớ lại đã thấy một số bài báo trong những năm 70, nơi các ngôn ngữ được tuyên bố là được gõ mạnh. Nó thường được coi là một sân bán hàng.
Uday Reddy

1
@Raphael. Tôi đã có nghĩa là "lỗi loại thời gian chạy". Để có được thời gian chạy, chương trình sẽ phải vượt qua trình kiểm tra kiểu tĩnh ở vị trí đầu tiên. Vấn đề là một ngôn ngữ được gõ mạnh, ví dụ, Java, sẽ đưa ra các lỗi loại trong thời gian chạy khi nó không thể kiểm tra chúng tại thời gian biên dịch. Một ngôn ngữ lỗ loại, ví dụ, C, sẽ cho phép thời gian chạy tạo ra rác thay vì đưa ra lỗi.
Uday Reddy

1
@benmachine. Xem phần "kiểm tra loại" trong bài báo Euclid mà tôi đã trích dẫn. Tôi nghĩ rằng điểm chính là "gõ mạnh" là một từ buzz. Nó không phải là một khái niệm kỹ thuật. Tốt nhất, nội dung kỹ thuật của nó có nghĩa là không có lỗ loại.
Uday Reddy

1
Trên một triển khai hiện đại điển hình trong đó hai loại số nguyên khác nhau có cùng một biểu diễn (ví dụ: cả hai intlonglà 32 bit, hoặc cả hai longlong longlà 64, một chương trình sử dụng một con trỏ đến một loại như vậy để ghi một số lưu trữ và sử dụng một con trỏ của loại khác để đọc nó, nói chung sẽ không gây ra lỗi thời gian chạy có thể phát hiện được, nhưng có thể tự ý trục trặc theo các cách khác tùy ý. trước đây được cung cấp để trao đổi.
supercat

7

Bài báo Uday Reddy tìm thấy trong câu trả lời của ông, về cách hiểu các loại, trừu tượng hóa dữ liệu và đa hình (1985), đưa ra các câu trả lời sau:

Các ngôn ngữ lập trình trong đó loại của mọi biểu thức có thể được xác định bằng phân tích chương trình tĩnh được cho là gõ tĩnh. Gõ tĩnh là một thuộc tính hữu ích, nhưng yêu cầu tất cả các biến và biểu thức được liên kết với một loại tại thời gian biên dịch đôi khi quá hạn chế. Nó có thể được thay thế bởi yêu cầu yếu hơn là tất cả các biểu thức được đảm bảo là loại nhất quán mặc dù bản thân loại có thể không xác định tĩnh; điều này thường có thể được thực hiện bằng cách giới thiệu một số loại kiểm tra thời gian chạy. Các ngôn ngữ trong đó tất cả các biểu thức là loại nhất quán được gọi là ngôn ngữ được gõ mạnh. Nếu một ngôn ngữ được gõ mạnh, trình biên dịch của nó có thể đảm bảo rằng các chương trình mà nó chấp nhận sẽ thực thi mà không có lỗi loại. Nói chung, chúng ta nên cố gắng gõ mạnh và chấp nhận gõ tĩnh bất cứ khi nào có thể.


được đăng dưới dạng wiki cộng đồng vì tôi không xứng đáng nhận được tín dụng cho việc tìm kiếm này.
Ben Millwood

Vấn đề tôi có ở đây liên quan đến bình luận đầu tiên của Svick. Mặc dù có thể tốt khi bạn đã tìm thấy một định nghĩa về gõ mạnh, đây chắc chắn không phải là một định nghĩa thường được chấp nhận.
edA-qa mort-ora-y

@ edA-qamort-ora-y: bạn nói điều đó dựa trên cơ sở nào? Bạn có cái gì tốt hơn bằng chứng giai thoại cho những gì đang và không thường được chấp nhận không? Bất kỳ trích dẫn? (Tôi hiểu rằng bạn có thể có một điểm hợp lệ ngay cả khi không, nhưng tôi vẫn nghĩ những câu trả lời trên của tôi; ngay cả khi không có sự đồng thuận, thật tốt khi biết ít nhất một trong những câu trả lời học thuật nghiêm túc).
Ben Millwood

1
Tôi thực sự không thể chứng minh sự vắng mặt của một định nghĩa theo thỏa thuận? Nó không phải là logic có thể. Tuy nhiên, các bài viết trên Wikipedia về gõ mạnh mẽ cung cấp rất nhiều bằng chứng và tài liệu tham khảo, cho sự bất đồng và mâu thuẫn. vi.wikipedia.org/wiki/Strong_typing
edA-qa mort-ora-y

@ edA-qamort-ora-y: Các trích dẫn từ Wikipedia không thực sự hữu ích: một số không mang tính học thuật, một số khác được trích dẫn vì những lý do khác ngoài việc xác định các điều khoản. Bài viết Lập trình đánh máy có vẻ đầy hứa hẹn, nhưng chỉ đề cập đến các định nghĩa rất ngắn gọn trong việc thông qua; có lẽ nó đáng để chỉnh sửa câu trả lời của tôi Liên quan đến bằng chứng vắng mặt, tôi nghĩ bằng chứng về sự tranh cãi / bất đồng giữa những người biết họ đang nói gì sẽ đủ cho tôi (thực sự, bài viết Lập trình đánh máy có thể cho tôi).
Ben Millwood

6

Câu trả lời có thẩm quyền có thể được tìm thấy trong bài viết khảo sát của Cardelli và Wegner: Về cách hiểu các loại, trừu tượng hóa dữ liệu và đa hình .

Xin lưu ý rằng, trong khi "gõ mạnh" có nghĩa được chấp nhận, thì "gõ yếu" thì không. Bất kỳ thất bại nào của việc gõ mạnh có thể được coi là yếu và mọi người có thể khác nhau về loại thất bại nào được chấp nhận và những gì không.



Tuyệt vời, đó chỉ là những gì tôi muốn. Bài viết cần một chút để đọc, vì vậy tôi nghĩ rằng phải có một câu trả lời tóm tắt các điểm nổi bật. Tôi có nên chỉnh sửa chúng thành câu trả lời của bạn hay đăng câu trả lời wiki cộng đồng của riêng tôi không? Dù bằng cách nào, tôi sẽ cho nó thêm một vài ngày nữa trong trường hợp bất kỳ ai khác có bất kỳ đầu vào nào, sau đó chấp nhận bất cứ điều gì còn lại :)
Ben Millwood

@benmachine. Bài viết đầy đủ rất đáng đọc, nhưng các vấn đề khái niệm cấp cao được đề cập chỉ trong vài phần đầu tiên.
Uday Reddy

4
Tôi vẫn nghĩ rằng nó nên được tóm tắt trên trang này. Liên kết có thể hết hạn sau này.
Ben Millwood

@benmachine. Bạn được chào đón để gửi một bản tóm tắt như câu trả lời của riêng bạn cho câu hỏi của bạn.
Uday Reddy
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.