อะไรคือความแตกต่างระหว่างกระบวนทัศน์การเขียนโปรแกรมเชิงประกาศและขั้นตอน?


97

อะไรคือความแตกต่างระหว่างกระบวนทัศน์การเขียนโปรแกรมเชิงประกาศและขั้นตอน ? คุณช่วยยกตัวอย่างได้ไหม

มีกระบวนทัศน์การเขียนโปรแกรมอะไรอีกบ้าง?


2
คำถามที่คล้ายกัน: stackoverflow.com/questions/1784664/…
daCoda

คำตอบ:


108

จำเป็น

มีหลายย่อยกระบวนทัศน์ของกระบวนทัศน์การเขียนโปรแกรมที่จำเป็นเช่นมีขั้นตอนหรือเชิงวัตถุกระบวนทัศน์การเขียนโปรแกรม

ในกระบวนทัศน์การเขียนโปรแกรมที่จำเป็นคุณจะอธิบายอัลกอริทึมทีละขั้นตอนในระดับนามธรรมต่างๆ

ตัวอย่างภาษาโปรแกรมที่สนับสนุนกระบวนทัศน์ขั้นตอน:

  • C (และภาษาดั้งเดิมอื่น ๆ ส่วนใหญ่)
  • PHP ส่วนใหญ่
  • ในบางแง่ภาษาหลักทั้งหมด

เชิงวัตถุ

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

ตัวอย่างภาษาการเขียนโปรแกรมที่รองรับกระบวนทัศน์ OO:

  • Java

ประกาศ

มีกระบวนทัศน์ย่อยหลายประการของกระบวนทัศน์การเขียนโปรแกรมเชิงประกาศเช่นกระบวนทัศน์การเขียนโปรแกรมเชิงฟังก์ชันหรือตรรกะ

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

ตัวอย่างของภาษาโปรแกรมที่สนับสนุนกระบวนทัศน์การเขียนโปรแกรมแบบเปิดเผย:

  • yacc
  • ทรีท็อป
  • SQL
  • นิพจน์ทั่วไป
  • lex
  • XSLT
  • มาร์กอัป, troff, CSS, VHDL

การทำงาน

การเขียนโปรแกรมเชิงฟังก์ชันเน้นการประยุกต์ใช้ฟังก์ชันโดยไม่มีผลข้างเคียงและไม่มีสถานะที่เปลี่ยนแปลงได้ ระบบประกาศด้านบนแสดงลักษณะบางประการของการเขียนโปรแกรมเชิงฟังก์ชัน

ตัวอย่างของภาษาโปรแกรมที่สนับสนุนกระบวนทัศน์เชิงฟังก์ชันที่เปิดเผย:

  • Haskell
  • OCaml
  • โครงการ
  • Erlang
  • F #
  • สกาล่า

61

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

ตัวอย่างเช่น SQL มีการประกาศมากกว่าขั้นตอนเนื่องจากแบบสอบถามไม่ได้ระบุขั้นตอนในการสร้างผลลัพธ์


2
+1 สำหรับตัวอย่างที่ดีใน SQL ขอตัวอย่างเพิ่มเติมได้ไหม
mauris

5
มอริส: อาจจะไม่ใช่ภาษาการเขียนโปรแกรม แต่ HTML เป็นภาษาประกาศเนื่องจากคุณอธิบายสิ่งที่คุณต้องการ (ย่อหน้าที่มีบิตนี้เป็นตัวหนา) แทนที่จะเขียนว่า "draw string, measure string, advance position, etc. " อีกตัวอย่างหนึ่งคือ Prolog โดยที่ "โปรแกรม" คือชุดข้อมูลที่เปิดเผยและความสัมพันธ์ / การหักเงินและแบบสอบถาม เอ็นจิ้น Prolog ระบุวิธีประเมินการสืบค้น: คุณไม่จำเป็นต้องบอกวิธีดำเนินการดังกล่าว สุดท้ายนิพจน์ทั่วไป: คุณอธิบายรูปแบบแทนที่จะสะกดตามขั้นตอนเพื่อทดสอบการจับคู่
itowlson

MXML (ส่วนหนึ่งของเฟรมเวิร์ก Flex) มีการเปิดเผย: คุณบอกได้ว่าคุณต้องการให้วัตถุ / คอนเทนเนอร์ของคุณแสดงลำดับใดและจัดการเลย์เอาต์ขึ้นอยู่กับว่าคุณได้บอกให้จัดวางในแนวนอนหรือแนวตั้ง ActionScript 3 เป็นขั้นตอนที่รองรับกระบวนทัศน์ OOP
Hooray Im Help

makefiles เป็นภาษาประกาศที่มีชื่อเสียงมากอีกภาษาหนึ่ง
Stefano Borini

25

ขอยกตัวอย่างในโลกแห่งความเป็นจริง: ฉันต้องการชาสักถ้วย

ขั้นตอน:

  1. ไปที่ห้องครัว
  2. รับน้ำตาลนมและชา
  3. ผสมให้เข้ากันแล้วนำไปตั้งไฟจนเดือด
  4. ตักใส่ถ้วยแล้วนำมาให้ฉัน

ประกาศ:

  1. รับชาสักถ้วย

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

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


2
ตัวอย่างที่เรียบง่ายอย่างยิ่งนี้ทำให้จุดกลับบ้านสำหรับฉัน (บิต) แต่สิ่งหนึ่งที่ยังทำให้ฉันติดขัดพยายามที่จะเข้าใจความแตกต่าง - จะเกิดอะไรขึ้นถ้าไม่มีคำสั่ง "รับชาให้ฉันสักแก้ว" คุณจะต้องสร้างมันขึ้นมาเองหรือไม่? ถ้าเป็นเช่นนั้นคุณจะไม่สร้างฟังก์ชันที่คล้ายกับตัวอย่างขั้นตอนหรือไม่? ฉันเดาว่าสิ่งที่ทำให้ฉันสับสนคือดูเหมือนว่าขั้นตอนและการประกาศไม่ใช่คุณสมบัติตายตัวของภาษาใดภาษาหนึ่ง แต่คุณใช้ภาษานั้นอย่างไร? คุณสามารถพูดว่า"รับถ้วยชาให้ฉันหน่อย"ใน Java หากเป็นวิธีที่ใช้ได้ ...
Magnus W

5
ฉันสงสัยว่า "1. ชาเอิร์ลเกรย์ร้อน" น่าจะเป็นตัวอย่างที่ดีกว่า เป็นการประกาศสิ่งที่ต้องจัดส่งไม่ใช่สิ่งที่ต้องดำเนินการ ('Get me ... ')
JeffUK

แม็กนัสคำถามของคุณถูกต้อง ในความคิดของฉันภาษาประกาศเป็นภาษาระดับสูงมากกว่าและได้มาจากขั้นตอน จำเวลาที่นักพัฒนาต้องใช้บรรทัดคำสั่งเพื่อเพิ่มตัวเลขสองตัวได้หรือไม่? ตอนนี้คุณสามารถรับ SUM ของตัวเลขสองตัวขึ้นไปด้วยฟังก์ชันง่ายๆ ดังนั้นในมุมมองของฉันถ้าไม่มีคำสั่ง "รับถ้วยชาให้ฉัน" คุณต้องสร้างมันขึ้นมา คนต่อไปจะลองใช้เมื่อไหร่ก็จะมี นั่นเป็นไปตามความรู้ที่ไม่ดีของฉัน ขอบคุณ
Muhammad Zeeshan Tahir

5

การเขียนโปรแกรมขั้นตอน:

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

การเขียนโปรแกรมที่เปิดเผย:

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


0

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


0

เพื่อระบุความคิดเห็นที่ตอบได้และอาจให้ตัวอย่างระหว่างความแตกต่างของทั้งสอง Ansible เป็นขั้นตอนที่มีการประกาศบางอย่างเช่นหุ่นหรือพื้นดิน ตัวอย่างเช่นคุณสร้างไฟล์ yaml ansible เพื่อปรับใช้อินสแตนซ์ ec2 10 รายการดังนี้:
-ec2: count: 10 image: ami-058c6e5b73b074cd2 instance_type: t2.micro

หากคุณต้องเรียกใช้ไฟล์นั้นสองครั้งคุณจะได้อินสแตนซ์ t2.micro ec2 จำนวน 20 รายการ หากคุณเขียนสิ่งที่เทียบเท่าในภาษาประกาศเช่น terraform และเรียกใช้สองครั้งคุณจะมีอินสแตนซ์ t2.micro 10 ตัวเท่านั้นไม่ว่าคุณจะเรียกใช้กี่ครั้งก็ตาม ภาษาประกาศระบุสถานะสิ้นสุด ภาษาขั้นตอนทำในสิ่งที่คุณบอกโดยไม่คำนึงถึงสถานะปัจจุบันหรือในอดีต


-1

YAML เป็นภาษาการเขียนโปรแกรมที่เปิดเผยหรือไม่? เพราะเรากำหนดสิ่งที่เราต้องการแทนที่จะเขียนตรรกะที่แท้จริง

ฉันถามสิ่งนี้เพราะถ้าใครรู้จัก Ansible ซึ่งเป็นเครื่องมือจัดการการกำหนดค่าจะใช้ YAML แต่ก็ยังอยู่ในหมวดภาษาขั้นตอน



นี่เป็นเหมือนความคิดเห็นที่ยืนยันไม่ได้คำตอบ
zardilior

-2

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

ดังที่คุณจะเห็นในตัวอย่างในแนวทางที่เปิดเผยคุณไม่จำเป็นต้องแนะนำวิธีการแก้ปัญหา


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