ภาษาของ Google เป็นภาษาที่ปลอดภัยหรือไม่


14

หน้านี้http://golang.org/doc/go_faq.htmlเขียน:

แม้ว่า Go จะมีประเภทสแตติก แต่ภาษาก็พยายามทำให้ประเภทรู้สึกเบากว่าในภาษา OO ทั่วไป

ดังนั้นคำถามของฉันคือว่ามันพิมพ์อย่างปลอดภัยกับ generics (เช่น C #) หรือพิมพ์อย่างอิสระ (เช่น javascript) หรือตัวเลือก (เช่นตัวเลือกเข้มงวดใน Vb.Net)


@JamesMcNellis ความหมายถ้าเป็นชนิดที่ล้มเหลวก็สามารถจะเป็นเพราะฉันทำชนิดหล่อ (กระทำการใด ๆ ไม่ควรทำให้เกิดข้อยกเว้นประเภท)
Pacerier

1
@ davidk01 Java จะคอมไพล์ (1 + "boo") และประเภทที่ปลอดภัยของ Java นิพจน์นั้นมีความหมายคงที่แน่นอนเนื่องจาก + มีการโหลดมากเกินไปสำหรับวัตถุ String ตามภาษาและตัวอักษรดั้งเดิมทั้งหมดสามารถยกประเภทให้เป็นวัตถุที่ถูกห่อซึ่งสามารถเปลี่ยนเป็นสตริงได้
ทริกซี่หมาป่า

คำตอบ:


26

ความปลอดภัยของประเภทไม่ได้เป็นประเภทที่ปลอดภัยสีดำหรือสีขาวหรือไม่ มันมากขึ้นของคลื่นและบางภาษาสามารถเพิ่มเติมความปลอดภัยประเภทกว่าคนอื่น ๆ (และในทางกลับกัน) อย่างไรก็ตามฉันคิดว่าสิ่งที่คุณคิดด้วย C # เทียบกับจาวาสคริปต์คือการพิมพ์แบบคงที่ (ซึ่งการตรวจสอบประเภทเกิดขึ้นที่คอมไพล์เวลา) กับการพิมพ์แบบไดนามิก (ซึ่งการตรวจสอบประเภทเกิดขึ้นในเวลาทำงาน) สิ่งที่ไปคำถามที่พบบ่อยพูดคุยเกี่ยวกับ

Google Go ถูกพิมพ์แบบคงที่ แต่คุณสมบัติจำนวนหนึ่งทำให้ "ปรากฏ" เป็น (อย่างน้อยค่อนข้าง) พิมพ์แบบไดนามิก ตัวอย่างเช่นคุณไม่จำเป็นต้องทำเครื่องหมายชั้นเรียนของคุณเป็นการใช้งานอินเตอร์เฟสใด ๆ หากวิธีการลงนามในชั้นเรียนของคุณตรงกับที่อยู่บนอินเทอร์เฟซคลาสของคุณจะใช้อินเทอร์เฟซนั้นโดยอัตโนมัติ (ชนิดของการพิมพ์เป็ด) สิ่งนี้มีประโยชน์สำหรับการขยายคลาสและคลาสที่มีอยู่แล้วในไลบรารีของบุคคลที่สามเนื่องจากคุณสามารถสร้างอินเทอร์เฟซของคุณให้ตรงกับวิธีการในคลาสของบุคคลที่สามและมันจะนำไปใช้โดยอัตโนมัติ

ความปลอดภัยของประเภทนั้นแท้จริงแล้วคือ "แกน" ที่แตกต่างกันของระบบประเภท ตัวอย่างเช่น C เป็นภาษาที่พิมพ์แบบคงที่ซึ่งไม่ปลอดภัยสำหรับประเภท - พอยน์เตอร์ช่วยให้คุณทำทุกอย่างที่คุณต้องการแม้กระทั่งสิ่งที่จะทำให้โปรแกรมของคุณพัง Javascript นั้นถูกพิมพ์แบบไดนามิก แต่ก็ปลอดภัยต่อการพิมพ์ด้วยเช่นกัน: คุณไม่สามารถดำเนินการที่จะทำให้โปรแกรมของคุณเสียหาย C # ส่วนใหญ่เป็นประเภทที่ปลอดภัย แต่คุณสามารถทำเครื่องหมายส่วนต่าง ๆ ของรหัสอย่างชัดเจนunsafeและทำสิ่งที่ไม่ปลอดภัยอีกต่อไป

Google Go ยังเป็นประเภทที่ปลอดภัยในแง่ที่ว่าคุณไม่สามารถยุ่งกับประเภทและทำให้โปรแกรมขัดข้อง (ไม่มีการเข้าถึงตัวชี้โดยตรง)


นอกเสียจากคุณใช้แพ็คเกจ "ไม่ปลอดภัย" ซึ่งในกรณีนี้คุณสามารถชนโปรแกรมในแบบที่คุณชอบ :)
Eloff

คุณสามารถยุ่งกับประเภทและมีการเข้าถึงตัวชี้ และใช่คุณสามารถพังโปรแกรมของคุณได้โดยง่าย
eithed

4

มันถูกพิมพ์อย่างปลอดภัยในประเภทที่จะไม่ถูกตีความผิด แต่ประเภทที่ไม่ถูกต้องสามารถทำให้โปรแกรมตื่นตระหนก


ฉันไม่เข้าใจหมายความว่าสามารถรวบรวมรหัสที่ไม่ใช่ประเภทที่ปลอดภัยได้จริงหรือ (ซึ่งเป็นไปไม่ได้ใน c # ยกเว้นว่าเราใช้การเปลี่ยนแปลง)
Pacerier

การยืนยันประเภท, แบบชาญฉลาดนั้นเป็นเหมือนการเรียกวิธีการในแบบไดนามิก
dan_waterworth

ตกลงดังนั้นในระยะสั้นมันไม่มีประเภทความปลอดภัยที่ c # อนุญาตหรือไม่
Pacerier

ทำเช่นนี้หากคุณไม่พิมพ์ข้อความยืนยัน
dan_waterworth

5
@Pacerier: เป็นไปได้อย่างสมบูรณ์ในการใช้งานนิพจน์ที่พิมพ์ผิดใน C # โดยไม่มีการเปลี่ยนแปลง: เพียงแค่ใส่ casts ทุกที่ (ซึ่งโดยพื้นฐานแล้วเป็นประเภทการยืนยัน)
sepp2k

-1

ชนิดแผนที่ของ Go ไม่ปลอดภัยสำหรับเธรด แต่ถูกพิมพ์แบบคงที่ มันไม่ได้มีมรดกประเภทโปรแกรมทั่วไปยืนยันวิธีการบรรทุกเกินพิกัดหรือคำนวณตัวชี้ใดอย่างหนึ่งและสำหรับเหตุผลที่ดี

ความปลอดภัยประเภทและความปลอดภัยของหน่วยความจำมีจุดมุ่งหมายระยะยาวที่นี่แทนปัญหา

ความปลอดภัยของประเภทแสดงค่าใช้จ่ายในกิโลไบต์และเมกะไบต์ซึ่งเป็นที่ยอมรับ Go ได้รับการออกแบบด้วย MapReduce และ "Big data" ซึ่ง exobytes เป็นเพตาไบต์ของข้อมูลซึ่งนำเสนอปัญหาด้านประสิทธิภาพด้วยความปลอดภัยของประเภทการตรวจสอบประเภท (Boxing / unboxing) สร้างค่าโสหุ้ย

ความปลอดภัยของประเภทสามารถ จำกัด ในการพิมพ์ย่อยและ polymorphism และในการพิมพ์เป็ด (cast object to object) สิ่งนี้สร้างอันตรายและเป็นพื้นที่ที่ภาษาเช่น Go มีประโยชน์อย่างมาก C ++ และ Java ไม่ได้ถูกแทนที่ด้วย Go เป็นภาษาใหม่ที่จะช่วยกระจายการเขียนโปรแกรมและระบบขนานอย่างหนาแน่น

คำแถลงที่ยิ่งใหญ่ของ Bruce Eckel - "Go เหมาะสมกว่าสำหรับปัญหาที่ C ++ เดิมตั้งใจจะแก้ปัญหา" เป็นที่ถกเถียงกัน C ++ เป็นภาษาที่มีประสิทธิภาพมากและการใช้งาน Boost ของ MapReduce นั้นมีประสิทธิภาพมาก

การเห็นพ้องด้วยกันคืออนาคต ประเภทความปลอดภัยเป็นหัวข้อที่ถกเถียงกันมากและอาจเป็นภาษาแรกที่ใช้ในการแก้ไขปัญหานี้ใน 20 ปีหรือตั้งแต่ Algol


3
น่าเศร้าที่ฉันต้องการชื่อเสียงมากกว่านี้เพื่อ -1 คำตอบนี้ ความปลอดภัยของประเภทไม่ใช่ค่าใช้จ่ายค่าใช้จ่ายในการดำเนินการจริงไม่ได้วัดเป็นหน่วยของไบต์และการไปมีการชกมวย / การเลิกทำกล่องในแง่ของ Java การพิมพ์แบบสแตติกช่วยให้คอมไพเลอร์ทำการปรับให้เหมาะสมยิ่งกว่าภาษาที่พิมพ์แบบไดนามิกได้ การลดแผนที่ไม่ได้อยู่ที่นี่หรือที่นั่นเช่นเดียวกันกับความปลอดภัยของด้าย
Eloff

สำนวนของ Golang ที่ให้คุณยืนยันประเภทโดยใช้อินเตอร์เฟสที่ว่างเปล่าเป็นรูปแบบทั่วไปเพื่อหลีกเลี่ยงการใช้งาน generics เนื่องจากคุณสมบัติทางภาษาไม่ใช่สิ่งที่ฉันคิดว่าเป็น "type safe" และในขณะที่มันทำให้สเป็คภาษาง่ายเมื่อปัญหา เกิดขึ้น (และมันจะ) มันทิ้งความซับซ้อนบนจานของคนที่เหลือตอนนี้เพื่อแก้ปัญหาด้วยม้วนท่อประปา golang เรียกคุณลักษณะ ดูเหมือนว่ามันจะไม่เหมือนภาษาที่ได้รับการออกแบบในช่วง 2 ทศวรรษที่ผ่านมาเพราะมีภาษาที่ให้ความปลอดภัยในการพิมพ์ด้วยวิธีที่ดีกว่ามาก
tsturzl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.