การเขียนโปรแกรมเชิงประกาศคืออะไร? [ปิด]


193

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


7
คำตอบที่คุณเลือกให้ถูกต้อง (ระบุโดยเครื่องหมายถูกสีเขียว) ไม่ถูกต้อง มันไม่ได้กำหนดสิ่งที่แยกความแตกต่างของการเขียนโปรแกรมที่ประกาศจากสิ่งที่ตรงกันข้าม - การเขียนโปรแกรมที่จำเป็น โปรดพิจารณาเปลี่ยนการเลือกของคุณ
Shelby Moore III

3
ใช่คำตอบที่ทำเครื่องหมายว่าถูกต้องนั้นไม่ถูกต้อง
เดอร์มอท

4
@ShelbyMooreIII ยังระบุว่าคำตอบใดถูกต้องเพื่อให้เราสามารถอ่านได้!
vivek.m

@ vivek.m ฉันได้ให้คำตอบใหม่วันนี้
Shelby Moore III

คำตอบ:


148

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

ตัวอย่างภาษาโปรแกรมที่ประกาศคือ SQL และ Prolog


29
คุณยังจะคิดออก "วิธีการ" ที่จะบอกคอมพิวเตอร์ "อะไร" คุณต้องการ :)
Hasen

7
@hasenj นี่และคำตอบอื่น ๆ ไม่ได้กำหนดคุณลักษณะเฉพาะที่ไม่ได้ใช้ร่วมกับการเขียนโปรแกรมจำเป็น - ซึ่งไม่สามารถเปลี่ยนแปลงได้
Shelby Moore III 3

3
มันจะดีมากถ้าคุณสามารถพูดถึงว่ามันแตกต่างจากการเขียนโปรแกรมที่จำเป็น (ภาษาเช่น C, C ++, C #) แล้วมันจะง่ายขึ้นสำหรับผู้อ่านที่จะสร้างความแตกต่าง
RBT

1
โปรแกรมเมอร์ : "ฉันอยากไปเที่ยวปารีส" declarative (c) : "คุณจะไปที่นั่นได้อย่างไรแล่นเรือหรือไม่หรืออาจบินในเครื่องบิน? บางทีแล่นครึ่งทางแล้วบินไปที่นั่น" โปรแกรมเมอร์ : "ฉันไม่มีความสนใจในสิ่งที่มันทำ" คำสั่ง (sql) : "ไม่ต้องกังวลฉันสามารถค้นหาสิ่งที่คุณต้องการได้" ( นี้เป็นวิธีที่ผมเข้าใจคำตอบ )
เนท

SQL สามารถประกาศอย่างไรถ้ารองรับนิพจน์ที่ไม่โปร่งใสในการอ้างอิง?
java-addict301

80

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

ความเป็นอิสระของบริบท

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

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

  • สร้างตัวแยกวิเคราะห์ C สำหรับไวยากรณ์นั้น (กรณีการใช้งานเดิมสำหรับyacc)
  • สร้างตัวแยกวิเคราะห์ C ++ สำหรับไวยากรณ์นั้น
  • สร้างตัวแยกวิเคราะห์ Java สำหรับไวยากรณ์นั้น (โดยใช้ Jay)
  • สร้าง C # parser สำหรับไวยากรณ์นั้น (ใช้ GPPG)
  • สร้าง Ruby parser สำหรับไวยากรณ์นั้น (ใช้ Racc)
  • สร้างการสร้างภาพต้นไม้สำหรับไวยากรณ์นั้น (โดยใช้ GraphViz)
  • เพียงแค่ทำการพิมพ์สวยจัดรูปแบบแฟนซีและเน้นไวยากรณ์ของไฟล์ต้นฉบับ yacc เองและรวมไว้ในคู่มืออ้างอิงของคุณเป็นสเปคไวยากรณ์ของภาษาของคุณ

และอื่น ๆ อีกมากมาย …

การเพิ่มประสิทธิภาพ

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

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


23

หลวม:

การเขียนโปรแกรมการสำแดงมีแนวโน้มดังนี้: -

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

การเขียนโปรแกรมเชิงความคิดมีแนวโน้มที่จะ: -

  • ลำดับของคำสั่งซึ่งแต่ละคำสั่งดำเนินการบางอย่าง แต่อาจมีหรือไม่มีความหมายในโดเมนปัญหา

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

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


นั่นคือคำตอบที่ถูกต้อง ไม่ใช่เสียงพึมพำใด ๆ ข้างต้น
Krzysztof Wende

ขอบคุณที่ไม่เพียง แต่ตอบคำถามเท่านั้น แต่ทำแบบ "อธิบายเหมือนฉัน 5" ด้วยบริบทและการปฏิบัติจริง คำตอบที่ยอดเยี่ยม
monsto

17

นี่คือตัวอย่าง

ใน CSS (ใช้เพื่อจัดหน้า HTML สไตล์) หากคุณต้องการให้องค์ประกอบภาพมีความสูง 100 พิกเซลและกว้าง 100 พิกเซลคุณเพียงแค่ "ประกาศ" ว่าเป็นสิ่งที่คุณต้องการดังนี้:

#myImageId {
height: 100px;
width: 100px;
}

คุณสามารถพิจารณา CSS ภาษา "สไตล์ชีท" ที่เปิดเผย

เบราว์เซอร์เอ็นจิ้นที่อ่านและตีความ CSS นี้มีอิสระที่จะทำให้ภาพดูสูงและกว้างตามที่ต้องการ เบราว์เซอร์เอ็นจิ้นต่าง ๆ (เช่นเอนจินสำหรับ IE, เอ็นจิ้นสำหรับ Chrome) จะใช้งานนี้แตกต่างกัน

การใช้งานที่ไม่ซ้ำกันของพวกเขาคือแน่นอนไม่ได้เขียนในภาษาที่ประกาศ แต่ในขั้นตอนหนึ่งเช่น Assembly, C, C ++, Java, JavaScript หรือ Python รหัสนั้นเป็นขั้นตอนที่ต้องดำเนินการทีละขั้นตอน (และอาจรวมถึงการเรียกใช้ฟังก์ชัน) มันอาจทำสิ่งต่าง ๆ เช่นสอดแทรกค่าพิกเซลและแสดงผลบนหน้าจอ


11

ฉันขอโทษ แต่ฉันต้องไม่เห็นด้วยกับคำตอบอื่น ๆ อีกมากมาย ฉันต้องการหยุดความเข้าใจผิดที่สับสนของคำจำกัดความของการเขียนโปรแกรมที่เปิดเผย

คำนิยาม

Referential transparent (RT) ของนิพจน์ย่อยเป็นคุณลักษณะที่จำเป็นเพียงอย่างเดียวของนิพจน์การเขียนโปรแกรมเชิงประกาศเนื่องจากเป็นแอ็ตทริบิวต์เดียวที่ไม่ได้แชร์กับการเขียนโปรแกรมที่จำเป็น

คุณลักษณะที่อ้างถึงอื่น ๆ ของการเขียนโปรแกรมที่ประกาศได้มาจาก RT นี้ โปรดคลิกที่ไฮเปอร์ลิงก์ด้านบนเพื่อดูคำอธิบายโดยละเอียด

ตัวอย่างสเปรดชีต

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

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


1
ผลข้างเคียงที่ไม่ได้ตั้งใจสามารถทำลายความสัมพันธ์ระหว่างสิ่งที่ประกาศกับพฤติกรรมที่แท้จริงของโปรแกรม ผมอธิบายในรายละเอียดเพิ่มเติมในคำตอบใหม่
Shelby Moore III

8

การเขียนโปรแกรมการสำแดงเป็นภาพที่การเขียนโปรแกรมที่จำเป็นคือคำแนะนำสำหรับการวาดภาพที่

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

เมื่อคุณใช้ XML เพื่อทำเครื่องหมายข้อมูลคุณกำลังใช้การเขียนโปรแกรมเชิงประกาศเนื่องจากคุณกำลังพูดว่า "นี่คือบุคคลนั่นคือวันเกิดและที่อยู่นั้นมีที่อยู่"

ตัวอย่างบางส่วนของการรวมโปรแกรมมิงที่การประกาศและการรวมเข้าด้วยกันเพื่อผลที่ดีกว่า:

  • Windows Presentation Foundation ใช้ไวยากรณ์ XML ที่ประกาศเพื่ออธิบายว่าส่วนต่อประสานผู้ใช้มีลักษณะอย่างไรและความสัมพันธ์ (การผูก) ระหว่างการควบคุมและโครงสร้างข้อมูลพื้นฐาน

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

  • HTML ทำเครื่องหมายข้อความด้วยแท็กที่อธิบายบทบาทของแต่ละส่วนของข้อความที่สัมพันธ์กับเอกสารทั้งหมด


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

1
จะต้องมีบริบทพื้นฐาน (โดเมน?) ซึ่งใช้โปรแกรมการประกาศ ดังนั้นการใช้ XML รวมกับ ANT สามารถตีความได้ว่าเป็นโปรแกรมที่ประกาศ
Gutzofter

7

Declarative Programming คือการเขียนโปรแกรมที่มีการประกาศเช่นประโยคบอกเล่า ประโยคการสำแดงมีจำนวนของคุณสมบัติที่แยกพวกเขาออกจากประโยคที่จำเป็น โดยเฉพาะอย่างยิ่งการประกาศคือ:

  • commutative (สามารถจัดลำดับใหม่ได้)
  • เชื่อมโยง (สามารถจัดกลุ่มใหม่ได้)
  • idempotent (สามารถทำซ้ำได้โดยไม่มีการเปลี่ยนแปลงในความหมาย)
  • monotonic (การประกาศไม่ลบข้อมูล)

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

บ่อยครั้งที่เราสามารถแปลงจากสิ่งที่จำเป็นเป็นสิ่งที่ประกาศได้โดยการเพิ่มบริบท เช่นจาก "เลี้ยวซ้าย (... รอก่อน ... ) เลี้ยวขวา" ถึง "Bob จะเลี้ยวซ้ายที่สี่แยก Foo and Bar เวลา 11:01 Bob จะเลี้ยวขวาที่สี่แยก Bar และ Baz เวลา 11:06 น." โปรดทราบว่าในกรณีหลังประโยคที่เป็น idempotent และ commutative ในขณะที่ในอดีตกรณีการจัดเรียงใหม่หรือทำซ้ำประโยคจะเปลี่ยนความหมายของโปรแกรมอย่างรุนแรง

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


1
สำนวนการสำแดงให้ข้อมูลแก่พฤติกรรมที่ตั้งใจของโปรแกรมความจำเป็นสามารถมีส่วนร่วมในการตั้งใจหรือไม่ตั้งใจ Declarative ไม่จำเป็นต้องเป็น commutative และ idempotent ถ้าเป็น semantics แบบจงใจ
Shelby Moore III


6

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

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

นั่นคือสิ่งที่โปรแกรมเกี่ยวกับการประกาศเกี่ยวกับ คุณประกาศพื้นที่ปัญหาและการแก้ปัญหาแทนการไหลของโปรแกรม

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


6

ฉันได้ปรับปรุงความเข้าใจของฉันเกี่ยวกับการเขียนโปรแกรมที่ประกาศตั้งแต่ธันวาคม 2011 เมื่อฉันให้คำตอบสำหรับคำถามนี้ ที่นี่ติดตามความเข้าใจปัจจุบันของฉัน

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

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

ในความหมายที่ไร้เดียงสาและสุดขีด (ซึ่งฉันยืนยันในคำตอบก่อนหน้านี้) การเขียนโปรแกรมเชิงประกาศ (DP) กำลังหลีกเลี่ยงสถานะที่ไม่แน่นอนที่เก็บไว้ทั้งหมดดังนั้นการสั่งซื้อและ / หรือการทำซ้ำคำสั่งโปรแกรมไม่สามารถเปลี่ยนแปลงพฤติกรรม .

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

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

ขั้นตอนต่อไปคือการพูดคุยเกี่ยวกับรูปแบบการเขียนโปรแกรมหรือกระบวนทัศน์ที่ช่วยใน DP แต่นั่นไม่ใช่คำถามที่นี่


ปรับปรุง: โปรดอ้างอิงถึงคำอธิบายที่ละเอียดยิ่งขึ้นที่คำตอบอื่น ๆของฉันเกี่ยวกับคำจำกัดความของการเขียนโปรแกรมที่ประกาศ
Shelby Moore III

Functional programmingเป็นคำที่ฉวัดเฉวียนในทุกวันนี้ซึ่งเป็นส่วนหนึ่งของการเขียนโปรแกรมเชิงประกาศ LINQ ในภาษา C # เป็นองค์ประกอบของการเขียนโปรแกรมฟังก์ชั่นเมื่อภาษาตัวเองมีความจำเป็นโดยธรรมชาติ ดังนั้น C # จึงกลายเป็นไฮบริดตามนิยามนั้น
RBT

1
ลิงก์ compute.com นั้นตาย
Kedar Mhaswade

5

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

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

บทความ Wikipedia นี้เป็นภาพรวมที่ดี: http://en.wikipedia.org/wiki/Declarative_programming


1
เล่นลิ้นเล็กน้อย WPF เป็นห้องสมุดไม่ใช่ภาษาหรือกระบวนทัศน์ ฉันคิดว่าคุณตั้งใจจะพูดว่า XAML เป็นตัวอย่างของภาษาที่เปิดเผย
Nick

และคุณจะอธิบายการเขียนโปรแกรมโดยใช้ห้องสมุด / กรอบงานอย่างไร
Gutzofter

ไม่ถูกต้องที่จะระบุว่าการโปรแกรมเชิงประกาศไม่สามารถมีนิพจน์ได้ ความแตกต่างที่สำคัญคือการแสดงออกไม่สามารถเก็บไว้กลายพันธุ์ค่า
Shelby Moore III 3

HTML ไม่ใช่ภาษาโปรแกรม
2557

5

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

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

คำอธิบายที่ยกมาของคำนิยามกล่าวถึงบทบาทการเขียนโปรแกรมฟังก์ชั่นการทำงานที่บริสุทธิ์ในการเขียนโปรแกรมประกาศ

Declarative vs. Imperative

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

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

เห็นได้ชัดว่าการเรียกซ้ำที่ไม่ได้ จำกัด ซึ่งทำให้ภาษาทัวริงสมบูรณ์นั้นก็มีความคล้ายคลึงกันในความหมาย - ไม่เพียง แต่ในโครงสร้างของการประเมินผลไวยากรณ์ (อาคาความหมายเชิงปฏิบัติการ) นี่เป็นตัวอย่างที่สมเหตุสมผลตามทฤษฎีบทของGödel -“ ระบบสัจพจน์ที่สมบูรณ์ใด ๆ ก็ไม่สอดคล้องกันเช่นกัน ” ไตร่ตรองความแปลกประหลาดที่ขัดแย้งของคำพูดนั้น! นอกจากนี้ยังเป็นตัวอย่างที่แสดงให้เห็นว่าการแสดงออกของความหมายไม่ได้มีขอบเขตที่พิสูจน์ได้ดังนั้นเราจึงไม่สามารถพิสูจน์ได้2ว่าโปรแกรม (และความหมายของความหมายของมันคล้ายกัน) หยุดยั้งทฤษฎีบท Halting

ทฤษฎีความไม่สมบูรณ์มาจากธรรมชาติพื้นฐานของเอกภพของเราซึ่งตามที่ระบุไว้ในกฎข้อที่สองของอุณหพลศาสตร์คือ“ เอนโทรปี (หรือที่รู้จักกันว่า # ของความเป็นไปได้อิสระ) นั้นมีแนวโน้มสูงสุดตลอดกาล ” การเขียนโปรแกรมและการออกแบบของโปรแกรมไม่เคยเสร็จสมบูรณ์ - มีชีวิตอยู่! - เพราะมันพยายามตอบสนองความต้องการในโลกแห่งความเป็นจริงและความหมายของโลกแห่งความเป็นจริงนั้นเปลี่ยนแปลงอยู่เสมอและมีแนวโน้มที่จะเป็นไปได้มากขึ้น มนุษย์ไม่เคยหยุดค้นพบสิ่งใหม่ ๆ (รวมถึงข้อผิดพลาดในโปรแกรม ;-)

ในการจับภาพความคิดที่ต้องการดังกล่าวข้างต้นอย่างแม่นยำและทางเทคนิคภายในเอกภพแปลกประหลาดที่ไม่มีขอบ (ไตร่ตรองว่า! ไม่มี“ นอก” ของจักรวาลของเรา) ต้องใช้คำจำกัดความสั้น ๆ แต่ไม่หลอกลวงซึ่งจะฟังไม่ถูกต้องจนกว่าจะอธิบาย ลึก

ความหมาย:


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

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


คำจำกัดความของการประกาศนี้มีความชัดเจนในระดับท้องถิ่นในขอบเขตความหมายซึ่งหมายความว่ามันต้องมีความหมายแบบแยกส่วนรักษาความหมายที่สอดคล้องกันโดยไม่คำนึงถึงสถานที่และวิธีการที่ instantiated และใช้งานในขอบเขตทั่วโลก ดังนั้นความหมายของแต่ละแบบแยกส่วนที่เปิดเผยภายในควรจะตั้งฉากกับเป็นไปได้ทั้งหมด others- และไม่ได้เป็นไปไม่ได้ (เพราะทฤษฎีบทไม่สมบูรณ์) ทั่วโลกขั้นตอนวิธีการหรือรูปแบบการเป็นพยานความสอดคล้องซึ่งยังเป็นจุดของ“ อื่น ๆ ไม่ดีกว่าเสมอ ” โดยโรเบิร์ตฮาร์เปอร์ศาสตราจารย์ วิทยาศาสตร์คอมพิวเตอร์ที่ Carnegie Mellon University หนึ่งในนักออกแบบของ Standard ML

ตัวอย่างของความหมายเหล่านี้เปิดเผย modular รวมถึงทฤษฎีประเภท functors เช่นพิมพ์เล็กน้อย namespaces เขตข้อมูลชื่อและ WRT ไปถึงระดับการดำเนินงานของความหมายแล้วเขียนโปรแกรมการทำงานบริสุทธิ์Applicative

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

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

Hyper Text Markup Language aka HTML - ภาษาสำหรับหน้าเว็บแบบสแตติก - เป็นตัวอย่างของภาษาที่มีการประกาศอย่างสูง (แต่ไม่สมบูรณ์แบบ3 ) ที่ (อย่างน้อยก่อน HTML 5) ไม่มีความสามารถในการแสดงพฤติกรรมแบบไดนามิก HTML อาจเป็นภาษาที่ง่ายที่สุดในการเรียนรู้ สำหรับพฤติกรรมแบบไดนามิกภาษาสคริปต์ที่จำเป็นเช่น JavaScript มักจะรวมกับ HTML HTML ที่ไม่มี JavaScript เหมาะกับคำนิยามที่ประกาศเนื่องจากแต่ละประเภทระบุ (เช่นแท็ก) รักษาความหมายที่สอดคล้องกันภายใต้องค์ประกอบภายในกฎของไวยากรณ์

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

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

C, Java, C ++, C #, PHP และ JavaScript ไม่ได้มีการประกาศโดยเฉพาะ ไวยากรณ์ของ Copute และไวยากรณ์ของ Python มีการประกาศควบคู่ไปกับผลลัพธ์ที่ตั้งใจไว้มากขึ้นเช่นความหมายเชิงไวยากรณ์ที่สอดคล้องกันซึ่งกำจัดสิ่งที่ไม่เกี่ยวข้องออกไปเพื่อที่เราจะสามารถเข้าใจรหัสได้อย่างง่ายดายหลังจากที่พวกเขาลืมมันไป Copute และ Haskell บังคับระดับความหมายของปฏิบัติการและส่งเสริมให้ " อย่าทำซ้ำตัวเอง " (DRY) เพราะพวกเขายอมให้กระบวนทัศน์การทำงานที่บริสุทธิ์


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

3คำอธิบายหลายอย่างไม่ถูกต้องอ้างว่าโปรแกรมที่จำเป็นเท่านั้นที่มีคำสั่ง syntactically ผมชี้แจงนี้สับสนระหว่างความจำเป็นและการเขียนโปรแกรมการทำงาน ตัวอย่างเช่นคำสั่งของคำสั่ง HTML ไม่ได้ลดความสอดคล้องของความหมาย


แก้ไข: ฉันโพสต์ความคิดเห็นต่อไปนี้ในบล็อกของ Robert Harper:

ในฟังก์ชั่นการเขียนโปรแกรม ... ช่วงของการเปลี่ยนแปลงของตัวแปรเป็นประเภท

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

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

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

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

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

ดังนั้นฉันจึงสรุปได้ว่ามีเพียงภาษาที่ไม่ใช่ทัวริงเท่านั้นที่สามารถประกาศได้

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

ดังนั้นสำหรับฉันแล้วดูเหมือนว่าภาษาที่ประกาศเป็นสิ่งที่ตรงกันข้ามกับการ เรียกซ้ำที่ไม่ได้ จำกัดเช่นทฤษฎีบทที่สองที่ไม่สมบูรณ์ของGödelไม่สามารถพิสูจน์ได้

Lesie Lamport เขียนเทพนิยายเกี่ยวกับวิธี Euclid อาจทำงานรอบทฤษฎีบทที่ไม่สมบูรณ์ของGödelนำไปใช้กับหลักฐานทางคณิตศาสตร์ในบริบทการเขียนโปรแกรมภาษาโดยการสอดคล้องกันระหว่างประเภทและตรรกะ (Curry-Howard จดหมาย ฯลฯ ).


4

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

ความแตกต่างระหว่างการเขียนโปรแกรมการประกาศและความจำเป็นจะแสดงให้เห็นอย่างดีจากปัญหาของการแยกวิเคราะห์ข้อมูลที่มีโครงสร้าง

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

ความแตกต่างระหว่างสองแนวทางนี้คือโปรแกรมการประกาศสร้างภาษาใหม่ที่มีการแมปอย่างใกล้ชิดกับแบบจำลองทางจิตของปัญหามากกว่าภาษาโฮสต์


2

มันอาจฟังดูแปลก แต่ฉันจะเพิ่ม Excel (หรือสเปรดชีตใด ๆ จริงๆ) ลงในรายการระบบประกาศ ตัวอย่างที่ดีของนี้จะได้รับที่นี่


1

ฉันจะอธิบายเพราะ DP เป็นวิธีในการแสดง

  • แสดงออกเป้าหมายเงื่อนไขสำหรับ - สิ่งที่เรากำลังค้นหา มีอย่างใดอย่างหนึ่งอาจจะหรือหลายคน?
  • ข้อเท็จจริงบางอย่างที่รู้จัก
  • กฎที่ขยายข้อเท็จจริงที่รู้

... และสถานที่ที่มีเอ็นจิ้นการหักมักจะทำงานร่วมกับอัลกอริทึมการรวมเพื่อค้นหาเป้าหมาย


-1

เท่าที่ฉันสามารถบอกได้มันเริ่มถูกนำมาใช้เพื่ออธิบายระบบการเขียนโปรแกรมเช่น Prolog เพราะ Prolog นั้นเกี่ยวกับการประกาศสิ่งต่าง ๆ ในลักษณะที่เป็นนามธรรม

มันมีความหมายน้อยมากขึ้นเรื่อย ๆ เนื่องจากมีคำจำกัดความที่กำหนดโดยผู้ใช้ข้างต้น มันควรจะชัดเจนว่ามีช่องว่างระหว่างการเขียนโปรแกรมการประกาศของ Haskell เมื่อเทียบกับการเขียนโปรแกรมการประกาศของ HTML


1
ไม่มี "ช่องว่างระหว่างการเขียนโปรแกรมที่ประกาศของ Haskell เมื่อเทียบกับการเขียนโปรแกรมการประกาศของ HTML" เพราะแอตทริบิวต์รากของการเขียนโปรแกรมการประกาศคือการเปลี่ยนแปลงไม่ได้ของค่าที่เก็บไว้
Shelby Moore III

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

ตกลง ทัวริง - ความสมบูรณ์เป็นฉากที่เปลี่ยนไม่ได้ของค่าที่เก็บไว้ ดังนั้นเราไม่ควรพูดคุยกับคุณลักษณะที่เปิดเผยและจำเป็น ขอบคุณที่คิดสำหรับคุณลักษณะอย่างใดอย่างหนึ่ง (ทัวริงสมบูรณ์) ที่สามารถทำให้ "อ่าว" นั้น
Shelby Moore III

เปิด-ครบถ้วนเท่านั้นต้องเรียกซ้ำมากมาย การเปลี่ยนไม่ได้ของค่าที่เก็บไว้ไม่ได้ จำกัด การเรียกซ้ำที่ไม่ได้ จำกัด ดังนั้นมันจึงเป็นคุณลักษณะมุมฉาก
Shelby Moore III

-2

ตัวอย่างอื่น ๆ ของการเขียนโปรแกรมที่ประกาศ:

  • มาร์กอัป ASP.Net สำหรับ databinding มันแค่บอกว่า "เติมกริดนี้ด้วยแหล่งที่มานี้" ยกตัวอย่างและนำไปไว้ที่ระบบเพื่อดูว่าเกิดอะไรขึ้น
  • นิพจน์ Linq

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

ตัวอย่างเช่นสมมติว่าคุณมีฟังก์ชันที่ทำบางสิ่งบางอย่างกับแต่ละองค์ประกอบในอาร์เรย์หรือรายการ รหัสดั้งเดิมจะมีลักษณะเช่นนี้:

foreach (object item in MyList)
{
   DoSomething(item);
}

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

MyList.ForEach(DoSometing);

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

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

1
คุณจะอธิบายโปรแกรมการทำงาน, การเขียนโปรแกรมไม่เปิดเผย การเขียนโปรแกรมที่เปิดเผยมีแอตทริบิวต์ที่ว่ามันไม่ได้เก็บไว้กลายพันธุ์ค่า
Shelby Moore III

การเขียนโปรแกรมเพื่อการประกาศสามารถเปลี่ยนแปลงค่าที่เก็บไว้ ... เป็นเพียงคุณระบุ (ประกาศ) สิ่งที่คุณต้องการที่จะกลายเป็นแทนวิธีการที่จะกลายพันธุ์เกี่ยวกับการกลายพันธุ์ คุณคิดว่าคำสั่ง sql INSERT หรือ UPDATE ใน sql มีอะไรอีกบ้าง
Joel Coehoorn

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

-3

ขึ้นอยู่กับวิธีที่คุณส่งคำตอบไปที่ข้อความ โดยรวมแล้วคุณสามารถดูโปรแกรมในมุมมองที่แน่นอน แต่ขึ้นอยู่กับมุมที่คุณมองปัญหา ฉันจะให้คุณเริ่มต้นกับโปรแกรม: Dim Bus, รถยนต์, เวลา, ส่วนสูงในฐานะ Integr

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

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