Apakah Google Go adalah bahasa yang aman untuk mengetik?

14

halaman ini http://golang.org/doc/go_faq.html menulis:

meskipun Go memiliki tipe statis, bahasa ini mencoba membuat tipe terasa lebih ringan daripada bahasa OO pada umumnya

Jadi pertanyaan saya adalah apakah ini diketik dengan aman dengan generik (seperti C #) atau diketik secara longgar (seperti javascript) atau opsional (seperti opsi ketat di Vb.Net)

Pacerier
sumber
@JamesMcNellis artinya jika suatu tipe gagal, itu hanya bisa karena saya melakukan tipe-cast (tindakan apa pun seharusnya tidak menyebabkan pengecualian tipe)
Pacerier
1
@ davidk01 Java akan mengkompilasi (1 + "boo"), dan Java cukup aman. Ekspresi itu memiliki makna statis yang pasti untuk itu karena + kelebihan beban untuk objek String oleh bahasa, dan semua literal primitif dapat diketikkan tipe ke objek yang dibungkus yang kemudian dapat diubah menjadi Strings.
Trixie Wolf

Jawaban:

26

Jenis keamanan bukan jenis hitam-putih-aman atau tidak. Ini lebih dari spektrum dan beberapa bahasa bisa lebih aman daripada yang lain (dan sebaliknya). Namun, saya pikir apa yang Anda pikirkan dengan C # vs. Javascript kemungkinan pengetikan statis (di mana pengecekan tipe terjadi pada waktu kompilasi) vs pengetikan dinamis (di mana pengecekan tipe terjadi pada saat run-time) - tentu saja, itu apa yang Go FAQ bicarakan.

Google Go diketik secara statis, tetapi sejumlah fitur membuatnya "tampak" sebagai (setidaknya agak) diketik secara dinamis. Misalnya, Anda tidak perlu secara eksplisit menandai kelas Anda sebagai mengimplementasikan antarmuka apa pun. Jika metode tanda tangan dari kelas Anda cocok dengan yang ada di antarmuka, maka kelas Anda secara otomatis mengimplementasikan antarmuka itu (semacam bebek-mengetik). Ini berguna untuk memperluas kelas built-in dan kelas di perpustakaan pihak ketiga, karena Anda bisa membuat antarmuka untuk mencocokkan metode pada kelas pihak ketiga dan itu akan secara otomatis mengimplementasikannya.

Keamanan jenis sebenarnya adalah "sumbu" yang berbeda dari sistem tipe. Sebagai contoh, C adalah bahasa yang diketik secara statis yang bukan tipe-aman - pointer memungkinkan Anda melakukan hampir semua hal yang Anda suka, bahkan hal-hal yang akan merusak program Anda. Javascript diketik secara dinamis, tetapi juga tipe-aman: Anda tidak dapat melakukan operasi yang akan merusak program Anda. C # kebanyakan bertipe safe, tetapi Anda dapat secara eksplisit menandai area kode yang ada unsafedan melakukan hal-hal yang tidak lagi bertipe safe.

Google Go juga tipe-aman dalam arti bahwa Anda tidak dapat dipusingkan dengan jenis dan crash program (tidak ada akses langsung ke petunjuk).

Dean Harding
sumber
Kecuali Anda menggunakan paket "tidak aman", dalam hal ini Anda dapat menghentikan program
sesuka
Anda dapat bermain-main dengan tipe dan memiliki akses ke petunjuk. Dan ya, Anda dapat dengan mudah crash program Anda dengan melakukan itu.
eithed
4

Itu diketik dengan aman bahwa suatu jenis tidak akan pernah salah ditafsirkan, tetapi jenis yang salah dapat menyebabkan program panik.

dan_waterworth
sumber
saya tidak mengerti, apakah itu berarti kode aman non-tipe sebenarnya dapat dikompilasi? (yang tidak mungkin dilakukan di c # kecuali kami menggunakan dinamika)
Pacerier
Melakukan pernyataan tipe, tipe-bijaksana, pada dasarnya seperti memanggil metode pada tipe dinamis
dan_waterworth
ok jadi singkatnya itu tidak memiliki jenis-keamanan seperti c # memungkinkan?
Pacerier
Itu terjadi jika Anda tidak mengetik pernyataan.
dan_waterworth
5
@ Peracerier: Sangat mungkin untuk menjalankan ekspresi salah ketik dalam C # tanpa dinamika: Cukup masukkan gips di mana-mana (yang pada dasarnya adalah tipe pernyataan apa).
sepp2k
-1

Jenis peta Go bukan thread-safe, ini diketik secara statis. Itu tidak memiliki jenis warisan, pemrograman generik, pernyataan, metode overloading, atau aritmatika pointer baik dan untuk alasan yang baik.

Keamanan tipe dan keamanan memori adalah tujuan jangka panjang, di sini pada masalah.

Jenis keamanan menghadirkan overhead, dalam kilobyte dan megabita yang dapat diterima. Go dirancang dengan MapReduce dan "Big data", mengeluarkan satu petabyte data, yang menghadirkan masalah kinerja dengan keamanan jenis, pengecekan tipe (tinju / unboxing) menciptakan overhead dan menghilangkan siklus pemrosesan.

Keamanan jenis dapat dibatasi dalam sub-pengetikan dan polimorfisme dan dalam pengetikan bebek (melemparkan benda ke benda), ini menciptakan bahaya dan juga ruang di mana bahasa seperti Go sangat bermanfaat. C ++ dan Java tidak digantikan oleh Go, itu adalah bahasa baru untuk membantu pemrograman terdistribusi dan sistem paralel masif.

Pernyataan besar oleh Bruce Eckel - "Go lebih masuk akal untuk kelas masalah yang awalnya ingin diselesaikan oleh C ++", masih bisa diperdebatkan. C ++ adalah bahasa yang sangat efisien dan implementasi Boost MapReduce sangat efisien.

Primitif konkurensi adalah masa depan. Keamanan jenis selalu menjadi topik yang sangat kontroversial dan Go mungkin bahasa pertama yang mengatasi masalah ini dalam 20 tahun, atau sejak Algol.

mrhassell
sumber
3
Sayangnya saya perlu lebih banyak reputasi untuk -1 jawaban ini. Jenis keamanan bukan overhead, overhead runtime pasti tidak diukur dalam satuan byte, dan go memang memiliki tinju / unboxing dalam arti Java. Pengetikan statis memungkinkan kompiler untuk membuat lebih banyak optimasi daripada bahasa yang diketik secara dinamis. Reduksi peta tidak penting, juga aman.
Eloff
Idiom Golang untuk meminta Anda menegaskan jenis menggunakan antarmuka kosong sebagai pola umum untuk menghindari penerapan generik sebagai fitur bahasa tentu bukan sesuatu yang saya anggap "ketik aman", dan sementara itu mungkin menjaga spesifikasi bahasa tetap sederhana, ketika masalahnya muncul (dan itu akan) ia meninggalkan kompleksitas di piring orang yang sekarang pergi untuk menyelesaikan masalah dengan gulungan saluran golang panggilan fitur. Ini tentu tidak tampak seperti bahasa yang dirancang dalam 2 dekade terakhir, karena ada bahasa yang membahas keamanan jenis dengan cara yang jauh lebih baik.
tsturzl