ความแตกต่างทางสถาปัตยกรรมระหว่างภาษาแบบไดนามิกและแบบคงที่


22

มีความแตกต่างทางสถาปัตยกรรมที่สำคัญหรือไม่เมื่อออกแบบแอพพลิเคชั่นที่จะสร้างด้วยภาษาแบบสแตติก (เช่น C # หรือ Java) และภาษาแบบไดนามิก (เช่น Ruby หรือ Python)

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

นอกจากนี้ยังมีรูปแบบการออกแบบเฉพาะแบบไดนามิกหรือไม่


1
ไม่ว่าสิ่งที่มีความแตกต่างทางสถาปัตยกรรมคืออะไรภาษาไดนามิก - IronRuby และ IronPython - ชมเชยภาษาแบบคงที่ของ. Net
IAbstract

3
ฉันไม่แน่ใจ แต่ถ้า metaprogramming ง่ายกว่าในภาษาไดนามิก (แน่นอนว่าดูง่ายกว่าใน Ruby มากกว่า Java ในครั้งสุดท้ายที่ฉันดู) นั่นอาจมีผลต่อการตัดสินใจเกี่ยวกับระบบไฟฟ้า ฉันไม่แน่ใจว่าอิทธิพลแบบใดเพราะฉันไม่เคยทำอะไรที่ยิ่งใหญ่ในภาษาไดนามิกเหล่านี้
FrustratedWithFormsDesigner

คำตอบ:


14

ลองทำบางสิ่งให้ตรง:

  1. การเขียนสคริปต์เชิงโต้ตอบและภาษาแบบคงที่ไม่ได้เกิดขึ้นพร้อมกัน F # และ Haskell ทั้งสองมีส่วนเชื่อมต่อ REPL
  2. ภาษาแบบไดนามิกและประสิทธิภาพสูงไม่ได้เกิดขึ้นพร้อมกัน จาวาสคริปต์ทำงานได้ค่อนข้างเร็วบนเบราว์เซอร์ส่วนใหญ่ในปัจจุบัน
  3. แม้ในภาษาไดนามิกคุณยังต้องจัดทำเอกสารจดจำและคิดถึงประเภท
  4. เนื่องจากความนิยมที่เพิ่มขึ้นของการอนุมานประเภทภาษาคงที่จำนวนมากไม่จำเป็นต้องสังเกตประเภทบ่อยครั้งอีกต่อไป ในภาษาแบบสแตติกที่มีการอนุมานชนิดที่รัดกุมคอมไพเลอร์จะระบุว่าประเภทใดมาจากรหัสของคุณเพื่อให้ใช้เวลาส่วนใหญ่และบอกคุณว่าคุณทำสิ่งที่ละเมิดคำจำกัดความของประเภทหรือไม่ เท่าที่เกี่ยวข้องกับไวยากรณ์นี่เป็นสิ่งที่ดีที่สุดของทั้งสองโลก
  5. OOP และภาษาแบบไดนามิกนั้นไม่ได้เกิดขึ้นพร้อมกัน ตอนนี้ PHP รองรับคลาสและแม้กระทั่งการสืบทอด

ความคล้ายคลึงกันที่น่าประหลาดใจเหล่านั้นทั้งหมดมีความแตกต่างในทางปฏิบัติที่มีผลต่อกระบวนการพัฒนา:

  1. ภาษาแบบไดนามิกช่วยให้หาวิธีการที่น่าสนใจของการส่งผ่านข้อมูลไปรอบ ๆในขนาดเล็ก
  2. ภาษาแบบสแตติกช่วยให้คุณลดจำนวนการทดสอบที่คุณต้องทำโดยการทำให้ข้อบกพร่องหลาย ๆ อย่างเป็นไปไม่ได้
  3. ในหลอดเลือดดำเดียวกันว่าภาษาแบบคงที่ช่วยให้การตรวจสอบที่น่าสนใจและคุณสมบัติการแปลงโดยอัตโนมัติเช่นหน่วยวัดใน F #
  4. นำไปสู่การใช้ภาษาที่รุนแรงและคงที่ช่วยให้สัญญารหัสและการตรวจสอบอย่างเป็นทางการซึ่งสามารถจัดทำเอกสารและแบนออกป้องกันสิ่งต่าง ๆ เช่นที่อาจเกิดขึ้นหารด้วยศูนย์ลูปไม่มีที่สิ้นสุดการอ้างอิงเป็นโมฆะขนาดรายการที่ไม่ถูกต้อง ที่คุณอาจกำหนด
  5. ด้วยความสามารถที่เหนือกว่านั้นการเพิ่มประสิทธิภาพของ CPU สามารถทำตามข้อ จำกัด แบบคงที่เหล่านี้ซึ่งให้ประสิทธิภาพที่ดียิ่งขึ้น

นอกจากนี้ยังมีโปรแกรมประเภทหนึ่งที่ไม่สามารถทำได้โดยไม่มีการพิมพ์แบบคงที่: ภาวะเอกฐาน , ระบบปฏิบัติการที่ไม่มีขอบเขตกระบวนการฮาร์ดแวร์ มันเขียนใน C เล็กน้อย, C # บางส่วน, และภาษา C # ที่เรียกว่า Spec #, ซึ่งรองรับสัญญาโค้ด

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

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


ภาวะเอกฐานสามารถให้การรับประกันเวลาแฝงสูงสุดที่ทราบในเวลาจริงหรือไม่?
Eonil

@Eonil ไม่ใช่สาขาของฉันจริง ๆ แต่ฉันคิดว่าคุณกำลังถามว่ามันสามารถทำแบบเรียลไทม์ ฉันไม่คิดอย่างนั้นเพราะมันใช้การเก็บขยะทั่วสถานที่ ภาวะเอกฐานยังไม่ได้รับการปรับปรุงในขณะที่เท่าที่ฉันรู้ แต่อาจมีบางคนทำอะไรบางอย่างที่คล้ายกับนักสะสมขยะแบบเรียลไทม์
Rei Miyasaka

ขอบคุณ ฉันแค่ต้องการตรวจสอบ ผมเคยได้ยินมีกำลังการใช้งานบางอย่างเรียลไทม์ GC แต่ผมยังไม่เคยได้ยินว่าพวกเขาจะใช้งานได้จริงในอุตสาหกรรม ...
Eonil

2

มีความแตกต่างทางสถาปัตยกรรมที่สำคัญคือ ประสิทธิภาพ.

ขึ้นอยู่กับงบประมาณฮาร์ดแวร์ของคุณข้อตกลงปริมาณงานและระดับการบริการที่คาดไว้อาจเป็นไปไม่ได้ที่จะปฏิบัติตามข้อกำหนดด้วยภาษาแบบไดนามิก

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


1

ฉันไม่เคยคิดตามบรรทัดเหล่านี้ ดังนั้นเมื่อ Google ทำบล็อกของ Peter Norvigเป็นหนึ่งในความนิยมสูงสุด มันบอกว่ารูปแบบการออกแบบบางอย่างนั้นจะนำไปใช้ในภาษาไดนามิกได้ง่ายกว่าภาษาเชิงวัตถุดั้งเดิมเช่น C ++ ฉันคิดว่าควรมีความแตกต่างในการออกแบบ / สถาปัตยกรรมเช่นกันเนื่องจากเขาตั้งข้อสังเกตว่าการใช้งานง่ายขึ้นในภาษาแบบไดนามิก ฉันจะพยายามเพิ่มคำตอบให้มากขึ้นขณะที่ศึกษาเพิ่มเติม


1

มีความแตกต่างทางสถาปัตยกรรมที่สำคัญหรือไม่เมื่อออกแบบแอพพลิเคชั่นที่จะสร้างด้วยภาษาแบบสแตติก (เช่น C # หรือ Java) และภาษาแบบไดนามิก (เช่น Ruby หรือ Python)

เลขที่

ง่ายขึ้นเล็กน้อยในการเขียนกรอบงานแฟนซีสำหรับภาษาแบบไดนามิก แต่นั่นไม่ใช่สิ่งที่แอปพลิเคชัน

ความเป็นไปได้ในการออกแบบที่อาจเป็นตัวเลือกที่ดีสำหรับประเภทหนึ่งที่ไม่ดีสำหรับอีกประเภทหนึ่งคืออะไร

ไม่มีจริงๆ

คุณสามารถเขียนสิ่งที่ดีในภาษาใดก็ได้

มีคุณสมบัติที่มีประโยชน์ใด ๆ ที่สามารถใช้งานได้กับประเภทหนึ่งที่ไม่ได้อยู่กับคุณสมบัติอื่น (ในการออกแบบและสถาปัตยกรรม)

เลขที่

ความแตกต่างคือภาษาแบบไดนามิกคือ "เขียนเรียกใช้แก้ไข" คุณสามารถทดลองและแก้ไขได้อย่างรวดเร็ว

ภาษาแบบคงที่คือ "เขียนรวบรวมสร้างเรียกใช้แก้ไข" คุณไม่สามารถทดลองได้อย่างง่ายดาย

นอกเหนือจากนั้นพวกเขามีความสามารถเกือบเหมือนกัน

มีรูปแบบการออกแบบเฉพาะแบบไดนามิกหรือไม่?

อาจจะ. Python eval()และexecfile()ฟังก์ชั่น - ชี้ไปที่คุณลักษณะภาษาแบบไดนามิกที่ยาก (แต่ไกลจากที่เป็นไปไม่ได้) ที่จะจัดการกับภาษาแบบคงที่ มันจะมีโค้ดมากขึ้นเพื่อคอมไพล์และรันโค้ดในพื้นที่กระบวนการเดียวกัน

ไม่ใช่เฉพาะภาษาแบบไดนามิก ง่ายกว่า


2
"คุณไม่สามารถทดลองได้อย่างง่ายดาย" - จริงแล้วข้อเสียของคอมไพเลอร์จะช่วยคุณค้นหาข้อผิดพลาดในขณะที่ภาษาที่แปลแล้วคุณอาจไม่พบข้อผิดพลาดจนกว่าผู้ใช้จะประมวลผลบรรทัดรหัสนั้น
Doug T.

4
@Doug T .: "คอมไพเลอร์ช่วยคุณค้นหาข้อผิดพลาด" บางครั้ง ไม่บ่อยพอ ข้อผิดพลาดที่น่าสนใจไม่สามารถพบได้โดยคอมไพเลอร์เลย นั่นคือสิ่งที่ทดสอบหน่วยสำหรับ
S.Lott

2
@ S.Lott ฉันพบว่า API ที่เขียนในภาษาไดนามิกต้องใช้เอกสารอีกเล็กน้อย ในภาษาแบบสแตติกลายเซ็นต์ของเมธอดจะบอกคุณว่าต้องการอาร์กิวเมนต์ชนิดใด ในภาษาไดนามิกคุณไม่สามารถบอกได้อย่างง่ายดายเอกสาร API ต้องบอกคุณว่าวัตถุใดที่คาดหวัง
quanticle

1
@quanticle: นั่นไม่ใช่สถาปัตยกรรมจริงๆเหรอ?
S.Lott

2
"คุณไม่สามารถทดลองได้อย่างง่ายดาย" - F # และ Haskell เป็นทั้งภาษาคงที่และมี REPL ที่เต็มเปี่ยมและไม่ค่อยจะถามคุณถึงตัวระบุหรือประเภทของนิพจน์
Rei Miyasaka
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.