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

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

30
“ ความประหลาดใจน้อยที่สุด” และอาร์กิวเมนต์เริ่มต้นที่เปลี่ยนแปลงได้
ทุกคนที่มี Python นานพอถูกกัด (หรือฉีกเป็นชิ้น ๆ ) โดยปัญหาต่อไปนี้: def foo(a=[]): a.append(5) return a [5]สามเณรงูใหญ่คาดว่าจะได้ฟังก์ชั่นนี้เสมอกลับรายการที่มีเพียงองค์ประกอบหนึ่ง: ผลลัพธ์จะแตกต่างกันมากและน่าประหลาดใจมาก (สำหรับมือใหม่): >>> foo() [5] >>> foo() [5, 5] >>> foo() [5, 5, 5] >>> foo() [5, 5, 5, 5] >>> foo() ผู้จัดการของฉันเคยพบกับคุณสมบัตินี้ครั้งแรกและเรียกมันว่า "ข้อบกพร่องในการออกแบบที่น่าทึ่ง" ของภาษา ฉันตอบว่าพฤติกรรมนั้นมีคำอธิบายพื้นฐานและเป็นเรื่องที่ทำให้งงงวยและคาดไม่ถึงถ้าคุณไม่เข้าใจ internals อย่างไรก็ตามฉันไม่สามารถตอบคำถามต่อไปนี้ (กับตัวเอง): อะไรคือเหตุผลในการเชื่อมอาร์กิวเมนต์เริ่มต้นที่คำจำกัดความของฟังก์ชั่นและไม่ทำงานในการดำเนินการ? ฉันสงสัยว่าพฤติกรรมที่มีประสบการณ์นั้นมีประโยชน์ในทางปฏิบัติ (ใครใช้ตัวแปรคงที่ใน C โดยไม่ต้องปรับปรุงบั๊ก) แก้ไข : Baczek …

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

13
ทำไมเราต้องกำหนดทั้งสอง == และ! = ใน C #
คอมไพเลอร์ C # ต้องการว่าเมื่อใดก็ตามที่ประเภทที่กำหนดเองจะกำหนดผู้ประกอบการ==มันจะต้องกำหนดด้วย!=(ดูที่นี่ ) ทำไม? ฉันอยากรู้ว่าทำไมนักออกแบบจึงคิดว่าจำเป็นและเหตุใดจึงไม่สามารถเริ่มต้นคอมไพเลอร์เพื่อให้เกิดการใช้งานที่สมเหตุสมผลสำหรับผู้ประกอบการรายใดรายหนึ่ง ตัวอย่างเช่น Lua ช่วยให้คุณกำหนดตัวดำเนินการความเสมอภาคเท่านั้นและคุณจะได้รับตัวดำเนินการอื่นฟรี C # จะทำเช่นเดียวกันโดยขอให้คุณสามารถกำหนดอย่างใดอย่างหนึ่งหรือทั้งสอง == == และ! = แล้วโดยอัตโนมัติรวบรวมหายไป! = !(left == right)ผู้ประกอบการเป็น ฉันเข้าใจว่ามีบางกรณีที่มุมแปลก ๆ ที่บางหน่วยงานอาจไม่เท่ากันหรือไม่เท่ากัน (เช่น IEEE-754 NaN) แต่สิ่งเหล่านั้นดูเหมือนเป็นข้อยกเว้นไม่ใช่กฎ ดังนั้นนี่ไม่ได้อธิบายว่าทำไมนักออกแบบคอมไพเลอร์ C # จึงได้ยกเว้นกฎ ฉันเคยเห็นกรณีของฝีมือไม่ดีที่กำหนดตัวดำเนินการความเท่าเทียมกันจากนั้นผู้ดำเนินการความไม่เท่าเทียมกันจะเป็นสำเนาคัดลอกที่มีการเปรียบเทียบแต่ละรายการที่ย้อนกลับและทุก && เปลี่ยนเป็น | | (คุณได้รับจุด ... โดยทั่วไป! (a == b) ขยายผ่านกฎของ De Morgan) นั่นเป็นวิธีปฏิบัติที่ไม่ดีที่ผู้รวบรวมสามารถกำจัดได้โดยการออกแบบเช่นเดียวกับ Lua หมายเหตุ: …

5
เหตุใดจึงไม่อนุญาต“ ขั้นสุดท้าย” ในวิธีส่วนต่อประสาน Java 8
หนึ่งในคุณสมบัติที่มีประโยชน์ที่สุดของ Java 8 คือdefaultวิธีการใหม่ในส่วนต่อประสาน มีสองเหตุผลหลัก (อาจมีเหตุผลอื่น) ทำไมพวกเขาถึงได้รับการแนะนำ: ให้การใช้งานเริ่มต้นจริง ตัวอย่าง:Iterator.remove() อนุญาตให้ใช้กับวิวัฒนาการ JDK API ตัวอย่าง:Iterable.forEach() จากมุมมองของนักออกแบบ API ของผมจะชอบที่จะสามารถใช้การปรับเปลี่ยนวิธีการอื่น ๆ finalบนอินเตอร์เฟซเช่น สิ่งนี้จะเป็นประโยชน์เมื่อเพิ่มวิธีอำนวยความสะดวกป้องกันการแทนที่ "โดยไม่ตั้งใจ" ในการใช้คลาส: interface Sender { // Convenience method to send an empty message default final void send() { send(null); } // Implementations should only implement this method void send(String message); } …


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

11
อะไรบล็อก Ruby, Python เพื่อให้ได้ความเร็ว Javascript V8? [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ปิดให้บริการใน5 ปีที่ผ่านมา ล็อคแล้ว คำถามและคำตอบของคำถามนี้ถูกล็อคเนื่องจากคำถามอยู่นอกหัวข้อ แต่มีความสำคัญทางประวัติศาสตร์ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ มีคุณสมบัติ Ruby / Python ที่บล็อกการใช้งานการเพิ่มประสิทธิภาพ (เช่นการแคชแบบอินไลน์ ) V8 engine มีหรือไม่? Python ได้รับการพัฒนาโดย Google ร่วมกันดังนั้นจึงไม่ควรถูกบล็อกโดยสิทธิบัตรซอฟต์แวร์ หรือนี่เป็นเรื่องของทรัพยากรที่ใส่ลงในโครงการ V8 โดย Google

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

5
คำหลัก“ นี้” ทำงานอย่างไรภายในฟังก์ชั่น
ฉันเพิ่งเจอสถานการณ์ที่น่าสนใจใน JavaScript ฉันมีคลาสที่มีวิธีการที่กำหนดหลายวัตถุโดยใช้สัญกรณ์ตามตัวอักษร ภายในวัตถุเหล่านั้นthisจะมีการใช้ตัวชี้ จากพฤติกรรมของโปรแกรมฉันได้อนุมานว่าthisตัวชี้หมายถึงคลาสที่มีการเรียกใช้เมธอดไม่ใช่วัตถุที่ถูกสร้างขึ้นโดยตัวอักษร สิ่งนี้ดูเหมือนว่าจะเป็นข้อแม้ว่ามันจะเป็นวิธีที่ฉันคาดว่ามันจะทำงาน นี่เป็นพฤติกรรมที่กำหนดไว้หรือไม่? เบราว์เซอร์ปลอดภัยหรือไม่? มีเหตุผลใดบ้างที่มีเหตุผลว่าทำไมมันถึงเกินกว่า "ข้อมูลจำเพาะกล่าวเช่นนั้น" (เช่นเป็นผลมาจากการตัดสินใจ / ปรัชญาการออกแบบที่กว้างขึ้น)? ตัวอย่างโค้ดแบบ Pared-down: // inside class definition, itself an object literal, we have this function: onRender: function() { this.menuItems = this.menuItems.concat([ { text: 'Group by Module', rptletdiv: this }, { text: 'Group by Status', rptletdiv: this }]); // …

12
ทำไมไพ ธ อนไม่มีฟังก์ชั่นสัญญาณ?
ฉันไม่เข้าใจว่าทำไม Python จึงไม่มีsignฟังก์ชั่น มันมีabsในตัว (ซึ่งผมคิดว่าsignน้องสาว) signแต่ไม่มี ใน python 2.6 มีcopysignฟังก์ชั่น (ในทางคณิตศาสตร์ ) แต่ไม่มีสัญญาณ ทำไมต้องเขียน a copysign(x,y)เมื่อคุณสามารถเขียน a signและได้รับcopysignโดยตรงจากabs(x) * sign(y)? หลังจะชัดเจนกว่านี้มาก: x ด้วยสัญลักษณ์ของ y ในขณะที่ copysign คุณต้องจำไว้ว่าถ้ามันเป็น x กับสัญลักษณ์ของ y หรือ y ด้วยสัญลักษณ์ของ x! เห็นได้ชัดsign(x)ว่าไม่ได้ให้อะไรมากไปกว่าcmp(x,0)แต่มันจะอ่านได้ง่ายกว่านี้อีกด้วย (และสำหรับภาษาที่อ่านได้อย่างมากเช่นไพ ธ อนมันน่าจะเป็นข้อดีอย่างมาก) ถ้าฉันเป็นนักออกแบบหลามผมจะได้รับวิธีการอื่น ๆ arond: ไม่มีcmpbuiltin signแต่ เมื่อคุณต้องการcmp(x,y)คุณสามารถทำsign(x-y)(หรือดียิ่งขึ้นสำหรับสิ่งที่ไม่ใช่ตัวเลขเพียงแค่ x> y - แน่นอนว่าสิ่งนี้ต้องได้sortedรับการยอมรับบูลีนแทนที่จะเป็นตัวเปรียบเทียบจำนวนเต็ม) สิ่งนี้จะมีความชัดเจนมากขึ้น: เป็นบวกเมื่อx>y(ในขณะที่cmpคุณต้องจำการประชุมเชิงบวกเมื่อแรกมีขนาดใหญ่กว่าแต่อาจเป็นวิธีอื่น …

5
เหตุใดอาร์เรย์จึงไม่สามารถกำหนดให้กับ Iterable ได้
ด้วย Java5 เราสามารถเขียน: Foo[] foos = ... for (Foo foo : foos) หรือเพียงแค่ใช้ Iterable ใน for for loop มันมีประโยชน์มาก อย่างไรก็ตามคุณไม่สามารถเขียนวิธีทั่วไปสำหรับการทำซ้ำเช่นนี้: public void bar(Iterable<Foo> foos) { .. } และเรียกมันด้วยอาเรย์เนื่องจากมันไม่ใช่ Iterable: Foo[] foos = { .. }; bar(foos); // compile time error ฉันสงสัยเกี่ยวกับเหตุผลที่อยู่เบื้องหลังการตัดสินใจออกแบบนี้

7
เหตุใดฉันจึงไม่มีวิธีคงที่เชิงนามธรรมใน C #
เมื่อไม่นานมานี้ฉันได้ทำงานกับผู้ให้บริการอย่างเป็นธรรมและฉันได้พบกับสถานการณ์ที่น่าสนใจที่ฉันต้องการมีคลาสนามธรรมที่มีวิธีแบบสแตติกแบบนามธรรม ฉันอ่านบทความสองสามข้อเกี่ยวกับหัวข้อและมันก็สมเหตุสมผล แต่มีคำอธิบายที่ชัดเจนหรือไม่?
182 c#  .net  language-design 

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

3
ทำไมคำสั่ง (j ++); ห้ามไม่?
รหัสต่อไปนี้ผิด (ดูบน ideone ): public class Test { public static void Main() { int j = 5; (j++); // if we remove the "(" and ")" then this compiles fine. } } ข้อผิดพลาด CS0201: สามารถใช้ได้เฉพาะการมอบหมายการโทรการเพิ่มการลดรอและนิพจน์วัตถุใหม่เท่านั้นที่สามารถใช้เป็นคำสั่ง ทำไมโค้ดถึงคอมไพล์เมื่อเราลบวงเล็บ? ทำไมมันไม่คอมไพล์ด้วยวงเล็บ? เหตุใด C # จึงถูกออกแบบด้วยวิธีนี้

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

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