Có phải những người không được đề cập đến cũng có nghĩa là người Viking đã đánh máy một cách linh hoạt trong thế giới CS hàn lâm?


166

Tôi đang đọc một trang trình bày có nội dung "JavaScript được gỡ bỏ." Điều này mâu thuẫn với những gì tôi nghĩ là đúng nên tôi bắt đầu đào để thử và tìm hiểu thêm.

Mọi câu trả lời cho JavaScript có phải là ngôn ngữ chưa được kiểm tra không? nói rằng JavaScript không được gỡ rối và đưa ra các ví dụ về các dạng gõ tĩnh, động, mạnh và yếu khác nhau mà tôi quen thuộc và hài lòng .. vì vậy đó không phải là hướng đi.

Vì vậy, tôi đã hỏi Brendan Eich, người tạo ra JavaScript và ông nói:

các loại học thuật sử dụng "tháo gỡ" có nghĩa là "không có loại tĩnh". họ đủ thông minh để thấy rằng các giá trị có loại (duh!). vấn đề bối cảnh.

Có phải những người làm khoa học máy tính tập trung vào học thuật sử dụng "tháo gỡ" như một từ đồng nghĩa của "gõ động" (và điều này có hợp lệ không?) Hoặc có điều gì sâu hơn mà tôi đang thiếu? Tôi đồng ý với Brendan rằng bối cảnh rất quan trọng nhưng bất kỳ trích dẫn giải thích nào cũng sẽ tuyệt vời vì những cuốn sách "đi đến" hiện tại của tôi không chơi bóng về chủ đề này.

Tôi muốn khắc phục điều này để tôi có thể cải thiện sự hiểu biết của mình và bởi vì ngay cả Wikipedia cũng không đề cập đến cách sử dụng thay thế này (dù sao tôi cũng có thể tìm thấy). Tôi không muốn gây rối với việc sử dụng thuật ngữ hoặc đặt câu hỏi về việc sử dụng thuật ngữ này trong tương lai nếu tôi sai :-)

.


5
Việc lạm dụng danh pháp của người khác không phải định hình thói quen của bạn - chỉ cần sử dụng cụm từ chính xác (hơn). Bạn phải nhận thức được vấn đề để đọc, rõ ràng.
Raphael

2
Tôi luôn lấy nó làm, các biến được tháo ra trong đó bất kỳ biến nào cũng có thể chứa bất kỳ loại dữ liệu nào. Các loại gì là trong biến có thể thay đổi tự động .
Izkata


1
Ngoài ra (một lần nữa nói nhiều hơn về ngôn ngữ tự nhiên so với ngôn ngữ máy tính) "unsyped" = "gõ đơn" (một loại cho tất cả các giá trị).
philipxy

Câu trả lời:


148

Vâng, đây là thực hành tiêu chuẩn trong văn học hàn lâm. Để hiểu nó, cần phải biết rằng khái niệm "loại" đã được phát minh vào những năm 1930, trong bối cảnh tính toán lambda (trên thực tế, thậm chí sớm hơn, trong bối cảnh của lý thuyết tập hợp). Kể từ đó, toàn bộ nhánh logic tính toán đã xuất hiện được gọi là "lý thuyết loại". Lý thuyết ngôn ngữ lập trình dựa trên những nền tảng này. Và trong tất cả các bối cảnh toán học này, "loại" có một ý nghĩa cụ thể, được thiết lập tốt.

Thuật ngữ "gõ động" được phát minh muộn hơn nhiều - và đó là một mâu thuẫn trong các thuật ngữ khi sử dụng toán học phổ biến của từ "loại".

Ví dụ, đây là định nghĩa về "hệ thống loại" mà Benjamin Pierce sử dụng trong sách giáo khoa Các loại và Ngôn ngữ lập trình tiêu chuẩn của mình :

Một hệ thống loại là một phương pháp cú pháp dễ hiểu để chứng minh sự vắng mặt của một số hành vi chương trình nhất định bằng cách phân loại các cụm từ theo các loại giá trị mà chúng tính toán.

Ông cũng nhận xét:

Từ khóa static static đôi khi được thêm vào một cách rõ ràng - ví dụ, chúng ta nói về một ngôn ngữ lập trình được gõ tĩnh, để phân biệt các loại phân tích thời gian biên dịch mà chúng ta đang xem xét ở đây với kiểu gõ động hoặc tiềm ẩn được tìm thấy trong các ngôn ngữ như Lược đồ (Sussman và Steele, 1975; Kelsey, Clinger và Rees, 1998; Dybvig, 1996), trong đó các loại thẻ thời gian chạy được sử dụng để phân biệt các loại cấu trúc khác nhau trong đống. Các thuật ngữ như kiểu động được gõ một cách linh hoạt là những từ được cho là sai và có thể được thay thế bằng cách kiểm tra động, có thể sử dụng, nhưng cách sử dụng là chuẩn.

Hầu hết mọi người làm việc trong lĩnh vực này dường như đang chia sẻ quan điểm này.

Lưu ý rằng điều này không có nghĩa là "tháo ra" và "gõ động" là từ đồng nghĩa. Thay vào đó, cái sau là một tên (sai về mặt kỹ thuật) cho một trường hợp cụ thể của cái trước.

PS: Và FWIW, tôi tình cờ vừa là nhà nghiên cứu học thuật trong các hệ thống loại, vừa là người triển khai JavaScript không học thuật, vì vậy tôi phải sống với sự phân liệt. :)


5
rất hữu ích và thậm chí có thể trả lời yêu thích của tôi trong việc cung cấp một số lịch sử với nó.
Peter Cooper

2
@PeterCooper btw bạn có thể quan tâm để biết rằng một nhánh chính của ngữ nghĩa chính thức được quy định (ha a chơi chữ) trên máy tính lambda đánh máy; ví dụ ngữ nghĩa học Montague. Nhưng với tư cách là một hệ thống khai báo, không mang tính khái quát, cá nhân tôi luôn luôn ngăn cách việc gõ trong các hệ thống như Montague Semantics tránh việc gõ các ngôn ngữ lập trình.
biết

+1. "[dynamically typed] is a (technically misleading) name for a particular case of [untyped]"
Steve

1
Điều này không hoàn toàn chính xác về lịch sử của "các loại". Họ thậm chí còn già hơn so với công việc của Church trên phép tính lambda. Russell đã sử dụng các loại để tránh nghịch lý trong việc xây dựng lý thuyết tập hợp.
Sam Tobin-Hochstadt

1
@ SamTobin-Hochstadt, vâng, đúng. Tôi chỉ nói về một phần của lịch sử liên quan trực tiếp đến nền tảng của PL. Tôi sẽ làm rõ.
Andreas Rossberg

68

Tôi là một nhà khoa học máy tính hàn lâm chuyên về ngôn ngữ lập trình, và vâng, từ "cởi trói" thường được sử dụng (mis) theo cách này. Sẽ rất tốt nếu dự trữ từ để sử dụng với các ngôn ngữ không mang thẻ loại động, chẳng hạn như mã Forth và mã lắp ráp, nhưng các ngôn ngữ này hiếm khi được sử dụng và thậm chí hiếm khi được nghiên cứu hơn và nói "tháo gỡ" dễ dàng hơn nhiều hơn là "gõ động".

Bob Harper thích nói rằng các ngôn ngữ như Scheme, Javascript, v.v nên được coi là các ngôn ngữ được gõ chỉ với một loại duy nhất: value. Tôi nghiêng về quan điểm này, vì nó có thể xây dựng một thế giới quan nhất quán chỉ bằng một loại hình thức.

PS Trong phép tính lambda thuần túy, "giá trị" duy nhất là các thuật ngữ ở dạng bình thường và các thuật ngữ đóng duy nhất ở dạng bình thường là các hàm. Nhưng hầu hết các nhà khoa học sử dụng phép tính lambda đều thêm các loại cơ sở và hằng số, và sau đó bạn có thể bao gồm một hệ thống kiểu tĩnh cho lambda hoặc bạn quay lại ngay với các loại thẻ động.

PPS Đối với áp phích gốc: khi nói đến ngôn ngữ lập trình và đặc biệt là các hệ thống loại, thông tin trên Wikipedia có chất lượng kém. Đừng tin tưởng nó.


12
Tôi nghĩ rằng có một vấn đề rộng lớn hơn trong CS (bao gồm cả giới hàn lâm) rằng tên được sử dụng mà không có định nghĩa nghiêm ngặt. Điều này trái ngược hoàn toàn với toán học và (hầu hết?) Khoa học. Một số lượng lớn các tranh chấp (ví dụ về OOP) dường như xuất phát từ việc thiếu định nghĩa đúng đắn này. Rất phiền phức.
Konrad Rudolph

2
@KonradRudolph: Tôi tự hỏi, thay vì các tranh chấp phát sinh từ việc thiếu các định nghĩa đúng, việc thiếu các định nghĩa đúng có thể phát sinh một phần từ các tranh chấp. Một số thuật ngữ có được giá trị cảm xúc (có thể là tích cực hoặc tiêu cực) và những người ủng hộ các ngôn ngữ cụ thể sau đó xác định các thuật ngữ đó theo cách bao gồm hoặc loại trừ ngôn ngữ của họ (và loại trừ hoặc bao gồm ngôn ngữ "kẻ thù" yêu thích của họ). Đối với một ví dụ toán học - nếu vẫn còn người ủng hộ lý thuyết tập ngây so với lý thuyết tập hợp tiên đề, bạn có thể chắc chắn họ sẽ gọi quan điểm của riêng họ là "lý thuyết tập hợp tiên đề" và định nghĩa "ngây thơ
ruakh

4
@Norman, tôi ngạc nhiên khi bạn gọi nó là lạm dụng - như bạn đã biết, khái niệm loại có trước cái gọi là ngôn ngữ được gõ động trong nhiều thập kỷ, và cái mà sau này gọi là "loại" ít liên quan đến cái trước. Vì vậy, tôi nghĩ thật công bằng khi nói rằng lạm dụng là cách khác.
Andreas Rossberg

5
@Norman: Khi nói đến các ngôn ngữ lập trình và đặc biệt là các hệ thống loại, nếu bạn cảm thấy thông tin trên Wikipedia có chất lượng kém, đừng để nó một mình và cải thiện nó. (chỉ trolling)
Gyom

3
@Gyom Tôi đã từ bỏ việc cải thiện Wikipedia vào ngày tôi nhận ra rằng phần thưởng quy trình Wikipedian thay đổi , không phải chuyên môn . Thời gian của tôi tốt hơn dành để cải thiện SO :-)
Norman Ramsey

43

Tôi đã xem xét và nhận thấy rằng câu trả lời cho câu hỏi của bạn chỉ đơn giản và đáng ngạc nhiên là "có": các loại CS học thuật, hoặc ít nhất là một số trong số chúng, sử dụng "tháo ra" để có nghĩa là "gõ động". Ví dụ : Ngôn ngữ lập trình: Nguyên tắc và thực tiễn , Ấn bản thứ ba (của Kenneth C. Louden và Kenneth A. Lambert, xuất bản 2012) nói điều này:

Các ngôn ngữ không có hệ thống kiểu tĩnh thường được gọi là ngôn ngữ chưa được gõ (hoặc ngôn ngữ được nhập động ). Các ngôn ngữ này bao gồm Scheme và các phương ngữ khác của Lisp, Smalltalk và hầu hết các ngôn ngữ script như Perl, Python và Ruby. Tuy nhiên, lưu ý rằng một ngôn ngữ chưa được gõ không nhất thiết cho phép các chương trình làm hỏng dữ liệu, điều này chỉ có nghĩa là tất cả các kiểm tra an toàn được thực hiện tại thời điểm thực hiện. [Càng]

[ link ] (lưu ý: tô đậm trong bản gốc) và tiếp tục sử dụng "tháo gỡ" theo cách này.

Tôi thấy điều này đáng ngạc nhiên (vì nhiều lý do tương tự mà afrischke và Adam Mihalcin đưa ra), nhưng có bạn đây. :-)


Đã chỉnh sửa để thêm: Bạn có thể tìm thấy nhiều ví dụ hơn bằng cách cắm "untyped languages"vào Tìm kiếm Sách của Google. Ví dụ:

[V]] Đây là cơ chế che giấu thông tin chính là nhiều ngôn ngữ chưa được kiểm tra. Ví dụ: Đề án PLT [4] sử dụng structs thế hệ , [Mạnh]

- Jacob Matthews và Amal Ahmed, 2008 [ link ]

[Hoài], chúng tôi trình bày một phân tích thời gian ràng buộc cho một ngôn ngữ chức năng chưa được xử lý [Khác]. [V]] Nó đã được triển khai và được sử dụng trong một bộ đánh giá một phần cho phương ngữ miễn phí có hiệu lực phụ của Đề án. Tuy nhiên, phân tích đủ chung để có hiệu lực đối với các ngôn ngữ chức năng được gõ không nghiêm ngặt như Haskell. [Càng]

- Charles Consel, 1990 [ link ]

Nhân tiện, ấn tượng của tôi, sau khi xem qua các kết quả tìm kiếm này, là nếu một nhà nghiên cứu viết một ngôn ngữ chức năng "chưa được đánh dấu", thì rất có thể anh ta coi nó là "được tháo gỡ" theo nghĩa tương tự như lambda chưa được đánh dấu tính toán mà Adam Mihalcin đề cập. Ít nhất, một số nhà nghiên cứu đề cập đến Scheme và phép tính lambda trong cùng một hơi thở.

Tất nhiên, những gì tìm kiếm không nói là liệu có nhà nghiên cứu nào từ chối nhận dạng này hay khôngkhông coi các ngôn ngữ này là "không được kiểm tra". Vâng, tôi đã tìm thấy điều này:

Sau đó tôi nhận ra rằng thực sự không có tính tuần hoàn, bởi vì các ngôn ngữ được gõ động không phải là ngôn ngữ được đánh dấu - chỉ là các loại thường không rõ ràng ngay lập tức từ văn bản chương trình.

- ai đó (tôi không thể nói với ai), 1998 [ link ]

nhưng rõ ràng hầu hết những người từ chối nhận dạng này sẽ không cảm thấy cần phải nói rõ ràng như vậy.


2
Ồ Gây sốc. Cảm ơn bạn về thông tin.
afrischke

Chính xác là loại trích dẫn tôi đang tìm kiếm, cảm ơn! Kinda làm tôi sợ rằng cuốn sách có trung bình 2 sao trên Amazon mặc dù rất nhiều trích dẫn được hoan nghênh, nhưng đây là một khởi đầu tuyệt vời.
Peter Cooper

@PeterCooper: Tôi đã chỉnh sửa câu trả lời của mình để thêm nhiều trích dẫn. Họ phá vỡ vấn đề xếp hạng của Amazon bằng cách từ các bài báo được xuất bản: đối với tất cả những gì tôi biết, chúng vẫn có thể là rác, nhưng ít nhất chúng ta không phải lo lắng về việc Amazon nói với chúng ta như vậy. :-P
ruakh 6/2 '

Nhầm lẫn "tháo gỡ" với "gõ động" là phi logic. Các nhà phát triển không nên phi logic.
rotman

10

Được đánh máy và đánh máy động hoàn toàn không phải là từ đồng nghĩa. Ngôn ngữ thường được gọi là "cởi trói" là Công cụ Lambda, đây thực sự là ngôn ngữ thống nhất - mọi thứ đều là hàm, vì vậy chúng tôi có thể chứng minh một cách tĩnh rằng loại mọi thứ đều là hàm. Một ngôn ngữ được gõ động có nhiều loại, nhưng không thêm một cách để trình biên dịch kiểm tra tĩnh chúng, buộc trình biên dịch phải chèn kiểm tra thời gian chạy vào các loại biến.

Sau đó, JavaScript là một ngôn ngữ được gõ động: có thể viết các chương trình bằng JavaScript sao cho một số biến xcó thể là một số hoặc một hàm hoặc một chuỗi hoặc một cái gì đó khác (và xác định cái nào sẽ yêu cầu giải quyết vấn đề Dừng hoặc một số vấn đề toán học khó), vì vậy bạn có thể áp dụng xcho một đối số và trình duyệt phải kiểm tra trong thời gian chạy đó xlà một hàm.


AFAIK Các vấn đề tương tự áp dụng cho biểu thức Lambda. Mặc dù bạn có thể chuyển một hàm cho "vị trí hiện tại của tôi" thành một hàm tính toán "khoảng cách của tôi với mục tiêu", bạn cũng có thể chuyển cùng một chức năng "vị trí hiện tại của tôi" vào một hàm tính toán "là những cú phồng cộng với vicks tốt hơn cho mũi của bạn ". Chỉ vì bạn không có nghĩa là nó hợp lệ - như trường hợp của bất kỳ hệ thống động nào.
Steve

5
@Steve Rác trong rác ra là trường hợp của bất kỳ ngôn ngữ lập trình nào, và không liên quan đến khái niệm các loại. Ngay cả trong một ngôn ngữ được gõ mạnh như OCaml hoặc SML, tôi có thể chuyển Bắc Cực vào một hàm tính toán "khoảng cách của tôi với mục tiêu" (và không, vị trí hiện tại của tôi không phải là Cực Bắc).
Adam Mihalcin

Chỉ muốn thêm vào, đối với những người bên ngoài giới hàn lâm: những thứ như lắp ráp cũng sẽ được tính là chưa được chỉnh sửa.
CoffeeTableEspresso

6

Cả hai câu đều đúng, tùy thuộc vào việc bạn đang nói về giá trị hay biến. Các biến JavaScript được gỡ bỏ, các giá trị JavaScript có các loại và các biến có thể nằm trong bất kỳ loại giá trị nào trong thời gian chạy (tức là 'động').

Trong JavaScript và nhiều ngôn ngữ khác, các giá trị và không phải là biến mang các loại. Tất cả các biến có thể nằm trong tất cả các loại giá trị và có thể được coi là "được gõ động" hoặc "chưa được gõ" - từ góc độ kiểm tra loại một biến không có loại / không thể biết và một biến có thể có bất kỳ loại nào tương đương về mặt logic và thực tế . Khi các nhà lý thuyết loại nói về ngôn ngữ và kiểu, họ thường nói về điều này - các biến mang các kiểu - bởi vì họ quan tâm đến việc viết trình kiểm tra và trình biên dịch kiểu, v.v., hoạt động trên văn bản chương trình (tức là biến) và không phải là chương trình đang chạy trong bộ nhớ (tức là các giá trị).

Ngược lại trong các ngôn ngữ khác, như C, các biến mang các loại nhưng giá trị thì không. Trong các ngôn ngữ như Java, các biến và giá trị đều mang các loại. Trong C ++, một số giá trị (những giá trị có hàm ảo) mang các loại và các giá trị khác thì không. Trong một số ngôn ngữ, các giá trị thậm chí có thể thay đổi các loại, mặc dù điều này thường được coi là thiết kế xấu.


5
Tôi nghĩ rằng sự khác biệt chính không phải là giữa các giá trị và biến , mà là giữa các giá trị và biểu thức : Trong một ngôn ngữ được gõ tĩnh, các biểu thức có các loại, trong khi trong một ngôn ngữ được gõ động, chỉ có các giá trị làm. (Tất nhiên, tên biến là một loại biểu thức.)
ruakh

4

Câu hỏi này là tất cả về ngữ nghĩa

Nếu tôi cung cấp cho bạn dữ liệu này: 12đó là loại gì? Bạn không có cách nào để biết chắc chắn. Có thể là một số nguyên - có thể là một số float - có thể là một chuỗi. Theo nghĩa đó, nó rất nhiều dữ liệu "được tháo gỡ".

Nếu tôi cung cấp cho bạn một ngôn ngữ tưởng tượng cho phép bạn sử dụng các toán tử như "thêm", "trừ" và "nối" trên dữ liệu này và một số dữ liệu tùy ý khác thì "loại" có phần không liên quan (với ngôn ngữ tưởng tượng của tôi) (ví dụ : có lẽ add(12, a)sản lượng 109mà là 12cộng với giá trị ascii của a).

Hãy nói chuyện C một chút. C khá nhiều cho phép bạn làm bất cứ điều gì bạn muốn với bất kỳ phần dữ liệu tùy ý. Nếu bạn đang sử dụng một hàm mất hai uintgiây - bạn có thể truyền và vượt qua bất cứ thứ gì bạn muốn - và các giá trị sẽ chỉ được hiểu là uints. Theo nghĩa đó, C là "cởi trói" (nếu bạn đối xử với nó theo cách như vậy).

Tuy nhiên - và đi đến quan điểm của Brendan - nếu tôi nói với bạn rằng "Tuổi của tôi là 12" - thì 12có một loại - ít nhất là chúng ta biết đó là số. Với bối cảnh mọi thứ đều có một loại - bất kể ngôn ngữ.

Đây là lý do tại sao tôi đã nói lúc đầu - câu hỏi của bạn là một trong những ngữ nghĩa. Ý nghĩa của "cởi trói" là gì? Tôi nghĩ Brendan đã bắn đinh vào đầu khi anh ta nói "không có loại tĩnh" - bởi vì đó là tất cả những gì nó có thể có nghĩa. Con người tự nhiên phân loại mọi thứ thành các loại. Chúng ta trực giác biết rằng có một cái gì đó khác biệt cơ bản giữa một chiếc xe và một con khỉ - mà không bao giờ được dạy để tạo ra những sự khác biệt.

Trở lại ví dụ của tôi ngay từ đầu - một ngôn ngữ "không quan tâm đến các loại" (per-se) có thể cho phép bạn "thêm" "tuổi" và "tên" mà không gây ra lỗi cú pháp ... nhưng điều đó không có nghĩa đó là một hoạt động hợp lý.

Javascript có thể cho phép bạn làm tất cả các loại điều điên rồ mà không coi chúng là "lỗi". Điều đó không có nghĩa là những gì bạn đang làm là hợp lý. Đó là cho các nhà phát triển để làm việc ra.

Là một hệ thống / ngôn ngữ không thực thi an toàn loại tại thời gian biên dịch / xây dựng / giải thích "được tháo ra" hoặc "gõ động"?

Ngữ nghĩa.

BIÊN TẬP

Tôi muốn thêm một cái gì đó ở đây vì một số người dường như bị cuốn vào "vâng, nhưng Javascript có một số" loại ".

Trong nhận xét của tôi về câu trả lời của người khác, tôi nói:

Trong Javascript, tôi có thể có các đối tượng tôi đã xây dựng thành "Khỉ" và các đối tượng tôi đã xây dựng thành "Con người" và một số chức năng có thể được thiết kế để chỉ hoạt động trên "Con người", các đối tượng khác chỉ có "Khỉ" và còn những người khác chỉ trên "Things With Arms". Có hay không ngôn ngữ đã từng được nói có một loại đối tượng như "vật có cánh tay" không liên quan đến lắp ráp ("tháo gỡ") như đối với Javascript ("động"). Tất cả chỉ là vấn đề về tính toàn vẹn logic - và lỗi duy nhất sẽ là sử dụng thứ gì đó không có vũ khí với phương pháp đó.

Vì vậy, nếu bạn coi Javascript có một số "khái niệm về loại" bên trong - và, do đó là "loại động" - và nghĩ rằng đây là "khác biệt rõ ràng với một hệ thống chưa được xử lý" - bạn sẽ thấy từ ví dụ trên rằng bất kỳ "khái niệm nào về" loại "nó có nội bộ thực sự không liên quan.

Ví dụ, để thực hiện thao tác tương tự với C #, tôi CẦN một giao diện được gọi ICreatureWithArmshoặc một cái gì đó tương tự. Không phải như vậy trong Javascript - không phải như vậy trong C hoặc ASM.

Rõ ràng, việc Javascript có hay không có bất kỳ sự hiểu biết nào về "các loại" đều không liên quan.


4
-1. Câu hỏi hỏi liệu một từ nào đó được sử dụng, trong một số vòng tròn nhất định, với một ý nghĩa nhất định và câu trả lời của bạn là để giải thích rằng đó là một câu hỏi liệu từ đó có nghĩa đó không? Thực sự, tôi nghĩ rằng bạn đã thực hiện một công việc đáng ngưỡng mộ để giải thích mọi thứ mà OP dường như đã biết, mà không cần thêm bất cứ điều gì mới. . .
ruakh

Có vẻ như có một số câu hỏi cần thiết để xây dựng một định nghĩa, có lẽ? Đó là thực thi kiểu (tĩnh hoặc động) và sự hiện diện của các loại được xác định. Vì vậy, JavaScript có các loại nhưng có thể được coi là "được tháo gỡ" do thiếu tính hợp lệ của loại kiểm tra trước khi thực hiện một thao tác?
Peter Cooper

@ruakh - Tôi có thể hiểu quan điểm của bạn. Tuy nhiên, OP đã hỏi: is there something deeper to this that I am missingvà, tôi nghĩ rằng, việc không hiểu rằng đó là một vấn đề ngữ nghĩa là điều sâu sắc hơn - vì vậy tôi đã cố gắng hết sức để sứt mẻ trong bất kỳ điều gì có thể.
Steve

@PeterCooper - Xem chỉnh sửa của tôi và cho tôi biết nếu điều đó thêm bất cứ điều gì cho bạn (vì bạn đã nói JavaScript has typestrong câu trả lời của mình).
Steve

2
'Rõ ràng, việc Javascript có hiểu bất kỳ "loại" nào hay không đều không liên quan.' Không đúng. Như tôi đã gợi ý trong câu trả lời của mình, bất kể bối cảnh nào, bạn không thể coi 12 là một hàm. Vì JavaScript có một loại chức năng (hoặc, tùy theo quan điểm của bạn, nhiều loại chức năng), đây là một sự khác biệt quan trọng.
Adam Mihalcin

4

Mặc dù sự thật là hầu hết các nhà nghiên cứu CS viết về các loại về cơ bản chỉ coi các ngôn ngữ có các loại có nguồn gốc cú pháp là ngôn ngữ được gõ, có rất nhiều người trong chúng ta sử dụng các ngôn ngữ được gõ một cách linh hoạt / gần đây sử dụng ngôn ngữ đó.

Tôi cho rằng có 3 loại [SIC] ngôn ngữ:

Unyped - chỉ người vận hành xác định việc giải thích giá trị - và nó thường hoạt động trên mọi thứ. Ví dụ: Trình biên dịch, BCPL

Nhập tĩnh - biểu thức / biến có các loại được liên kết với chúng và loại đó xác định việc giải thích / tính hợp lệ của toán tử tại thời gian biên dịch. Ví dụ: C, Java, C ++, ML, Haskell

Nhập động - các giá trị có các loại được liên kết với chúng và loại đó xác định việc giải thích / hiệu lực của toán tử trong thời gian chạy. Ví dụ: LISP, Scheme, Smalltalk, Ruby, Python, Javascript

Theo hiểu biết của tôi, tất cả các ngôn ngữ được gõ động đều an toàn kiểu - tức là chỉ các toán tử hợp lệ mới có thể hoạt động trên các giá trị. Nhưng điều tương tự không đúng với ngôn ngữ gõ tĩnh. Tùy thuộc vào sức mạnh của hệ thống loại được sử dụng, một số toán tử chỉ có thể được kiểm tra tại thời gian chạy hoặc hoàn toàn không. Ví dụ: hầu hết các ngôn ngữ được nhập tĩnh không xử lý tràn số nguyên đúng cách (thêm 2 số nguyên dương có thể tạo ra một số nguyên âm) và các tham chiếu mảng ngoài giới hạn hoàn toàn không được kiểm tra (C, C ++) hoặc chỉ được kiểm tra tại thời gian chạy Hơn nữa, một số hệ thống loại yếu đến mức lập trình hữu ích đòi hỏi các lối thoát (phôi trong C và gia đình) để thay đổi kiểu biểu thức thời gian biên dịch.

Tất cả điều này dẫn đến những tuyên bố vô lý, chẳng hạn như C ++ an toàn hơn Python vì nó (được gõ tĩnh), trong khi sự thật là Python thực sự an toàn trong khi bạn có thể bắn hạ chân của mình bằng C ++.


Nâng cao. Vui mừng khi biết "tất cả các ngôn ngữ được nhập động là loại an toàn". "Nhưng điều tương tự không đúng với ngôn ngữ gõ tĩnh", bạn có nghĩa là tất cả hoặc hầu hết các ngôn ngữ gõ tĩnh đều không an toàn?
Tim

Nâng cao. (1) Vui mừng khi biết "tất cả các ngôn ngữ được nhập động là loại an toàn", nhưng Javascript được gõ động và gõ yếu, xem stackoverflow.com/questions/964910/ . (2) "Nhưng điều tương tự không đúng với ngôn ngữ gõ tĩnh", bạn có nghĩa là tất cả hoặc hầu hết các ngôn ngữ gõ tĩnh đều không an toàn?
Tim

Rất ít ngôn ngữ là loại an toàn tĩnh, nếu bạn bao gồm khả năng thất bại truyền, ngoại lệ đăng ký hoặc ngoại lệ con trỏ null dưới dạng loại (và hầu hết mọi người đều bao gồm ít nhất lỗi thất bại là lỗi loại). Rust, ví dụ, an toàn kiểu tĩnh hơn Java vì bạn không thể có con trỏ null. Java là loại động an toàn ở chỗ bạn có ngoại lệ cho bất kỳ hoạt động bất hợp pháp nào và mọi thứ đều được chỉ định (ngoại trừ các phương thức gốc). Tương tự Rust (ngoại trừ mã "không an toàn" được chỉ định như vậy).
Dave Mason

Tuy nhiên, C ++, C thậm chí không an toàn về mặt động vì có những phần "không xác định" của ngôn ngữ và nếu bạn thực hiện một trong các thao tác "không xác định", nghĩa đen là mọi phản hồi hợp pháp từ ngôn ngữ (giá trị của các biến không liên quan có thể thay đổi, virus có thể lây nhiễm chương trình của bạn, chương trình có thể ghi trên đĩa của bạn và sau đó bị sập, chương trình thậm chí có thể làm những gì bạn mong đợi :-).
Dave Mason

@DaveMason: Không xác định. Có một sự khác biệt rất lớn giữa "không xác định" và "không xác định" trong C. Hành vi không xác định về cơ bản là những điều bất hợp pháp có thể làm những gì bạn đã mô tả --- trong khi về cơ bản không xác định có nghĩa là "việc thực hiện được xác định trong đó việc thực hiện không phải ghi lại "(Có một số sắc thái ở đây và đó, vì vậy đây một sự đơn giản hóa). Do đó, gọi hành vi không xác định là hoàn toàn hợp pháp (trên thực tế, người ta làm như vậy bất cứ khi nào người ta viết, nói, gọi hàm).
Tim Čas

2

Tôi không phải là nhà khoa học máy tính, nhưng tôi sẽ khá ngạc nhiên nếu "cởi trói" thực sự được sử dụng như một từ đồng nghĩa với "gõ động" trong cộng đồng CS (ít nhất là trong các ấn phẩm khoa học) vì hai thuật ngữ này mô tả các khái niệm khác nhau. Một ngôn ngữ được gõ động có một khái niệm về các loại và nó thực thi các ràng buộc kiểu trong thời gian chạy (ví dụ bạn không thể chia một số nguyên cho một chuỗi trong Lisp mà không gặp lỗi) trong khi một ngôn ngữ chưa được gõ không có bất kỳ khái niệm nào về các loại tại tất cả (ví dụ trình biên dịch). Ngay cả bài viết Wikipedia về ngôn ngữ lập trình (http://en.m.wikipedia.org/wiki/Programming_lingu#Typed_versus_untyped_lacular) cũng tạo nên sự khác biệt này.

Cập nhật: Có thể sự nhầm lẫn xuất phát từ việc một số văn bản nói điều gì đó đến mức "các biến không được gõ" trong Javascript (đó là sự thật). Nhưng điều đó không tự động có nghĩa là ngôn ngữ được tháo ra (điều này sẽ sai).


1
Trình biên dịch có một số khái niệm rất yếu về các loại. Ít nhất là trong x86, mọi thứ đều là số nguyên, nhưng một số số nguyên có kích thước khác với các số nguyên khác. Đó là ngay cả trước khi vào MMX, x87 và các tiện ích mở rộng khác cho thông số x86 gốc.
Adam Mihalcin

Tôi phải không đồng ý. Trong Javascript, tôi có thể có các đối tượng tôi đã xây dựng thành "Khỉ" và các đối tượng tôi đã xây dựng thành "Con người" và một số chức năng có thể được thiết kế để chỉ hoạt động trên "Con người", các đối tượng khác chỉ có "Khỉ" và còn những người khác chỉ trên "Things With Arms". Có hay không ngôn ngữ đã từng được nói có một loại đối tượng như "vật có cánh tay" không liên quan đến lắp ráp ("tháo gỡ") như đối với Javascript ("động"). Tất cả chỉ là vấn đề về tính toàn vẹn logic - và lỗi duy nhất sẽ là sử dụng thứ gì đó không có vũ khí với phương pháp đó.
Steve

@Adam Mihalcin Đúng. Tất nhiên, các ngôn ngữ lắp ráp [Macro] cũng có thể có một số khái niệm về các loại ở nhiều mức độ khác nhau. (Kiểm tra "Ngôn ngữ hội nhập" chẳng hạn.) Tôi vẫn nghĩ rằng quan điểm của tôi vẫn đúng.
afrischke

3
@Steve Tôi không chắc là tôi có thể theo dõi bạn không. OP đã hỏi nếu trong vòng tròn CS, không có sự phân biệt nào được thực hiện giữa "gõ động" và "tháo gỡ". Điều này không liên quan gì đến việc bạn có tin rằng thực tế không có sự phân biệt giữa cách Javascript so với lắp ráp xử lý các bit trong bộ nhớ. Theo những gì tôi đã đọc (và tôi phải tìm kiếm cụ thể vì tôi không phải là lập trình viên Javascript): Tiêu chuẩn ECMAScript / Javascript xác định 6 loại dữ liệu (Boolean, String, Không xác định, Số, Null và Object) và tại bất kỳ điểm nào trong thời gian một giá trị là một loại cụ thể ...
afrischke

1
... Bây giờ đây là một khái niệm (hầu hết) các ngôn ngữ lắp ráp không có (tất cả đều có bit và byte), vì vậy imho điều này đánh dấu sự phân biệt rõ ràng giữa Javascript và lắp ráp.
afrischke

1

Đồng ý với Brendan - bối cảnh là tất cả.

Tôi lấy:

Tôi nhớ đã bị nhầm lẫn, vào khoảng năm 2004, bởi vì đã có những cuộc tranh cãi nổ ra về việc liệu Ruby đã được tháo ra hay đánh máy một cách linh hoạt. Những người học C / C ++ cũ (trong đó tôi là một) đã suy nghĩ về trình biên dịch và nói rằng Ruby đã được tháo gỡ.

Hãy nhớ rằng, trong C, không có loại thời gian chạy, chỉ có địa chỉ và nếu mã đang thực thi quyết định coi bất cứ thứ gì tại địa chỉ đó là thứ gì đó không phải là gì, thì rất tiếc. Điều đó chắc chắn được tháo ra và rất khác so với gõ động.

Trong thế giới đó, "gõ" là tất cả về trình biên dịch. C ++ đã "gõ mạnh" vì các kiểm tra của trình biên dịch nghiêm ngặt hơn. Java và C được "gõ yếu" hơn (thậm chí còn có những tranh luận về việc Java được gõ mạnh hay yếu). Các ngôn ngữ động, trong tính liên tục đó, "được tháo gỡ" bởi vì chúng không có kiểm tra loại trình biên dịch.

Ngày nay, đối với các lập trình viên thực hành, chúng ta đã quá quen với các ngôn ngữ động, rõ ràng chúng ta nghĩ đến việc không được kiểm tra có nghĩa là không có trình biên dịch cũng như kiểm tra kiểu trình thông dịch, sẽ rất khó để gỡ lỗi. Nhưng có một khoảng thời gian mà điều đó không rõ ràng và trong thế giới lý thuyết hơn của CS thậm chí có thể không có ý nghĩa.

Trong một số ý nghĩa sâu sắc, không có gì có thể được tháo gỡ (hoặc gần như không có gì, dù sao) bởi vì bạn phải có một số ý định trong việc thao túng một giá trị để viết một thuật toán có ý nghĩa. Đây là thế giới của CS lý thuyết, không liên quan đến các chi tiết cụ thể về cách trình biên dịch hoặc trình thông dịch được thực thi cho một ngôn ngữ nhất định. Vì vậy, "cởi trói" là (có lẽ, tôi không biết) hoàn toàn vô nghĩa trong bối cảnh đó.

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.