ความแตกต่างระหว่างภาษาสคริปต์และภาษาโปรแกรมปกติคืออะไร


20

ภาษาการเขียนโปรแกรมและภาษาสคริปต์แตกต่างกันอย่างไร ตัวอย่างเช่นพิจารณา C กับ Perl

ความแตกต่างเพียงอย่างเดียวที่ภาษาสคริปต์ต้องการเพียงล่ามและไม่ต้องการการรวบรวมและการลิงก์?


4
ฉันเกรงว่านี่จะเป็นที่น่ารังเกียจ สิ่งที่คุณต้องการรู้เป็นเรื่องของการใช้ภาษาอย่างหมดจด นอกจากนี้ยังดูเหมือนว่าจะดึงดูดคำตอบตื้น / ความเห็น (ไม่ใช่ความผิดของคุณต่อ se) ซึ่งมักจะเป็นธงสีแดง
Raphael

ฮาร์ดแวร์คือ "ล่าม" สำหรับภาษาที่รวบรวม ความแตกต่างเพียงอย่างเดียวคือจำนวนล่ามที่คุณต้องทำ หากเครื่องทัวริงเทียบเท่าและคุณกำลังใช้ภาษาที่เทียบเท่าทัวริงคุณสามารถเขียนล่ามที่แปลAเป็นภาษาแล้วเขียนล่ามBในภาษาที่ล่ามAสามารถดำเนินการได้แล้วล่ามCในภาษาที่ล่ามBสามารถดำเนินการได้ เป็นต้นโดยพื้นฐานแล้วมันเป็นเรื่องของการอ้อมค้อมซึ่งมีน้อยกว่าเนื่องจากมีพื้นฐานทางทฤษฎีของการคำนวณและอื่น ๆ ที่เกี่ยวกับวิศวกรรมเชิงปฏิบัติ
Patrick87

เงินเดือน (ก่อน DevOps)
Phil Lello

คำตอบ:


21

ฉันคิดว่าความแตกต่างนั้นมีมากขึ้นเกี่ยวกับการใช้ภาษาที่ตั้งใจไว้

ตัวอย่างเช่น Python ตีความและไม่จำเป็นต้องรวบรวมและเชื่อมโยงเหมือน Prolog ฉันจะจัดให้ทั้งสองอย่างนี้เป็นโปรแกรม languges

การเขียนโปรแกรม langauges มีความหมายสำหรับการเขียนซอฟต์แวร์ พวกเขาถูกออกแบบมาเพื่อจัดการโครงการขนาดใหญ่ พวกเขาอาจเรียกโปรแกรมอ่านไฟล์ ฯลฯ แต่อาจไม่ค่อยดีเท่าภาษาสคริปต์

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

ตัวอย่างเช่น Bash ไม่ได้ทำเลขคณิตเป็นอย่างดีซึ่งอาจจะทำให้การเขียนซอฟต์แวร์ขนาดใหญ่ในฝันร้าย

ในฐานะที่เป็นมาตรฐาน: ฉันจะไม่มีวันเขียนเครื่องเล่นเพลงในภาษา Perl แม้ว่าฉันจะทำได้ ในทำนองเดียวกันฉันจะไม่พยายามใช้ C ++ เพื่อเปลี่ยนชื่อไฟล์ทั้งหมดในโฟลเดอร์ที่กำหนด

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


1
+1 สำหรับตัวอย่างจริง: ฉันนึกภาพไม่ออกเลยว่าต้องถูกบังคับให้ใช้ C ++ เพื่อดำเนินการเปลี่ยนชื่องาน!
Casey Kuball

3
คุณไม่ได้ระบุความแตกต่างทางแนวคิดใด ๆ มีเพียงความเห็นยอดนิยมเกี่ยวกับกรณีการใช้งานที่เกี่ยวข้อง
กราฟิลส์

3
คุณยังจะ "ไม่เขียน" เครือข่ายสังคมที่ใหญ่ที่สุดในโลกในภาษาสคริปต์ (FB ใน PHP) ซึ่งเป็นหนึ่งในบริการสร้างบล็อกแรกที่ส่งเสริมทั้งแนวโน้ม (LJ ใน Perl), ระบบควบคุมเวอร์ชันที่ช่วยให้นักพัฒนาหลายพันทำงานร่วมกันได้อย่างง่ายดาย ใน Python)? ขออภัย แต่ "การเขียนสคริปต์สำหรับงานเล็ก ๆ " นี้เป็นเพียงขยะ buzzwordy ยอดนิยม
Oleg V. Volkov

1
@ ราฟาเอลฉันคิดว่าความแตกต่างทางแนวคิดนั้นคลุมเครือที่สุด ความแตกต่างที่สำคัญคือการใช้ IMO ยอดนิยม ภาษาเหล่านี้ส่วนใหญ่จะทัวริงสมบูรณ์และทำตามรูปแบบการคำนวณที่คล้ายกัน ฉันไม่เคยเจอข้อแตกต่างหรือคำจำกัดความที่เป็นทางการ แต่อย่าลังเลที่จะแก้ไขคำตอบหากคุณมี
jmite

3
@ ราฟาเอลนั่นเป็นส่วนหนึ่งของประเด็น: ไม่มีความแตกต่างทางแนวคิด สิ่งที่คุณสามารถทำได้ในการคอมไพล์ - vs รันไทม์เป็นหลักของการตีความ vs รวบรวมและนั่นคือคุณสมบัติของการใช้งานไม่ใช่ภาษา (แม้ว่าการออกแบบภาษาสามารถทำให้รูปแบบการใช้งานเฉพาะยาก)
Gilles 'หยุดความชั่วร้าย' ใน

6

บทความคลาสสิกเกี่ยวกับภาษาสคริปต์คือการเขียนสคริปต์ของ John K. Ousterhout : การเขียนโปรแกรมระดับสูงสำหรับศตวรรษที่ 21เผยแพร่ในคอมพิวเตอร์ 31 (3), 1998 เขาดึงความแตกต่างระหว่างภาษาสคริปต์ด้วยมือเดียวและภาษาโปรแกรมระบบ อื่น ๆ.

Ousterhout โดดเด่นด้วยภาษาการเขียนโปรแกรมระบบที่พัฒนาขึ้นเพื่อแทนที่ภาษาเครื่องสำหรับการเขียนโปรแกรม พวกเขาซ่อนรายละเอียดที่น่าเบื่อเช่นการลงทะเบียนและลำดับการเรียกรูทีนย่อยจัดเตรียมโครงสร้างอย่างง่ายสำหรับการเขียนลูปและสำนวนการควบคุมทั่วไปอื่น ๆ และบังคับใช้วินัยการพิมพ์ พวกเขามักจะดำเนินการโดยคอมไพเลอร์ (ก่อนเวลา) ภาษาเหล่านี้มีความหมายสำหรับการเขียนซอฟต์แวร์ตั้งแต่เริ่มต้น ตัวอย่างคือ C, C ++ และ Java

ในทางตรงกันข้ามภาษาการเขียนสคริปต์ตาม Ousterhout เริ่มต้นจากหลักฐานว่ามีโปรแกรมที่มีประโยชน์อยู่แล้วโดยทั่วไปจะเขียนด้วยภาษาโปรแกรมระบบ ภาษาสคริปต์เช่น Perl, Python, Tcl, Visual Basic และ Unix shells จัดเตรียมเครื่องมือสำหรับการรวมโปรแกรมที่มีอยู่เหล่านี้เข้ากับโปรแกรมใหม่ Ousterhout โดดเด่นด้วยภาษาสคริปต์เป็น "typeless" (รวมถึงสิ่งที่เรียกว่าการพิมพ์แบบไดนามิกจำนวนมาก) และเน้นการพัฒนาอย่างรวดเร็ว; พวกเขามักจะใช้งานโดยล่าม

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

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


2

ภาษาสคริปต์ทั้งหมดเป็นภาษาโปรแกรม การสนทนาไม่เป็นความจริง ภาษาที่ "ต้องการเพียงล่าม" แปลเป็นภาษา (ต่างจากภาษาที่คอมไพล์ - โปรดทราบว่าบางภาษาเช่น Java มีทั้งสองประเภท)

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

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


คุณไม่ได้ระบุความแตกต่างทางแนวคิดใด ๆ มีเพียงความเห็นยอดนิยมเกี่ยวกับกรณีการใช้งานที่เกี่ยวข้อง
กราฟิลส์

1

ชุด 'ภาษาสคริปต์' เป็นเซตย่อยของชุด 'ภาษาการเขียนโปรแกรม' ความแตกต่างระหว่าง C และ Perl คือความแตกต่างระหว่างภาษาการเขียนโปรแกรมระบบและภาษาแอปพลิเคชันและระหว่างภาษาที่ตีความและภาษาที่รวบรวม

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

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

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

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


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

1

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

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


0

ความแตกต่างที่ฉันยังไม่ได้กล่าวถึงคือเมื่อใช้อย่างตั้งใจเวลาดำเนินการของสคริปต์ส่วนใหญ่จะถูกควบคุมด้วยการดำเนินการ "macroscopic" และประสิทธิภาพของการดำเนินการด้วยกล้องจุลทรรศน์จะไม่มีผลกระทบอย่างมีนัยสำคัญต่อเวลาดำเนินการโดยรวม ตัวอย่างเช่นหากโปรแกรมภาพเคลื่อนไหวการติดตาม ray อาจรวมถึงภาษาสคริปต์ด้วยคำสั่ง "render image" สคริปต์เพื่อสร้างภาพเคลื่อนไหว 240 เฟรมอาจใช้เวลาสี่ชั่วโมงในคำสั่ง "render image" และการทำสี่วินาทีทั้งหมด อย่างอื่น. แม้ว่าจะมีการเร่งทุกอย่างที่อยู่นอกเครื่องยนต์เรนเดอร์โดยมีค่าเป็นล้าน แต่นั่นจะมีผลต่อประสิทธิภาพโดยรวมน้อยกว่าการเร่งความเร็วของเรนเดอร์เครื่องยนต์ 0.1%

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