อะไรทำให้ภาษา“ เหมาะที่สุด” สำหรับงานเฉพาะ


15

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

เกี่ยวกับภาษาช่วยให้งานหรือเป้าหมายที่เฉพาะเจาะจงดีกว่าภาษาอื่น ๆ โดยเฉพาะอย่างยิ่งการรวบรวมเพื่อประกอบต่อไปหรือไม่

ฉันกำลังพูดถึงทัวริงภาษาสมบูรณ์ภาษาที่ทัวริงเทียบเท่า


1
นี่เป็นคำถามสารานุกรม ฉันขอแนะนำให้คุณทำลายมันลงในบางวิธีทำให้มีความเฉพาะเจาะจงมากขึ้น
André Souza Lemos

5
จะผิดไหมถ้าจะพูดว่า "การตลาด"
corsiKa

2
@corsiKa ใช่ฉันคิดว่ามันเป็นมากกว่าประเด็นทางการตลาด
Jeremy West

คำตอบ:


18

มีบางสิ่งที่ควรพิจารณา:

  • สิ่งที่เป็นนามธรรม: ภาษาใดที่ถือว่าเป็น "พิเศษ" เมทริกซ์มีค่าที่ดีที่สุดเช่นเดียวกับใน Matlab หรือคุณเข้ารหัสพวกมันโดยใช้ประเภทที่ง่ายกว่าเช่นอาร์เรย์เช่นเดียวกับใน C C ทำให้คุณคิดว่าการฝึกอบรมจะถูกนำไปใช้อย่างไร Matlab ไม่

    หากคุณมีระบบการสื่อสารแบบอะซิงโครนัสที่ซับซ้อนคุณอาจต้องการฟังก์ชั่นชั้นหนึ่งเพื่อให้สามารถโทรกลับได้

    ยิ่งมีคุณสมบัติเพิ่มเข้ามามากเท่าใดภาษาก็จะยิ่งซับซ้อนมากขึ้นเท่านั้น ดังนั้นในขณะที่มี "หลายกระบวนทัศน์" ภาษาเช่น C ++ และ D ภาษาส่วนใหญ่เลือกช่องเลือกสิ่งที่มีความสำคัญกับช่องนั้นและจัดลำดับความสำคัญเหล่านั้นเป็น abstractions หลักของพวกเขา

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

    Early Fortran ไม่อนุญาตให้ใช้ตัวชี้หรือการเรียกซ้ำดังนั้นมันจึงยอดเยี่ยมในการทำตัวเลขให้เร็วกว่าภาษาอย่าง C ซึ่งคุณใช้ลูปมากมาย แต่มันก็แย่มากในการเข้ารหัสโครงสร้างข้อมูลขนาดใหญ่เช่นต้นไม้ที่คุณต้องการตัวชี้สำหรับการอ้อม (โปรดทราบว่าฉันไม่ค่อยรู้อะไรเกี่ยวกับ Fortran ที่ทันสมัย)

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


8

ข้อ จำกัด ของบางภาษาทำให้ง่ายต่อการติดตั้งโค้ดได้เร็วขึ้น (เช่น Fortran vs C และ aliasing ของพอยน์เตอร์พอยน์เตอร์) ซึ่งเป็นการแลกเปลี่ยนระหว่างประสิทธิภาพและความเป็นไปได้นอกกรอบ)

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

ยกตัวอย่างเช่นการคูณใช้กรณีต่างๆ (ดูGMP คูณ

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

โปรดดูการคำนวณอันดับเมทริกซ์ใน Matlab, Mathematica และ Maple (ฉันไม่สามารถทำการทดสอบทั้งหมดด้วยตัวเองได้ในตอนนี้ แต่สิ่งเหล่านี้สอดคล้องกับการทดสอบของฉัน) ภาษาทั้งหมดเหล่านี้ (สภาพแวดล้อม) ใช้การทำงานระดับเดียวกันสูงกว่า แต่รายละเอียดการใช้งานแตกต่างกันซึ่งให้เวลาต่างกัน

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

ข้อ จำกัด ของภาษาสร้างความแตกต่างในกระบวนการรวบรวมการใช้นามแฝงตัวชี้ที่กล่าวถึงป้องกันความเป็นไปได้ของรหัสการเรียงลำดับใหม่และบังคับใช้การโหลดตัวแปร


9
ภาษาส่วนใหญ่เป็นทัวริงที่สมบูรณ์ตามข้อกำหนดเนื่องจากไม่ใช่ทั้งหมดระบุขนาดที่อยู่คงที่ในข้อมูลจำเพาะ และมันค่อนข้าง จำกัด ที่จะสูญเสียความแตกต่างระหว่างสิ่งต่าง ๆ เช่น C ซึ่งเป็นขนาดที่อยู่ของโมดูโลทัวริงที่สมบูรณ์และสิ่งต่าง ๆ เช่น Coq, Agda หรือ System F ซึ่งไม่ใช่ทัวริงที่สมบูรณ์เลย
jmite

1
@jmite ขอบคุณ ฉันหวังว่านี่จะไม่ทำให้เกิดความแตกต่างอีกต่อไป
Evil

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

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

5

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

ในทางปฏิบัติไม่สามารถวัดปริมาณเหล่านี้ได้จริง ถึงกระนั้นฉันคิดว่ามันเป็นวิธีที่ถูกต้องในการคิดถึงปัญหา


4

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

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


3

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

ตัวอย่างเช่นทั้ง C และ C ++ สามารถใช้สำหรับการเขียนโปรแกรมเชิงวัตถุ - และแน่นอนห้องสมุด GObject เป็นตัวอย่างที่ดีของ OO C. โครงสร้าง AC ที่มีตัวชี้ฟังก์ชันสามารถตอบสนองวัตถุประสงค์เดียวกับวิธีเสมือนในคลาส C ++ และสามารถดำเนินการได้ ดีกว่า; โทษการพัฒนาคือรหัสกาวเพื่อจัดสรรหน่วยความจำเริ่มต้นตัวชี้ฟังก์ชันและเลือกกลยุทธ์สำหรับการเรียกเมธอด 'parent' เวลาส่วนใหญ่ของมันเป็นที่ชัดเจน / ปลอดภัยในการพิมพ์มากกว่าClass klass * = new class()struct class *klass = malloc(sizeof(struct class));klass->fn1 = ...;klass->fnN = ...


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

2
@Evil: การเขียนโปรแกรมเชิงวัตถุและภาษาการเขียนโปรแกรมเชิงวัตถุเป็นสองแนวคิดที่แตกต่างกัน การเขียนโปรแกรมเชิงวัตถุไม่ต้องการภาษาเชิงวัตถุ เพียงแค่ต้องการกระดาษหรือกระดานไวท์บอร์ดเพื่อให้คุณสามารถออกแบบ UML ของคุณได้
slebetman

@slebetman ฉันไม่เห็นว่ามา เนื้อหาที่คุณไม่ต้องการกระดาษและไวท์บอร์ดคุณสามารถจินตนาการวัตถุและตามบางคนนี่คือวิธีที่เราคิด แต่สิ่งนี้ไม่ได้ใกล้เคียงกับการสนับสนุนภาษาของแนวคิด OOP ฉันขอโทษ แต่นี่เป็นข้อโต้แย้งที่ฉันไม่ต้องการเลือก
Evil

@Evil: ฉันไม่แน่ใจเกี่ยวกับความสามารถในการติดตามมันทั้งหมดทางจิตใจโดยไม่ต้องมีสิ่งที่เป็นนามธรรมที่จะช่วยคุณ งานแรกของฉันคือการได้รับรหัส C ขนาดใหญ่ที่ดูเหมือนอาร์เรย์ทั้งหมดที่มีพอยน์เตอร์ของฟังก์ชั่น (พาฉันไปสักครู่เพื่อคิดว่าไวยากรณ์แปลก ๆ หมายความว่าอย่างไร - ไม่มี google ย้อนหลัง) และฉันก็ดิ้นรนกับมันจนกระทั่งฉันเริ่มเห็นรูปแบบ และตระหนักว่าอาร์เรย์เหล่านั้นเป็นวัตถุและตัวชี้ฟังก์ชันเหล่านั้นเป็นวิธีการ ซื้อไวท์บอร์ดขนาดเล็กให้ตัวเองและใช้กระดาษ A4 จำนวนมาก แต่ในที่สุดฉันก็สามารถเข้าใจโค้ดได้
slebetman

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