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

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

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

5
ทำไมการเรียนล่ามเสียงกระเพื่อมในเสียงกระเพื่อมจึงสำคัญ?
ฉันได้เห็นหลักสูตร CS และคำแนะนำการเรียนรู้มากมายสำหรับโปรแกรมเมอร์ใหม่ที่เรียกร้องให้โปรแกรมเมอร์ที่ต้องการศึกษาล่ามเสียงกระเพื่อมที่เขียนโดยเฉพาะในเสียงกระเพื่อม เว็บไซต์ทั้งหมดเหล่านี้พูดสิ่งที่คล้ายกับ "ของมันเปิดเผยทางปัญญา" "มันเป็นประสบการณ์ที่ตรัสรู้โปรแกรมเมอร์ทุกคนอย่างจริงจังควรจะมี" หรือ "มันแสดงให้คุณเห็นความสัมพันธ์ของฮาร์ดแวร์ / ซอฟแวร์" และงบคลุมเครืออื่น ๆ โดยเฉพาะอย่างยิ่งจากบทความนี้นำมาจากนี้วิธีการที่มีชื่อเสียง ความเชื่อมั่นทั่วไปของคำถามของฉันคือเสียงกระเพื่อมบรรลุเป้าหมายข้างต้นและทำไมเสียงกระเพื่อม? ทำไมจึงไม่ใช้ภาษาอื่น ฉันถามสิ่งนี้เพราะฉันเพิ่งเสร็จสิ้นการเขียนล่ามแบบแผนในโครงการ (นำมาจาก SICP http://mitpress.mit.edu/sicp/ ) และตอนนี้ฉันกำลังเขียนล่ามหลามในแบบแผนและฉันกำลังพยายามที่จะมีความศักดิ์สิทธิ์ตามตำนานนี้ ที่ควรมาจากอดีตโดยเฉพาะ ฉันกำลังมองหารายละเอียดทางเทคนิคเฉพาะระหว่างสองภาษาที่ฉันสามารถใช้ประโยชน์จากล่ามในโครงการเพื่อทำความเข้าใจเกี่ยวกับวิธีการทำงานของโปรแกรม โดยเฉพาะอย่างยิ่ง: เหตุใดการศึกษาล่ามที่เขียนด้วยภาษาที่ล่ามจึงเน้น - เป็นเพียงการออกกำลังกายทางจิตที่ดีในการรักษาภาษาดั้งเดิมและภาษาที่สร้างขึ้นตรงหรือมีปัญหาเฉพาะที่สามารถหาวิธีแก้ปัญหาในลักษณะของ ภาษาต้นฉบับ? ล่ามเสียงกระเพื่อมแสดงให้เห็นถึงแนวคิดสถาปัตยกรรมที่ดีสำหรับการออกแบบซอฟต์แวร์ในอนาคต ฉันจะพลาดอะไรถ้าฉันทำแบบฝึกหัดนี้ในภาษาอื่นเช่น C ++ หรือ Java เป็นสิ่งที่ใช้มากที่สุด Takeaway หรือ "เครื่องมือทางจิต" จากการออกกำลังกายนี้? ** ** ฉันเลือกคำตอบที่ผมทำเพราะผมได้สังเกตเห็นว่าผมได้รับจากการใช้สิทธิทักษะมากขึ้นในการออกแบบเครื่องมือแยกในหัวของฉันกว่าเครื่องมืออื่น ๆ เดียวและฉันต้องการที่จะหาวิธีการที่แตกต่างกันของการแยกที่อาจทำงานได้ดีขึ้นสำหรับโครงการ ล่ามกว่าล่ามหลาม

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

1
คณะกรรมการมาตรฐาน C ++ ทดสอบแนวคิดการออกแบบอย่างไร
คณะกรรมการ C ++ ทดสอบข้อกำหนดการออกแบบใหม่ของพวกเขาด้วยคอมไพเลอร์ต้นแบบบางประเภทก่อนปล่อยมาตรฐานใหม่หรือไม่? หรือพวกเขาปล่อยมาตรฐานซึ่งเป็นผลทางทฤษฎีเท่านั้นจนกว่าคอมไพเลอร์ขนาดใหญ่ใช้มันได้หรือไม่

9
ทำไมภาษาที่จำเป็น / OO ที่เป็นที่รู้จักกันดีส่วนใหญ่อนุญาตให้เข้าถึงประเภทที่สามารถแสดงถึงค่า 'ไม่มีอะไร' ได้โดยไม่ จำกัด
ผมได้อ่านเกี่ยวกับ (UN) ความสะดวกสบายของการมีnullแทน Maybe(ตัวอย่าง) หลังจากที่ได้อ่านบทความนี้ , ผมเชื่อว่ามันจะดีกว่าที่จะใช้Maybe (หรือบางสิ่งบางอย่างที่คล้ายกัน) อย่างไรก็ตามฉันรู้สึกประหลาดใจที่เห็นว่าภาษาการเขียนโปรแกรมเชิงวัตถุหรือเชิงวัตถุที่มีชื่อเสียง "ยังคงใช้อยู่null(ซึ่งอนุญาตการเข้าถึงชนิดที่ไม่ถูกตรวจสอบซึ่งสามารถแสดงถึงค่า 'ไม่มีอะไร') และMaybeส่วนใหญ่จะใช้ในภาษาโปรแกรมเชิงฟังก์ชัน ตัวอย่างเช่นดูรหัส C # ต่อไปนี้: void doSomething(string username) { // Check that username is not null // Do something } มีบางอย่างมีกลิ่นไม่ดีที่นี่ ... ทำไมเราควรตรวจสอบว่าข้อโต้แย้งนั้นเป็นโมฆะหรือไม่ เราไม่ควรคิดว่าทุกตัวแปรมีการอ้างอิงไปยังวัตถุหรือไม่? อย่างที่คุณเห็นปัญหาคือว่าโดยนิยามตัวแปรเกือบทั้งหมดสามารถมีการอ้างอิงที่เป็นโมฆะ เกิดอะไรขึ้นถ้าเราสามารถตัดสินใจว่าตัวแปรใดเป็น "โมฆะ" และไม่ได้? นั่นจะช่วยเราได้มากในขณะที่ทำการดีบั๊กและมองหา "NullReferenceException" ลองจินตนาการว่าโดยค่าเริ่มต้นไม่มีประเภทอาจมีอ้างอิงโมฆะ แทนที่จะเป็นเช่นนั้นคุณจะระบุอย่างชัดเจนว่าตัวแปรสามารถมีการอ้างอิงที่เป็นโมฆะได้เฉพาะในกรณีที่คุณต้องการ นั่นคือความคิดเบื้องหลังบางที หากคุณมีฟังก์ชั่นที่ในบางกรณีล้มเหลว (ตัวอย่างเช่นการหารด้วยศูนย์) คุณสามารถส่งกลับMaybe<int>ระบุอย่างชัดเจนว่าผลลัพธ์อาจเป็น int แต่ยังไม่มีอะไร! นี่คือเหตุผลหนึ่งที่ต้องการบางทีอาจจะแทนที่จะเป็นโมฆะ …

16
ฉันกำลังเขียนเกี่ยวกับไวยากรณ์ภาษา มีภาษาใดบ้างที่มีพารามิเตอร์ใดวางอยู่ภายในชื่อเมธอด?
ใน JavaScript: function getTopCustomersOfTheYear(howManyCustomers, whichYear) { // Some code here. } getTopCustomersOfTheYear(50, 2010); ใน C #: public List<Customer> GetTopCustomersOfTheYear(int howManyCustomers, int whichYear) { // Some code here } List<Customer> customers = GetTopCustomersOfTheYear(50, 2010); ใน PHP: public function getTopCustomersOfTheYear($howManyCustomers, $whichYear) { // Some code here } $customers = getTopCustomersOfTheYear(50, 2010); มีภาษาใดบ้างที่สนับสนุนไวยากรณ์นี้: …

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

4
ภาษาการเขียนโปรแกรมกำหนดฟังก์ชั่นอย่างไร
ภาษาการเขียนโปรแกรมกำหนดและบันทึกฟังก์ชัน / วิธีอย่างไร ฉันกำลังสร้างภาษาการเขียนโปรแกรมตีความใน Ruby และฉันพยายามคิดวิธีการประกาศใช้ฟังก์ชั่น แนวคิดแรกของฉันคือการบันทึกเนื้อหาของการประกาศในแผนที่ ตัวอย่างเช่นถ้าฉันทำสิ่งที่ชอบ def a() { callSomething(); x += 5; } จากนั้นฉันจะเพิ่มรายการลงในแผนที่ของฉัน: { 'a' => 'callSomething(); x += 5;' } ปัญหานี้คือว่ามันจะกลายเป็นแบบเรียกซ้ำเพราะฉันจะต้องเรียกparseวิธีการของฉันบนสตริงซึ่งจะโทรparseอีกครั้งเมื่อพบdoSomethingและจากนั้นฉันก็จะหมดพื้นที่สแต็คในที่สุด ดังนั้นภาษาที่ตีความจะจัดการกับสิ่งนี้ได้อย่างไร

3
ทำไมคำหลัก rec จำเป็นใน F #
ใน F # มีความจำเป็นต้องใช้recคำหลัก ใน Haskell ไม่จำเป็นต้องบอกอย่างชัดเจนว่าฟังก์ชั่นที่ให้มานั้นเรียกซ้ำหรือไม่ ด้วยบทบาทของการเรียกซ้ำในการเขียนโปรแกรมเชิงฟังก์ชันการออกแบบ F # ดูเหมือนจะค่อนข้างแปลกสำหรับฉัน เป็นการตัดสินใจออกแบบภาษาที่ดีหรือมีเหตุผลทางประวัติศาสตร์หรือมีข้อ จำกัด ในการใช้งานเท่านั้น

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

6
คำเตือนของการใช้ประเภทพื้นฐาน (เช่น int) เป็นชั้นเรียนคืออะไร?
เมื่อมีการออกแบบและ implenting ภาษาโปรแกรมเชิงวัตถุในบางจุดหนึ่งต้องให้ทางเลือกเกี่ยวกับการใช้ประเภทพื้นฐาน (เช่นint, float, doubleหรือเทียบเท่า) เป็นชั้นเรียนหรือสิ่งอื่นใด เห็นได้ชัดว่าภาษาในตระกูล C มีแนวโน้มที่จะไม่กำหนดเป็นคลาส (Java มีชนิดดั้งเดิมแบบพิเศษ C # ใช้ภาษาเหล่านี้เป็น struct ที่ไม่เปลี่ยนรูป ฯลฯ ) ฉันสามารถนึกถึงข้อได้เปรียบที่สำคัญมากเมื่อมีการใช้ประเภทพื้นฐานเป็นคลาส (ในระบบชนิดที่มีลำดับชั้นแบบรวม): ชนิดเหล่านี้อาจเป็นชนิดย่อย Liskov ที่เหมาะสมของประเภทรูต ดังนั้นเราจึงหลีกเลี่ยงความสับสนของภาษาด้วย Boxing / unboxing (ชัดเจนหรือโดยปริยาย) ประเภทของ wrapper กฎความแปรปรวนพิเศษพฤติกรรมพิเศษ ฯลฯ แน่นอนฉันสามารถเข้าใจบางส่วนว่าทำไมนักออกแบบภาษาจึงตัดสินใจเลือกวิธีการ: อินสแตนซ์ของชั้นเรียนมักจะมีค่าใช้จ่ายเชิงพื้นที่ (เนื่องจากอินสแตนซ์อาจมี vtable หรือข้อมูลเมตาอื่น ๆ ในโครงร่างหน่วยความจำ) มี (ถ้าภาษาไม่อนุญาตให้สืบทอดกับสิ่งเหล่านั้น) ประสิทธิภาพเชิงพื้นที่ (และพื้นที่เชิงพื้นที่ที่ได้รับการปรับปรุงโดยเฉพาะในอาร์เรย์ขนาดใหญ่) เป็นเหตุผลเดียวที่ว่าทำไมประเภทพื้นฐานมักไม่ได้เรียน? โดยทั่วไปฉันคิดว่าคำตอบคือใช่ แต่คอมไพเลอร์มีอัลกอริธึมการวิเคราะห์แบบ Escape และพวกเขาสามารถอนุมานได้ว่าพวกเขาสามารถ (เลือก) …

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

3
ทำไมตัวชี้โมฆะแทนการส่งคลาส
ใน Java: int count = (Integer) null; พ่น java.lang.NullPointerException เหตุใดจึงไม่โยนข้อยกเว้น Class Cast เพื่อความสะดวกในการทำความเข้าใจโปรแกรมเมอร์ เหตุใดจึงเลือกข้อยกเว้นนี้นอกเหนือจากข้อยกเว้นอื่น ๆ

9
มีภาษาโปรแกรมใดบ้างที่เป็นไปตามแนวทางการพัฒนาแบบมินิมัลลิสต์?
ฉันพบว่าเมื่อภาษาได้รับการพิจารณาเหมือนซอฟต์แวร์เชิงพาณิชย์มีความจำเป็นเสมอที่จะต้องเพิ่มคุณสมบัติใหม่เพื่อปรับการออกรุ่นใหม่ สามารถมีหรือมีภาษาที่เวอร์ชัน 1.0 เป็นเวอร์ชั่นสุดท้ายหรือไม่? แน่นอนว่าการแก้ไขข้อบกพร่องได้รับการยกเว้นจากสิ่งนี้ แต่ชุดคุณลักษณะยังคงเหมือนเดิมหรือไม่ วิธีนี้คุณลักษณะทุกอย่างในภาษาจะเข้ากันได้ดีและดูเหมือนจะไม่ถูกยึดติดหลังจากความจริงที่มีคุณลักษณะที่ล้าสมัยยังคงอยู่เนื่องจากความเข้ากันได้ย้อนหลัง ฉันคิดว่าภาษาเชิงวิชาการบางอย่างเป็นเช่นนี้? แต่มีภาษาที่ประสบความสำเร็จทางการค้าตามแนวคิดนี้หรือไม่? ห้องสมุดที่แนบมาก็มีอิสระที่จะรับฟีเจอร์ใหม่ด้วยเช่นกัน แต่ภาษาก็ยังคงไม่เปลี่ยนแปลงอยู่เสมอ ตัวอย่างหนึ่งที่ฉันสามารถให้ได้คือหนึ่งในภาษาที่ฉันโปรดปราน C # ซึ่งฉันใช้บ่อยมากมีการเพิ่มฟีเจอร์ให้มากขึ้นทุกครั้ง เพื่อใช้ประโยชน์จากสิ่งเหล่านี้ฉันต้องทิ้งงานจริงไว้ในมือและใช้เวลาในการเรียนรู้สิ่งเหล่านี้แทนความสามารถในการรับแนวคิดที่ไม่สำคัญและรวมตัวเองเพื่อแก้ไขปัญหาที่ซับซ้อนได้อย่างง่ายดาย ดังนั้นฉันคิดว่าฉันกำลังมองหาวิธีการที่มินิมัลลิสต์ที่ทุกอย่างสอดคล้องกันเข้าท่าและเป็นมุมฉากเท่าที่จะทำได้

5
จะทำอย่างไรถ้าฉันเกลียดไฟล์ส่วนหัวของ C ++
ฉันมักจะสับสนเกี่ยวกับไฟล์ส่วนหัว มันแปลกมาก: คุณรวมไฟล์. h ซึ่งไม่รวม. cpp แต่. cpp จะถูกคอมไพล์ด้วยเช่นกัน เมื่อเร็ว ๆ นี้ฉันเข้าร่วมโครงการของทีมและแน่นอนว่าจะใช้ทั้ง. h และ. cpp ฉันเข้าใจว่าสิ่งนี้สำคัญมาก แต่ฉันไม่สามารถอยู่กับการคัดลอกทุกการประกาศฟังก์ชันในแต่ละคลาสที่เรามี ฉันจะจัดการกับการประชุม 2 ไฟล์ได้อย่างมีประสิทธิภาพได้อย่างไร มีเครื่องมือใดบ้างที่จะช่วยเหลือหรือเปลี่ยนหนึ่งไฟล์ที่มีลักษณะตัวอย่างด้านล่างเป็น. h และ. cpp โดยอัตโนมัติ? (เฉพาะสำหรับ MS VC ++ 2010) class A { ... Type f(Type a,Type b) { //implementation here, not in another file! } ... }; Type f(Type …

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