ภาษาที่มีการพิมพ์แบบไดนามิกควรได้รับการวิจารณ์หรือไม่? [ปิด]


35

ฉันได้อ่านบทความบนอินเทอร์เน็ตเกี่ยวกับการเลือกภาษาโปรแกรมในองค์กร เมื่อเร็ว ๆ นี้ภาษาที่พิมพ์แบบไดนามิกจำนวนมากได้รับความนิยมเช่น Ruby, Python, PHP และ Erlang แต่องค์กรจำนวนมากยังคงอยู่กับภาษาที่พิมพ์แบบคงที่เช่น C, C ++, C # และ Java

และใช่หนึ่งในประโยชน์ของภาษาที่พิมพ์แบบคงที่คือข้อผิดพลาดการเขียนโปรแกรมที่ถูกจับก่อนหน้านี้ในเวลารวบรวมมากกว่าในเวลาทำงาน แต่ยังมีข้อได้เปรียบกับภาษาที่พิมพ์แบบไดนามิก ( เพิ่มเติมเกี่ยวกับ Wikipedia )

เหตุผลหลักที่องค์กรไม่เริ่มใช้ภาษาอย่าง Erlang, Ruby และ Python ดูเหมือนว่าพวกเขาเป็นแบบไดนามิก นั่นก็เป็นเหตุผลหลักว่าทำไมคนใน StackOverflow ตัดสินใจต่อต้าน Erlang ดูทำไมคุณตัดสินใจ "กับ" Erlang

แต่มีดูเหมือนจะเป็นคำวิจารณ์ที่แข็งแกร่งกับพิมพ์แบบไดนามิกในองค์กร แต่ฉันไม่ได้รับมันจริงๆว่าทำไมมันเป็นที่แข็งแกร่ง

ทำไมมีการวิพากษ์วิจารณ์อย่างมากต่อการพิมพ์แบบไดนามิกในองค์กร? มันส่งผลกระทบต่อต้นทุนของโครงการมากหรือไม่? แต่บางทีฉันผิด


3
ฉันคิดว่าการพิมพ์แบบสแตติกที่มีการอนุมานประเภทและการพิมพ์เป็ดที่เป็นไปได้เป็นวิธีที่ดีที่สุดในการทำสิ่งต่าง ๆ มันซับซ้อนมากเช่นกัน
Casebash

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

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

2
@ChinmayKanchi: คำฟุ่มเฟื่อย? คุณเพิ่งประกาศบางสิ่งบางอย่างdynamicและเริ่มใช้มัน มันไม่ได้มากไปกว่าวิธีการโทรปกติหรือผู้ประกอบการเกินพิกัด
Joey

4
ฉันไม่สามารถนับจำนวนชั่วโมงที่ฉันเสียไปกับข้อผิดพลาดในการดีบัก บริษัท ปัจจุบันของฉันใน Groovy กับรหัส Grails ซึ่งคอมไพเลอร์จะตรวจพบทันทีที่เราใช้ Java
WKS

คำตอบ:


46

ใช่ฉันเชื่อว่าพวกเขาทำ

มีเหตุผลบางประการที่ต้องพิจารณาในการเลือกภาษาสำหรับโครงการใหม่:

  • ความเร็วรันไทม์ เมื่อเทียบกับ C / C ++ / Fortran, Perl และ Python ช้ามากมันตลกดี
  • ความเร็วการเริ่มต้น เมื่อเปรียบเทียบกับภาษาที่รวดเร็วข้างต้นJava มีมากกว่าและร้องไห้เมื่อ JVM ทำการโหลดและโหลดและ ... while(1)....
  • ต้นแบบความสามารถ การผ่านและการทำงานประกาศ / คำจำกัดความที่จำเป็นสำหรับ C ++ หรือ Java จะเพิ่ม LOC อย่างละเอียดซึ่งเป็นตัวชี้วัดที่เป็นที่รู้จักเพียงอย่างเดียวที่มีความสัมพันธ์อย่างน่าเชื่อถือกับ bugcounts นอกจากนี้ยังใช้เวลานานมาก นอกจากนี้ยังต้องใช้ความคิดอีกเล็กน้อยเกี่ยวกับประเภทและการเชื่อมต่อ
  • Fiddlability ภายใน แบบไดนามิก messing รอบด้วย internals ของคุณเป็นที่ดีจนกว่าคุณจะเริ่มที่จะแก้ปัญหาของคุณรหัสตนเองการปรับเปลี่ยน (Python, Lisp, Perl)
  • การตรวจสอบความถูกต้อง คอมไพเลอร์สามารถให้รหัสผ่านที่ถูกต้องแบบกึ่งสำเร็จในครั้งเดียวได้อย่างรวดเร็วใน C ++ และนี่อาจเป็นสิ่งที่ดีจริงๆ
  • รายละเอียดการวิเคราะห์แบบคงที่ C และ Java มีการวิเคราะห์สแตติกที่ดีพอสมควร Perl นั้นไม่สามารถวิเคราะห์ได้อย่างคงที่ในระดับทฤษฎี (อาจเป็น Python ด้วย) ฉันค่อนข้างแน่ใจว่า LISP ไม่เหมือนกัน
  • แพลตฟอร์มแปลก ๆ ใช้ C เท่านั้นโดยทั่วไป
  • ห่วงโซ่การสนับสนุน ถ้าคุณสามารถมีสัญญาที่คุณจะได้รับข้อบกพร่องของคุณมองไปที่และทำงานในที่มีขนาดใหญ่

หากคุณสามารถสันนิษฐานได้ว่าองค์กรที่คุณทำงานด้วยมีหลักการ "ก้าวไปข้างหน้า" (มีข้อกำหนดทางบัญชีสำหรับเรื่องนี้) และจะไม่เพียงแค่เลือกที่จะไม่ทำงานกับซอฟต์แวร์คุณจะมีกรณีที่ดีกว่ามากสำหรับ ใช้ซอฟต์แวร์ เนื่องจากไม่มีการขายธุรกิจที่สำคัญ(มีนัยในการรับผิดชอบในการดูแลรักษา) Python / Perl / $ dynamic_language จึงช่วยลดความเสี่ยงได้อย่างมาก

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

แน่นอนว่าฉันไม่ได้พูดถึงโลกของ webapp / startup ซึ่งมีแนวโน้มที่จะเล่นโดยกฎความเสี่ยงสูง / รางวัลสูงและเปิดกว้างมากที่จะอยู่บนขอบของเทคโนโลยี


16
"ฟรีคุณทำงานได้!" <- ปัญหาที่ใหญ่ที่สุดของ F / OSS โดยทั่วไปฉันจะ +1 แต่ฉันไม่ได้คะแนน :(
Billy ONeal

4
สรุปที่ดี ฉันจะยึดติดกับประเภทที่สร้างมาอย่างดีสื่อความหมายเชิงความหมาย (ฉันสามารถดูประเภทและเข้าใจสิ่งที่มันทำวิธีใช้งานได้) และสามารถใช้เพื่อบังคับใช้ความถูกต้องได้ (ฉันสามารถสร้างประเภทที่ยอมรับเฉพาะ inpus เท่านั้น ) และฉันไม่ได้รับข้อผิดพลาดโง่จากการพิมพ์ผิด (ฉันเกลียดการประกาศตัวแปรอัตโนมัติ)
smithco

4
คุณสามารถรับการสนับสนุนเชิงพาณิชย์สำหรับโครงการโอเพนซอร์สที่สำคัญ บริษัท ขนาดใหญ่ใช้ PL แบบไดนามิกสำหรับชิ้นส่วนขนาดใหญ่ (คนที่เหมาะสม), Facebook ใช้ PHP (UI) และ Erlang (แชท), Twitter ใช้ Ruby (UI), Google ใช้ Python (ฉันไม่ทราบว่ามีอะไร) และ Lisp และ Python ถูกนำมาใช้ในโครงการวิจัยที่ซับซ้อนมากมาย หมายเหตุ: ฉันเป็นนักพัฒนา C # ฉัน (เกือบ) ไม่เคยใช้ภาษาที่พิมพ์แบบไดนามิก แต่คะแนนเหล่านี้ไม่สามารถใช้การได้กับการเพิ่มจำนวนมาก
Kaveh Shahbazian

4
ผมชอบคำตอบของคุณ แต่ Java ไม่ได้พิมพ์แบบไดนามิก ...
Mehrdad

2
@ พอลนาธาน: คุณกำลังคิดหนักเกินไป คำถามที่ถามเกี่ยวกับภาษาที่พิมพ์แบบไดนามิกและคำตอบนี้กล่าวถึง Java ราวกับว่ามันเป็นแบบไดนามิก
Mehrdad

24

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

มี บริษัท เล็ก ๆ หลายแห่งที่จะกลายเป็นธุรกิจแห่งอนาคตและจะใช้ภาษาเหล่านั้นในที่สุด

และอย่าลืมรหัสที่เขียนใน VBA!


1
+1 สำหรับ "... วิสาหกิจในวันพรุ่งนี้ [และ] จะใช้ภาษาเหล่านั้น"
rdmueller

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

17

เหตุผลที่องค์กรใช้ C, C ++, C # และ Java ไม่ใช่เพราะพวกเขาพิมพ์แบบคงที่ (อย่างน้อยก็ไม่โดยตรง) ผู้มีอำนาจตัดสินใจระดับองค์กรไม่ได้เลือกสิ่งเหล่านี้บนพื้นฐานของการเปรียบเทียบวัตถุประสงค์ของระบบพิมพ์ฉันรับรองกับคุณ

รัฐวิสาหกิจทำดูแลเกี่ยวกับ:

  • ค่าใช้จ่ายในการบำรุงรักษาระยะยาว : คุณสามารถคาดหวังว่าสิ่งต่าง ๆ จะยังคงทำงานได้ดีในเวลา 10 ปี? มันเป็นสิ่งที่ดีถ้าวิวัฒนาการทางภาษานั้นอนุรักษ์นิยมและเข้ากันได้ย้อนหลัง (เช่นเดียวกับ Java) การพิมพ์แบบสแตติกมีประโยชน์ที่นี่เพราะมันจะจับข้อบกพร่องหลัก ๆ ในเวลารวบรวมก่อนที่มันจะเข้าสู่ระบบการผลิตของคุณ .....
  • ความพร้อมใช้งานที่มีความสามารถ - คุณจะสามารถค้นหานักพัฒนาเพื่อรักษาระบบใหม่ของคุณได้หรือไม่? จะเกิดอะไรขึ้นถ้านักพัฒนาดั้งเดิมออกไปทุกคนจะเข้าใจรหัสหรือไม่ สิ่งนี้ทำให้เกิดอุปสรรคสูงในการแนะนำภาษา "ใหม่" ใด ๆ (โดยเฉพาะอย่างยิ่งถ้ามันยังสร้างข้อกำหนดใหม่สำหรับการปรับใช้สร้างระบบสนับสนุนการดำเนินงาน ฯลฯ ) สิ่งนี้ให้ประโยชน์อย่างมากกับภาษาที่ใช้กันอย่างแพร่หลาย (C, C ++, C # และ Java)
  • ค่าใช้จ่ายในการรวมระบบ : เป็นเรื่องง่ายที่จะเชื่อมต่อ / รวมเข้ากับเทคโนโลยีอื่น ๆ ที่คุณมีอยู่แล้วหรือมีแนวโน้มที่จะได้รับ? หากคุณมีระบบ J2EE รุ่นเก่าอยู่แล้วคุณจำเป็นต้องรวมเข้ากับระบบเหล่านั้น โซลูชัน Java EE ใหม่มีแนวโน้มที่จะใช้งานได้จริงมากกว่านี้เช่น Python
  • Predicatbility / low risk : เป็นแพลตฟอร์ม / ภาษาที่พิสูจน์แล้วและฉันสามารถมั่นใจได้ว่ามันจะทำงานได้หรือไม่ ซึ่งมักจะเป็นมากขึ้นที่สำคัญกว่าการผลิตที่เรียบง่าย มันง่ายกว่ามากสำหรับผู้จัดการที่จะชักชวนให้เจ้านายของเขามอบงบประมาณขนาดใหญ่สำหรับกำลังคนในการสร้างระบบใหม่กว่าที่เขาจะต้องกลับไปในภายหลังและบอกว่ามันไม่ได้ทำงาน .....
  • การสนับสนุนองค์กร / การสนับสนุน - องค์กรระหว่างประเทศที่สำคัญมุ่งมั่นที่จะสนับสนุนภาษาและแพลตฟอร์มหรือไม่ พวกเขาจะลงนามในสัญญาเพื่อสนับสนุนฉันหรือไม่
  • ความเป็นกลางของผู้ขาย / แพลตฟอร์มอิสระ - ฉันจะถูกล็อคเข้ากับซัพพลายเออร์รายเดียวหรือไม่ หรือฉันมีทางเลือก / เส้นทางการเปลี่ยนผ่านของผู้จัดหาในอนาคตมากมาย คุณไม่ต้องการที่จะติดอยู่ในทางตันสถาปัตยกรรมไม่สามารถก้าวหน้าได้ในขณะที่คู่แข่งของคุณกินอาหารกลางวันของคุณ หากคุณทำงานอย่างถูกต้องในฐานะสถาปนิกขององค์กรคุณต้องคิดล่วงหน้าอย่างน้อย 5-10 ปีสำหรับสิ่งนี้

โดยส่วนตัวแล้วฉันคิดว่าถ้าคุณต้องการใช้ภาษาแบบไดนามิกใน Enterprise โอกาสที่ดีที่สุดของคุณคือการใช้บางสิ่งที่หมูหยอดบนระบบนิเวศขององค์กรที่มีอยู่ สิ่งที่น่าสังเกตมากที่สุดคือภาษา JVM แบบไดนามิกใหม่: เช่น JRuby, Groovy, Clojure เท่าที่ฝ่ายบริหารไอทีกังวลสิ่งเหล่านี้คือตัวเลือกภาษาแบบไดนามิกที่ "ปลอดภัย" เนื่องจากทำงานภายในและเล่นได้ดีกับระบบนิเวศองค์กรส่วนที่เหลือของ Java


1
ฉันไม่อยากจะเชื่อเลยว่าไม่มีใครตอบคำถามของคุณเลย
Sebastian N.

11

เหตุผลหลักที่องค์กรไม่เริ่มใช้ภาษาอย่าง Erlang, Ruby และ Python ดูเหมือนว่าพวกเขาเป็นแบบไดนามิก

ฉันคิดว่านี่เป็นเพียงข้อแก้ตัวหลักของพวกเขา เหตุผลที่แท้จริงคือธุรกิจไม่ได้ใส่ใจพวกเขาอย่างจริงจังและรู้สึกว่าพวกเขาอาจจะเป็นมือสมัครเล่นด้วย Java และ. NET เป็น“ ชื่อธุรกิจขนาดใหญ่” มีการตลาดเชิงพาณิชย์ที่ดีการสนับสนุนลูกค้าเชิงพาณิชย์และมีการดำเนินการอย่างกว้างขวางอย่างจริงจัง

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


8
จริงๆ? ครั้งล่าสุดที่ฉันเห็น Google มีน้ำหนักค่อนข้างมากและมีความพยายามในการพัฒนาอย่างมากหลัง Python รวมถึงการจ้างผู้สร้าง Python และอนุญาตให้เขาใช้เวลา 50% ในการทำงานกับภาษา Google ยังให้รหัสจำนวนที่ดีแก่ Python โดยเฉพาะอย่างยิ่งตอนนี้ที่ unladen-swallow ได้ถูกรวมเข้ากับทรีของ Python 3 นั่นทำให้ Python เป็น "ชื่อธุรกิจขนาดใหญ่" สำหรับฉัน
Chinmay Kanchi

13
@Chinmay Kanchi: น่าสนใจวิธีการที่คุณวาดข้อสรุปของคุณจากสถิติที่มีขนาดตัวอย่าง 1.
Timwi

6
Touch? อย่างไรก็ตามข้อสรุปบางส่วนของคุณมีข้อบกพร่องเช่นกัน ต้องดำเนินการตามภาษาแบบไดนามิกจะไกลยากกว่าการใช้ภาษาพิมพ์แบบคงที่ การพิมพ์แบบไดนามิกไม่ใช่ "แฮ็คคนขี้เกียจ" อย่างที่คุณเห็น มันช่วยให้นักพัฒนาขี้เกียจ แต่ไม่ใช่คนที่เขียนคอมไพเลอร์ / ล่าม ในความเป็นจริงการเพิ่มประสิทธิภาพของภาษาที่พิมพ์แบบไดนามิกนั้นยากที่ฉันจะนึกได้เพียงภาษาเดียวเท่านั้นที่ได้รับการรักษานี้อย่างกว้างขวาง (JavaScript) แม้ว่าจะมีการเพิ่มประสิทธิภาพ / โครงการ JITting สำหรับภาษาอื่น ๆ (Python, PHP)
Chinmay Kanchi

2
นอกจากนี้หากคุณคิดว่าภาษาที่พิมพ์แบบไดนามิกนั้นเป็นภาษาที่ใช้บ่อยที่สุดในสภาพแวดล้อมโอเพ่นซอร์สนี่ก็ยังห่างไกลจากความชัดเจน สิ่งนี้อาจเป็นจริง แต่ขึ้นอยู่กับตัวชี้วัดที่คุณเลือก การวัดเส้นของรหัส C ชนะโดยการยิงระยะไกล หากคุณวัดว่าภาษาใดที่ใช้ในโครงการโอเพ่นซอร์สรวมถึงภาษาหลายภาษาภาษาที่ได้รับความนิยมมากที่สุดคือ JavaScript, C, C ++ และ PHP ตามลำดับ หากคุณวัดเฉพาะภาษาหลักภาษาที่นิยมที่สุดคือ Perl, Java, C # และ JavaScript bit.ly/C6xTB
Chinmay Kanchi

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

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

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


1
ในขณะที่ความจริงที่ว่าคอมไพเลอร์ไม่พิถีพิถันนักแปลมักจะเป็น ล่ามส่วนใหญ่จะตรวจจับสถานการณ์ที่มีปัญหาและส่งสัญญาณข้อผิดพลาด
Winston Ewert

17
ฉันชอบการพิมพ์แบบไดนามิก แต่ฉันเกลียดที่จะไม่ต้องประกาศตัวแปรล่วงหน้า! หลายครั้งที่ฉันจบลงด้วยการแนะนำตัวแปรใหม่โดยบังเอิญเพราะฉันสะกดชื่อตัวแปรผิด
Frank Shearar

1
@ Frank: ฉันรักที่ Perl อย่างไม่พอใจที่มีการตั้งค่าเพื่อบังคับให้ประกาศตัวแปร เป็นหนึ่งในข้อดีของ Perl ในความคิดของฉัน
พอลนาธาน

8

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

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

ภาษาที่พิมพ์แบบไดนามิกนั้นช้ากว่าภาษาที่พิมพ์แบบคงที่ (แต่เราจะดูว่าการเปลี่ยนแปลง JIT ทำงานได้ดีเพียงใด)


2
"รับรู้โดย" โปรแกรมเมอร์บางคน เมื่อฉันมีข้อโต้แย้งกับโปรแกรมเมอร์เกี่ยวกับการพิมพ์แบบไดนามิกพวกเขามักจะยอมรับว่าพวกเขาไม่เคยใช้ภาษาแบบนั้น
Frank Shearar

1
@ Frank คุณกำลังบอกว่าคนที่โต้เถียงสำหรับความด้อยกว่าของการพิมพ์แบบไดนามิกโดยทั่วไปไม่ได้ใช้มัน?
Winston Ewert

2
@ Frank: ฉันได้ใช้ภาษาแบบนั้นและส่วนใหญ่แล้วผลลัพธ์ที่ได้ก็ไม่เป็นระเบียบ (เพื่อความเป็นธรรมมันเป็น PHP, PHP และมีปัญหาอื่น ๆ นอกเหนือจากการพิมพ์แบบไดนามิก)
บิลลี่ ONeal

@Billy: ฉันคิดว่านี่เป็นเรื่องปกติ ฉันใช้การพิมพ์แบบไดนามิกนานหลายปีเพราะประสบการณ์ของฉันกับ VB - ในที่สุดฉันก็ตระหนักว่าการใช้งานการพิมพ์แบบไดนามิกที่น่ากลัวนี้ไม่ได้เป็นเรื่องปกติความคิดของฉันเปลี่ยนไปอย่างมาก
Shog9

@ Winston: ฉันกำลังบอกว่าคนที่ฉันเคยเถียงไม่ได้ สำหรับฉันแล้ว "การพิมพ์แบบไดนามิกไม่สามารถทำงานได้" ... แต่พวกเขาจะใช้เทคนิคต่าง ๆ ที่พัฒนาขึ้นเป็นครั้งแรกโดยและภาษาแบบไดนามิก (IDEs, refactoring, ด้านบนของหัวของฉัน) นอกจากนี้คำถามเช่นนี้: stackoverflow.com/questions/2317579บ่งชี้ว่าแม้ว่าอาจไม่ใช่สากลกรณีของฉันในการโต้แย้งกับโปรแกรมเมอร์ที่ไม่ทำงาน แต่ฉันยังไม่ได้ลองก็ไม่ได้แยก (ฉันฉันคิดว่าทั้งสองวิธีมีคุณค่า)
Frank Shearar

8

หมายเหตุ: ส่วนใหญ่จะเป็นอัตนัยและขึ้นอยู่กับประสบการณ์และความประทับใจของฉัน

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

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

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

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

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

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

เหตุผลอื่น ๆ ที่ บริษัท ที่กล้าได้กล้าเสียไม่ใช้ภาษาที่พิมพ์แบบไดนามิกส่วนใหญ่เป็นรหัสดั้งเดิม โง่อย่างที่เราคิดว่าน่าเบื่อ บริษัท ขนาดใหญ่มักจะยึดติดกับวิธีแก้ปัญหาที่ใช้งานได้แม้ว่าพวกเขาจะผ่านพ้นอายุการเก็บรักษา นี่คือเหตุผลที่ บริษัท ใหญ่ ๆ หลายแห่งบังคับใช้ Internet Explorer 6 และช้าในการอัพเกรดระบบปฏิบัติการ นี่คือสาเหตุที่พวกเขามักจะเขียนโค้ดใหม่ในภาษา "เก่า" (เช่น Java เวอร์ชันเก่า): ง่ายกว่าการเพิ่มโค้ดสองสามบรรทัดลงในซอฟต์แวร์ที่ไม่มีชีวิตแทนที่จะได้รับการอนุมัติสำหรับการเขียนใหม่ทั้งหมดในใหม่ ภาษา.

tl; dr:ภาษาแบบคงที่รู้สึกเหมือนระบบราชการมากขึ้นดังนั้นผู้จัดการระดับมืออาชีพก็ชอบพวกเขาดีกว่า


3
ภาษาที่มีกฎการพิมพ์แบบหลวม ๆ จะสร้างโอกาสมากมายให้กับสิ่งที่ผิดกับการเรียงลำดับงาน ตัวอย่างเช่นใน JavaScript การส่งผ่านตัวเลขไปยังโค้ดซึ่งคาดว่าสตริงจะทำงานเหมือนว่ามีการผ่านการแสดงสตริงของตัวเลขนั้น แต่ไม่เสมอไป การพยายามที่จะผนวกเช่น 456 ถึง 123 จะไม่ได้ผล 123456 แต่จะให้ผล 579 แทนเว้นแต่จะเป็นที่ชัดเจนว่าใครเป็นผู้รับผิดชอบการแปลงหมายเลขต่อสตริงมันอาจจะเป็นการทำซ้ำซ้อนหรือไม่สามารถทำได้เลย
supercat

1
@supercat ผมคิดว่า PHP และ JavaScript เป็นตัวอย่างที่ดีสำหรับทั้งสองวิธีในการจัดการกับปัญหาที่ (เกี่ยวกับการประกอบการที่มี): ในผู้ประกอบการมีความโปร่งใส PHP - +ใช้เวลาตัวเลขและเพิ่มพวกเขาถ้าคุณต้องการที่เรียงต่อกันที่คุณจำเป็นต้องใช้.; ใน JS การดำเนินการทั้งสองจะใช้โอเปอเรเตอร์ร่วมกัน - หากคุณไม่ทราบว่าค่าของคุณจะทำงานอย่างไรคุณคาดว่าจะทำการแปลงให้ชัดเจน แน่นอนว่าสิ่งนี้เกี่ยวข้องกับการพิมพ์ที่ไม่รัดกุมเทียบกับการพิมพ์ที่เข้มงวด (Python ยิ่งเข้มงวด) แต่โดยทั่วไปคุณต้องแน่ใจว่าค่าของคุณมีประเภทที่ถูกต้องหรือทำให้การบังคับใช้ของคุณเป็นไปตามประเภทที่คาดไว้
Alan Plum

1
ฉันไม่คุ้นเคยกับ PHP มาก แต่ดูเหมือนว่ามันใช้สิ่งที่ฉันเรียกว่า "ถูกต้อง" Javascript นั้นน่ารังเกียจ IMHO ในหลาย ๆ ด้าน แต่ฉันคิดว่าพฤติกรรมของ "+" นั้นแย่ที่สุดอย่างหนึ่ง ที่จริงแล้วฉันไม่เชื่อว่าการพิมพ์แบบไดนามิกแบบ loosy-goosy จะมีความได้เปรียบมากกว่าระบบการพิมพ์ที่แข็งแกร่งกว่าซึ่งอนุญาตให้ส่วนต่อประสานประกาศว่าสิ่งอื่น ๆ ในชั้นเรียนหรือประเภทอินเตอร์เฟสควรได้รับการพิจารณาว่าเป็นการใช้งาน เกี่ยวกับวิธีการเรียกร้องที่จะจัดลำดับความสำคัญ ข้อ จำกัด ใหญ่ฉันรู้กับกรอบโครงสร้างพิมพ์ในปัจจุบันก็คือว่า ...
SuperCat

1
... หากสองคนพัฒนาอินเทอร์เฟซที่คล้ายกันเป็นอิสระไม่มีบุคคลที่สามที่จะเขียนโค้ดที่สามารถใช้แทนกันได้ หากบุคคลที่สามสามารถกำหนดอินเทอร์เฟซใหม่และประกาศว่าการใช้งานของอย่างใดอย่างหนึ่งหรือทั้งสองที่มีอยู่ควรดำเนินการใหม่โดยอัตโนมัติ (ใช้ wrappers ที่ให้มาในอินเทอร์เฟซใหม่ถ้าจำเป็น) ฉันคิดว่าจะจัดการ 99% เก่งเกี่ยวกับการพิมพ์แบบไดนามิก
supercat

3

ไม่ฉันไม่คิดว่าภาษาที่พิมพ์แบบไดนามิกควรได้รับการวิจารณ์ทั้งหมด (หรือหากคุณต้องการพวกเขาสมควรได้รับการวิจารณ์มากพอ ๆ กับภาษาที่พิมพ์แบบคงที่)

จากประสบการณ์ของฉัน (และฉันไม่พยายามที่จะพูดคุยเรื่องนี้กับคนทั่วไป) โปรแกรมเมอร์ที่วิจารณ์ภาษาแบบไดนามิกไม่ได้ใช้มัน บทสนทนามักจะ "แต่ด้วยการพิมพ์คอมไพเลอร์คงที่จับข้อผิดพลาดมากมาย!" และฉันพูดว่า "ดีนั่นไม่ใช่แค่ปัญหาในประสบการณ์ของฉัน" (โดยปกติแล้วโปรแกรมเมอร์คนอื่น ๆ จาก Java, Delphi หรือพื้นหลังที่คล้ายกันฉันไม่รู้จักโปรแกรมเมอร์ Haskell หรือ ML)

สิ่งเดียวที่มันเจ็บปวดฉันคือเมื่อการเรียกร้องคนที่เทคนิคฟูไม่สามารถเป็นไปได้ที่จะทำ (หรืออาจจะเป็นเรื่องยากมากที่จะทำ) ในภาษาพิมพ์แบบไดนามิก ... เมื่อเทคนิคที่ถูกประดิษฐ์ขึ้นในโดยและสำหรับพิมพ์แบบไดนามิก ภาษา. IDEs? หูฟัง. การปรับโครงสร้างใหม่อัตโนมัติหรือไม่ หูฟัง. โทรติดต่อของ / implementors ของ? หูฟัง.


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

6
เมื่อโปรแกรมเมอร์คนอื่นมาจาก Haskell เขา / เธอรู้แล้วว่ามันเป็นภาษาที่เหนือกว่าทั้งภาษาจาวาและภาษาไดนามิก;)
Andres F.

0

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


ฉันไม่รู้ว่าทำไมสิ่งนี้จึงถูกลดระดับลง แต่เป็นคำกล่าวที่ลึกซึ้ง องค์กรมีความช้าและอนุรักษ์นิยม ผู้คนก็ชอบการเปลี่ยนแปลงทีละน้อย (เช่นคำสำคัญแบบไดนามิกใน C # ซึ่งช่วยให้คุณสามารถใช้การพิมพ์แบบไดนามิกในภาษาที่พิมพ์แบบคงที่) เพื่อการเปลี่ยนแปลงอย่างกะทันหัน (เช่น Ruby)
Vaddadi Kartick
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.