Điều này xuất hiện trong một cuộc thảo luận với một người bạn và tôi thấy mình thật khó khăn để nghĩ ra bất kỳ lý lẽ tốt nào. Những lợi ích nào khi gõ yếu confer?
Điều này xuất hiện trong một cuộc thảo luận với một người bạn và tôi thấy mình thật khó khăn để nghĩ ra bất kỳ lý lẽ tốt nào. Những lợi ích nào khi gõ yếu confer?
Câu trả lời:
Vấn đề với loại thảo luận này chỉ đơn giản là các thuật ngữ "gõ yếu" và "gõ mạnh" không được xác định, không giống như các thuật ngữ "gõ tĩnh", "gõ động", "gõ rõ ràng", "gõ ngầm", "gõ" gõ vịt "," gõ cấu trúc "hoặc" gõ danh nghĩa ". Heck, ngay cả các thuật ngữ "gõ biểu hiện" và "gõ tiềm ẩn", vẫn là các lĩnh vực nghiên cứu và thảo luận mở có lẽ được xác định tốt hơn.
Vì vậy, cho đến khi bạn của bạn cung cấp định nghĩa về thuật ngữ "gõ yếu" đủ ổn định để làm cơ sở cho một cuộc thảo luận, thậm chí không có ý nghĩa gì để trả lời câu hỏi này.
Thật không may, ngoài câu trả lời của Nick , không ai trong số những người trả lời bận tâm đưa ra định nghĩa của họ, và bạn có thể thấy sự nhầm lẫn tạo ra trong một số ý kiến. Thật khó để nói, vì không ai thực sự cung cấp định nghĩa của họ, nhưng tôi nghĩ rằng tôi đếm ít nhất ba cái khác nhau, chỉ trên chính trang này.
Một số định nghĩa được sử dụng phổ biến hơn là (và vâng, tôi biết rằng hầu như không có định nghĩa nào trong số chúng có ý nghĩa, nhưng đó là những định nghĩa tôi thấy mọi người thực sự sử dụng):
Tuy nhiên, ba định nghĩa dường như được sử dụng rộng rãi nhất là
Trừ khi tất cả mọi người đồng ý về một định nghĩa về "gõ yếu" là gì , thậm chí không có ý nghĩa gì để nghĩ về những lợi thế của nó có thể là gì. Ưu điểm của cái gì? Thậm chí tệ hơn, nếu không có định nghĩa nào cả , thì mọi người chỉ có thể thay đổi định nghĩa của mình để phù hợp với lập luận của họ, và mọi cuộc thảo luận đều được đảm bảo khá nhiều để biến thành một flamewar.
Bản thân tôi đã tự thay đổi định nghĩa của mình nhiều lần trong nhiều năm và giờ đã đạt đến mức tôi thậm chí không còn xem xét các điều khoản hữu ích nữa. Tôi cũng từng nghĩ rằng việc gõ yếu (theo nhiều định nghĩa khác nhau) có một vị trí trong kịch bản shell, nhưng bất cứ khi nào tôi phải giải quyết vấn đề tương tự trong Bash và PowerShell, tôi đau đớn nhắc nhở rằng tôi đã sai như thế nào.
Hãy nhớ rằng có hai khái niệm chính thường bị nhầm lẫn:
Một ngôn ngữ lập trình được cho là được gõ động khi phần lớn việc kiểm tra kiểu của nó được thực hiện trong thời gian chạy trái ngược với thời gian biên dịch. Trong kiểu gõ động, các giá trị có kiểu nhưng biến không; có nghĩa là, một biến có thể tham chiếu đến một giá trị của bất kỳ loại nào.
Những ưu điểm ở đây thường bị loại bỏ chỉ dành cho các lập trình viên "mới", nhưng cũng có thể thuận tiện cho bất kỳ lập trình viên nào:
if (!(arr is Array)) arr = [arr]; // is, instanceof, .constructor ==, whatever
Ít mã hơn trong mọi trường hợp nếu bạn phải truyền hoặc gán giá trị mới:
if (data is Array)) {
i = data.length; // no i = ((Array)data).length or Array myArr=(Array)data;
}
Gõ yếu có nghĩa là một ngôn ngữ ngầm chuyển đổi các loại (hoặc phôi) khi sử dụng.
Lợi ích:
Đánh giá boolean tiềm ẩn . Bất kỳ loại có thể được đánh giá là một boolean. Điều này cũng có các lợi ích phụ như một phần của một ||
có thể được sử dụng trong chuyển nhượng mà không cần chuyển đổi sang boolean:
var a = param || defaultValue;
Một lần nữa, ít mã hơn:
var num = 5;
var str = "Hello";
input.innerHTML = input.value = num;
for (var i=0; i < input.value; i++) { ... }
Ngay cả Java cũng phải đi một phần, với lời gọi ngầm .toString()
khi kết hợp các đối tượng với a String
; nếu không thì các lập trình viên Java sẽ chửi rủa nó suốt cả ngày (các câu lệnh log sẽ vượt khỏi tầm kiểm soát).
Cả hai định nghĩa đều từ http://en.wikipedia.org/wiki/Type_system . Nó nói nó tốt hơn tôi có thể.
if
khối được sử dụng hay một số logic phức tạp khác (thậm chí thời gian chạy hoặc động), dòng tiếp theo sẽ hợp pháp và an toàn không có lỗi.
Đối số chính cho gõ yếu là một trong hiệu suất. (điều này là để trả lời câu hỏi OP như đã nêu). Có rất nhiều cuộc thảo luận tốt về động so với tĩnh, ẩn so với rõ ràng. v.v.
C là ngôn ngữ gõ yếu nổi tiếng nhất và nó không thực hiện bất kỳ kiểm tra thời gian chạy hoặc biên dịch kiểm tra thời gian của loại biến. Về bản chất, bạn có thể char *
chuyển sang một int *
và ngôn ngữ sẽ không quan tâm. Vậy tại sao bạn lại làm điều này?
Lập trình C khá gần với cách bạn sẽ làm mọi thứ với lắp ráp, vì vậy có những lúc bạn chỉ quan tâm đến một địa chỉ. Không có gì lạ khi bỏ hoặc chuyển một void *
tài liệu tham khảo cho chính lý do đó. Nếu bạn biết cách tổ chức bộ nhớ (lại là mối quan tâm của C và lắp ráp), bạn có thể thực hiện một số tính toán khá thú vị dựa trên địa chỉ void *
để lấy thông tin bạn cần. Điều này có thể cho phép bạn làm ngắn mạch quá trình bạn sẽ phải trải qua trong Java chẳng hạn.
Mặc dù kiểm tra loại thời gian chạy không có một chút chi phí bất thường, nhưng có những lúc nó chỉ đủ để khiến một phần quan trọng trở nên quá chậm. Tôi đang suy nghĩ chủ yếu về lập trình nhúng và hệ thống thời gian thực trong trường hợp này.
Điều đó nói rằng, trong hầu hết các trường hợp có một hệ thống loại mạnh là kiểm tra thời gian biên dịch hoặc kiểm tra thời gian chạy sẽ giúp thường xuyên hơn nó gây tổn thương.
Việc gõ yếu thường dễ dàng hơn cho người mới nắm bắt, ví dụ như trong những thứ như excel, javascript và vbscript. Bạn cũng đánh đổi một số tốc độ phát triển cho các lỗi tiềm ẩn.
Bài viết hay về chủ đề: Đánh máy mạnh vs Thử nghiệm mạnh