Tĩnh / Động so với Mạnh / Yếu


319

Tôi thấy những thuật ngữ này được băng bó khắp nơi trong lập trình và tôi có một khái niệm mơ hồ về ý nghĩa của chúng. Một tìm kiếm cho tôi thấy rằng những điều như vậy đã được yêu cầu trên tất cả các ngăn xếp tràn trên thực tế. Theo như tôi biết thì việc gõ tĩnh / động trong các ngôn ngữ khác biệt rất nhiều so với cách gõ mạnh / yếu nhưng sự khác biệt đó là gì làm tôi khó hiểu. Các nguồn khác nhau dường như sử dụng các ý nghĩa khác nhau hoặc thậm chí sử dụng các thuật ngữ thay thế cho nhau. Tôi không thể tìm thấy ở đâu đó nói về cả hai và thực sự nói lên sự khác biệt. Điều tuyệt vời là nếu ai đó có thể vui lòng đánh vần điều này rõ ràng ở đây cho tôi và phần còn lại của thế giới.



Câu trả lời:


423
  • Nhập tĩnh / động là về khi có được thông tin loại (Có thể tại thời gian biên dịch hoặc khi chạy)

  • Nhập mạnh / yếu là về cách phân biệt các loại nghiêm ngặt (ví dụ: liệu ngôn ngữ có cố thực hiện chuyển đổi ngầm định từ chuỗi sang số hay không).

Xem trang wiki để biết thêm thông tin chi tiết.


7
Wikipedia có tất cả các câu trả lời. Tại sao tôi không vấp phải điều này tôi đã không biết.
Dan Revell

31
Thật xấu hổ khi nhiều người không nhận thức được rằng tĩnh / động là thứ gì đó khác hơn là mạnh / yếu ... Nó thực sự sẽ tiết kiệm một số sự thiên vị và thảo luận.
Dykam

10
Có nhiều mức độ khác nhau của "loại yếu". Một ngôn ngữ được gõ mạnh có thể thử chuyển đổi từ chuỗi sang số. Mặt khác, HyperTalk (một ngôn ngữ mà tôi đã sử dụng từ nhiều thập kỷ trước) được đánh máy yếu đến mức "12" + "34"có thể bằng "46", nhưng "12" + "34Q"sẽ bằng "1234Q"[may mắn thay, người ta có thể viết "12" & "34"nếu muốn ghép nối]. Thật kỳ lạ, các biến giữ các số được lưu trữ chúng dưới dạng các phao có độ chính xác kép và toán học trên các biến đó đã sử dụng các giá trị dấu phẩy động mà không có chuỗi, nhưng không có cách nào để hỏi liệu một biến là một chuỗi hay số.
supercat

9
@kittylyst Tôi không thể thấy câu trả lời này gợi ý rằng mạnh mẽ là từ đồng nghĩa với tĩnh
Pete

4
++ cho (đại khái) định nghĩa dòng đơn.
JamesFaix

211

Bạn đã phát hiện ra một điểm yếu trong thuật ngữ mà những người nghiệp dư sử dụng để nói về ngôn ngữ lập trình. Không sử dụng thuật ngữ gõ "mạnh" và "yếu" , vì chúng không có ý nghĩa chung về mặt kỹ thuật. Ngược lại, gõ tĩnh có nghĩa là các chương trình được kiểm tra trước khi được thực thi và một chương trình có thể bị từ chối trước khi bắt đầu. Gõ động có nghĩa là các loại giá trị được kiểm tra trong khi thực hiện và thao tác gõ kém có thể khiến chương trình tạm dừng hoặc báo hiệu lỗi trong thời gian chạy . Một lý do chính cho việc gõ tĩnh là loại trừ các chương trình có thể có "lỗi kiểu động" như vậy.

Gõ mạnh thường có nghĩa là không có sơ hở trong hệ thống loại, trong khi gõ yếu có nghĩa là hệ thống loại có thể bị phá vỡ (làm mất hiệu lực bất kỳ đảm bảo nào). Các thuật ngữ thường được sử dụng không chính xác để có nghĩa là gõ tĩnh và động. Để thấy sự khác biệt, hãy nghĩ về C: ngôn ngữ được kiểm tra kiểu tại thời gian biên dịch (gõ tĩnh), nhưng có rất nhiều sơ hở; bạn có thể chuyển một giá trị của bất kỳ loại nào sang loại khác có cùng kích thước --- đặc biệt, bạn có thể truyền các loại con trỏ một cách tự do. Pascal là một ngôn ngữ được dự định sẽ gõ mạnh nhưng nổi tiếng có một lỗ hổng không lường trước: một bản ghi biến thể không có thẻ.

Việc triển khai các ngôn ngữ được gõ mạnh thường thu được các sơ hở theo thời gian, thông thường để một phần của hệ thống thời gian chạy có thể được thực hiện bằng ngôn ngữ cấp cao. Ví dụ, Objective Caml có một hàm được gọi là Obj.magiccó hiệu ứng thời gian chạy đơn giản là trả về đối số của nó, nhưng tại thời điểm biên dịch, nó chuyển đổi một giá trị của bất kỳ loại nào thành một loại khác. Ví dụ yêu thích của tôi là Modula-3, người thiết kế gọi là cấu trúc đúc kiểu của họ LOOPHOLE.

Như đã nói, bạn không thể tin tưởng vào bất kỳ hai người nào sử dụng các từ "mạnh" và "yếu" theo cùng một cách. Vì vậy, tránh chúng.


31
(+1) cho đề xuất của bạn để tránh các thuật ngữ "mạnh" và "yếu".
Nico

1
Đồng ý, chỉ đọc qua cuốn sách của Jon Skeet, và đây là phản hồi tương tự được ghi nhận ở đó.
Bennett Yeates

Theo như tôi biết, Java cũng có những sơ hở này, nhưng nó vẫn được coi là một ngôn ngữ được đánh máy mạnh mẽ, vì vậy tôi đoán điều này sẽ giúp ích nhiều hơn cho lời khuyên của bạn về việc tránh các thuật ngữ "mạnh" và "yếu".
doubleOrt

74

Đơn giản chỉ cần đặt nó theo cách này: trong một ngôn ngữtĩnh , loại là tĩnh , nghĩa là một khi bạn đặt biến thành một loại, bạn KHÔNG THỂ thay đổi nó. Đó là bởi vì gõ được liên kết với biến chứ không phải giá trị mà nó đề cập đến.

Ví dụ trong Java:

String str = "Hello";  //statically typed as string
str = 5;               //would throw an error since java is statically typed

Trong khi trong một ngôn ngữ được gõ động , kiểu này là động , nghĩa là sau khi bạn đặt biến thành một loại, bạn CÓ THỂ thay đổi nó. Đó là bởi vì gõ được liên kết với giá trị chứ không phải là biến.

Ví dụ trong Python:

str = "Hello" # it is a string
str = 5       # now it is an integer; perfectly OK

Mặt khác, việc gõ mạnh / yếu trong một ngôn ngữ có liên quan đến chuyển đổi kiểu ngầm định (một phần được lấy từ câu trả lời của @ Dario):

Ví dụ trong Python:

str = 5 + "hello" 
# would throw an error since it does not want to cast one type to the other implicitly. 

trong khi đó trong PHP:

$str = 5 + "hello"; // equals 5 because "hello" is implicitly casted to 0 
// PHP is weakly typed, thus is a very forgiving language.

Gõ tĩnh cho phép kiểm tra tính chính xác của kiểu tại thời gian biên dịch. Các ngôn ngữ gõ tĩnh thường được biên dịch và các ngôn ngữ gõ động được diễn giải. Do đó, các ngôn ngữ được gõ động có thể kiểm tra gõ khi chạy.


2
câu trả lời tuyệt vời, và danh tiếng cho việc sử dụng các ví dụ cụ thể.
Julian A.

3
Đây là lý do tại sao PHP cần được sử dụng hết sức cẩn thận.
Ali Gajani

1
Các ví dụ ngôn ngữ thực sự hữu ích. Nhiều đánh giá cao.
J Mullen

Theo nghĩa này, Java sẽ được gõ hơi yếu vì bạn có thể nối các chuỗi không có chuỗi và vì tự động mở hộp / đấm bốc?
Stephen Paul

1
@StephenPaul bạn đúng câu trả lời của tôi có thể được hiểu theo cách đó, và đó không phải là trường hợp. Tôi đã sử dụng phép nối vì mục đích đơn giản, nhưng trên thực tế, tính mạnh / yếu là về việc chuyển đổi kiểu ngầm định của chính biến đó.
mehmet

20

Gõ yếu có nghĩa là loại đối tượng có thể thay đổi tùy theo ngữ cảnh. Ví dụ, trong một ngôn ngữ được gõ yếu, chuỗi "123" có thể được coi là số 123 nếu bạn thêm một số khác vào đó. Ví dụ về các ngôn ngữ có kiểu gõ yếu là bash, awk và PHP.

Một loại ngôn ngữ được gõ yếu là C, trong đó dữ liệu tại một địa chỉ bộ nhớ có thể được coi là một loại khác bằng cách truyền.

Trong một ngôn ngữ được gõ mạnh, loại đối tượng không thay đổi - một int luôn là một int và cố gắng sử dụng nó như một chuỗi sẽ dẫn đến một lỗi. Cả Java và Python đều được gõ mạnh.

Sự khác biệt giữa gõ động và gõ tĩnh là khi các quy tắc loại được thi hành. Trong một ngôn ngữ gõ tĩnh, loại của mọi biến và tham số phải được khai báo trong nguồn và được thi hành tại thời điểm biên dịch. Trong một ngôn ngữ được gõ động, các loại chỉ được kiểm tra khi chúng được sử dụng trong thời gian chạy. Vì vậy, Java được gõ tĩnh và Python được gõ động.

Tuy nhiên, ranh giới đôi khi có thể hơi mờ. Ví dụ: mặc dù Java được gõ tĩnh, mỗi khi bạn sử dụng phản chiếu hoặc ép kiểu (ví dụ: khi sử dụng các thùng chứa Đối tượng), bạn sẽ trì hoãn việc kiểm tra kiểu cho thời gian chạy.

Tương tự, hầu hết các ngôn ngữ được gõ mạnh sẽ vẫn tự động chuyển đổi giữa số nguyên và số float (và trong một số ngôn ngữ, BigInts có độ chính xác cao).


1
Tôi không thể đồng ý với câu này -. "Trong ngôn ngữ được nhập tĩnh, loại của mọi biến và tham số phải được khai báo trong nguồn" - trong SML, các loại biến không phải khai báo (bao giờ chúng được kiểm tra). Hãy nói rằng hàm flấy tham số x( fun f(x)) [** vì vậy không có loại nào được khai báo **] và phần thân của hàm là x+1. Không có loại trình biên dịch khai báo sẽ chỉ ra rằng xphải là một int. - fun f x = x + 1; val f = fn : int -> int
Filip Bartuzi

Về C, truyền không phải là chống gõ mạnh, nhưng C cho phép thêm các loại khác nhau mà không cần truyền quá, ví dụ:5 + 'c' // OK
mehmet

3
@mehmet: trong C, các giá trị ký tự nằm trong miền số nguyên, do đó, ví dụ cụ thể đó không vi phạm an toàn loại. 'c' chỉ là cú pháp cú pháp cho 99. C không có loại ký tự chuyên dụng.
Peter Lewerin

Peter Lewerin: đúng tôi nên đã đưa ra một ví dụ tốt hơn. Thật không may, đã gần 20 năm kể từ khi tôi không chạm vào C :)
mehmet

1
C không phải là một ngôn ngữ đánh máy yếu . Chỉ là Java, C #, v.v. là những ngôn ngữ được gõ mạnh hơn so với C. Đọc thêm ở đây - en.wikipedia.org/wiki/Strong_and_weak_typing Nếu bạn kiểm tra định nghĩa của ngôn ngữ được gõ "yếu" thì ngôn ngữ được gõ "yếu" là những loại mà bạn có thể thực hiện bất kỳ loại chuyển đổi nào, ví dụ như một int có thể được "ngầm định" chuyển đổi hoặc chuyển thành một chuỗi, bây giờ hãy tự nghĩ rằng liệu điều này có khả thi trong C hay không?
hagrawal

15

Hôm nay nghiên cứu về chủ đề này tôi đã xem qua bài viết tuyệt vời này http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html Nó xoá sổ nhiều những điều cho tôi và tôi nghĩ rằng nó có thể thêm vào một số câu trả lời tuyệt vời ở trên.

Gõ mạnh và yếu:

Có lẽ các hệ thống loại phổ biến nhất được phân loại là "mạnh" hoặc "yếu". Điều này thật đáng tiếc, vì những từ này gần như không có ý nghĩa gì cả. Ở một mức độ hạn chế, có thể so sánh hai ngôn ngữ với các hệ thống loại rất giống nhau và chỉ định một ngôn ngữ có sức mạnh hơn trong hai hệ thống đó. Ngoài ra, những từ này không có nghĩa gì cả.

Các loại tĩnh và động

Đây là gần như phân loại phổ biến duy nhất của các hệ thống loại có ý nghĩa thực sự. Như một vấn đề thực tế, tầm quan trọng của nó thường được ước tính thấp [...] Các hệ thống kiểu động và tĩnh là hai thứ hoàn toàn khác nhau, có mục tiêu xảy ra chồng chéo một phần.

Hệ thống kiểu tĩnh là một cơ chế trong đó trình biên dịch kiểm tra mã nguồn và gán nhãn (được gọi là "loại") cho các phần của cú pháp, sau đó sử dụng chúng để suy luận điều gì đó về hành vi của chương trình. Hệ thống kiểu động là một cơ chế trong đó trình biên dịch tạo mã để theo dõi loại dữ liệu (ngẫu nhiên, còn được gọi là "loại") được sử dụng bởi chương trình. Tất nhiên, việc sử dụng cùng một từ "loại" trong hai hệ thống này không thực sự hoàn toàn ngẫu nhiên; nhưng nó được hiểu tốt nhất là có một loại ý nghĩa lịch sử yếu. Sự nhầm lẫn lớn là kết quả của việc cố gắng tìm một thế giới quan trong đó "loại" thực sự có nghĩa là điều tương tự trong cả hai hệ thống. Nó không.

Các loại rõ ràng / tiềm ẩn:

Khi các thuật ngữ này được sử dụng, chúng đề cập đến mức độ mà trình biên dịch sẽ lý giải về các loại phần tĩnh của chương trình. Tất cả các ngôn ngữ lập trình có một số hình thức lý luận về các loại. Một số có nhiều hơn những người khác. ML và Haskell có các kiểu ẩn, trong đó không cần (hoặc rất ít, tùy thuộc vào ngôn ngữ và các phần mở rộng được sử dụng) là cần thiết. Java và Ada có các loại rất rõ ràng và người ta liên tục tuyên bố các loại sự vật. Tất cả những điều trên có (tương đối, so với C và C ++ chẳng hạn) các hệ thống kiểu tĩnh mạnh.


8

Từ ngôn ngữ lập trình thực dụng của Scott , ấn bản thứ 3 trang 291, chúng tôi có

Kiểm tra kiểu là quá trình đảm bảo rằng chương trình tuân theo quy tắc tương thích loại ngôn ngữ. Vi phạm các quy tắc được gọi là một cuộc đụng độ loại. Một ngôn ngữ được cho là được gõ mạnh nếu nó cấm, theo cách mà việc thực thi ngôn ngữ có thể thực thi, việc áp dụng bất kỳ hoạt động nào cho bất kỳ đối tượng nào không nhằm hỗ trợ hoạt động đó. Một ngôn ngữ được cho là gõ tĩnh nếu nó được gõ mạnh và kiểm tra kiểu có thể được thực hiện tại thời điểm biên dịch. Theo nghĩa chặt chẽ nhất của thuật ngữ này, rất ít ngôn ngữ được gõ tĩnh. Trong thực tế, thuật ngữ thường được áp dụng cho các ngôn ngữ trong đó hầu hết việc kiểm tra loại có thể được thực hiện tại thời gian biên dịch và phần còn lại có thể được thực hiện trong thời gian chạy.

Một vài ví dụ: Ada được gõ mạnh và đối với hầu hết các phần được nhập tĩnh (các ràng buộc loại nhất định phải được kiểm tra trong thời gian chạy). Việc triển khai Pascal cũng có thể thực hiện hầu hết việc kiểm tra kiểu của nó tại thời điểm biên dịch, mặc dù ngôn ngữ không được gõ mạnh: các bản ghi biến thể không được đánh dấu (sẽ được thảo luận trong Phần 7.3.4) là lỗ hổng duy nhất của nó. C89 được gõ mạnh hơn đáng kể so với phương ngữ tiền nhiệm, nhưng vẫn gõ mạnh hơn đáng kể so với Pascal. Các lỗ hổng của nó bao gồm các hiệp hội, chương trình con với số lượng tham số biến đổi và khả năng tương tác của các con trỏ và mảng (sẽ được thảo luận trong Phần 7.7.1). Việc triển khai C hiếm khi kiểm tra bất cứ điều gì trong thời gian chạy.

Kiểm tra loại động (thời gian chạy) là một hình thức ràng buộc muộn và có xu hướng được tìm thấy trong các ngôn ngữ làm trì hoãn các vấn đề khác cho đến thời gian chạy. Lisp và Smalltalk được gõ động (mặc dù mạnh). Hầu hết các ngôn ngữ script cũng được gõ động; một số (ví dụ, Python và Ruby) được gõ mạnh. Các ngôn ngữ có phạm vi động thường được gõ động (hoặc hoàn toàn không được gõ): nếu trình biên dịch không thể xác định đối tượng mà tên gọi, nó thường không thể xác định loại đối tượng.

Vì vậy, trong các thuật ngữ đơn giản, gõ tĩnh / động đề cập đến thời gian khi kiểm tra kiểu xảy ra: biên dịch thời gian để gõ tĩnh và thời gian chạy cho các ngôn ngữ động. Tương tự, gõ mạnh / yếu đề cập đến mức độ mạnh mẽ của một ngôn ngữ trong việc thực thi hệ thống loại của nó.

Tôi đã cố gắng dịch mô tả của Scott thành một sơ đồ đẹp, mà tôi đã đăng dưới đây.

Mặt phẳng gõ tĩnh / động - mạnh / yếu


5

Tôi nghĩ rằng các đồng nghiệp khác đã làm một công việc tốt. giải thích sự khác biệt giữa gõ tĩnh và động. Nhưng khi có liên quan đến việc đánh máy mạnh và yếu, cần phải nói rằng có những cách hiểu / quan điểm khác nhau.

Dưới đây là hai ví dụ:

  • Một số người nói rằng Haskell được gõ mạnh, bởi vì bạn không được phép thực hiện bất kỳ chuyển đổi loại nào .

  • Những người khác (ví dụ, quan điểm của Dario) nói rằng một ngôn ngữ cho phép chuyển đổi hoàn toàn từ chuỗi sang số theo mục đích được đánh máy yếu, nhưng thậm chí những người khác gọi đây chỉ là gõ vịt.

Cả hai tuyên bố nêu bật không phải các thái cực đối lập của một hệ thống loại, nhưng các khía cạnh hoàn toàn khác nhau. Vì vậy, tôi tham gia quan điểm của ông Ramsey không sử dụng thuật ngữ "mạnh" và "yếu" để phân biệt giữa các hệ thống loại.


5

Các ngôn ngữ gõ động v / s tĩnh

  • Các ngôn ngữ được nhập tĩnh là những ngôn ngữ kiểm tra kiểu được thực hiện tại thời điểm biên dịch, do đó, điều này cũng có nghĩa là trong các ngôn ngữ được nhập tĩnh, mỗi biến có một loại và nó không thay đổi trong khóa học. Bây giờ, ngược lại, các ngôn ngữ được gõ động là những ngôn ngữ kiểm tra kiểu được thực hiện trong thời gian chạy và không có kiểm tra kiểu nào trong thời gian biên dịch, do đó, điều này cũng có nghĩa là trong các ngôn ngữ được gõ động có thể có hoặc không có loại được liên kết với một biến và nếu một loại được liên kết thì nó có thể là một loại chung chung như kiểu var var trong JS, nó giữ tốt cho cả chuỗi và số.
    • Các triển khai của các ngôn ngữ được kiểm tra kiểu động thường liên kết từng đối tượng thời gian chạy với thẻ loại (nghĩa là tham chiếu đến một loại) có chứa thông tin loại của nó. Thông tin loại thời gian chạy này (RTTI) cũng có thể được sử dụng để triển khai công văn động, liên kết muộn, truyền xuống, phản chiếu và các tính năng tương tự.
  • Ngay cả khi ngôn ngữ được gõ tĩnh, nó vẫn có thể có một số tính năng được gõ động, về cơ bản có nghĩa là một số loại kiểm tra khi chạy. Điều này rất hữu ích trong việc đúc các loại.
    • Một số tính năng ngôn ngữ lập trình phổ biến và hữu ích không thể được kiểm tra tĩnh, chẳng hạn như truyền xuống. Do đó, nhiều ngôn ngữ sẽ có cả kiểu kiểm tra tĩnh và động; trình kiểm tra kiểu tĩnh xác minh những gì có thể và kiểm tra động xác minh phần còn lại.
  • Một số ngôn ngữ cho phép viết mã không an toàn. Ví dụ, trong C, lập trình viên có thể tự do đưa ra một giá trị giữa bất kỳ hai loại nào có cùng kích thước.
  • Ưu điểm của ngôn ngữ gõ tĩnh của động cơ gõ là:
    • Vì hầu hết việc kiểm tra loại được thực hiện tại thời gian biên dịch nên trình thông dịch hoặc thời gian chạy có thể chạy ở tốc độ tối đa, mà không phải lo lắng về các loại.
    • Nó dẫn đến số lượng ngoại lệ thời gian chạy ít hơn hoặc các lỗi liên quan đến kiểu, bởi vì hầu hết việc kiểm tra kiểu được thực hiện tại thời gian biên dịch.
  • Ưu điểm của các ngôn ngữ gõ động của động cơ học là:
    • Họ có thể giúp tạo mẫu cực nhanh, vì nhà phát triển không cần phải hiểu hệ thống loại nên dev có thể tạo ra các biến và chạy nó một cách lỏng lẻo, và điều này dẫn đến việc tạo mẫu rất nhanh.
  • Danh sách các ngôn ngữ gõ tĩnh và động :
    • Tĩnh:
      • Java
      • C (C là một ngôn ngữ được gõ tĩnh nhưng ít mạnh hơn, gõ mạnh hơn so với Java vì nó cho phép nhiều chuyển đổi ngầm hơn)
      • C ++
      • C #
    • Động:
      • PERL
      • PHP
      • Con trăn
      • JavaScript
      • Hồng ngọc
  • Kiểm tra loại là một tính năng bảo mật quan trọng. Giả sử, không có kiểm tra loại và một phương thức chấp nhận một đối tượng thuộc loại Ngân hàng BankAccount, có một phương thức gọi là Hồi tín dụngAccount (BankAccountDetails), bây giờ trong thời gian chạy nếu không có kiểm tra loại thì tôi có thể vượt qua một đối tượng của riêng mình lớp có cùng phương thức Tín dụngAccount (BankAccountDetails) và nó sẽ được thực thi, xem xét chúng ta đang nói về ngôn ngữ hướng đối tượng vì OOP hỗ trợ đa hình hóa và ở đây những gì chúng ta đang thảo luận không gì khác ngoài tính đa hình hóa. Vì vậy, về cơ bản, một ngôn ngữ hướng đối tượng (về cơ bản có nghĩa là nó hỗ trợ đa hình hóa), không kiểm tra kiểu mạnh có thể dẫn đến các vấn đề bảo mật.

Ngôn ngữ gõ mạnh v / s

  • Các ngôn ngữ được gõ mạnh là những ngôn ngữ không được phép chuyển đổi ngầm định nếu mất độ chính xác. Ví dụ, trong Java, bạn có thể chuyển một dữ liệu int sang long vì không có sự mất độ chính xác nhưng bạn không thể bỏ qua một cách ngầm định một cách lâu dài để chuyển đổi thành một trò chơi vì sẽ mất độ chính xác. Ngược lại, trong các ngôn ngữ được gõ yếu, chuyển đổi ngầm được cho phép ngay cả khi mất độ chính xác.
  • Tôi nghĩ rằng ngôn ngữ được gõ động cũng có thể là ngôn ngữ được gõ mạnh nếu trong thời gian chạy, nó không cho phép chuyển đổi ngầm trong đó có sự mất chính xác.

Tốt đọc thêm


bạn đã trích dẫn "bây giờ trong thời gian chạy nếu không có kiểm tra kiểu thì tôi có thể vượt qua một đối tượng của lớp mình có cùng phương thức. sau đó cách kiểm tra kiểu sẽ ngăn bạn gọi phương thức đó trong trường hợp ngôn ngữ được nhập tĩnh?
Aseem Yadav

@AseemYadav Ý của bạn là gì khi "* nếu bạn đã vượt qua cơ chế có thể chặn bạn vượt qua một đối tượng *"?
hagrawal

như bạn đã đề cập, đây là một tính năng bảo mật quan trọng và bạn cũng có thể vượt qua một đối tượng của lớp mình bằng cùng một phương thức, do đó, nó ám chỉ với tôi rằng nó dường như chỉ là một lỗ hổng khi bạn cố xâm nhập vào mã của người khác và nếu bạn đang nói trong ngữ cảnh của mã thuộc về bạn hơn là vấn đề về hiệu năng so với vấn đề liên quan đến bảo mật, phải không?
Aseem Yadav

Không có khía cạnh hiệu suất của nó, bạn phải nhìn thấy nó từ bối cảnh đa hình thì bạn sẽ có thể hiểu khía cạnh bảo mật của nó, tôi đã đề cập đến điều này trong cùng một đoạn.
hagrawal

1

Các ngôn ngữ được nhập tĩnh thường yêu cầu bạn khai báo các loại biến, sau đó được kiểm tra tại thời điểm biên dịch để giảm lỗi. Từ "tĩnh" trong "gõ tĩnh" dùng để chỉ "phân tích mã tĩnh", đây là quá trình kiểm tra mã trước khi thực thi nó. Mặc dù ngôn ngữ gõ tĩnh có thể suy ra loại biến từ phía bên phải của biểu thức hoặc tham số thực tế, trong thực tế, hầu hết các ngôn ngữ gõ tĩnh yêu cầu các loại biến phải được khai báo rõ ràng.

Các ngôn ngữ được gõ động thường không yêu cầu khai báo biến phải có loại và chúng suy ra các loại biến dựa trên loại được tính như là kết quả của việc đánh giá phía bên phải của mỗi câu lệnh gán hoặc tham số thực cho lệnh gọi hàm. Vì biến có thể được gán nhiều lần trong suốt vòng đời của nó, nên loại của nó có thể thay đổi theo thời gian và đây là lý do tại sao nó được gọi là "gõ động". Ngoài ra, môi trường thời gian chạy cần theo dõi loại hiện tại cho mỗi biến, vì vậy loại này được liên kết với giá trị hơn là với khai báo biến. Đây có thể được coi là một hệ thống thông tin loại thời gian chạy (RTTI).

Các yếu tố của ngôn ngữ gõ tĩnh và động có thể được kết hợp. Ví dụ, C # hỗ trợ cả các biến được nhập tĩnh và động và các ngôn ngữ hướng đối tượng thường hỗ trợ phân cấp kiểu truyền xuống. Các ngôn ngữ được nhập tĩnh thường cung cấp nhiều cách khác nhau để bỏ qua việc kiểm tra kiểu, ví dụ bằng cách sử dụng phép truyền, phản xạ và gọi động.

Nhập mạnh so với gõ yếu đề cập đến sự liên tục về mức độ ngôn ngữ cố gắng ngăn chặn lỗi do sử dụng một biến như thể nó là một loại khi thực tế nó là một loại khác. Ví dụ, cả C và Java đều là các ngôn ngữ được nhập tĩnh, tuy nhiên Java sử dụng kiểm tra kiểu mạnh hơn nhiều so với C. Mã C sau đây rất vui khi biên dịch và chạy và sẽ đặt một giá trị ngẫu nhiên vào biến b khi chạy, rất có thể gây ra một bọ cánh cứng:

char *a = "123";
int b = (int)a;

Mã Java tương đương sẽ tạo ra một lỗi biên dịch, thường được ưu tiên hơn:

String a = "123"
int b = (int)a;
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.