Google có phải là ngôn ngữ an toàn không?


14

trang này http://golang.org/doc/go_faq.html viết:

mặc dù Go có các kiểu tĩnh, ngôn ngữ cố gắng làm cho các loại cảm thấy trọng lượng nhẹ hơn so với các ngôn ngữ OO thông thường

Vì vậy, câu hỏi của tôi là chính xác là nó được gõ một cách an toàn với các tổng quát (như C #) hoặc được gõ lỏng lẻo (như javascript) hoặc tùy chọn (như tùy chọn nghiêm ngặt trong Vb.Net)


@JamesMcNellis có nghĩa là nếu một loại thất bại, đó chỉ có thể là do tôi thực hiện một kiểu phân loại (bất kỳ hành động nào khác không nên gây ra ngoại lệ loại)
Pacerier

1
@ davidk01 Java sẽ biên dịch (1 + "boo") và loại khá an toàn của Java. Biểu thức đó có ý nghĩa tĩnh nhất định đối với nó bởi vì + bị quá tải đối với các đối tượng Chuỗi bởi ngôn ngữ và tất cả các nghĩa đen nguyên thủy có thể được nâng lên thành các đối tượng được bọc mà sau đó có thể được chuyển thành Chuỗi.
Trixie Wolf

Câu trả lời:


26

Loại an toàn không phải là loại màu đen hoặc trắng - an toàn hay không. Đó là chi tiết của một quang phổ và một số ngôn ngữ có thể được nhiều loại an toàn hơn những người khác (và ngược lại). Tuy nhiên, tôi nghĩ những gì bạn nghĩ về C # so với Javascript có thể là kiểu gõ tĩnh (trong đó việc kiểm tra kiểu xảy ra vào thời gian biên dịch) so với kiểu gõ động (trong đó việc kiểm tra kiểu xảy ra trong thời gian chạy) - chắc chắn, đó là những gì Câu hỏi thường gặp về Go đang nói về.

Google Go được nhập tĩnh, nhưng một số tính năng làm cho nó "có vẻ" được (ít nhất là phần nào) được gõ động. Ví dụ, bạn không cần phải đánh dấu rõ ràng lớp của bạn là thực hiện bất kỳ giao diện nào. Nếu chữ ký phương thức của lớp của bạn khớp với các chữ ký trên giao diện, thì lớp của bạn sẽ tự động thực hiện giao diện đó (một kiểu gõ vịt). Điều này hữu ích để mở rộng các lớp và lớp tích hợp trong thư viện của bên thứ ba, bởi vì bạn chỉ cần tạo giao diện của mình để khớp với các phương thức trên lớp của bên thứ ba và nó sẽ tự động triển khai nó.

Loại an toàn thực sự là một "trục" khác nhau của hệ thống loại. Ví dụ, C là một ngôn ngữ gõ tĩnh không an toàn về loại - con trỏ cho phép bạn thực hiện khá nhiều thứ bạn thích, ngay cả những thứ sẽ làm hỏng chương trình của bạn. Javascript được gõ động, nhưng cũng an toàn về kiểu: bạn không thể thực hiện các thao tác sẽ làm hỏng chương trình của mình. C # chủ yếu là loại an toàn, nhưng bạn có thể đánh dấu rõ ràng các khu vực mã đang unsafevà thực hiện những thứ không còn loại an toàn.

Google Go cũng an toàn theo kiểu mà bạn không thể loay hoay với các loại và làm hỏng chương trình (không có quyền truy cập trực tiếp vào con trỏ).


Trừ khi bạn sử dụng gói "không an toàn", trong trường hợp đó bạn có thể làm hỏng chương trình theo bất kỳ cách nào bạn muốn :)
Eloff

Bạn có thể loay hoay với các loại và có quyền truy cập vào con trỏ. Và vâng, bạn có thể dễ dàng phá vỡ chương trình của bạn bằng cách làm điều đó.

4

Nó được gõ một cách an toàn rằng một loại sẽ không bao giờ bị hiểu sai, nhưng một loại không chính xác có thể khiến chương trình bị hoảng loạn.


Tôi không hiểu nó, điều đó có nghĩa là mã an toàn không phải loại thực sự có thể được biên dịch? (không thể có trong c # trừ khi chúng tôi sử dụng động lực học)
Pacerier

Thực hiện các xác nhận kiểu, loại khôn ngoan, về cơ bản giống như gọi một phương thức trên một kiểu động
dan_waterworth

ok vậy tóm lại là nó không có loại c # an toàn cho phép?
Pacerier

Nó không nếu bạn không làm xác nhận loại.
dan_waterworth

5
@Pacerier: Hoàn toàn có thể chạy các biểu thức bị nhập sai trong C # mà không cần động: Chỉ cần chèn phôi ở mọi nơi (về cơ bản là xác nhận kiểu gì).
sepp2k

-1

Loại bản đồ của Go không an toàn cho chủ đề, nó được nhập tĩnh. Nó không có kiểu thừa kế, lập trình chung, xác nhận, nạp chồng phương thức hoặc số học con trỏ hoặc vì lý do chính đáng.

An toàn loại và an toàn bộ nhớ là mục tiêu lâu dài, đây là một vấn đề.

Loại an toàn thể hiện một chi phí chung, tính bằng kilobyte và megabyte có thể chấp nhận được. Go được thiết kế với MapReduce và "Dữ liệu lớn", loại bỏ một petabyte dữ liệu, đưa ra các vấn đề về hiệu suất với an toàn loại, kiểm tra loại (đấm bốc / bỏ hộp) tạo ra các chi phí và xử lý chu kỳ.

Loại an toàn có thể bị hạn chế trong việc gõ phụ và đa hình và trong việc gõ vịt (truyền đối tượng sang đối tượng), điều này tạo ra những nguy hiểm và cũng là không gian nơi các ngôn ngữ như Go có lợi rất lớn. C ++ và Java không được thay thế bởi Go, đây là ngôn ngữ mới giúp lập trình phân tán và hệ thống song song ồ ạt.

Tuyên bố lớn của Bruce Eckel - "Go có ý nghĩa hơn nhiều đối với loại vấn đề mà C ++ ban đầu dự định giải quyết", vẫn còn gây tranh cãi. C ++ là một ngôn ngữ rất hiệu quả và việc triển khai MapReduce rất hiệu quả.

Nguyên thủy đồng thời là tương lai. Loại an toàn luôn là một chủ đề gây tranh cãi và Go có thể là ngôn ngữ đầu tiên để giải quyết vấn đề này trong 20 năm, hoặc kể từ Algol.


3
Đáng buồn là tôi cần thêm danh tiếng để -1 câu trả lời này. Loại an toàn không phải là chi phí hoạt động, chi phí thời gian chạy chắc chắn không được tính bằng đơn vị byte và đi có quyền anh / unboxing theo nghĩa Java. Gõ tĩnh cho phép trình biên dịch thực hiện nhiều tối ưu hóa hơn so với ngôn ngữ gõ động có thể. Bản đồ giảm không ở đây cũng không có, ditto với an toàn chủ đề.
Eloff

Thành ngữ của Golang về việc bạn khẳng định các loại sử dụng giao diện trống làm mẫu chung để tránh việc triển khai các khái quát như một tính năng ngôn ngữ chắc chắn không phải là điều tôi sẽ coi là "loại an toàn", và trong khi nó có thể giữ cho ngôn ngữ đơn giản, khi sự cố xảy ra phát sinh (và nó sẽ) nó để lại sự phức tạp trên đĩa của người mà bây giờ còn lại để giải quyết vấn đề với cuộn ống golang gọi là một tính năng. Nó chắc chắn không giống như một ngôn ngữ được thiết kế trong 2 thập kỷ qua, bởi vì có những ngôn ngữ giải quyết vấn đề an toàn theo cách tốt hơn nhiều.
tsturzl
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.