Tại sao các ngôn ngữ gõ yếu vẫn đang được tích cực phát triển?


17

Tôi tự hỏi tại sao các ngôn ngữ gõ yếu vẫn đang được tích cực phát triển. Ví dụ, lợi ích gì người ta có thể rút ra từ việc có thể viết

$someVar = 1;
(...)  // Some piece of code
$someVar = 'SomeText';

thay vì sử dụng phiên bản gõ mạnh mẽ khác nhau

int someInt = 1;
(...)
string SomeString = 'SomeText';

Đúng là bạn cần khai báo một biến số quảng cáo trong ví dụ thứ hai, nhưng điều đó có thực sự gây tổn thương không? Không phải tất cả các ngôn ngữ đều cố gắng để được gõ mạnh vì nó thực thi an toàn kiểu vào thời gian biên dịch, do đó tránh được một số cạm bẫy trong việc tạo kiểu?


9
"Gõ mạnh" không phải là một thuật ngữ được xác định rõ. Chủ yếu nó có nghĩa là "bạn không thể lật đổ hệ thống loại". Nó trực giao với những gì bạn mô tả ở trên có thể là tiềm ẩn so với gõ biểu hiện hoặc gõ tĩnh so với gõ động.
Frank Shearar

10
Tôi còn thiếu điều gì khi chuyển câu hỏi này từ mồi lửa với một số câu hỏi liên quan chặt chẽ, thậm chí có thể trùng lặp (chỉ cần tìm kiếm SackOverflow cho các câu hỏi đề cập đến việc gõ tĩnh và động trong thẻ của họ) sang câu hỏi hợp pháp?

1
Có những ưu điểm và nhược điểm đối với cả ngôn ngữ được gõ tĩnh và gõ động. Các ngôn ngữ được gõ tự động cho vay để phát triển hoặc tạo mẫu nhanh chóng (do đó lý do "ngôn ngữ kịch bản" thường được gõ động), trong khi các ngôn ngữ được gõ tĩnh (có thể được cho là) ​​dễ duy trì và mở rộng hơn khi chúng phát triển thành các dự án lớn, phức tạp.
Charles Salvia

6
Ví dụ đầu tiên hơi giống Python trong đó các biến không có kiểu khai báo. Tuy nhiên, Python là một ngôn ngữ được gõ rất mạnh bởi vì các đối tượng - bản thân chúng - có một loại gần như không thể thay đổi hoặc ép buộc. Tôi nghĩ rằng việc sử dụng sai thuật ngữ làm cho câu hỏi này rất khó trả lời.
S.Lott

1
@delnan Thực tế là câu hỏi này có hai câu trả lời hợp lý và không tham gia vào một cuộc chiến rực lửa.
Adam Lear

Câu trả lời:


25

Gõ mạnh / yếu và gõ tĩnh / động là trực giao.

Mạnh / yếu là về loại giá trị có quan trọng hay không, nói theo chức năng. Trong một ngôn ngữ được gõ yếu, bạn có thể lấy hai chuỗi xảy ra để điền vào các chữ số và thực hiện phép cộng số nguyên trên chúng; trong một ngôn ngữ được gõ mạnh, đây là một lỗi (trừ khi bạn bỏ hoặc chuyển đổi các giá trị thành các loại chính xác trước). Gõ mạnh / yếu không phải là một điều đen trắng; hầu hết các ngôn ngữ không nghiêm ngặt 100% cũng không yếu 100%.

Gõ tĩnh / động là về việc các loại liên kết với các giá trị hoặc với các định danh. Trong một ngôn ngữ được gõ động, bạn có thể gán bất kỳ giá trị nào cho bất kỳ biến nào, bất kể loại nào; gõ tĩnh định nghĩa một loại cho mỗi mã định danh và việc gán từ một loại khác là lỗi hoặc dẫn đến kết quả là ẩn. Một số ngôn ngữ có cách tiếp cận hỗn hợp, cho phép các loại khai báo tĩnh cũng như các định danh chưa được đánh dấu ('biến thể'). Ngoài ra còn có kiểu suy luận, một cơ chế có thể gõ tĩnh mà không cần khai báo rõ ràng loại của mọi thứ, bằng cách trình biên dịch tìm ra các loại (Haskell sử dụng rộng rãi, C # hiển thị nó thông qua vartừ khóa).

Lập trình năng động yếu cho phép một cách tiếp cận thực tế; ngôn ngữ không cản trở bạn trong hầu hết thời gian, nhưng nó sẽ không bước vào khi bạn tự bắn vào chân mình. Ngược lại, gõ tĩnh mạnh, thúc đẩy lập trình viên thể hiện những kỳ vọng nhất định về các giá trị rõ ràng trong mã, theo cách cho phép trình biên dịch hoặc trình thông dịch phát hiện một lớp lỗi. Với một hệ thống loại tốt, một lập trình viên có thể xác định chính xác những gì có thể và không thể thực hiện đối với một giá trị, và nếu, một cách tình cờ, ai đó cố gắng đôi khi không mong muốn, hệ thống loại thường có thể ngăn chặn nó và hiển thị chính xác nơi và tại sao mọi thứ lại sai.


Trong một ngôn ngữ được gõ yếu như HyperTalk với các toán tử riêng biệt để nối và thêm chuỗi (ví dụ: giả sử &để nối), các thao tác như "12"+3hoặc 45 & "6"không có sự mơ hồ (lần lượt tính toán 15 và "456"). Trong một ngôn ngữ được gõ mạnh hơn, toán tử "+" có thể bị quá tải một cách an toàn cho cả nối chuỗi và bổ sung số mà không gây ra sự mơ hồ vì các thao tác trên chuỗi và số sẽ bị cấm. Các vấn đề phát sinh khi ngôn ngữ chỉ định đóng đinh xuống các loại cũng như các hoạt động được thực hiện.
supercat

4

Gõ yếu là nhiều hơn dọc theo dòng 1 == "TRUE". Phần này trên wikipedia minh họa độc đáo sự khác biệt.

Xin lưu ý rằng không có ví dụ nào từ wikipedia được gõ tĩnh, đó là những gì bạn đề cập đến trong ví dụ thứ hai của mình.

Vì vậy, nếu câu hỏi là, tại sao mọi người sử dụng các ngôn ngữ được gõ động, thì câu trả lời là: các hệ thống kiểu tĩnh đặt giới hạn cho bạn. Nhiều người chỉ đơn giản là chưa bao giờ làm việc với một hệ thống kiểu tĩnh biểu cảm, điều này dẫn đến kết luận rằng những nhược điểm của việc gõ tĩnh vượt trội hơn lợi ích.


0

Các ngôn ngữ loại yếu vẫn đang được phát triển vì mọi người sử dụng chúng và thích chúng. Nếu bạn không thích gõ yếu, đừng sử dụng các ngôn ngữ được gõ yếu. Tuyên bố rằng một cái gì đó là Một cách chân thực và Mọi người nên làm Điều đó Một cách chân thực bỏ qua sự phức tạp của thế giới.


0

Không phải tất cả các ngôn ngữ đều cố gắng để được gõ mạnh vì nó thực thi an toàn kiểu vào thời gian biên dịch, do đó tránh được một số cạm bẫy trong việc tạo kiểu?

Không cần thiết. Mục tiêu học tập-C: Một Primer giải quyết câu hỏi trực tiếp trong ngữ cảnh của Objective-C:

Các biến được gõ yếu được sử dụng thường xuyên cho những thứ như các lớp bộ sưu tập, trong đó loại chính xác của các đối tượng trong một bộ sưu tập có thể không xác định. Nếu bạn đã quen với việc sử dụng các ngôn ngữ được gõ mạnh, bạn có thể nghĩ rằng việc sử dụng các biến được gõ yếu sẽ gây ra vấn đề, nhưng chúng thực sự mang lại sự linh hoạt to lớn và cho phép sự năng động hơn nhiều trong các chương trình Objective-C.

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.