ความแตกต่างระหว่างการเขียนโปรแกรมที่จำเป็นขั้นตอนและมีโครงสร้างคืออะไร?


85

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

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

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

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

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

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

ป้อนคำอธิบายรูปภาพที่นี่

คำตอบ:


52

คำศัพท์จำนวนมากสามารถนำมาใช้ซ้ำ (มักใช้ในทางที่ผิด) เกี่ยวกับภาษาการเขียนโปรแกรม

ต่อไปนี้เป็นคำอธิบายเล็กน้อยของข้อกำหนด

  1. การเขียนโปรแกรมที่จำเป็น - ในวันเก่า ๆ ที่ดีเมื่อมีการเขียนโปรแกรมในวงกว้างการชุมนุมรหัสจะมี GOTO จำนวนมาก ภาษาระดับที่สูงขึ้นเช่น FORTRAN และ BASIC ก็เริ่มใช้ภาษาพื้นฐานเดียวกัน ในกระบวนทัศน์การเขียนโปรแกรมนี้โปรแกรมทั้งหมดเป็นอัลกอริทึมเดียวหรือฟังก์ชั่นที่สมบูรณ์เขียนเชิงเส้น - ทีละขั้นตอน นี่คือความจำเป็นสไตล์ เข้าใจว่าสามารถเขียนงานที่ไม่ดีได้อย่างสมบูรณ์แม้ในภาษา C สมัยใหม่เช่นกัน แต่มันค่อนข้างง่ายในการจัดระเบียบโค้ดในภาษาระดับสูงกว่า

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

    • การเขียนโปรแกรมแบบโครงสร้างคือการเขียนโปรแกรมใด ๆ เมื่อฟังก์ชั่นจะแบ่งออกเป็นหน่วยเช่นfor loop, while loop, if... thenโครงสร้างบล็อก ฯลฯ
    • นอกจากนี้ที่นี่สามารถใช้ชิ้นส่วนของรหัส (ฟังก์ชัน) อีกครั้งได้
    • ในการเขียนโปรแกรมแบบแยกส่วนหนึ่งสามารถสร้างรูปแบบทางกายภาพของแพคเกจ - เช่นก้อนของรหัสที่สามารถจัดส่งได้ ซึ่งมีวัตถุประสงค์ทั่วไปที่ค่อนข้างเป็นธรรมและสามารถใช้งานได้อีกครั้ง นี้เรียกว่าโมดูลขององค์ประกอบที่รวบรวมเข้าด้วยกัน
    • ดังนั้นเราแทบจะไม่สามารถเห็นโปรแกรมแบบแยกส่วนที่ไม่มีโครงสร้างและในทางกลับกัน ความหมายทางเทคนิคแตกต่างกันเล็กน้อย แต่รหัสที่มีโครงสร้างส่วนใหญ่สามารถทำแบบแยกส่วนและวิธีอื่น ๆ
  3. จากนั้น "การเขียนโปรแกรมเชิงวัตถุ" ซึ่งถูกกำหนดไว้อย่างดีในวรรณคดี เข้าใจว่าการเขียนโปรแกรมเชิงวัตถุเป็นรูปแบบของการเขียนโปรแกรมที่มีโครงสร้างตามคำนิยาม ชื่อใหม่สำหรับรหัสที่ใช้ฟังก์ชั่นเหล่านั้นซึ่งเป็นรหัสที่มีโครงสร้าง แต่ไม่ได้มุ่งเน้นวัตถุมักจะเรียกว่าเป็นการเขียนโปรแกรมขั้นตอน

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

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

หากต้องการระบุคำถามของคุณโดยเฉพาะ:

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

  • การแก้ไข * รูปแบบการประกอบที่ทันสมัยที่สุดรองรับการใช้ฟังก์ชั่น ในความเป็นจริงทุกอย่างที่เป็นไปได้ในรหัสระดับสูง HAS จะมีระดับต่ำในการทำงาน แม้ว่ามันจะเป็นวิธีปฏิบัติที่ดีกว่าในการสร้างรหัสขั้นตอน แต่ก็เป็นไปได้ที่จะเขียนทั้งรหัสขั้นตอนและรหัสที่จำเป็น ซึ่งแตกต่างจากหลังมันบำรุงรักษามากขึ้นและง่ายต่อการเข้าใจ (หลีกเลี่ยงรหัสสปาเก็ตตี้ที่น่ากลัว) ฉันคิดว่ามีสคริปต์ shell / bash ที่เหมาะสมกับการยกย่องว่าเป็นสิ่งจำเป็นอย่างยิ่ง แต่ถึงอย่างนั้นส่วนใหญ่ก็มีฟังก์ชั่นนักพัฒนาเข้าใจถึงคุณค่าที่พวกเขามี

คำถามที่สอง : การเขียนโปรแกรมเชิงกระบวนการเป็นรูปแบบของการเขียนโปรแกรมที่มีโครงสร้าง


โบนัส


1
ดังนั้นคุณจะบอกว่าการเขียนโปรแกรมตามขั้นตอนจำเป็นต้องมีการเขียนโปรแกรมที่มีโครงสร้างในขณะที่สิ่งที่ตรงกันข้ามนั้นไม่เป็นความจริง
Daniel Scocco

2
ใช่ฉันจะพูดอย่างนั้น
Dipan Mehta

1
ในคำตอบของฉันฉันได้กำหนดคำสั่งเปรียบเทียบกับโครงสร้าง - ที่การเขียนโปรแกรมจำเป็นจะต้องเขียนด้วยการดำเนินการทีละขั้นตอนและไม่มีโครงสร้าง อย่างไรก็ตามตามคำจำกัดความมีการจำแนกประเภทอื่น; นี่คือการจำแนกประเภทระหว่าง Declarative (หรือภาษาที่ใช้งานได้) กับ Imperative ภาษาที่มีการประกาศอนุญาตให้คำนวณได้โดยไม่ต้องอธิบายโฟลว์การควบคุมโดยที่จำเป็นคือการกำหนดโฟลว์การควบคุมที่ชัดเจน (ทีละขั้นตอน) จากการจัดหมวดหมู่นี้การวางโปรแกรมที่จำเป็นสำหรับบางคนอาจเป็นชุดสุดยอดของโครงสร้าง บางคนไม่ค่อยปฏิบัติตามคำจำกัดความนั้น
Dipan Mehta

ฉันมีความคิดเห็นที่แตกต่างกันโดยขึ้นอยู่กับคำจำกัดความของการเขียนโปรแกรมที่มีโครงสร้าง การเขียนโปรแกรมแบบมีโครงสร้างและการเขียนโปรแกรมแบบแยกส่วนไม่เหมือนกัน โปรดดูคำจำกัดความที่ท้ายหมายเหตุนี้ ลิงค์เดียวกันแสดงให้เห็นว่า Assembler ** เป็นภาษาการเขียนโปรแกรมที่มีโครงสร้าง **! อ้างอิงสำหรับคำจำกัดความของ STP: en.wikipedia.org/wiki/Structured_programming - Emmad Kareem
NoChance

"รูปแบบฟิสิคัลของแพ็กเกจ" คือ ... ไฟล์หรือไดเร็กทอรี / ไฟล์เก็บถาวรหรือไม่? (หรือไม่ใช่และมันเป็นอย่างอื่น)
n611x007

4

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

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

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

ดังนั้นคุณสมบัติทั้งสองนี้จะแยกจากกันคุณสามารถมีได้โดยไม่มีคุณสมบัติอื่น


1
การทดสอบสารสีน้ำเงินเพียงอย่างเดียวสำหรับขั้นตอนการปฏิบัติก็คือภาษานั้นมีขั้นตอน (ฟังก์ชั่นหรือวิธีการ ) และมีความจำเป็นเช่น ไม่ใช่บอกเล่า ซึ่งหมายความว่าภาษา OO ส่วนใหญ่ที่ไม่ได้ใช้งานได้จริงจะเป็นขั้นตอน
dietbuddha

1
@dietbuddha: ตามคำนิยามนี้ Haskell จะถือว่าเป็นภาษาขั้นตอนผ่านการใช้ monads ฉันต้องการความเชื่อมั่นอย่างมากเกี่ยวกับขั้นตอนการทำขั้นตอนภาษา
thiton

ฉันไม่รู้จัก Haskell แต่ฉันคิดว่า Haskell เป็นภาษาที่ใช้งานได้จริงเพราะมันห่อผลข้างเคียงใน Monads
dietbuddha

2
ดีบางคนอ้าง Haskell ไม่ได้ทำงานอย่างหมดจดเพราะจะช่วยให้มีปฏิสัมพันธ์กับโลกภายนอกใด ๆ (หรือเพราะ GHC นามสกุล , unsafePerformIOช่วยให้ซื่อบื้อ Havok) บางคนก็ตลกว่า Haskell เป็นภาษาการเขียนโปรแกรมที่พวกเขาต้องการ แต่ความจริงก็คือรหัส Haskell ที่มีขนาดใหญ่มากมีชีวิตที่แยกจากกันอย่างหมดจดIOไม่ใช้ช่องโหว่ที่ไม่เป็นมาตรฐานเพื่อแอบดูผลข้างเคียงและทำงานได้อย่างหมดจด

1
@ ทันใดนั้นฉันไม่เห็นด้วย Monads ก็มีโครงสร้างที่ใช้งานได้เช่นกัน พวกเขาดูมีความจำเป็นเท่านั้นเนื่องจากน้ำตาลของไวยากรณ์ของ Haskell (ที่ "ทำสัญลักษณ์") เมื่อคุณ desugar monads ลักษณะการทำงานของพวกเขาจะชัดเจน ในทางตรงกันข้ามภาษา OO มีความจำเป็นจริง ๆ : ที่สำคัญของพวกเขาพวกเขาจะขึ้นอยู่กับการดำเนินการตามลำดับของงบ
Andres F.

2

ภาษายอดนิยมส่วนใหญ่ในช่วง 50 ปีที่ผ่านมาได้รับการออกแบบรอบ ๆ สถาปัตยกรรมคอมพิวเตอร์ที่แพร่หลายซึ่งเรียกว่าสถาปัตยกรรม Von Neumannหลังจาก John John Von Neumannเป็นผู้ริเริ่ม

ภาษาเหล่านี้เรียกว่าภาษาที่จำเป็น

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


1
+1 ไม่แน่ใจว่าสิ่งนี้เกี่ยวข้องกับคำถาม แต่เป็นคำตอบที่น่าสนใจ
Chuck Conway

2
อะไร? ส่วนเกี่ยวกับ Imperative กับขั้นตอนที่ ฯลฯ อยู่ที่ไหน
bbqchickenrobot

ฉันคิดว่าจุดที่นี่คือการพูดคลุมเครือเกี่ยวกับโครงสร้างของโปรแกรม (จำเป็น, ประกาศ, ขั้นตอน, เชิงวัตถุ, ฟังก์ชั่น ฯลฯ ) เป็นโครงสร้างภาษาและท้ายที่สุดโปรแกรมทั้งหมดจะถูกประมวลผลบนเครื่องสถาปัตยกรรม Von Neumann สิ่งนี้คล้ายกับการบอกว่าภาษาทัวริงทั้งหมดนั้นเทียบเท่ากัน
ChuckCottrill

2

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

จำเป็นขั้นตอนและโครงสร้างไม่ได้เป็นคุณสมบัติพิเศษร่วมกันพวกเขาเพียงแค่มุ่งเน้นด้านเดียวของตรรกะการสร้างแบบจำลอง

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

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

การเขียนโปรแกรมแบบมีโครงสร้างเป็นขั้นตอนต่อไปจากความสามารถในการข้ามไปยังคำสั่งอื่น ในที่สุดทุกอย่างก็จะกระโดดลงไป แต่ถ้าคุณสามารถกระโดดได้ตามเงื่อนไขคุณสามารถสร้างคำสั่งควบคุมการไหลขั้นพื้นฐานเช่น if-then, for, while, when, repeat-จนถึงและ switch การใช้สิ่งเหล่านี้เรียกว่าการเขียนโปรแกรมแบบมีโครงสร้าง

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

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

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