ภาษาโปรแกรมเทียบกับภาษามาร์กอัปกับภาษาสคริปต์


38

จนถึงตอนนี้ฉันไม่ทราบความแตกต่างที่สำคัญระหว่างทั้งสามนี้ เมื่อมีคนถามฉันเกี่ยวกับเรื่องนี้ฉันจะบอกพวกเขาว่า C # เป็นภาษาการเขียนโปรแกรม HTML และ XML เป็นภาษามาร์กอัปและ JavaScript และ VBScript เป็นภาษาสคริปต์ แต่อะไรคือความแตกต่างที่สำคัญที่ทำให้พวกเขาแตกต่างจากคนอื่น?


อย่าลืมสืบค้นภาษา!
Kyle Delaney

คำตอบ:


38

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

  • ภาษามาร์กอัปใช้เพื่อควบคุมการนำเสนอข้อมูลเช่น "แสดงชื่อผู้ใช้เหล่านี้เป็นรายการหัวข้อย่อยหรือเป็นตาราง"

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

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

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

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

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


7
ภาษาสคริปต์เป็นประเภทย่อยของภาษาโปรแกรมอย่างเป็นทางการ (ฉันเคยเห็นภาษาเช่น C และ Java ถูกตีความอย่างสมบูรณ์ด้วย REPL อุปสรรคมีการรั่วไหลทั้งสองวิธี…)
Donal Fellows

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

1
@ DonalFellows: ฉันได้แก้ไขคำตอบของฉันเพื่อพูดถึงอย่างชัดเจนว่าหนึ่งคือส่วนย่อยของอีก
logc

1
ฉันสนับสนุนคำตอบนี้ในการเป็นเพียงคนเดียว (จนถึงตอนนี้) ที่อ้างว่าภาษามาร์กอัปเป็นภาษาที่อธิบายโครงสร้างของข้อมูล
Idan Arye

3
@ JörgWMittag: ฉันรู้ว่ามันจะมีข้อยกเว้นนั่นคือเหตุผลที่ฉันเริ่มต้นด้วย "จะมีข้อยกเว้นมากมาย" :) มิฉะนั้นแล้วคำตอบของฉันจะบอกว่าภาษาสคริปต์ไม่ได้ถูกรวบรวม? ฉันพยายามจดจ่อกับวัตถุประสงค์ของภาษาอย่างแม่นยำเพื่อหลีกเลี่ยงหลุมพรางนั้น ...
logc

11

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

ภาษามาร์กอัปไม่ถือเป็นภาษาโปรแกรม

ความแตกต่างกับภาษาโปรแกรมไม่ชัดเจนเสมอไป ตัวอย่างเช่น XSLT เป็นภาษาทัวริงที่สมบูรณ์² แต่ยึดตาม XML ซึ่งเป็นภาษามาร์กอัป

วิกิพีเดียใช้ความพยายามที่สำคัญเพื่อหลีกเลี่ยง XSLT ที่ผ่านการรับรองว่าเป็นภาษาโปรแกรมหรือภาษามาร์กอัป เพียงกล่าวว่าเป็นภาษาที่มีการประกาศและใช้“ เทคนิคการปรับให้เหมาะสมที่พบในภาษาโปรแกรมการทำงานและภาษาคิวรีฐานข้อมูล”

ภาษาสคริปต์เป็นภาษาการเขียนโปรแกรมที่ถูกตีความแทนที่จะรวบรวมซึ่งหมายความว่าภาษาสคริปต์แทนส่วนย่อยของภาษาการเขียนโปรแกรมทั้งหมด

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

ดูเพิ่มเติม: การแยก Meta-Hairsโดย Steven Lott


¹“ XML ไม่ใช่ภาษาโปรแกรม” ดูXML ใน 10 จุด

²“ XSLT เป็นภาษาทัวริงที่สมบูรณ์” ดูXSLT ใน Wikipedia

³“ HHVM รวบรวมการแฮ็คและ PHP ไว้ในไบต์กลาง bytecode นี้ถูกแปลแล้วเป็นรหัสเครื่อง x64 แบบไดนามิกที่รันไทม์โดยเพียงแค่ในเวลา (JIT) คอมไพเลอร์.” ดูHHVM

ภาษาสคริปต์ในรายการภาษาโปรแกรมตามประเภทบน Wikipedia


16
ภาษาจะไม่ถูกรวบรวมหรือตีความ ภาษาเพียงแค่มี การรวบรวมและการตีความเป็นลักษณะของคอมไพเลอร์หรือล่าม (duh!) ที่ใช้ในการใช้ภาษา คำว่า "ภาษาที่แปลแล้ว" หรือ "ภาษาที่แปลแล้ว" ไม่สมเหตุสมผลแม้แต่อยู่ในระดับที่แตกต่างกันของสิ่งที่เป็นนามธรรม หาก Englisch เป็นภาษาที่พิมพ์ "ภาษาที่รวบรวม" จะเป็นTypeError! ทุกภาษาสามารถดำเนินการโดยล่ามทุกภาษาสามารถนำไปใช้โดยคอมไพเลอร์
Jörg W Mittag

@ JörgWMittag "ทุกภาษาสามารถใช้งานได้โดยล่ามทุกภาษาสามารถใช้งานได้โดยคอมไพเลอร์" - 100% จริงหรือ?
spartacus

@spartacus ฉันเรียกว่าลังเลว่า "ไม่" ฉันคิดว่าภาษาใด ๆ ที่สามารถรวบรวมได้ก็สามารถตีความได้ (เพียงดำเนินการคำสั่งแทนการบันทึก) แต่ฉันได้ยินมาว่าhomoiconicityนั้นจำกัดความเป็นไปได้ของการรวบรวมอย่างรุนแรง
Izkata

@Izkata ฉันจะไม่พูดว่า homoiconicity เปลี่ยนแปลงความเป็นไปได้ของการคอมไพล์ แต่ metaprogramming นั้นจะช่วยให้มีการรวบรวมจำนวนมากที่ต้องรอการประมวลผลหากจำเป็น
Mark Hurd

1
ส่วน "ภาษาสคริปต์" ผิดอย่างสิ้นเชิงเนื่องจาก "Jörg W Mittag" ได้ชี้ให้เห็นแล้ว และด้านบนไม่มีคำอธิบายของ "ภาษาโปรแกรม"
David Raab

2

ในการสร้างอนุกรมวิธานใด ๆ คุณต้องถามตัวเองก่อน:

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

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

ภาษาโปรแกรม

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

ภาษาการเขียนโปรแกรมคอมพิวเตอร์จึงเป็นสิ่งที่คอมพิวเตอร์โปรแกรม

ภาษาสคริปต์

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

ภาษามาร์กอัป

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

นอกจากนี้ยังเป็นไปได้ที่จะให้การตีความ "การเขียนโปรแกรม" สำหรับภาษา XML สิ่งที่อาจเป็นดังนี้:

< := put interpreter in the reading node mode
! := if reading node, start CData/Comment mode
     else if not in read text mode, signal error
-- := if in start CData/Comment mode, start comment
      else if in comment, put in end comment mode
      else if in end comment mode, signal error
...

Bottom line: การแบ่งส่วนนี้ ณ วันนี้ดูเหมือนจะไม่มีความหมายมากนักมันสามารถให้สัญชาตญาณบางอย่างแก่คุณเกี่ยวกับภาษาที่คุณเผชิญ แต่มันจะไม่ให้คำจำกัดความที่เข้มงวดกับคุณ


1

แนวคิดทั้งสามนี้ซ้อนทับกันบ้างดังนั้นคุณสามารถรับอาร์กิวเมนต์ที่ไม่มีที่สิ้นสุดว่า XSLT เป็นภาษาการเขียนโปรแกรมหรือว่า Python เป็นภาษาสคริปต์หรือไม่

ภาษามาร์กอัปภาษาซึ่งเป็นตัวแทนของโครงสร้างข้อมูลในรูปแบบที่เป็นข้อความ , HTML เป็นส่วนใหญ่ที่รู้จักกันดี แต่มีรูปแบบต่าง ๆ นานาเพื่อวัตถุประสงค์ต่างๆเช่น SVG สำหรับกราฟิก, WSDL สำหรับการอธิบายการเชื่อมต่อบริการเว็บ resx สำหรับไฟล์ resouce ใน สุทธิและอื่น ๆ กฎง่ายๆคือภาษามาร์กอัปไม่ได้อธิบายกระบวนการหรืออัลกอริทึม (เช่นภาษาการเขียนโปรแกรม) แต่เป็นข้อมูลที่แท้จริง แต่ก็ยังเป็นความเข้าใจที่ CS พื้นฐานที่มีคือไม่มีความแตกต่างพื้นฐานระหว่างรหัสและข้อมูล ภาษามาร์กอัปบางภาษาเช่น XSLT มีลูปและเงื่อนไขเหมือนกับภาษาการเขียนโปรแกรม "ของจริง" และภาษาการเขียนโปรแกรมบางอย่างเช่น Prolog เป็นข้อมูลที่เกือบจะบริสุทธิ์โดยไม่มีกระบวนการที่ระบุไว้ในรหัส และเสียงกระเพื่อมพร่ามัวบรรทัดมากมันถือว่ารหัสของตัวเองเป็นรูปแบบข้อมูลที่มีโครงสร้าง

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


0

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

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

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

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


4
ภาษาจะไม่ถูกรวบรวมหรือตีความ ภาษาเพียงแค่มี การรวบรวมและการตีความเป็นลักษณะของคอมไพเลอร์หรือล่าม (duh!) ที่ใช้ในการใช้ภาษา คำว่า "ภาษาที่แปลแล้ว" หรือ "ภาษาที่แปลแล้ว" ไม่สมเหตุสมผลแม้แต่อยู่ในระดับที่แตกต่างกันของสิ่งที่เป็นนามธรรม หาก Englisch เป็นภาษาที่พิมพ์ "ภาษาที่รวบรวม" จะเป็นTypeError! ทุกภาษาสามารถดำเนินการโดยล่ามทุกภาษาสามารถนำไปใช้โดยคอมไพเลอร์ มันเป็นไปได้ที่จะสร้างคอมไพเลอร์โดยอัตโนมัติจากล่ามและในทางกลับกัน
Jörg W Mittag

@ JörgWMittagเป็นเรื่องจริงที่ไม่มีการรวบรวมหรือตีความภาษาโดยเนื้อแท้ แต่บ่อยครั้งที่มีการประชุมว่าจะดำเนินการอย่างไรซึ่งโดยทั่วไปแล้วเป็นสิ่งที่ฉันพูดถึง
Pierre Andersson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.