2013-06-12 32 views
10

Tôi đã đọc một số trang, bao gồm trang wiki http://en.wikipedia.org/wiki/Strong_and_weak_typing xử lý các ngôn ngữ được nhập mạnh và yếu. Đối với hầu hết các phần, tôi nghĩ rằng tôi hiểu sự khác biệt. Tuy nhiên, tôi muốn một câu trả lời thẳng đến điểm phân biệt hai.Sự khác biệt giữa các ngôn ngữ gõ mạnh và yếu?

Từ hiểu biết của tôi, trong ngôn ngữ được nhập sai, các kiểu dữ liệu không cần phải được gọi rõ ràng. Đây sẽ là một ngôn ngữ như Matlab, nơi bạn có thể thêm 4 và 2.3 mà không cần phải gõ. Các ngôn ngữ được gõ mạnh yêu cầu người lập trình khai báo một kiểu dữ liệu cho mỗi biến và/hoặc giá trị. Ví dụ trong C, bạn sẽ cần phải làm một cái gì đó như 4 + (int) 2.3 hoặc (float) 4 + 2.3 (không thể nhớ nếu đó là hợp lệ C loại đúc).

Bất kỳ thông tin nào mở rộng hoặc chỉnh sửa sự hiểu biết của tôi về các khái niệm này sẽ được đánh giá cao.

+0

Tôi tự hỏi, nếu câu hỏi này có thể là một phù hợp tốt hơn cho nơi nào đó như [máy tính lý thuyết Khoa học] (http://cstheory.stackexchange.com/) hoặc [Lập trình viên] (http://programmers.stackexchange.com/) ...? – summea

+0

Yea, tôi không biết phải đặt nó ở đâu. Tôi sẽ thêm nó. – Josh

+0

Trong C, hoàn toàn hợp pháp để thêm 'int' vào' float'. –

Trả lời

8

Kiểm tra blog của Eric Lippert. Có một mục về những gì bạn đang tìm kiếm here.

Từ giao diện của blog của anh ấy, các thuật ngữ đó chủ quan, vì vậy "nói chính xác hơn về các tính năng của hệ thống kiểu".

2

Như bạn đã nói ... ... trong ngôn ngữ được nhập sai, loại dữ liệu không cần phải được gọi rõ ràng.

Ngôn ngữ được nhập mạnh yêu cầu người lập trình khai báo loại dữ liệu cho từng biến và/hoặc giá trị.

này là đúng ...

Ngoài ra còn có một loại mô trong cái gọi là "mạnh mẽ" gõ các ngôn ngữ như C#, trong đó loại có thể được công bố nếu cần thiết hoặc muốn bởi các lập trình viên ... ví dụ C# có kiểu "var", nhưng cũng có các kiểu mạnh (Int32, String, Boolean, vv) mà nhiều lập trình viên sử dụng ngôn ngữ này thích.

Bằng cách này, ngôn ngữ có thể vừa được nhập "mạnh" và "yếu".

Tôi hy vọng điều này sẽ giúp đẩy mạnh sự hiểu biết của mình về khái niệm này ...

+1

Lưu ý rằng var trong C# duy trì việc gõ "chuỗi" các biến. Tên loại là – dlev

22

Sự khác biệt không phải là về tuyên bố loại trên các biến. Đó là một chút tinh tế hơn (và tốc độ Eric Lippert, tôi nghĩ rằng thuật ngữ được xác định hợp lý). Sự khác biệt là trong một ngôn ngữ được đánh máy mạnh, mỗi biểu thức có một loại có thể được xác định tại thời gian biên dịchchỉ hoạt động phù hợp với loại đó được phép.

Trong một ngôn ngữ không được nhập (không được nhập sai "cho người phê bình", được nhập động "cho người hâm mộ), điều đó không đúng. Ngôn ngữ cho phép bất kỳ thao tác nào được thực hiện trên bất kỳ loại nào, với điều kiện khá đáng kể rằng thao tác có thể thất bại. Tức là, trong khi ngôn ngữ có thể cho phép hoạt động, thời gian chạy có thể không hoạt động.

Lưu ý rằng có thể có ngôn ngữ được đánh máy mạnh mà không yêu cầu khai báo kiểu ở mọi nơi. Thật vậy, không có ngôn ngữ gõ mạnh nào. Hãy xem xét bit này của Java:

String s = "hellO"; 
int l = s.getBytes().length; 

Trình biên dịch quyết định rằng .length là hợp pháp ở đó? Nó hợp pháp vì nó đang được sử dụng trên byte[]. Nhưng không có tuyên bố về bất cứ điều gì như là một byte[] ở đây.Thay vào đó, trình biên dịch biết rằng sString và khi bạn gọi getBytes() trên số String, bạn sẽ nhận được byte[]. Nó bắt nguồn từ những sự kiện đó là loại s.getBytes() là một số byte[] và do đó việc yêu cầu length của pháp luật là hợp pháp.

Một số ngôn ngữ có hệ thống kiểu phức tạp hơn Java cho phép trình biên dịch phỏng đoán nhiều hơn điều này. Ví dụ, trong Scala, bạn có thể nói:

val s = "hello" 
val l = s.getBytes().length 

Và trình biên dịch sẽ suy ra các loại sl, cũng như của các biểu thức trung gian.

Ngôn ngữ có cách nhập mạnh mẽ nhưng giới hạn nhân tạo về kiểu suy luận yêu cầu khai báo kiểu thừa (như Java) được mô tả là có nhập tệp kê khai, vì loại phải được hiển thị. vào sự tồn tại, đó là một cách ưa thích để viết ra.

+1

Nhập mạnh/yếu là trực giao đối với nhập tĩnh/động. Ví dụ, hệ thống kiểu Ruby mạnh và năng động. – ComDubh

0

Một ngôn ngữ được đánh máy mạnh sẽ kiểm tra loại biến trước khi thực hiện thao tác trên biến đó, trong khi ngôn ngữ được nhập không chính xác thì không.

Ví dụ: JAVA (ngôn ngữ gõ mạnh):

int i = 10; 
boolean b = true; 
System.out.println(i + b); //compile error. Can't add int with boolean 

C (ngôn ngữ yếu gõ):

int i = 10; 
bool b = true; 
printf("%d" i + b); //Prints 11 
Các vấn đề liên quan