นักออกแบบภาษาทำอะไรเพื่อตัดสินใจหรือพิสูจน์ว่าคุณลักษณะเฉพาะทำงานได้อย่างถูกต้อง


11

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

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

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

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

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

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

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

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

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


เมื่อคุณพูดว่า "ผู้ออกแบบภาษา" คุณหมายถึงคนที่สร้างคอมไพเลอร์หรือเพียงแค่ไวยากรณ์หรือทั้งสองอย่าง?
Snoop

6
@StevieV: การออกแบบภาษามีความแตกต่างและเป็นอิสระจากการใช้งาน ตัวอย่างเช่น Lisp ได้รับการออกแบบโดย John McCarthy เพื่อให้เข้าใจได้ง่ายขึ้นแทน to-แคลคูลัส อย่างไรก็ตามเขาไม่ได้ใช้มัน ในความเป็นจริงเมื่อสตีฟรัสเซลนักเรียนของเขาต้องการใช้ Lisp แม็คคาร์ธีบอกเขาว่าเขาเชื่อว่ามันเป็นไปไม่ได้ที่จะนำ Lisp ไปใช้! APL ได้รับการออกแบบเป็นภาษาสำหรับการสอนคณิตศาสตร์ ต่อมา IBM ใช้เพื่อระบุพฤติกรรมของ System / 360 อย่างเป็นทางการซึ่งภาษานั้นมีหลายนามสกุล ในเวลานี้มันยังไม่ได้ใช้งาน Plankalkülได้รับการออกแบบโดย Konrad
Jörg W Mittag

4
Zuse 1942-1946 แต่มีการใช้งานในปี 1975 Niklaus Wirth ได้ออกแบบภาษาของเขาเป็นครั้งแรกและนำไปใช้หลังจากออกแบบเสร็จเท่านั้น ออกแบบ - จากนั้นให้นักเรียนแปลคอมไพเลอร์เป็นภาษาอื่นสำหรับการบูตสแตรป ภาษาทางวิชาการจำนวนมากไม่เคยถูกนำมาใช้ แต่ถูกออกแบบมาเพื่อพิสูจน์จุดหรือการทดสอบด้วยคุณลักษณะภาษาบางอย่างในทางที่เป็นนามธรรม Smalltalk ถูกสร้างขึ้นเนื่องจากการเดิมพันร่วมกัน: Alan Kay เดิมพันที่เขาทำได้
Jörg W Mittag

3
ออกแบบภาษาเชิงวัตถุบนกระดาษหน้าเดียว Dan Ingalls เดิมพันว่าเขาสามารถใช้ภาษานั้นได้ภายในสองสามวัน (และเขาทำมันเป็นภาษาเบสิกทุกภาษา!) ภาษาเป็นวัตถุทางคณิตศาสตร์ที่มีอยู่เป็นอิสระจากคอมไพเลอร์ / ล่าม และพวกเขาสามารถออกแบบศึกษาและอภิปรายอย่างอิสระจากการใช้งานทางกายภาพใด ๆ
Jörg W Mittag

3
ต้องอ่าน: เกอเดล, Escher โสด บางครั้งมันก็แปลก แต่ท้ายที่สุดได้รับงานของทัวริงและ Godel มากมายที่มีผลต่อการออกแบบภาษาอย่างเป็นทางการ
RubberDuck

คำตอบ:


6

ฉันมีปัญหาในการหาข้อมูลอ้างอิงที่ถูกต้องในขณะนี้ แต่เมื่อไม่นานมานี้ฉันได้ดูวิดีโอหลายรายการโดยSimon Peyton Jonesซึ่งเป็นผู้สนับสนุนหลักในการออกแบบของ Haskell เขาเป็นนักพูดที่ยอดเยี่ยมเกี่ยวกับทฤษฎีการพิมพ์การออกแบบภาษาและอื่น ๆ อีกมากมายและมีวิดีโอมากมายให้เล่นฟรีบน youtube

Haskell มีการแสดงสื่อกลางซึ่งเป็นแคลคูลัสแลมบ์ดาเป็นหลักโดยเพิ่มสิ่งง่าย ๆ เพื่อให้ใช้งานได้ง่ายขึ้น แคลคูลัสแลมบ์ดาถูกนำมาใช้และพิสูจน์แล้วเนื่องจากคอมพิวเตอร์เป็นเพียงบุคคลที่คำนวณสิ่งต่าง ๆ จุดที่น่าสนใจที่ Simon Peyton Jones ทำบ่อยครั้งคือเมื่อใดก็ตามที่พวกเขาทำอะไรที่บ้าคลั่งและบ้าคลั่งกับภาษาเขาก็รู้ว่ามันฟังดูเป็นพื้นฐานเมื่อในที่สุดมันก็ลดกลับลงมาเป็นภาษากลางนั้น

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


2
ฉันเชื่อว่าข้อมูลอ้างอิงที่คุณกำลังมองหาอยู่ในหนึ่งในซีรีส์ "Adventures with Types in Haskell" บางทีนี่อาจเป็นเนื้อหาของกระดานในภาพย่อ ...
Jules

8

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

สำหรับการติดตั้งภาษามันเป็นรหัสที่เหมือนกัน คุณเขียนการทดสอบหน่วย คุณเขียนการทดสอบการรวม คุณทำรีวิวรหัส

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

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


4
The only thing that makes languages special is that they are (almost always) infinite. You literally cannot test all inputs.มันพิเศษจริงๆเหรอ? นั่นดูเหมือนจะเป็นกรณีทั่วไปสำหรับฉัน เช่นฟังก์ชันที่รับรายการเป็นอาร์กิวเมนต์จะมีจำนวนอินพุตไม่สิ้นสุด สำหรับขนาดใดก็ได้ที่คุณเลือกมีรายการขนาด n + 1
Doval

@doval - และสตริงด้วยฉันคิดว่า จุดที่ดี
Telastyn

4

สิ่งแรกและสิ่งที่ยากที่สุดที่นักออกแบบภาษาต้องดูแลเมื่อแนะนำคุณสมบัติใหม่คือการทำให้ภาษาของเขาสอดคล้องกัน:

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

เพื่อเป็นแนวทางในเรื่องนี้ผู้ออกแบบอาศัยกฎและหลักการออกแบบ วิธีการนี้ได้อธิบายไว้อย่างดีใน" การออกแบบและวิวัฒนาการของ C ++ " จาก Bjarne Stroustrupหนึ่งในหนังสือหายากที่อุทิศให้กับการออกแบบภาษา สิ่งที่น่าสนใจมากคือการเห็นว่าภาษานั้นไม่ค่อยได้รับการออกแบบในสุญญากาศและนักออกแบบก็ดูว่าภาษาของพวกเขาใช้คุณสมบัติที่คล้ายกันอย่างไร แหล่งอื่น (ออนไลน์และฟรี) เป็นหลักการออกแบบสำหรับภาษาจาวา

หากคุณดูการดำเนินการตามกฎหมายของคณะกรรมการกำหนดมาตรฐานสาธารณะคุณจะเห็นว่าเป็นกระบวนการข้อผิดพลาดในการทดลองมากขึ้น นี่คือตัวอย่างในโมดูล C ++ ซึ่งเป็นแนวคิดใหม่ที่จะนำเสนอในเวอร์ชันถัดไปของภาษา และนี่คือการวิเคราะห์ร่างหลังจากการเปลี่ยนแปลงภาษาเพื่อประเมินความสำเร็จ และที่นี่กระบวนการ Java Communityเพื่อกำหนดรายละเอียด Java ใหม่เช่นตัว API คุณจะเห็นว่างานนี้ดำเนินการโดยผู้เชี่ยวชาญหลายคนที่ร่างบทความแนวคิดและข้อเสนอแรก จากนั้นข้อเสนอเหล่านี้จะได้รับการตรวจสอบโดยชุมชน / คณะกรรมการที่ใหญ่ขึ้นซึ่งอาจแก้ไขข้อเสนอเพื่อให้แน่ใจว่ามีความมั่นคงในระดับที่สูงขึ้น


4

จะทดสอบคุณสมบัติภาษาการเขียนโปรแกรมได้อย่างไร เป็นคำถามที่ดีมากและฉันไม่แน่ใจว่าสถานะของศิลปะขึ้นอยู่กับงาน

คุณลักษณะใหม่แต่ละรายการสามารถโต้ตอบกับคุณสมบัติอื่น ๆ ทั้งหมด (สิ่งนี้มีผลต่อภาษา, เอกสาร, คอมไพเลอร์, ข้อความแสดงข้อผิดพลาด, IDEs, ห้องสมุด ฯลฯ ) ฟีเจอร์ต่างๆรวมกันเพื่อเปิดช่องโหว่หรือไม่? เพื่อสร้างกรณีขอบที่น่ารังเกียจ?

แม้นักออกแบบภาษาสมาร์ทมากทำงานอย่างหนักเพื่อรักษาความมั่นคงประเภทค้นพบการละเมิดดังกล่าวเป็นข้อผิดพลาดนี้เกิดสนิม ระบบการพิมพ์สนิมไม่ได้ดังนั้นเห็นได้ชัดกับผม แต่ผมคิดว่าในกรณีนี้มีระบบการพิมพ์ค่าติดตามชีวิตหมายถึงอายุการใช้งาน "Subtyping" (subranges) ปะทะกับความคาดหวังสำหรับ subtyping สามัญ coercions การอ้างอิงและความไม่แน่นอนในการสร้างช่องโหว่ที่staticอายุการใช้งาน ref สามารถชี้ไปที่ค่าการจัดสรรสแต็กและต่อมากลายเป็นข้อมูลอ้างอิงห้อย

เมื่อ "ทำงานอย่างถูกต้อง" ฉันหมายถึงฟีเจอร์นี้จะช่วยแก้ปัญหาที่ตั้งใจไว้ได้อย่างถูกต้อง

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

กล่าวอีกนัยหนึ่งการใช้งานมีความสำคัญต่อการออกแบบภาษาเหมือนกับการออกแบบชนิดอื่น นี่เป็นการออกแบบ (1) สำหรับการใช้งาน (เช่นรู้จักผู้ชมของคุณ) และ (2) การทดสอบการใช้

ตัวอย่างบทความในหัวข้อนี้คือ“ โปรแกรมเมอร์คือผู้คนเช่นกันนักเขียนโปรแกรมภาษาและนักออกแบบ API สามารถเรียนรู้มากมายจากการออกแบบปัจจัยมนุษย์”

ตัวอย่างคำถาม SE ในหัวข้อนี้มีการทดสอบไวยากรณ์ของภาษาการเขียนโปรแกรมใด ๆ หรือไม่?

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

ภาษาเช่น Smalltalk, Python และ Dart ได้รับการออกแบบโดยเน้นการใช้งาน เห็นได้ชัดว่า Haskell ไม่ใช่


Haskell นั้นใช้งานได้จริง มันยากที่จะเรียนรู้เพราะมันเป็นกระบวนทัศน์ที่แตกต่างอย่างสิ้นเชิงกับ Python / C / Java เป็นต้น แต่ในฐานะที่เป็นภาษามันค่อนข้างใช้งานง่าย
อัฒภาค
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.