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

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

22
การอ้างอิง Null เป็นสิ่งที่เลวร้ายจริง ๆ หรือไม่?
ฉันได้ยินมาว่าการรวมการอ้างอิงโมฆะในภาษาการเขียนโปรแกรมเป็น "ความผิดพลาดพันล้านดอลลาร์" แต่ทำไม แน่นอนว่าพวกเขาสามารถทำให้ NullReferenceExceptions ได้ แต่อย่างนั้น องค์ประกอบของภาษาใด ๆ สามารถเป็นแหล่งของข้อผิดพลาดหากใช้ไม่ถูกต้อง และทางเลือกคืออะไร? ฉันคิดว่าแทนที่จะพูดสิ่งนี้: Customer c = Customer.GetByLastName("Goodman"); // returns null if not found if (c != null) { Console.WriteLine(c.FirstName + " " + c.LastName + " is awesome!"); } else { Console.WriteLine("There was no customer named Goodman. How lame!"); } คุณสามารถพูดสิ่งนี้: …

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

14
ทำไม 0 จึงเป็นเท็จ
คำถามนี้อาจฟังดูเป็นใบ้ แต่ทำไม0ประเมินfalseและค่าอื่น ๆ [จำนวนเต็ม] trueเป็นภาษาโปรแกรมส่วนใหญ่ การเปรียบเทียบสตริง เนื่องจากคำถามดูเหมือนจะง่ายเกินไปฉันจะอธิบายตัวเองมากกว่านี้ก่อนอื่นอาจเห็นได้ชัดจากโปรแกรมเมอร์ทุกคน แต่ทำไมไม่มีภาษาการเขียนโปรแกรม - อาจมี แต่ไม่มี ฉันใช้ - ซึ่งเป็น0ค่าที่ประเมินtrueและ [จำนวนเต็ม] อื่น ๆ เพื่อfalseที่ไหน คำพูดหนึ่งอาจดูสุ่ม แต่ฉันมีตัวอย่างเล็ก ๆ น้อย ๆ ที่มันอาจเป็นความคิดที่ดี ก่อนอื่นเราลองมาดูตัวอย่างของการเปรียบเทียบสามสายผมจะเอา C มาstrcmpเป็นตัวอย่าง: โปรแกรมเมอร์ที่ลอง C เป็นภาษาแรกของเขาอาจถูกล่อลวงให้เขียนโค้ดต่อไปนี้: if (strcmp(str1, str2)) { // Do something... } เนื่องจากstrcmpส่งคืน0ซึ่งประเมินว่าfalseเมื่อใดที่สตริงมีค่าเท่ากันสิ่งที่โปรแกรมเมอร์เริ่มต้นพยายามทำล้มเหลวอย่างน่าสังเวชและโดยทั่วไปเขาไม่เข้าใจว่าทำไมในตอนแรก มีการ0ประเมินผลtrueแทนฟังก์ชันนี้สามารถใช้ในการแสดงออกที่ง่ายที่สุด - อย่างใดอย่างหนึ่งข้างต้น - เมื่อเปรียบเทียบกับความเสมอภาคและการตรวจสอบที่เหมาะสมสำหรับ-1และ1จะทำได้เมื่อจำเป็นเท่านั้น เราจะพิจารณาประเภทการคืนเป็นbool(ในความคิดของเราฉันหมายถึง) ส่วนใหญ่เวลา นอกจากนี้ขอแนะนำชนิดใหม่signที่ใช้เวลาเพียงค่า-1, และ0 1ที่สามารถมีประโยชน์สวย ลองนึกภาพว่ามีโอเปอเรเตอร์ยานอวกาศใน …

6
เหตุใด XML จึงเรียกว่า "ภาษา" อย่างแน่นอน
ฉันสงสัยว่าทำไม XML จึงมี L อยู่ในชื่อ ด้วยตัวเอง XML ไม่ "ทำ" อะไร มันเป็นเพียงรูปแบบการจัดเก็บข้อมูลไม่ใช่ภาษา! ภาษาที่ "ทำ" วิธีที่คุณได้รับ XML เพื่อ "ทำ" สิ่งต่าง ๆ เพื่อเปลี่ยนให้เป็นภาษาที่เหมาะสมคือการเพิ่มxmlnsคุณสมบัติให้กับองค์ประกอบราก จากนั้นจะบอกสภาพแวดล้อมเกี่ยวกับสิ่งนั้น ตัวอย่างหนึ่งคือ XHTML มันใช้งานก็มีการเชื่อมโยงหลายมิติรูปแบบอื่น ๆ xmlnsทั้งหมดที่เกิดจาก หากปราศจากไฟล์นั้นไฟล์ XHTML จะเป็นเพียงข้อมูลในโหนดมาร์กอัป เหตุใด XML จึงเรียกว่าภาษา มันไม่ได้อธิบายอะไรเลยมันไม่ได้แปลมันแค่ แก้ไข: บางทีคำถามของฉันควรกว้างขึ้น เนื่องจากคำตอบอยู่ในขณะนี้ "เนื่องจาก XML ถูกตั้งชื่อตาม SGML ซึ่งถูกตั้งชื่อตาม GML ฯลฯ " คำถามควรได้รับทำไมมาร์กอัปภาษา (เช่น XML) เรียกว่าภาษา? อ๋อและ WRT …

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


30
คุณต้องการมีฟีเจอร์อะไรใน PHP? [ปิด]
เนื่องจากเป็นช่วงเทศกาลวันหยุดและทุกคนต้องการสิ่งนี้ฉันสงสัย - ฟีเจอร์ภาษาที่คุณต้องการจะเพิ่มใน PHP คืออะไร? ฉันสนใจคำแนะนำ / ความปรารถนาที่เป็นประโยชน์สำหรับภาษานี้ โดยการปฏิบัติฉันหมายถึง: สิ่งที่สามารถทำได้ในทางปฏิบัติ (ไม่ใช่: "ฉันหวังว่า PHP จะเดาว่ารหัสของฉันหมายถึงอะไรและแก้ไขข้อบกพร่องสำหรับฉัน" หรือ "ฉันหวังว่าโค้ดใด ๆ จะทำงานภายใต้ 5ms") บางสิ่งที่ไม่ต้องการเปลี่ยน PHP เป็นภาษาอื่น (ไม่ใช่: "ฉันหวังว่าพวกเขาจะลบเครื่องหมาย $ และใช้พื้นที่แทนวงเล็บปีกกา" หรือ "ฉันหวังว่า PHP ถูกคอมไพล์พิมพ์แบบสแตติกและมี # อยู่ในชื่อ") สิ่งที่ไม่ต้องการทำลายรหัสที่มีอยู่ทั้งหมด (ไม่ใช่: "ลองเปลี่ยนชื่อ 500 ฟังก์ชั่นและเปลี่ยนลำดับพารามิเตอร์สำหรับพวกเขา") สิ่งที่ไม่เปลี่ยนภาษาหรือบางแง่มุมที่น่าสนใจของมัน (ไม่ได้ "ผมต้องการมีส่วนขยายเพื่อรองรับการ XYZ โปรโตคอล" หรือ "ฉันหวังว่าข้อผิดพลาด # 12345 ได้รับการแก้ไขในที่สุด") บางสิ่งที่มากกว่าคำพูดโวยวาย (ไม่ใช่: "ฉันหวังว่า …

11
นักพัฒนาซอฟต์แวร์ของ Java ได้ละทิ้ง RAII หรือไม่?
ในฐานะโปรแกรมเมอร์ C # เป็นเวลานานฉันเพิ่งได้เรียนรู้เพิ่มเติมเกี่ยวกับข้อดีของการได้มาซึ่งทรัพยากรคือการเริ่มต้น (RAII) โดยเฉพาะฉันได้ค้นพบว่าสำนวน C #: using (var dbConn = new DbConnection(connStr)) { // do stuff with dbConn } มี C ++ ที่เทียบเท่า: { DbConnection dbConn(connStr); // do stuff with dbConn } หมายความว่าการจดจำการใช้ทรัพยากรเช่นDbConnectionในusingบล็อกนั้นไม่จำเป็นใน C ++! สิ่งนี้ดูเหมือนจะเป็นข้อได้เปรียบที่สำคัญของ C ++ สิ่งนี้น่าเชื่อถือยิ่งขึ้นเมื่อคุณพิจารณาคลาสที่มีสมาชิกอินสแตนซ์ของประเภทDbConnectionตัวอย่างเช่น class Foo { DbConnection dbConn; // ... } ใน …
82 java  c#  c++  language-design 

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

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

11
ทำไม String ถึงไม่เปลี่ยนรูปใน Java?
ฉันไม่เข้าใจเหตุผลของมัน ฉันมักจะใช้คลาส String เหมือนนักพัฒนาอื่น ๆ แต่เมื่อฉันแก้ไขค่าของมันอินสแตนซ์ใหม่ของ String ที่สร้างขึ้น สิ่งที่อาจเป็นสาเหตุของการไม่เปลี่ยนรูปแบบสำหรับคลาส String ใน Java? ฉันรู้ว่ามีทางเลือกบางอย่างเช่น StringBuffer หรือ StringBuilder มันเป็นเพียงความอยากรู้

14
ทำไมการคำนวณทางคณิตศาสตร์มากเกินไปจึงถูกเพิกเฉย?
เคยลองสรุปตัวเลขทั้งหมดตั้งแต่ 1 ถึง 2,000,000 ในภาษาการเขียนโปรแกรมที่คุณชื่นชอบ? ผลลัพธ์ที่ได้นั้นง่ายต่อการคำนวณด้วยตนเอง: 2,000,001,000,000 ซึ่งมีขนาดใหญ่กว่า 900 เท่าของค่าสูงสุดของจำนวนเต็ม 32 บิตที่ไม่ได้ลงนาม C # พิมพ์ออกมา-1453759936- ค่าลบ! และฉันเดาว่า Java ทำเช่นเดียวกัน นั่นหมายความว่ามีบางภาษาโปรแกรมทั่วไปที่ละเว้น Arithmetic Overflow โดยค่าเริ่มต้น (ใน C # มีตัวเลือกที่ซ่อนอยู่สำหรับการเปลี่ยนแปลงนั้น) นั่นเป็นพฤติกรรมที่ดูเสี่ยงมากสำหรับฉันและไม่ใช่ความผิดพลาดของ Ariane 5 ที่เกิดจากการไหลล้นเช่นนี้ใช่ไหม ดังนั้น: อะไรคือการตัดสินใจในการออกแบบที่อยู่เบื้องหลังพฤติกรรมที่อันตราย แก้ไข: คำตอบแรกสำหรับคำถามนี้แสดงค่าใช้จ่ายในการตรวจสอบที่มากเกินไป มารันโปรแกรม C # สั้น ๆ เพื่อทดสอบสมมติฐานนี้: Stopwatch watch = Stopwatch.StartNew(); checked { for (int i …

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

8
ชุมชนภาษาบางภาษา (เช่น Ruby และ Python) สามารถป้องกันการแตกแฟรกเมนต์ได้อย่างไรขณะที่ชุมชนอื่น (เช่น Lisp หรือ ML) ไม่
คำว่า "เสียงกระเพื่อม" (หรือ "เสียงกระเพื่อมคล้าย") เป็นร่มสำหรับภาษาต่าง ๆ มากมายเช่น Common Lisp, Scheme และ Arc มีการแตกแฟรกเมนต์ที่คล้ายกันในชุมชนภาษาอื่นเช่นใน ML อย่างไรก็ตาม Ruby และ Python มีการจัดการเพื่อหลีกเลี่ยงชะตากรรมนี้ที่นวัตกรรมเกิดขึ้นมากขึ้นในการดำเนินการ (เช่น PyPy หรือ YARV) แทนการเปลี่ยนแปลงภาษาเอง ชุมชน Ruby และ Python ทำอะไรเป็นพิเศษเพื่อป้องกันการแตกหักของภาษาหรือไม่

10
การออกแบบไวยากรณ์ - ทำไมต้องใช้วงเล็บเมื่อไม่มีการส่งอาร์กิวเมนต์?
ในหลายภาษาไวยากรณ์function_name(arg1, arg2, ...)ถูกใช้เพื่อเรียกใช้ฟังก์ชัน เมื่อเราต้องการที่จะเรียกฟังก์ชั่นโดยไม่ขัดแย้งใด ๆ function_name()ที่เราต้องทำ ฉันคิดว่ามันแปลกที่คอมไพเลอร์หรือสคริปต์ล่ามจะต้อง()ประสบความสำเร็จในการตรวจสอบว่าเป็นการเรียกใช้ฟังก์ชัน หากตัวแปรรู้จักกันว่า callable ทำไมถึงไม่function_name;พอ? ในบางภาษาเราสามารถทำได้: function_name 'test';หรือแม้แต่function_name 'first' 'second';เรียกฟังก์ชั่นหรือคำสั่ง ฉันคิดว่าวงเล็บจะดีกว่านี้หากพวกเขาต้องการเพียงแค่ประกาศลำดับความสำคัญและในสถานที่อื่นเป็นทางเลือก ตัวอย่างเช่นการทำif expression == true function_name;ควรถูกต้องตามที่if (expression == true) function_name();ควร สิ่งที่น่ารำคาญที่สุดในความคิดของฉันคือทำ'SOME_STRING'.toLowerCase()เมื่อไม่มีข้อโต้แย้งที่ชัดเจนโดยฟังก์ชันต้นแบบ ทำไมนักออกแบบถึงเลือกคนที่เรียบง่าย'SOME_STRING'.lower? คำเตือน:อย่าเข้าใจฉันผิดฉันชอบไวยากรณ์ C-like! ;) ฉันแค่ถามว่ามันจะดีกว่า ต้อง()มีข้อได้เปรียบด้านประสิทธิภาพหรือไม่หรือทำให้เข้าใจรหัสได้ง่ายขึ้น? ฉันอยากรู้จริงๆว่าเหตุผลคืออะไร

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