it-swarm-vi.com

Những tranh luận có lợi cho việc gõ yếu?

Đ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?

41
Fishtoaster

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ó nghĩa nào trong số chúng có ý nghĩa, nhưng đó là những định nghĩa tôi đã thấy người thực sự sử dụng):

  • gõ yếu = gõ không an toàn/gõ mạnh = gõ an toàn
  • gõ yếu = gõ động/gõ mạnh = gõ tĩnh
  • gõ yếu = gõ vịt/gõ mạnh = gõ danh nghĩa
  • gõ yếu = gõ cấu trúc/gõ mạnh = gõ danh nghĩa
  • gõ yếu = gõ ngầm/gõ mạnh = gõ rõ ràng
  • gõ yếu = gõ tiềm ẩn/gõ mạnh = gõ biểu hiện
  • gõ yếu = không gõ/gõ mạnh = gõ
  • gõ yếu = phôi ẩn/gõ mạnh = chỉ phôi rõ ràng
  • gõ yếu = phôi ngầm hoặc rõ ràng/gõ mạnh = không có phôi nào cả
  • gõ yếu = chuyển đổi ngầm định/gõ mạnh = chỉ chuyển đổi rõ ràng
  • gõ yếu = chuyển đổi ngầm định hoặc rõ ràng/gõ mạnh = không có chuyển đổi nào cả
  • gõ yếu = giải thích/gõ mạnh = biên dịch
  • gõ yếu = chậm/gõ mạnh = nhanh
  • gõ yếu = thu gom rác/gõ mạnh = quản lý bộ nhớ thủ công
  • gõ yếu = quản lý bộ nhớ thủ công/gõ mạnh = thu gom rác
  • Giáo dục và nhiều người khác

Ba định nghĩa dường như được sử dụng hầu hết , tuy nhiên, là

  • gõ yếu = ngôn ngữ lập trình ngu ngốc của bạn/gõ mạnh = ngôn ngữ lập trình siêu tuyệt vời của tôi
  • gõ yếu = mọi ngôn ngữ lập trình khác/gõ mạnh = ngôn ngữ lập trình duy nhất tôi từng học (thường là Java, C # hoặc C++; lạ thay, những người học ví dụ như Haskell hoặc Scheme là ngôn ngữ đầu tiên và duy nhất của họ dường như không chia sẻ thế giới quan này)
  • gõ yếu = mọi ngôn ngữ tôi không hiểu/gõ mạnh = Java (thay thế bằng C # hoặc C++ tùy ý)

Trừ khi mọi người đồng ý về định nghĩa "gõ yếu" thậm chí là gì , thậm chí không có ý nghĩa gì khi nghĩ về lợi thế của nó. Ư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 để phá hủy vào một cái sáo.

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.

46
Jörg W Mittag

Hãy nhớ rằng có hai khái niệm chính thường bị nhầm lẫn:

Gõ động

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õ lỏng hoặc yếu

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.

Những lợi ích:

  • Truyền bất kỳ giá trị loại nào dưới dạng tham số cho hàm . Hữu ích cho các cuộc gọi lại, API linh hoạt và giúp cho việc thực hiện các bao đóng đơn giản hơn.
  • Đá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 || 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 giữa chừng, với lệnh gọi ngầm đến .toString() khi kết hợp các đối tượng với một String; nếu không Java = lập trình viên sẽ chửi rủa nó suốt cả ngày (báo cáo nhật ký 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ể.

25
Nicole

Đối số chính for gõ yếu là một trong những 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ân vân.

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ể sử dụng char * đến 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 hội, 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 sử dụng hoặc vượt qua void * 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à hội), bạn có thể thực hiện một số tính toán khá thú vị dựa trên địa chỉ trong void * để có được 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.

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.

7
Berin Loritsch

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 so với kiểm tra mạnh

2
Homde