ระบบชนิดสแตติกส่งผลกระทบต่อการออกแบบภาษาที่ใช้ต้นแบบอย่างไร


15

บทความวิกิพีเดียภาษาต้นแบบที่ใช้มีวรรคต่อไปนี้:

ระบบที่ทำงานบนต้นแบบเกือบทั้งหมดนั้นใช้ภาษาตีความและพิมพ์แบบไดนามิก อย่างไรก็ตามระบบที่ใช้ภาษาที่พิมพ์แบบสแตติกนั้นเป็นไปได้ทางเทคนิค

ระบบชนิดสแตติกทำในสิ่งที่กำหนดข้อ จำกัด หรือแนะนำความซับซ้อนในภาษาที่ใช้ต้นแบบและทำไมมีภาษาต้นแบบที่พิมพ์แบบไดนามิกมากขึ้น?


2
+1 และรายการโปรด: ฉันไตร่ตรองว่าตัวเองอยู่พักหนึ่งแล้วและไม่พบปัญหาที่ยากเป็นพิเศษกับระบบโครงสร้างแบบโครงสร้าง อันที่จริงแล้วสิ่งนี้ทำให้ฉันรำคาญใจอย่างมากจนฉันต้องการที่จะก้าวไปข้างหน้าและพยายามสร้างภาษาที่ใช้ต้นแบบต้นแบบแบบคงที่เพื่อดูว่ามีปัญหาอะไรบ้าง ...

ฉันเพียงการเริ่มต้นกระบวนการที่ตัวเองด้วยเหตุผลเดียวกัน :)
โจ

คำตอบ:


6

เส้นแบ่งระหว่างชนิดพื้นฐานและวัตถุนั้นเบลอและมักจะมีการทำเทียม ตัวอย่างเช่นใน C โครงสร้างเป็นเพียงกลุ่มของเร็กคอร์ดเพียงชนิดที่ไม่ใช่วัตถุที่ได้รับ ใน C ++, struct คือคลาสที่มีเขตข้อมูลสาธารณะทั้งหมดซึ่งเป็นวัตถุ ถึงกระนั้น C ++ ก็เกือบเข้ากันได้กับ C ... ชายแดนที่นี่อ่อนจริง ๆ

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

คุณอาจเก็บชนิดพื้นฐานและชนิดที่ไม่ใช่วัตถุเป็นแบบสแตติก แต่สิ่งนี้นำเสนอความแตกต่างที่แปลกประหลาดวัตถุนั้นเป็นชนิดที่อ่อนนุ่มไม่ใช่วัตถุที่จะถูกพิมพ์แบบคงที่และต้องสร้างบาร์ริเออร์อย่างหนักระหว่างคนทั้งสอง คุณควรจะสามารถเปลี่ยนโครงสร้างหรือไม่? สตริง? Number ควรเป็นคลาสหรือชนิดพื้นฐานหรือชุดของชนิดพื้นฐาน, int / float / bignum / etc?

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

พิมพ์คงที่คือ:

  • ง่ายต่อการใช้
  • เร็วขึ้น / มีประสิทธิภาพมากขึ้น
  • ปลอดภัยมากขึ้น
  • ง่ายต่อการบำรุงรักษา / บันทึกเอกสารระบบใหญ่เนื่องจากสิ่งที่เป็นนามธรรม

พิมพ์แบบไดนามิกคือ:

  • เขียนได้เร็วขึ้น
  • รัดกุมมากขึ้น
  • ภาษาที่ง่ายต่อการเรียนรู้
  • ให้อภัยมากขึ้นสำหรับข้อผิดพลาดในการออกแบบ

ด้วยการผสมผสานทั้งสองอย่างเข้าด้วยกันคุณเสียสละมาก

  • การนำไปใช้จะยากกว่าการดำเนินการสองแบบก่อนหน้านี้
  • ความเร็วขึ้นอยู่กับว่าคุณใช้ประเภทซอฟต์หรือไม่ ... ถ้าเป็นเช่นนั้นมันต่ำถ้าคุณไม่เลือกภาษาเลยทำไม?
  • ความปลอดภัยของประเภทอยู่นอกหน้าต่างสำหรับวัตถุทุกประเภท
  • การติดตามลักษณะของมอร์ฟประเภทหนึ่งไปอีกแบบนั้นเป็นงานที่ค่อนข้างยาก บันทึกไว้ - ยากมาก
  • คุณยังคงต้องทำบัญชีทั้งหมดด้วยประเภทพื้นฐานซึ่งฆ่าความกระชับและความเร็วในการเขียน
  • ความซับซ้อนของภาษานั้นสูงกว่า (ยากต่อการเรียนรู้) มากกว่าภาษาที่ "เจาะจง" ใด ๆ
  • "การให้อภัย" ของการพิมพ์แบบไดนามิกจะถูกแทนที่ด้วยแนวโน้มที่จะเกิดข้อผิดพลาดที่ยุ่งยากบางอย่างที่ไม่ตรงกันประเภทแอตทริบิวต์

1
อย่าลืมให้ตัวอย่างว่าทำไมวัตถุต้อง "ไม่แน่นอน" (ฉันถือว่าคุณหมายถึงการเพิ่มและลบแอตทริบิวต์ไม่ใช่การเปลี่ยนแปลงสิ่งเหล่านั้นเนื่องจากโดยทั่วไปแล้วไม่เกี่ยวข้องกับการพิมพ์)

@delnan: ไม่จริงในการเขียนโปรแกรมต้นแบบคุณสามารถขุดในความกล้าของวัตถุตามที่เห็นเหมาะสม, ลบ, เพิ่ม, แทนที่, ครอบคลุมทั้งวิธีการและคุณลักษณะในอินสแตนซ์สด นั่นคือจุดรวมและการเปลี่ยนที่สะดวกและยืดหยุ่นมากสำหรับการดัดแปลงวัตถุผ่านกฎเข้มงวดของการสืบทอดคลาสสิก หากภาษาใช้คลาสเป็นชนิดคุณจะไม่สามารถแก้ไขโครงสร้างได้ทันทีหากประเภทนั้นไม่นุ่ม
เอสเอฟ

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

@delnan: คุณแค่อธิบายการสืบทอดคลาสสิกผ่านการแต่งเพลง ใช่มันดูต้นแบบสวย ๆ และเป็นวิธีการเขียนโปรแกรมเชิงต้นแบบในภาษาต้นแบบการสืบทอดคลาสสิก มันแค่ตัด pb.p ออกไป 90% ของความสนุกฆ่าข้อได้เปรียบที่ยิ่งใหญ่ที่สุดของมัน ใช่ในการเปรียบเทียบการยิงเท้าแบบเก่า pb.p ที่โดดเด่นอย่างเต็มรูปแบบจะช่วยให้คุณยิงชาทั้งสองขาด้วยช้อนชา ถ้าคุณไม่ชอบพลังแบบนี้คุณควรยึดถือการสืบทอดคลาสสิก
เอสเอฟ

1
คุณสับสน "ไดนามิก" กับ "ต้นแบบ" เสรีภาพเหล่านี้ซึ่งไม่เข้ากันได้ดีกับระบบแบบสแตติกไม่ใช่คุณสมบัติของต้นแบบ แต่เป็นคุณสมบัติของพลวัต แน่นอนว่าการเพิ่มการพิมพ์แบบสแตติกป้องกันไม่ให้พวกเขา แต่พวกเขาไม่ได้เป็นส่วนหนึ่งของต้นแบบ (นั่นคือ IMGO ส่วนใหญ่ขาดเรียนในความโปรดปรานของการโคลนวัตถุที่จะทำหน้าที่เป็นผู้ปกครอง) พลวัตนั้นเป็นฉากตั้งฉากกับต้นแบบ ภาษาต้นแบบยอดนิยมทั้งหมดเกิดขึ้นเพื่อรวมเข้าด้วยกัน แต่เป็นอิสระจากต้นแบบดังกล่าวก่อนหน้านี้ พิจารณาข้อมูลโค้ดนี้ในภาษาสมมุติ: pastebin.com/9pLuAu9F มันไม่ใช่ต้นแบบอย่างไร

3

ความยากลำบากค่อนข้างตรงไปตรงมาเพื่อดู: การมองวัตถุเป็นพจนานุกรมของวิธีการหรือเป็นสิ่งที่ตอบสนองต่อข้อความให้สังเกตสิ่งต่อไปนี้เกี่ยวกับภาษา OO ที่พิมพ์แบบคงที่

  • โดยทั่วไปคีย์ / ข้อความพจนานุกรมทั้งหมดจะถูกประกาศล่วงหน้าโดยใช้ตัวระบุที่ประกาศแบบคงที่

  • มีการประกาศชุดข้อความล่วงหน้าและมีการเชื่อมโยงออบเจ็กต์กับชุดเหล่านี้เพื่อพิจารณาว่าจะตอบข้อความใด

  • การรวมความสัมพันธ์ของข้อความหนึ่งชุดเป็นชุดย่อยของข้อความอื่นจะถูกประกาศอย่างคงที่และชัดเจน ไม่ได้ประกาศ แต่เป็นส่วนย่อยที่ไม่ถูกต้อง

  • การตรวจสอบประเภทพยายามตรวจสอบให้แน่ใจว่าข้อความทั้งหมดถูกส่งไปยังวัตถุที่ตอบกลับเท่านั้น

ทุกความขัดแย้งเหล่านี้มีขอบเขตด้วยระบบที่ใช้ต้นแบบ:

  • ชื่อข้อความสามารถประกาศล่วงหน้าในรูปแบบของ "อะตอม" หรือสตริง interned หรืออะไร แต่อย่างน้อย; ความเป็นพลาสติกของวัตถุหมายถึงการกำหนดประเภทให้กับวิธีการนั้นเป็นสิ่งที่ไม่เหมาะสม

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

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

ซึ่งนำเราไปสู่จุดสุดท้ายซึ่งเราไม่ต้องการเปลี่ยนแปลง เรายังต้องการรับรองว่าข้อความจะถูกส่งไปยังวัตถุที่ตอบกลับเท่านั้น อย่างไรก็ตาม:

  • เราไม่สามารถทราบได้อย่างถาวรว่าข้อความใดบ้างที่อาจถูกจัดกลุ่มเข้าด้วยกัน
  • เราไม่สามารถรู้ได้ว่าการจัดกลุ่มใดเป็นส่วนย่อยของผู้อื่น
  • เราไม่สามารถรู้ได้ว่าการจัดกลุ่มใดเป็นไปได้
  • เราไม่สามารถระบุได้ว่าข้อโต้แย้งประเภทใดที่ถูกส่งไปพร้อมกับข้อความเดียว
  • โดยทั่วไปเราพบว่าเราไม่สามารถระบุอะไรได้มากในกรณีทั่วไปอย่างสมบูรณ์

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

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

โดยสรุป: มันเป็นไปได้มันเป็นเรื่องยากที่จะทำมากกว่าทั้งระบบสแตติกชนิดเล็กน้อยหรือระบบแบบไดนามิกโดยยึดตามข้อมูลเมตารันไทม์


1

ฉันเชื่อว่าวิธีการบรรลุภาษาที่มีการพิมพ์แบบคงที่ต้นแบบจะเป็นพื้นฐานของภาษาที่อยู่รอบ ๆ เทมเพลตและแนวคิด

แนวคิดเคยเป็นคุณลักษณะที่วางแผนไว้สำหรับ C ++ 0x รหัสทั่วไปในแม่แบบ C ++ นั้นแท้จริงแล้ว"เป็ดพิมพ์แบบคงที่" แนวคิดของ Concepts จะสามารถพูดบางสิ่งเกี่ยวกับสมาชิกที่ต้องการและลักษณะของชนิดโดยไม่ต้องการหรืออ้างถึงโมเดลการสืบทอดคลาสที่อ้างอิงความสัมพันธ์นั้น (เพราะต้องทำงานกับเทมเพลตโค้ดที่มีอยู่แล้วซึ่งเป็น "เป็ดเป็ดแบบคงที่" )

ในภาษาที่มีพื้นฐานมาจากเทมเพลตและแนวคิดมันจะเป็นแนวคิดที่อิงต้นแบบและเทมเพลตจะช่วยให้คุณเป็นอิสระจากการใส่ใจเกี่ยวกับโมเดลคลาสใด ๆ ที่อาจใช้หรือไม่ใช้ในการปรับใช้ค่าประเภทต่างๆ

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.