คำถามติดแท็ก language-design

คำถามที่เกี่ยวข้องกับการออกแบบและโครงสร้างของภาษาโปรแกรม

15
คุณจะออกแบบภาษาการเขียนโปรแกรมอย่างไร [ปิด]
หากคุณออกแบบภาษาโปรแกรมคุณจะทำอย่างไร คุณจะใส่ลูกเล่นอะไรลงไป? คุณจะทิ้งอะไรไป พิมพ์แบบคงที่หรือแบบไดนามิก? พิมพ์อย่างรุนแรงหรืออ่อนแอ รวบรวมหรือตีความ? ปรับคำตอบของคุณ

9
เหตุใดจึงมีการสนับสนุนที่ จำกัด สำหรับ Design by Contract ในภาษาการเขียนโปรแกรมที่ทันสมัยที่สุด?
ฉันเพิ่งค้นพบการออกแบบตามสัญญา (DbC) และฉันพบว่ามันเป็นวิธีที่น่าสนใจอย่างยิ่งในการเขียนโค้ด เหนือสิ่งอื่นใดดูเหมือนว่าจะนำเสนอ: เอกสารที่ดีกว่า เนื่องจากสัญญาเป็นเอกสารจึงเป็นไปไม่ได้ที่จะล้าสมัย นอกจากนี้เนื่องจากสัญญาระบุว่าสิ่งที่รูทีนทำจะช่วยสนับสนุนการใช้ซ้ำได้ การดีบักง่ายขึ้น เนื่องจากการทำงานของโปรแกรมหยุดทันทีที่สัญญาล้มเหลวข้อผิดพลาดจึงไม่สามารถเผยแพร่ได้และการละเมิดการยืนยันที่เฉพาะเจาะจงน่าจะถูกเน้น สิ่งนี้ให้การสนับสนุนในระหว่างการพัฒนาและในระหว่างการบำรุงรักษา การวิเคราะห์เชิงสถิตที่ดีขึ้น DbC นั้นเป็นเพียงการนำตรรกะของ Hoare มาใช้และควรใช้หลักการเดียวกันนี้ ค่าใช้จ่ายในการเปรียบเทียบดูเหมือนจะค่อนข้างเล็ก: พิมพ์ลายนิ้วมือพิเศษ เนื่องจากสัญญาต้องถูกสะกดออกมา ใช้เวลาฝึกอบรมจำนวนหนึ่งเพื่อให้คุ้นเคยกับสัญญาการเขียน ตอนนี้การทำความคุ้นเคยกับ Python เป็นหลักฉันตระหนักว่าในความเป็นจริงเป็นไปได้ที่จะเขียนเงื่อนไขเบื้องต้น (เพียงแค่โยนข้อยกเว้นสำหรับอินพุตที่ไม่เหมาะสม) และเป็นไปได้ที่จะใช้การยืนยันเพื่อทดสอบ postconditions อีกครั้ง แต่มันเป็นไปไม่ได้ที่จะจำลองคุณสมบัติบางอย่างเช่น 'เก่า' หรือ 'ผลลัพธ์' โดยไม่ต้องใช้เวทมนตร์พิเศษที่ในที่สุดจะได้รับการพิจารณาว่าไม่เป็น Pythonic (นอกจากนี้ยังมีห้องสมุดเพียงไม่กี่แห่งที่ให้การสนับสนุน แต่ท้ายที่สุดฉันได้รับความรู้สึกว่ามันผิดที่จะใช้พวกเขาเนื่องจากนักพัฒนาส่วนใหญ่ทำไม่ได้) ฉันคิดว่ามันเป็นปัญหาที่คล้ายกันสำหรับภาษาอื่น ๆ ทั้งหมด (ยกเว้นแน่นอน ไอเฟล) สัญชาตญาณของฉันบอกฉันว่าการขาดการสนับสนุนต้องเป็นผลมาจากการปฏิเสธการฝึกฝน แต่การค้นหาทางออนไลน์นั้นไม่ประสบผลสำเร็จ ฉันสงสัยว่าบางคนสามารถอธิบายได้ว่าทำไมภาษาสมัยใหม่ส่วนใหญ่จึงให้การสนับสนุนเพียงเล็กน้อย DbC มีข้อบกพร่องหรือมีราคาแพงเกินไป? หรือเป็นเพียงล้าสมัยเนื่องจาก Extreme Programming และวิธีการอื่น ๆ ?

12
เหตุใดภาษาการเขียนโปรแกรมส่วนใหญ่จึงมีคำหลักหรือไวยากรณ์พิเศษสำหรับการประกาศฟังก์ชั่น [ปิด]
ภาษาโปรแกรมส่วนใหญ่ (ทั้งภาษาแบบไดนามิกและแบบคงที่) มีคำหลักพิเศษและ / หรือไวยากรณ์ที่มีลักษณะแตกต่างจากการประกาศตัวแปรสำหรับฟังก์ชั่นการประกาศ ฉันเห็นฟังก์ชั่นเช่นเดียวกับการประกาศเอนทิตีที่มีชื่ออื่น: ตัวอย่างเช่นใน Python: x = 2 y = addOne(x) def addOne(number): return number + 1 ทำไมจะไม่ล่ะ: x = 2 y = addOne(x) addOne = (number) => return number + 1 ในทำนองเดียวกันในภาษาเช่น Java: int x = 2; int y = addOne(x); int addOne(int x) { return …

4
ไปได้เร็วแค่ไหน?
Go เป็นหนึ่งในไม่กี่ภาษาที่ควรจะเรียกใช้ 'ใกล้กับโลหะ' นั่นคือมันถูกรวบรวมพิมพ์แบบคงที่และเรียกใช้งานโค้ดโดยไม่ต้องใช้ VM สิ่งนี้ควรให้ความได้เปรียบด้านความเร็วเหนือ Java, C # และอื่น ๆ อย่างไรก็ตามดูเหมือนว่าอยู่หลัง Java (ดูProgramming Language Shootout ) ฉันสมมติว่าคอมไพเลอร์ที่มีวุฒิภาวะน้อยกว่ามีความรับผิดชอบอย่างมากในเรื่องนี้ แต่มีเหตุผลอื่นอีกไหม? มีอะไรในการออกแบบของ Go ที่จะป้องกันไม่ให้รันเร็วกว่าพูด Java หรือไม่? ฉันมีมุมมองที่ไม่ซับซ้อนมากของแบบจำลองรันไทม์ แต่ดูเหมือนว่าอย่างน้อยในหลักการแล้วมันควรจะสามารถทำงานได้เร็วกว่าจาวาเพราะต้องมีการประมวลผลโค้ดเนทีฟ

8
ข้อเสียของการจัดการหน่วยความจำตามขอบเขต
ฉันชอบการจัดการหน่วยความจำตามขอบเขต (SBMM) หรือRAIIจริงๆแล้วเนื่องจากชุมชน C ++ เป็นที่รู้จักกันมากกว่าปกติ เท่าที่ฉันรู้ยกเว้น C ++ (และ C) ไม่มีภาษากระแสหลักอื่น ๆ ที่ใช้อยู่ในปัจจุบันซึ่งทำให้ SBMM / RAII เป็นกลไกการจัดการหน่วยความจำหลักและแทนที่จะต้องการใช้การรวบรวมขยะ (GC) ฉันพบว่ามันค่อนข้างสับสนตั้งแต่ SBMM ทำให้โปรแกรมกำหนดค่าได้มากขึ้น (คุณสามารถบอกได้อย่างแม่นยำเมื่อวัตถุถูกทำลาย) ในภาษาที่ใช้ GC คุณมักจะต้องทำการจัดการทรัพยากรด้วยตนเอง (ดูที่การปิดไฟล์ใน Java เช่น) ซึ่งบางส่วนเอาชนะวัตถุประสงค์ของ GC และยังมีข้อผิดพลาดเกิดขึ้นได้ง่าย หน่วยความจำฮีปสามารถ (ขอบเขตอย่างสวยงามมาก, imo) ได้เช่นกัน (ดูstd::shared_ptrใน C ++) ทำไม SBMM ถึงไม่ใช้กันอย่างแพร่หลาย? ข้อเสียของมันคืออะไร?

5
เหตุใด C # จึงไม่มีขอบเขตในบล็อกกรณี
ฉันกำลังเขียนรหัสนี้: private static Expression<Func<Binding, bool>> ToExpression(BindingCriterion criterion) { switch (criterion.ChangeAction) { case BindingType.Inherited: var action = (byte)ChangeAction.Inherit; return (x => x.Action == action); case BindingType.ExplicitValue: var action = (byte)ChangeAction.SetValue; return (x => x.Action == action); default: // TODO: Localize errors throw new InvalidOperationException("Invalid criterion."); } } และรู้สึกประหลาดใจที่พบข้อผิดพลาดในการคอมไพล์: ตัวแปรท้องถิ่นชื่อ 'การกระทำ' ถูกกำหนดไว้แล้วในขอบเขตนี้ …

26
สิ่งใดที่คุณต้องการให้นักออกแบบภาษาให้ความสนใจ? [ปิด]
วัตถุประสงค์ของคำถามนี้คือการรวบรวมรายการซักผ้าของคุณสมบัติการเขียนโปรแกรมภาษาที่คุณขาดไม่ได้หรือต้องการเป็นภาษาหลักที่คุณเลือก จุดประสงค์ของคำถามนี้คือนำเสนอมุมมองของการออกแบบที่อ่อนล้านักออกแบบภาษาส่วนใหญ่อาจไม่ได้คิดถึง ดังนั้นแทนที่จะคิดเกี่ยวกับคุณสมบัติภาษา X ลองคิดดูฟิสโซฟิคสักหน่อย หนึ่งในอคติของฉันและบางทีมันอาจเป็นการโต้เถียงกันคือด้านวิศวกรรมที่นุ่มนวล - สิ่งที่ควรทำ - สิ่งสำคัญคือหลายครั้งที่สำคัญกว่าด้านคอนกรีต ตัวอย่างเช่น Ruby ได้รับการออกแบบโดยมีเป้าหมายเพื่อพัฒนาความสุขของนักพัฒนา ในขณะที่ความคิดเห็นของคุณอาจถูกปนกันไม่ว่าจะนำเสนอหรือไม่ก็ตามความจริงที่เป็นเป้าหมายนั้นหมายความว่าตัวเลือกบางอย่างในการออกแบบภาษาได้รับอิทธิพลจากปรัชญานั้น กรุณาอย่าโพสต์: สงครามเปลวไฟวากยสัมพันธ์ มาดูกันเรามีการตั้งค่าของเราและไวยากรณ์เป็นสิ่งสำคัญตามที่เกี่ยวข้องกับการออกแบบภาษา ฉันแค่ต้องการหลีกเลี่ยงการต่อสู้ที่ยิ่งใหญ่ของธรรมชาติของ emacs กับ VI (ซึ่งผู้คนจำนวนมากในทุกวันนี้ไม่รู้อะไรเลย) "ภาษาใด ๆ ที่ไม่มีคุณลักษณะ X ไม่สมควรมีอยู่" พิมพ์ข้อคิดเห็น มีอย่างน้อยหนึ่งเหตุผลสำหรับภาษาการเขียนโปรแกรมทั้งหมดที่มีอยู่ - ดีหรือไม่ดี โปรดทำโพสต์: แนวความคิดที่เป็นแนวร่วมที่นักออกแบบภาษาดูเหมือนจะพลาด แนวคิดทางเทคนิคที่ดูเหมือนว่าจะนำมาใช้ไม่ดีบ่อยกว่าไม่ โปรดยกตัวอย่างความเจ็บปวดที่เกิดขึ้นและหากคุณมีความคิดว่าคุณต้องการให้มันทำงานอย่างไร สิ่งที่คุณต้องการอยู่ในห้องสมุดทั่วไปของแพลตฟอร์ม แต่ไม่ค่อยมี หนึ่งในโทเค็นเดียวกันสิ่งต่าง ๆ ที่มักจะอยู่ในห้องสมุดทั่วไปที่คุณไม่ต้องการ คุณสมบัติด้านแนวคิดเช่นการสนับสนุนการจัดการการทดสอบ / การยืนยัน / สัญญา / ข้อผิดพลาดที่คุณต้องการให้ภาษาการเขียนโปรแกรมทั้งหมดจะใช้งานได้อย่างถูกต้องและกำหนดอย่างเหมาะสม ฉันหวังว่ามันจะเป็นหัวข้อที่สนุกและน่าตื่นเต้น แก้ไข: อธิบายสิ่งที่ฉันหมายถึงโดย …

2
ภาษาการเขียนโปรแกรมรุ่นที่ 4 และ 5 คืออะไร มีอะไรอีกบ้าง? [ปิด]
เนื่องจากมันถูกจำแนกในระดับโรงเรียน / วิทยาลัยภาษาการเขียนโปรแกรมยอดนิยม (C #, Java, C ++) เป็นภาษาที่ 3 ทั้งหมด (ด้วยระดับที่สูงกว่าของนามธรรมจากชิ้นส่วนทางกายภาพของเครื่อง) นอกจากนี้ภาษาแอสเซมบลีถูกจัดประเภทเป็นภาษาที่ 2 และภาษาเครื่องเป็นภาษาที่ 1 ตอนแรกฉันคิดว่า SQL ควรถูกพิจารณาว่าเป็นภาษาเจนเนอเรชั่นที่ 4 เพราะมันเป็นนามธรรมและห่างไกลจากรายละเอียดของการวนซ้ำและการอธิบายเพิ่มเติม ตอนนี้ฉันพบว่ามีภาษารุ่นที่ 4 และรุ่นที่ 5 แต่อะไรคือพื้นฐานของภาษาโปรแกรมหรือเทคโนโลยีใด ๆ ที่จะจัดประเภทเป็นภาษารุ่นที่ 4 หรือ 5 นอกจากนี้ยังมีภาษารุ่นที่ 6 หรือ 7 เช่นกัน?

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

3
การพัฒนา Java โดยทั่วไปเกี่ยวข้องกับคลาสย่อยมากกว่า C # /. NET หรือไม่
ฉันเพิ่งเริ่มดูการพัฒนา Android สิ่งนี้นำฉันกลับสู่โลกของการพัฒนาซอฟต์แวร์ Java ครั้งสุดท้ายที่ฉันทำงานกับ Java ฉันจะยอมรับว่าฉันไม่เข้าใจ OOP เท่าที่ฉันคิดตอนนี้ หลังจากใช้งาน C # เป็นส่วนใหญ่ในอาชีพของฉันฉันสังเกตเห็นความแตกต่างที่น่าตกใจในการใช้ Java และ C # ในการสืบทอด ใน C # ดูเหมือนว่าสามารถหลีกเลี่ยงการสืบทอดในสถานการณ์ส่วนใหญ่ งานในมือสามารถทำได้โดยใช้คลาสที่เป็นรูปธรรมของ. NET Framework ใน Java จากสิ่งที่ฉันรวบรวมจากตัวอย่างโค้ดดูเหมือนว่า Java framework จะให้ส่วนต่อประสานหรือคลาสนามธรรมที่มีความหมายที่จะนำไปใช้ / ขยายโดยนักพัฒนา ดูเหมือนว่าจะมีความแตกต่างใหญ่เกินไปที่จะทำให้สไตล์ อะไรคือเหตุผลเบื้องหลังสิ่งนี้ ฉันรู้สึกว่าฉันจะไม่เขียนโค้ด Java ที่สะอาดจนกว่าฉันจะเข้าใจสิ่งนี้ นอกจากนี้ยังมีข้อ จำกัด เพียงแค่ Android SDK หรือนี่เป็นแนวทางแบบกว้าง ๆ ของ OOP หรือไม่? หรือใส่ในอีกทางหนึ่ง มันเกี่ยวกับการออกแบบของสองภาษานี้ที่ดูเหมือนว่าจะส่งเสริมให้ใช้มรดกมากกว่าหรือน้อยกว่าอีก? …

5
เมื่อไหร่ที่จะต้องรวบรวมภาษาของตัวเองเป็นรหัส C ก่อน?
เมื่อออกแบบภาษาการเขียนโปรแกรมของตัวเองมันจะเหมาะสมที่จะเขียนตัวแปลงที่ใช้ซอร์สโค้ดและแปลงเป็นรหัส C หรือ C ++ เพื่อให้ฉันสามารถใช้คอมไพเลอร์ที่มีอยู่เช่น gcc เพื่อจบด้วยรหัสเครื่อง? มีโครงการที่ใช้วิธีนี้หรือไม่?

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

6
ทำไมภาษาการเขียนโปรแกรมอนุญาตให้แชโดว์ / การซ่อนตัวแปรและฟังก์ชั่น?
ภาษาการเขียนโปรแกรมที่นิยมมากที่สุด (เช่น C ++, Java, Python ฯลฯ ) มีแนวคิดของการซ่อน / แชโดว์ของตัวแปรหรือฟังก์ชั่น เมื่อฉันพบการซ่อนหรือเงาพวกเขาเป็นสาเหตุของข้อบกพร่องที่หายากและฉันไม่เคยเห็นกรณีที่ฉันพบว่าจำเป็นต้องใช้คุณสมบัติเหล่านี้ของภาษา สำหรับฉันมันจะเป็นการดีกว่าถ้าหากไม่อนุญาตให้ซ่อนและซ่อนเงา มีใครรู้บ้างเกี่ยวกับการใช้แนวคิดเหล่านี้ อัปเดต: ฉันไม่ได้อ้างถึงการห่อหุ้มของสมาชิกในชั้นเรียน (ส่วนตัว / สมาชิกที่ได้รับความคุ้มครอง)

10
ทำไม Math.Sqrt () เป็นฟังก์ชันคงที่
ในการอภิปรายเกี่ยวกับวิธีการแบบคงที่และอินสแตนซ์ฉันคิดเสมอว่าSqrt()ควรเป็นวิธีการแบบอินสแตนซ์ของชนิดตัวเลขแทนวิธีแบบคงที่ ทำไมถึงเป็นอย่างนั้น? เห็นได้ชัดว่ามันทำงานกับค่า // looks wrong to me var y = Math.Sqrt(x); // looks better to me var y = x.Sqrt(); ToString()ชนิดของมูลค่าชัดสามารถมีวิธีการเช่นเดียวกับในหลายภาษามีวิธีการเช่น เพื่อตอบคำถามจากความคิดเห็น: ทำไม1.Sqrt()ไม่ควรถูกกฎหมาย? 1.ToString()คือ. บางภาษาไม่อนุญาตให้มีวิธีการในประเภทค่า แต่บางภาษาสามารถ ฉันกำลังพูดถึงสิ่งเหล่านี้รวมถึง Java, ECMAScript, C # และ Python (พร้อมคำ__str__(self)จำกัดความ) เช่นเดียวกับฟังก์ชั่นอื่น ๆ เช่นceil(), floor()ฯลฯ

4
เหตุใด. .compareTo () ในอินเทอร์เฟซในขณะที่. equals () อยู่ในคลาสใน Java
ฉันต้องการทราบว่าทำไมถึง.compareTo()อยู่ในComparableอินเทอร์เฟซในขณะที่วิธีการเช่น.equalsนั้นอยู่ในObjectชั้นเรียน สำหรับฉันดูเหมือนว่า.compareTo()จะไม่มีวิธีการเช่นนั้นอยู่ในObjectชั้นเรียนอยู่แล้ว ที่จะใช้.compareTo()คุณใช้Comparableอินเตอร์เฟซและใช้.compareTo()วิธีการเพื่อวัตถุประสงค์ของคุณ สำหรับทาง.equals()วิธีการคุณเพียงแค่แทนที่วิธีการในชั้นเรียนของคุณเนื่องจากชั้นเรียนทั้งหมดได้รับมรดกจากObjectชั้นเรียน คำถามของฉันคือเหตุใดจึงมีวิธีการ.compareTo()ในอินเทอร์เฟซที่คุณใช้งานมากกว่าในคลาสอย่างObject? เช่นเดียวกันทำไมจึงเป็น.equals()วิธีการในชั้นเรียนObjectและไม่ได้อยู่ในอินเตอร์เฟซบางอย่างที่จะดำเนินการ?

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