C có được gõ mạnh không?


87

Trích dẫn Wikipedia :

Hai ngôn ngữ được sử dụng phổ biến hỗ trợ nhiều kiểu chuyển đổi ngầm định là C và C ++, và đôi khi người ta cho rằng đây là những ngôn ngữ được đánh máy yếu. Tuy nhiên, những người khác cho rằng những ngôn ngữ này đặt ra đủ hạn chế về cách các toán hạng của các kiểu khác nhau có thể được trộn lẫn, rằng cả hai nên được coi là ngôn ngữ được đánh máy mạnh.

Có câu trả lời chắc chắn hơn không?


188
Đối với một lập trình viên C, gõ mạnh đồng nghĩa với việc nhấn các phím mạnh hơn.
Dan Dyer

2
C ở bên yếu trong liên tục gõ. Nhưng có đủ mặt hàng ở hai bên mà bạn có thể tranh luận theo cách nào đó. Trong khi bạn đang ở đó bạn cũng có thể hỏi (vi hay emacs, NetBeans hoặc nhật thực, vv)
Cervo

4
Tình trạng chơi trên Wikipedia tệ đến mức tôi cảm thấy buộc phải chỉnh sửa một số trang Wikipedia. Có lẽ mọi thứ tốt hơn một chút bây giờ. Có lẽ.
Norman Ramsey

40
Re: Nhận xét của Dan (để ghi công khi nó đến hạn) Cuốn sách "Chuyên gia lập trình C" của Peter van der Linden có dòng sau: "Cho đến ngày nay, nhiều lập trình viên C tin rằng 'gõ mạnh chỉ có nghĩa là gõ mạnh hơn vào bàn phím."
Alexandros Gezerlis

Câu hỏi rất hay !!!
Kẻ hủy diệt

Câu trả lời:


154

"Gõ mạnh" và "gõ yếu" là những thuật ngữ không có ý nghĩa kỹ thuật được thống nhất rộng rãi. Các thuật ngữ có ý nghĩa được xác định rõ ràng là

  • Được nhập động có nghĩa là các loại được gắn với các giá trị tại thời gian chạy và việc cố gắng kết hợp các giá trị của các loại khác nhau có thể gây ra "lỗi loại thời gian chạy". Ví dụ, nếu trong Scheme bạn cố gắng thêm một giá trị vào true bằng cách viết, (+ 1 #t)điều này sẽ gây ra lỗi. Bạn chỉ gặp lỗi nếu bạn cố gắng thực thi mã vi phạm.

  • Kiểu tĩnh có nghĩa là các kiểu được kiểm tra tại thời điểm biên dịch và một chương trình không có kiểu tĩnh sẽ bị trình biên dịch từ chối. Ví dụ: nếu trong ML bạn cố gắng thêm một vào true bằng cách viết 1 + true, chương trình sẽ bị từ chối với thông báo lỗi (có thể là khó hiểu). Bạn luôn gặp lỗi ngay cả khi mã có thể không bao giờ được thực thi.

Những người khác nhau thích các hệ thống khác nhau một phần tùy thuộc vào mức độ họ đánh giá cao tính linh hoạt và mức độ họ lo lắng về lỗi thời gian chạy.

Đôi khi "được gõ mạnh" được sử dụng lỏng lẻo để có nghĩa là "được nhập tĩnh", và "được nhập yếu" được sử dụng không chính xác để có nghĩa là "được nhập động". Cách sử dụng tốt hơn cho thuật ngữ "được đánh mạnh" là "bạn không thể làm việc xung quanh hoặc lật đổ hệ thống kiểu", trong khi "được đánh yếu" có nghĩa là "có sơ hở trong hệ thống kiểu". Ngược lại, hầu hết các ngôn ngữ với hệ thống kiểu tĩnh đều có kẽ hở, trong khi nhiều ngôn ngữ với hệ thống kiểu động không có kẽ hở.

Không có thuật ngữ nào trong số này được kết nối theo bất kỳ cách nào với số lượng chuyển đổi ngầm định có sẵn trong một ngôn ngữ.

Nếu bạn muốn nói một cách chính xác về các ngôn ngữ lập trình, cách tốt nhất là tránh các thuật ngữ "gõ mạnh" và "gõ yếu". Tôi muốn nói rằng C là một ngôn ngữ được gõ tĩnh nhưng có rất nhiều lỗ hổng. Một lỗ hổng là bạn có thể tự do chuyển bất kỳ loại con trỏ nào sang bất kỳ loại con trỏ nào khác. Bạn cũng có thể tạo kẽ hở giữa hai loại bất kỳ mà bạn chọn bằng cách khai báo một liên minh C có hai thành viên, một cho mỗi loại được đề cập.

Tôi đã viết thêm về nhập tĩnh và nhập động tại sao-giải-ngôn-ngữ-là-chủ-yếu-vịt-trong-khi-biên-dịch-có-mạnh-gõ .


2
Bạn lấy đâu ra các định nghĩa mà bạn đề xuất cho cách gõ mạnh / yếu (điều sơ hở)?
Sydius

2
Tại sao bạn cần một "lỗ hổng" trong một môi trường đánh máy động?
Chris Conway

4
@Sydius: Từ việc dành phần lớn thời gian trong 20 năm qua để đi chơi với những người thiết kế, xây dựng và phân tích ngôn ngữ lập trình và hệ thống loại. Đó là công việc trả lương của tôi :-)
Norman Ramsey

@Chris: Tôi chưa bao giờ thấy một ngôn ngữ được nhập động có 'lỗ hổng'. Việc sử dụng lỗ hổng phổ biến là làm việc với hệ thống hoặc hệ điều hành thời gian chạy, ví dụ: lấy một địa chỉ thô và chuyển đổi nó thành một con trỏ thành một giá trị ngôn ngữ hoạt động tốt. Bạn có thể thực hiện việc này trong cài đặt động nhưng tôi không biết có bất kỳ nỗ lực nào.
Norman Ramsey

1
@NormanRamsey Tôi nghĩ rằng Chris đã đề cập với câu hỏi của mình để:whereas "weakly typed" means "there are loopholes in the type system
Nir Alfasi

23

Thật khó để phân loại mọi ngôn ngữ thành được gõ 'yếu' hoặc 'mạnh' - nó mang tính liên tục hơn. Tuy nhiên, so với các ngôn ngữ khác, C được đánh khá mạnh. Mọi đối tượng đều có kiểu thời gian biên dịch và trình biên dịch sẽ thông báo cho bạn biết (lớn tiếng) nếu bạn đang làm điều gì đó với một đối tượng mà kiểu của nó không cho phép bạn làm. Ví dụ: bạn không thể gọi các hàm với các loại tham số sai, truy cập struct / union member không tồn tại, v.v.

Nhưng có một vài điểm yếu. Một điểm yếu chính là typecast - về cơ bản chúng nói rằng bạn sẽ xoay quanh các loại đối tượng và trình biên dịch phải yên tĩnh (khi có thể). void*cũng là một điểm yếu khác - đó là một con trỏ chung đến một loại không xác định và khi sử dụng chúng, bạn phải hết sức cẩn thận để đảm bảo rằng mình đang làm đúng. Trình biên dịch không thể kiểm tra tĩnh hầu hết các mục đích sử dụng void*. void*cũng có thể được chuyển đổi thành con trỏ thành bất kỳ kiểu nào mà không cần ép kiểu (chỉ trong C, không phải trong C ++), đó là một điểm yếu khác.


Câu trả lời hay, mặc dù "typecast ... và trình biên dịch nên yên lặng" làm phiền tôi. Đánh máy không giống như tắt cảnh báo, nó thực sự thay đổi cách diễn giải giá trị được tham chiếu.
Cao Jeff

15
Bạn đang nhầm lẫn giữa "tĩnh" và "mạnh" liên quan đến việc nhập. Hai khái niệm này độc lập với nhau.
uốn cong vào

1
Dennis Ritchie (C tác giả) gọi là C 'gõ mạnh và yếu kiểm tra'
TimZaman

11

Tài liệu không rõ ràng về điều này. Tôi nghĩ rằng gõ mạnh không phải là có / không, có nhiều mức độ gõ mạnh khác nhau.

Một ngôn ngữ lập trình có một đặc tả về cách nó thực thi các chương trình. Đôi khi không rõ cách thực thi với một số chương trình nhất định. Ví dụ, các chương trình cố gắng trừ một chuỗi khỏi một số. Hoặc các chương trình chia cho không. Có một số cách để đối phó với những tình trạng này. Một số ngôn ngữ có các quy tắc để xử lý các lỗi này (ví dụ: chúng đưa ra một ngoại lệ). Các ngôn ngữ khác không có quy tắc để đối phó với những tình huống này. Những ngôn ngữ đó thường có hệ thống kiểu để ngăn chặn các chương trình biên dịch dẫn đến hành vi không xác định. Và cũng tồn tại các ngôn ngữ có hành vi không xác định và không có hệ thống loại để ngăn chặn các lỗi này tại thời điểm biên dịch (nếu bạn viết một chương trình có hành vi không xác định, nó có thể phóng tên lửa).

Vì thế:

Các ngôn ngữ chỉ định những gì xảy ra trong thời gian chạy trong mọi trường hợp (như thêm một số vào một chuỗi) được gọi là nhập động. Các ngôn ngữ ngăn việc thực thi chương trình có lỗi tại thời điểm biên dịch được nhập tĩnh. Các ngôn ngữ không xác định điều gì sẽ xảy ra và cũng không có hệ thống loại để ngăn lỗi được gọi là nhập yếu.

Vậy Java có được gõ tĩnh không? Có, vì hệ thống kiểu của nó không cho phép trừ một chuỗi khỏi một số. Không, vì nó cho phép bạn chia cho không. Bạn có thể ngăn chia cho số 0 tại thời điểm biên dịch bằng hệ thống kiểu. Ví dụ: bằng cách tạo một kiểu số không thể bằng 0 (ví dụ: NonZeroInt) và chỉ cho phép chia cho các số có kiểu này.

Vậy C gõ mạnh hay gõ yếu? C được gõ mạnh vì hệ thống kiểu không cho phép một số lỗi kiểu. Nhưng nó được nhập yếu trong các trường hợp khác khi không xác định được điều gì sẽ xảy ra (và hệ thống loại không bảo vệ bạn).


Tôi thích sự sắp xếp của bạn giữa động và tĩnh như các hình thức mạnh và yếu. Tuy nhiên, tôi không chắc mình hiểu ý bạn về việc các hệ thống được nhập tĩnh dừng chia cho 0. Nếu kiểu gõ tĩnh của tôi intnhận được một giá trị từ người dùng hoặc đối số dòng lệnh hoặc một tệp, thì không có gì trình biên dịch có thể làm để ngăn việc đó là số 0!
Rikki,

1
Có những hệ thống kiểu tĩnh ngăn chặn điều này, nhưng hầu hết các ngôn ngữ đều được "gõ" động hoặc yếu đối với phép chia cho 0, vì đó là hành vi không xác định (C) hoặc chúng ném ra một ngoại lệ (Java).
Jules

11

C được coi là được gõ yếu, vì bạn có thể chuyển đổi bất kỳ kiểu nào sang bất kỳ kiểu nào khác thông qua ép kiểu mà không gặp lỗi trình biên dịch. Bạn có thể đọc thêm về vấn đề ở đây .


2
wikipedia đang gây hiểu lầm ở đây. C được đánh mạnh, các kiểu rất hợp lệ và trình biên dịch sẽ ngăn cản nếu bạn nhập sai, tuy nhiên, C cũng cung cấp các tính năng để bạn bỏ qua điều này. So sánh với các ngôn ngữ như BCPL chỉ có kiểu 'byte'.
gbjbaanb

12
Nhập yếu không có nghĩa là một ngôn ngữ không có bất kỳ kiểu nào, nó chỉ có nghĩa là các kiểu có thể bị ép buộc ngầm từ kiểu này sang kiểu khác. So sánh với Python, một ngôn ngữ được đánh máy mạnh, trong đó bạn phải chuyển đổi rõ ràng các kiểu bằng các lệnh gọi hàm.
mipadi

không thể cast một thứ trong C cũng góp phần vào việc nó là một loại yếu. ?? Tôi đã nghi ngờ điều này cho như mãi mãi
Suraj Jain

8

C được gõ mạnh hơn Javascript và ít được gõ mạnh hơn Ada.

Tôi muốn nói rằng nó rơi vào phía được đánh máy mạnh mẽ của liên tục. nhưng người khác có thể không đồng ý (ngay cả khi họ sai).

Làm thế nào là dứt khoát?


Đó là một câu trả lời hơi lè lưỡi. Nhưng làm chi tiết về sự sai trái.
Michael Burr

1
Javascript được gõ mạnh. Nó chỉ không được nhập tĩnh. Tất cả các kiểm tra kiểu xảy ra trong thời gian chạy (động, không tĩnh) nhưng chúng xảy ra và điều đó ngăn bạn làm hỏng bộ nhớ (một khía cạnh của việc nhập mạnh).
uốn cong vào

5
Chà, như câu trả lời rất hay của Norm Ramsey đã chỉ ra, "gõ mạnh" và "gõ yếu" không phải là những thuật ngữ được định nghĩa rõ ràng. Ngoài ra, với điều kiện Javascript được nhập mạnh, một số người có thể tin rằng ("4" / ​​"2") là một biểu thức Javascript hợp lệ có thể chỉ ra điều khác.
Michael Burr

5

C được coi là kiểu tĩnh (bạn không thể thay đổi biến từ int thành float). Khi một biến được khai báo, nó sẽ bị kẹt theo cách đó.

Nhưng nó được coi là đánh máy yếu vì các loại có thể được lật úp.

0 là gì? '\ 0', FALSE, 0.0, v.v.

trong nhiều ngôn ngữ, bạn không thể nói IF (biến) vì các điều kiện sẽ chỉ nhận các giá trị boolean từ các biểu thức boolean. Chúng được gõ mạnh hơn. Điều tương tự cũng áp dụng cho việc chuyển đổi giữa các ký tự và số nguyên.

Về cơ bản, c có hai kiểu dữ liệu đơn giản chính, số nguyên và số dấu phẩy động (mặc dù có nhiều phân biệt). Mọi thứ khác boolean, enum (không đơn giản nhưng nó phù hợp), v.v. được thực hiện như một trong số đó. Các ký tự chẵn về cơ bản là số nguyên.

So sánh với các ngôn ngữ khác có kiểu chuỗi, kiểu enum chỉ có thể được gán cho các giá trị đã xác định, kiểu boolean chỉ có thể sử dụng các biểu thức tạo boolean hoặc true / false.

Nhưng bạn có thể tranh luận rằng so với Perl C được đánh mạnh mẽ. Vì vậy, nó là một trong những đối số nổi tiếng (vi vs emacs, linux vs windows, v.v.). C # được gõ mạnh hơn C. Về cơ bản, bạn có thể tranh luận theo một trong hai cách. Và câu trả lời của bạn có thể sẽ đi theo cả hai cách :) Ngoài ra, một số sách giáo khoa / trang web sẽ nói rằng C được gõ yếu, và một số sẽ nói C được gõ mạnh. Nếu bạn truy cập wikipedia, mục nhập C cho biết "gõ yếu một phần". Tôi có thể nói so với Python C được gõ yếu. Vì vậy, Python / C #, C, Perl trên liên tục.


Hãy giải thích lý do của bạn mà Perl được gõ ít mạnh mẽ hơn so với C.
user51568

in "Đang kiểm tra" + 0 # perl sẽ làm 0; $ var = "string"; $ var = 1; $ var = 123,4; Đó là loại biến nào?
Cervo

Trong C char * test = "testing"; printf (kiểm tra + 0); vẫn sẽ là một chuỗi, chỉ là trong C chỉ mục sẽ thay đổi nếu thay vì số 0, tôi sử dụng một số. Nó vẫn còn khá yếu, nhưng mạnh hơn một chút sau đó perl. kiểm tra char *; kiểm tra = 0; kiểm tra = 123,4; test = "c"; ... trình biên dịch của tôi tạo ra lỗi
Cervo

lỗi cho biết rằng cần phải truyền. Tuy nhiên, kiểm tra kiểu mạnh hơn Perl một chút vì vậy về liên tục, tôi phải nói C được gõ mạnh hơn Perl. Bạn vẫn có thể kiểm tra = (char *) và sau đó sử dụng 0, 123.4, 'C', v.v. Nhưng nếu chỉ làm điều đó thì có lỗi.
Cervo

4

Rất nhiều câu trả lời hay ở đây. Tôi muốn nêu ra một điểm quan trọng từ Real World Haskell :

Cần lưu ý rằng nhiều cộng đồng ngôn ngữ có định nghĩa riêng của họ về “loại mạnh”. Tuy nhiên, chúng tôi sẽ nói một cách ngắn gọn và rộng rãi về khái niệm sức mạnh trong các hệ thống kiểu.

(snip)

Pháo hoa xung quanh các hệ thống loại có nguồn gốc từ tiếng Anh thông thường, nơi mọi người gắn khái niệm giá trị với các từ "yếu" và "mạnh": chúng ta thường nghĩ về sức mạnh tốt hơn là điểm yếu. Nhiều lập trình viên nói tiếng Anh đơn giản hơn là thuật ngữ học thuật, và thường thì các nhà học thuật thực sự ném gạch đá vào bất kỳ loại hệ thống nào không phù hợp với sở thích của họ. Kết quả thường là trò tiêu khiển phổ biến trên Internet, một cuộc chiến rực lửa.

Vì vậy, hãy xem các câu trả lời về C và C ++, nhưng hãy nhớ rằng 'mạnh' và 'yếu' không liên kết với 'tốt' và 'xấu'.


4

Theo Dennis Ritchie ( người tạo ra C ) và Brian Kernighan, C không phải là một ngôn ngữ được đánh máy mạnh. Những dòng tiếp theo trích từ cuốn sách Ngôn ngữ lập trình C trang 3 đoạn 5

C không phải là một ngôn ngữ được đánh máy mạnh, nhưng khi nó phát triển, việc kiểm tra kiểu của nó đã được tăng cường.


3

Theo tôi, C / C ++ được đánh rất mạnh. Loại hack cho phép chuyển đổi kiểu (void *) ở đó vì C gần với máy. Nói cách khác, bạn có thể gọi các lệnh hợp ngữ từ Pascal và thao tác với con trỏ và Pascal vẫn được coi là một ngôn ngữ được đánh máy mạnh. Bạn có thể gọi trình dịch hợp ngữ và các tệp thực thi C từ Java thông qua JNI nhưng nó không làm cho Java được gõ yếu.

C chỉ có trình hợp dịch được "nhúng" vào nó với các con trỏ thô và như vậy.


3

Thuật ngữ được đánh mạnh không có một định nghĩa thống nhất. Do đó, trừ khi bạn xác định ý bạn "được đánh máy mạnh", thì không thể trả lời câu hỏi của bạn.

Theo kinh nghiệm của tôi, các từ ngữ "mạnh mẽ gõ" và "yếu gõ" được sử dụng độc quyền bởi troll, bởi vì họ thiếu định nghĩa cho phép troll để xác định lại họ giữa lý luận cho phù hợp với chương trình nghị sự của họ. Khác với việc khởi động súng hỏa mai, những thuật ngữ này khá vô dụng.

Bạn cũng có thể muốn xem Các khía cạnh chính của một ngôn ngữ được đánh máy mạnh là gì? tại đây trên StackOverflow.


3
Tôi không đồng ý. "Được nhập mạnh" có nghĩa là có thể xác định kiểu dữ liệu của một giá trị và chỉ cho phép các thao tác phù hợp với kiểu đó. Địa chỉ "động" và "tĩnh" khi xác định đó có thể được thực hiện.
joel.

2
Bạn nhận ra điều trớ trêu khi cố gắng bác bỏ khẳng định rằng không có định nghĩa được thống nhất bằng cách đưa ra một định nghĩa khác, phải không?
Jörg W Mittag

1
@Jorg: Không cố gắng giới thiệu một cái khác; chỉ nêu một cái thường được sử dụng trong các vòng kết nối mà tôi di chuyển.
joel.neely

1

Có một sự liên tục với nhiều con đường song song giữa "gõ yếu" và "nhập mạnh", hai thuật ngữ thậm chí còn không được xác định rõ ràng.

C được nhập tĩnh , trong đó trình biên dịch biết kiểu khai báo của mọi biến cục bộ và thành viên cấu trúc là gì.

Các ngôn ngữ được gõ động vẫn có thể được gõ mạnh, nếu mỗi đối tượng có một kiểu cụ thể nhưng không có cách nào để trình biên dịch biết kiểu đó.


0

Lý do cho truy vấn của bạn là gì? Lý do tôi yêu cầu là đây là một sự khác biệt nhỏ và cách sử dụng cụ thể của bạn "được đánh máy mạnh" có thể cần được làm rõ hơn hoặc ít hơn. Tôi chắc chắn sẽ nói rằng Java và các ngôn ngữ khác có những hạn chế chặt chẽ hơn đối với cuộc hội thoại kiểu ngầm.


Chủ yếu là tò mò, nhưng tôi đang ứng tuyển vị trí C và muốn biết trong trường hợp họ hỏi tôi về điều đó.
Sydius

Sau đó, có lẽ câu trả lời dài hơn mang lại sắc thái của những gì "được đánh máy mạnh" là cách tiếp cận tốt nhất thay vì chỉ nói "có" hoặc "không".
BobbyShaftoe

0

Thật khó để đưa ra một câu trả lời cụ thể khi không có một định nghĩa cụ thể về "được đánh máy mạnh". Tôi muốn nói rằng C được gõ mạnh vào đó mọi biến và mọi biểu thức đều có một kiểu nhưng gõ yếu ở chỗ nó cho phép bạn thay đổi kiểu bằng cách sử dụng phôi và diễn giải lại biểu diễn của kiểu này thành kiểu khác.


Có một def chính thức. để được gõ mạnh . Nó nói rằng một sys. là ST khi người ta đảm bảo rằng không có lỗi kiểu thời gian chạy. Ví dụ: ML, Haskell. Điều này hữu ích để làm cho hệ thống bỏ qua các thẻ loại bên trong các đối tượng và tuy nhiên, hãy áp dụng các toán tử trên các loại chính xác. Bởi vì chúng ta biết trước khi thực thi rằng không cần thẻ trong các đối tượng. Bởi vì C có dàn diễn viên và con trỏ truy cập vào bản ghi nhớ tùy ý, C không phải là st
alinsoar

0

Tôi muốn nói rằng C được đánh mạnh như lệnh của trình biên dịch / nền tảng của bạn. Ví dụ: nếu bạn đang xây dựng trên một nền tảng nghiêm ngặt, việc bỏ tham chiếu đến một con trỏ kiểu chơi chữ có thể sẽ bị hỏng:

void m_free(void **p)
{
        if (*p != NULL) {
                free(*p);
                *p = NULL;
        }
}

....
char *str = strdup("foo");
m_free((void **) &foo);

Bây giờ, nếu bạn yêu cầu trình biên dịch bỏ qua răng cưa nghiêm ngặt, nó sẽ không phải là vấn đề, nhưng không phải là rất linh hoạt. Vì vậy, theo nghĩa đó, việc thúc đẩy giới hạn của ngôn ngữ là có thể nhưng có lẽ không phải là ý tưởng tốt nhất. Điều đó vượt xa quá trình ép kiểu điển hình, tức là ép kiểu int càng lâu và thực sự cho thấy một trong những cạm bẫy có thể có của khoảng trống.

Vì vậy, tôi sẽ nói C về cơ bản được nhập đúng, nhưng các trình biên dịch khác nhau của nó cho rằng lập trình viên hiểu rõ nhất và cho phép một số linh hoạt. Điều này thực sự phụ thuộc vào trình biên dịch, một số sẽ không nhận ra lỗi tiềm ẩn đó. Vì vậy, theo nghĩa đó, trình biên dịch lựa chọn thực sự đóng một vai trò khi trả lời câu hỏi. Những gì đúng thường khác với những gì mà trình biên dịch của bạn sẽ cho phép bạn loại bỏ.



-1

Không được gõ mạnh.

Hãy xem xét những gì mà nguyên mẫu hàm sau cho bạn biết về kiểu dữ liệu của các đối số:

void func (int n, char ch, ...);

Không có gì. Vì vậy, tôi đề nghị rằng gõ mạnh không áp dụng ở đây.


Huh? Nó cho biết bạn có một int, theo sau là một ký tự, theo sau là bất kỳ số đối số nào thuộc bất kỳ loại nào. Đó không phải là "không có gì".
Lawrence Dol

... không cho bạn biết gì về các loại đối số được truyền. Đúng là loại của chức năng tự nó biết. Đó là những gì Software Monkey đã nói.
Johannes Schaub - litb

Những "bất kỳ số đối số thuộc bất kỳ loại nào" là những gì tôi đang nói đến. Một chuỗi chỉ mạnh bằng mắt xích yếu nhất của nó.
joel.neely

-3

Tôi muốn nói rằng nó có nhiều kiểu vì mọi biểu thức đều có kiểu không phải là một hàm của giá trị của nó; ei nó có thể được biết trước thời gian chạy.

OTOH Tôi không chắc đó có phải là mô tả chính xác của được gõ mạnh hay không. Tuyên bố mạnh mẽ duy nhất mà tôi có thể thấy lý do để một ngôn ngữ đưa ra sẽ là đảm bảo rằng bạn không thể lật đổ hệ thống kiểu trong thời gian chạy thông qua diễn giải lại các kiểu kiểu, hợp nhất, gọi sang các ngôn ngữ khác, con trỏ, hợp ngữ, v.v. Các ngôn ngữ như thế này tồn tại nhưng bị tê liệt đến mức chúng dường như không được các lập trình viên quan tâm nhiều ngoài tính học thuật và đảm bảo cao. Như ai đó đã chỉ ra, để thực sự làm được điều đó, bạn bắt đầu cần phải có các loại như thế nào nonZeroIntvà không. Kinh quá.


3
Cái gì không? Định nghĩa của tôi về gõ mạnh hay C?
BCS
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.