ภาษาแบบไดนามิก vs แบบคงที่พิมพ์สำหรับเว็บไซต์ [ปิด]


13

คำสั่งนี้แสดงให้เห็นว่าภาษาที่พิมพ์แบบคงที่ไม่เหมาะสำหรับเว็บไซต์:

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

ที่มา: http://www.infoq.com/interviews/kallen-scala-twitter

ถูกต้องหรือไม่ ทำไมหรือทำไมไม่?


6
ฟังดูเหมือนว่าพวกเขาไม่ได้พิจารณาภาษา / แพ็คเกจที่มีลำดับชั้นของวัตถุที่เหมาะสม ไม่จำเป็นต้องตรวจสอบว่าตัวควบคุมที่คุณกำลังเคลื่อนไหวนั้นเป็นButtonเมื่อใดที่WebControlมีข้อมูลทั้งหมดที่คุณต้องการและตัวควบคุมทั้งหมดนั้นได้รับมาจากมัน
Matthew อ่าน

5
Yup @Matthew - ฟังดูเหมือนใครบางคนที่ไม่รู้จักความแตกต่างหลากหลาย
Nicole

8
นอกจากนี้ - Twitter อาจได้รับความนิยม แต่ไม่ใช่เพราะไซต์ของพวกเขาเป็นผลงานชิ้นเอกด้านวิศวกรรม
Nicole

คำตอบ:


39

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

นอกจากนี้ตัวอย่างที่ผู้เขียนไม่ได้ให้ความรู้สึกจริงๆ ดูเหมือนว่าผู้ชายคนนี้ไม่รู้ว่าความหลากหลายนั้นสามารถทำได้โดยวิธีอื่นนอกเหนือจากการพิมพ์เป็ด

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


1
ฟังก์ชันลำดับแรกตกลงในประเภทเดียวกันกับชนิดข้อมูลย่อยโครงสร้างและชนิดข้อมูลพีชคณิตอย่างไร คุณทำให้ดูเหมือนว่าภาษาแบบไดนามิกไม่มีฟังก์ชันการเรียงลำดับแรกซึ่งเห็นได้ชัดว่าไม่เป็นความจริง (Scheme, Common Lisp, Erlang, Smalltalk, ... )
Frank Shearar

21
+1 สำหรับ"ดูเหมือนว่าผู้ชายคนนี้ไม่รู้ว่ารูปแบบที่หลากหลายสามารถทำได้โดยวิธีอื่นนอกเหนือจากการพิมพ์เป็ด"
Nicole

1
@ Frank Shearer: สิ่งที่ฉันหมายถึงคือพวกเขาได้รับการสนับสนุนด้วยความปลอดภัยประเภทเดียวกันกับค่าอื่น ๆ มีภาษาที่พิมพ์จำนวนมากที่รองรับค่าฟังก์ชัน แต่ไม่แยกความแตกต่างระหว่างลายเซ็น
back2dos

1
ฉันไม่เห็นด้วยเหมือนกันซึ่งเป็นเหตุผลที่ฉันเลือกสิ่งนี้เป็นคำตอบ
Bradford


8

ก่อนอื่นให้ระลึกไว้เสมอว่าผู้เขียนข้อความข้างต้นกำลังพูดถึงการพัฒนาเว็บไซต์ ดังนั้นเขาจึงกังวลเกี่ยวกับการพัฒนางานนำเสนอและนั่นคือสิ่งที่เขาคิดว่าสกาล่าจะไม่เป็นทางเลือกที่ดี ...

ต้องบอกว่าฉันมีประสบการณ์ที่ดีกับการพัฒนาเว็บไซต์ ฉันทำงานเป็นเวลาอย่างน้อย 8 ปีโดยเฉพาะกับ บริษัท 5 แห่งในเอเจนซี่ดิจิทัล

และใช่จากประสบการณ์ของฉันการพิมพ์แบบคงที่ภาษาที่รวบรวมในเลเยอร์การนำเสนออาจเป็นอุปสรรคใหญ่ เนื้อหาจะต้องมีการเปลี่ยนแปลงอย่างต่อเนื่องบ่อยกว่าความต้องการทางธุรกิจ และโดยปกติสิ่งนี้จะต้องทำโดยทีมที่แตกต่าง (ผู้พัฒนา "front-end") ปกติแล้วพวกเขาจะรู้เรื่อง HTML, JavaScript, มาตรฐานเว็บ, CSS แต่ไม่มากนักเกี่ยวกับภาษาฝั่งเซิร์ฟเวอร์เช่น Java และ C # พวกเขายังคิดว่าการเปลี่ยนแปลงใด ๆ ในเทมเพลตนั้นสามารถใช้ได้ทันที พวกเขาไม่ได้ใช้ในการรวบรวมและพิมพ์ข้อผิดพลาด และถูกต้อง: ภาษาที่พิมพ์แบบสแตติกจะดีมากสำหรับความต้องการที่ซับซ้อนและซับซ้อนเช่นการเข้าถึงข้อมูลและกฎเกณฑ์ทางธุรกิจ แต่ไม่ดีสำหรับการพัฒนาอินเตอร์เฟส

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

อย่างไรก็ตามฉันก็เห็นด้วยว่าสกาล่านั้นแตกต่างกันบ้าง ในขณะเดียวกันก็ใช้ verbose น้อยกว่าและแสดงออกได้มากกว่า Java ฉันเชื่อว่ามันสามารถใช้ในการพัฒนางานนำเสนอได้ดังนั้นบางทีมันอาจใช้เป็นภาษาเทมเพลตได้สำเร็จ และถ้ามันสามารถรวมเข้ากับกรอบเช่นPlay (ซึ่งรวบรวมเว็บไซต์โดยอัตโนมัติหลังจากการเปลี่ยนแปลงทุกครั้ง) มันอาจเป็น IMHO ที่ชนะ แต่ถึงกระนั้น Play ก็ยังเลือกใช้ภาษาเทมเพลตที่มีลักษณะคล้าย Groovy (ไดนามิก) ซึ่งไม่ใช่สัญญาณที่ดี

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

(และขอโทษเกี่ยวกับภาษาอังกฤษของฉันให้ฉันรู้ว่าบางสิ่งไม่ชัดเจนฉันจะพยายามแก้ไขมัน)


1
ฉันจะรองสิ่งนี้ - เพียงแค่ดูระเบียบ JSP / STRUTS เมื่อพวกเขาพยายามทำให้ Java เป็นภาษาเว็บ!
James Anderson

8

ผมคิดว่าข้อความ (และคำตอบมากที่สุด) กำลังผสมพิมพ์ staticallyภาษาและมากเกินไป verboseภาษา แน่นอนว่าทางแยกนั้นใหญ่มาก (โดยเฉพาะเมื่อพิจารณาเฉพาะภาษากระแสหลัก) แต่มีบางตัวอย่างที่น่าสนใจของภาษาที่ไม่ได้ verbose แบบคงที่: Go, Haskell, Scala, Rust ...


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

1
แค่ข้อสังเกตด้านข้าง: บางอย่างเช่น TypeScript (JavaScript พร้อมด้วยข้อมูลประเภทสแตติก) อาจเป็นวิธีที่ตรงไปตรงมาในการทดสอบทฤษฎีของ OP การสัมผัสสั้นของฉันเพื่อจะได้รับสวยดี - ครั้งหนึ่งเมื่อมีการแปลง JavaScript บางอย่างเพื่อ typescript ก็จริงช่วยให้ฉันพบว่าไม่มีทางเป็นไปได้สำหรับวิธีการบางอย่างที่จะเรียกและไม่สร้างข้อผิดพลาด
Katana314

5

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

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


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

@Giorgio น่าสนใจฉันไม่ค่อยมีตรรกะการตรวจสอบชนิดใด ๆ ในการทดสอบของฉัน
pllee

@pllee: บางครั้งมันไม่ได้เป็นตรรกะการตรวจสอบโดยตรง แต่การทดสอบตรวจสอบพฤติกรรมบางอย่างที่ระบบประเภทคงที่จะมีการบังคับใช้อยู่แล้ว
Giorgio

Bruce Eckel ดูเหมือนจะเป็นเพียงบุคคลอื่นที่ใช้เวลาหลายปีในการจัดการกับภาษา verbose มากเกินไป (Java, C ++, ... ) แล้วกระโดดรถไฟขบวนแรก (Python) ที่เขาพบ เขาใช้เวลาครึ่งหนึ่งของบทความที่ชื่นชมว่าไพ ธ อนไวยากรณ์นั้นยอดเยี่ยมแค่ไหน เขาไม่ได้มีส่วนร่วมในการอภิปรายนี้เนื่องจากขาดความรู้
ziggystar

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

2

ฉันเห็นด้วยกับสิ่งเหล่านี้ในกรณีส่วนใหญ่เพราะจะช่วยให้เผชิญกับมันเมื่อคุณจัดการกับลูกค้าในรูปแบบของเว็บความยืดหยุ่นเป็นสิ่งจำเป็น

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

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


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

2

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


1

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


ฉันคิดว่ามันน่าสังเกตว่า Scala นั้นค่อนข้างพิเศษเพราะใช้การอนุมานแบบและดังนั้นจึงไม่ได้อยู่ในหมวดหมู่การพิมพ์แบบคงที่เช่นเดียวกับ Java
Winston Ewert

1

คำตอบที่ใช้ได้จริง: ขึ้นอยู่กับขนาดและความซับซ้อนของขนาดเว็บ เว็บไซต์ขนาดเล็ก progr แบบไดนามิก lang, เว็บไซต์ขนาดใหญ่ที่ซับซ้อน, โปรแกรมแบบคงที่ lang

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

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

พิมพ์ Lagn ยังช่วยการใช้งาน IDE ที่ต้องใช้การตรวจสอบหลายประเภท

(นำโดยเพื่อนบ้านของคุณ progr. & ผู้ออกแบบคอมไพเลอร์ ;-))


0

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

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