ฉันได้ยินคำนี้เรื่อย ๆ ในบริบทที่แตกต่างกันหลายอย่าง มันคืออะไร?
ฉันได้ยินคำนี้เรื่อย ๆ ในบริบทที่แตกต่างกันหลายอย่าง มันคืออะไร?
คำตอบ:
การเขียนโปรแกรมเพื่อการประกาศคือเมื่อคุณเขียนโค้ดของคุณในลักษณะที่อธิบายสิ่งที่คุณต้องการทำไม่ใช่วิธีที่คุณต้องการทำ มันถูกทิ้งไว้ที่คอมไพเลอร์เพื่อหาวิธี
ตัวอย่างภาษาโปรแกรมที่ประกาศคือ SQL และ Prolog
คำตอบอื่น ๆ ทำงานที่ยอดเยี่ยมแล้วอธิบายว่าการเขียนโปรแกรมประกาศคืออะไรดังนั้นฉันแค่จะให้ตัวอย่างบางส่วนของสาเหตุที่อาจเป็นประโยชน์
เปิดเผยโปรแกรมที่มีบริบทที่เป็นอิสระ เนื่องจากพวกเขาประกาศว่าเป้าหมายสูงสุดคืออะไร แต่ไม่ใช่ขั้นตอนตัวกลางในการเข้าถึงเป้าหมายนั้นโปรแกรมเดียวกันจึงสามารถใช้ในบริบทที่แตกต่างกัน นี่เป็นเรื่องยากที่จะทำกับโปรแกรมที่จำเป็นเพราะพวกเขามักจะขึ้นอยู่กับบริบท
ใช้yacc
เป็นตัวอย่าง มันเป็นตัวแยกวิเคราะห์อาคา คอมไพเลอร์คอมไพเลอร์ซึ่งเป็น DSL การประกาศภายนอกสำหรับการอธิบายไวยากรณ์ของภาษาเพื่อให้ตัวแยกวิเคราะห์สำหรับภาษานั้นสามารถสร้างขึ้นโดยอัตโนมัติจากคำอธิบาย เนื่องจากความเป็นอิสระของบริบทคุณสามารถทำสิ่งต่าง ๆ ด้วยไวยากรณ์เช่น:
yacc
)และอื่น ๆ อีกมากมาย …
เนื่องจากคุณไม่ได้กำหนดคอมพิวเตอร์ในขั้นตอนที่ต้องดำเนินการและในลำดับใด ๆ จึงสามารถจัดเรียงโปรแกรมของคุณได้อย่างอิสระมากขึ้นอาจทำหน้าที่บางอย่างควบคู่กันไป ตัวอย่างที่ดีคือตัววางแผนคิวรีและตัวเพิ่มประสิทธิภาพคิวรีสำหรับฐานข้อมูล SQL ฐานข้อมูล SQL ส่วนใหญ่อนุญาตให้คุณแสดงแบบสอบถามที่พวกเขากำลังดำเนินการจริงกับแบบสอบถามที่คุณขอให้ดำเนิน บ่อยครั้งที่คำค้นหาเหล่านั้นไม่ได้ดูอะไรเลยเหมือนกัน ตัววางแผนคิวรีคำนึงถึงสิ่งที่คุณไม่เคยนึกฝันมาก่อน: ความล่าช้าในการหมุนของดิสก์เพลตตัวอย่างเช่นความจริงที่ว่าแอพพลิเคชั่นบางตัวที่แตกต่างกันอย่างสมบูรณ์สำหรับผู้ใช้ที่แตกต่างกันโดยสิ้นเชิง เข้าร่วมกับและคุณทำงานอย่างหนักเพื่อหลีกเลี่ยงการโหลดอยู่ในหน่วยความจำแล้ว
มีการออกที่น่าสนใจคือที่นี่: เครื่องมีการทำงานยากที่จะคิดออกว่าจะทำอะไรกว่าจะเป็นภาษาที่มีความจำเป็น แต่เมื่อมันไม่คิดออกก็มีเสรีภาพมากขึ้นและข้อมูลมากขึ้นสำหรับการเพิ่มประสิทธิภาพ เวที.
หลวม:
การเขียนโปรแกรมการสำแดงมีแนวโน้มดังนี้: -
การเขียนโปรแกรมเชิงความคิดมีแนวโน้มที่จะ: -
เป็นผลให้รูปแบบที่จำเป็นช่วยให้ผู้อ่านเข้าใจกลไกของสิ่งที่ระบบกำลังทำอยู่ แต่อาจให้ข้อมูลเชิงลึกเกี่ยวกับปัญหาที่ตั้งใจจะแก้ไข ในอีกทางหนึ่งรูปแบบการประกาศช่วยให้ผู้อ่านเข้าใจโดเมนปัญหาและแนวทางที่ระบบนำไปสู่การแก้ปัญหา แต่เป็นข้อมูลน้อยกว่าในเรื่องของกลศาสตร์
โปรแกรมจริง (แม้แต่ภาษาที่เขียนด้วยภาษาที่สนับสนุนปลายสเปกตรัมเช่น ProLog หรือ C) มีแนวโน้มที่จะมีทั้งสองรูปแบบที่นำเสนอไปยังองศาที่หลากหลายตามจุดต่าง ๆ เพื่อตอบสนองความซับซ้อนและความต้องการด้านการสื่อสารที่แตกต่างกัน สไตล์หนึ่งไม่เหนือกว่าแบบอื่น พวกเขาเพียงแค่รับใช้จุดประสงค์ที่ต่างกันและเช่นเดียวกับหลายสิ่งในชีวิต
นี่คือตัวอย่าง
ใน CSS (ใช้เพื่อจัดหน้า HTML สไตล์) หากคุณต้องการให้องค์ประกอบภาพมีความสูง 100 พิกเซลและกว้าง 100 พิกเซลคุณเพียงแค่ "ประกาศ" ว่าเป็นสิ่งที่คุณต้องการดังนี้:
#myImageId {
height: 100px;
width: 100px;
}
คุณสามารถพิจารณา CSS ภาษา "สไตล์ชีท" ที่เปิดเผย
เบราว์เซอร์เอ็นจิ้นที่อ่านและตีความ CSS นี้มีอิสระที่จะทำให้ภาพดูสูงและกว้างตามที่ต้องการ เบราว์เซอร์เอ็นจิ้นต่าง ๆ (เช่นเอนจินสำหรับ IE, เอ็นจิ้นสำหรับ Chrome) จะใช้งานนี้แตกต่างกัน
การใช้งานที่ไม่ซ้ำกันของพวกเขาคือแน่นอนไม่ได้เขียนในภาษาที่ประกาศ แต่ในขั้นตอนหนึ่งเช่น Assembly, C, C ++, Java, JavaScript หรือ Python รหัสนั้นเป็นขั้นตอนที่ต้องดำเนินการทีละขั้นตอน (และอาจรวมถึงการเรียกใช้ฟังก์ชัน) มันอาจทำสิ่งต่าง ๆ เช่นสอดแทรกค่าพิกเซลและแสดงผลบนหน้าจอ
ฉันขอโทษ แต่ฉันต้องไม่เห็นด้วยกับคำตอบอื่น ๆ อีกมากมาย ฉันต้องการหยุดความเข้าใจผิดที่สับสนของคำจำกัดความของการเขียนโปรแกรมที่เปิดเผย
คำนิยาม
Referential transparent (RT) ของนิพจน์ย่อยเป็นคุณลักษณะที่จำเป็นเพียงอย่างเดียวของนิพจน์การเขียนโปรแกรมเชิงประกาศเนื่องจากเป็นแอ็ตทริบิวต์เดียวที่ไม่ได้แชร์กับการเขียนโปรแกรมที่จำเป็น
คุณลักษณะที่อ้างถึงอื่น ๆ ของการเขียนโปรแกรมที่ประกาศได้มาจาก RT นี้ โปรดคลิกที่ไฮเปอร์ลิงก์ด้านบนเพื่อดูคำอธิบายโดยละเอียด
ตัวอย่างสเปรดชีต
คำตอบสองข้อที่กล่าวถึงการเขียนโปรแกรมสเปรดชีต ในกรณีที่การเขียนโปรแกรมสเปรดชีต (สูตร aka) ไม่สามารถเข้าถึงสถานะโกลบอลที่ไม่แน่นอนได้นั่นคือการเขียนโปรแกรมเชิงประกาศ นี่เป็นเพราะค่าของเซลล์ที่ไม่แน่นอนคืออินพุตและเอาต์พุตแบบเสาหินของmain()
(โปรแกรมทั้งหมด) ค่าใหม่จะไม่ถูกเขียนไปยังเซลล์หลังจากดำเนินการแต่ละสูตรดังนั้นจึงไม่สามารถเปลี่ยนแปลงได้ตลอดอายุการใช้งานของโปรแกรมการประกาศ (การดำเนินการของสูตรทั้งหมดในสเปรดชีต) ดังนั้นเมื่อเปรียบเทียบกับสูตรอื่น ๆ จึงมองว่าเซลล์ที่ไม่แน่นอนเหล่านี้เป็นเซลล์ที่ไม่เปลี่ยนรูป ฟังก์ชั่น RT ได้รับอนุญาตให้เข้าถึงสถานะโกลบอลที่ไม่เปลี่ยนแปลง (และสถานะท้องถิ่นที่ไม่แน่นอนด้วย )
ดังนั้นความสามารถในการกลายพันธุ์ค่าในเซลล์เมื่อโปรแกรมสิ้นสุดลง (เป็นผลลัพธ์จากmain()
) ไม่ได้ทำให้พวกเขาค่าที่เก็บไว้ไม่แน่นอนในบริบทของกฎ ความแตกต่างที่สำคัญคือค่าของเซลล์จะไม่ได้รับการอัปเดตหลังจากดำเนินการแต่ละสูตรสเปรดชีตดังนั้นลำดับการดำเนินการของสูตรจะไม่สำคัญ ค่าของเซลล์จะได้รับการอัปเดตหลังจากทำสูตรการประกาศทั้งหมดแล้ว
การเขียนโปรแกรมการสำแดงเป็นภาพที่การเขียนโปรแกรมที่จำเป็นคือคำแนะนำสำหรับการวาดภาพที่
คุณกำลังเขียนในสไตล์ที่เปิดเผยถ้าคุณ "บอกให้รู้ว่ามันคืออะไร" แทนที่จะอธิบายขั้นตอนที่คอมพิวเตอร์ควรทำเพื่อไปยังที่ที่คุณต้องการ
เมื่อคุณใช้ XML เพื่อทำเครื่องหมายข้อมูลคุณกำลังใช้การเขียนโปรแกรมเชิงประกาศเนื่องจากคุณกำลังพูดว่า "นี่คือบุคคลนั่นคือวันเกิดและที่อยู่นั้นมีที่อยู่"
ตัวอย่างบางส่วนของการรวมโปรแกรมมิงที่การประกาศและการรวมเข้าด้วยกันเพื่อผลที่ดีกว่า:
Windows Presentation Foundation ใช้ไวยากรณ์ XML ที่ประกาศเพื่ออธิบายว่าส่วนต่อประสานผู้ใช้มีลักษณะอย่างไรและความสัมพันธ์ (การผูก) ระหว่างการควบคุมและโครงสร้างข้อมูลพื้นฐาน
ไฟล์การกำหนดค่าที่มีโครงสร้างใช้ไวยากรณ์ที่ประกาศได้ (เป็นคู่ที่ "คีย์ = ค่า") เพื่อระบุว่าสตริงหรือค่าของข้อมูลหมายถึงอะไร
HTML ทำเครื่องหมายข้อความด้วยแท็กที่อธิบายบทบาทของแต่ละส่วนของข้อความที่สัมพันธ์กับเอกสารทั้งหมด
Declarative Programming คือการเขียนโปรแกรมที่มีการประกาศเช่นประโยคบอกเล่า ประโยคการสำแดงมีจำนวนของคุณสมบัติที่แยกพวกเขาออกจากประโยคที่จำเป็น โดยเฉพาะอย่างยิ่งการประกาศคือ:
ประเด็นที่เกี่ยวข้องคือสิ่งเหล่านี้ล้วนเป็นคุณสมบัติโครงสร้างและเป็นฉากฉากกับหัวข้อ ที่เปิดเผยไม่ได้เกี่ยวกับ"สิ่งที่เมื่อเทียบกับวิธีการ" เราสามารถประกาศ (แทนและอุปสรรคบริการ) "วิธีการ"ได้อย่างง่ายดายเพียงเท่าที่เราประกาศ"อะไร" การประกาศเป็นเรื่องเกี่ยวกับโครงสร้างไม่ใช่เนื้อหา การเขียนโปรแกรมการประกาศมีผลกระทบอย่างมีนัยสำคัญเกี่ยวกับวิธีการที่เราสรุปและ refactor รหัสของเราและวิธีการที่เราปรับให้เป็นโมดูลย่อย แต่ไม่มากในรูปแบบโดเมน
บ่อยครั้งที่เราสามารถแปลงจากสิ่งที่จำเป็นเป็นสิ่งที่ประกาศได้โดยการเพิ่มบริบท เช่นจาก "เลี้ยวซ้าย (... รอก่อน ... ) เลี้ยวขวา" ถึง "Bob จะเลี้ยวซ้ายที่สี่แยก Foo and Bar เวลา 11:01 Bob จะเลี้ยวขวาที่สี่แยก Bar และ Baz เวลา 11:06 น." โปรดทราบว่าในกรณีหลังประโยคที่เป็น idempotent และ commutative ในขณะที่ในอดีตกรณีการจัดเรียงใหม่หรือทำซ้ำประโยคจะเปลี่ยนความหมายของโปรแกรมอย่างรุนแรง
เกี่ยวเนื่องการประกาศสามารถเพิ่มข้อ จำกัดที่ลบไปได้ แต่ข้อ จำกัด ยังคงเพิ่มข้อมูล (แม่นยำยิ่งขึ้นข้อ จำกัด คือข้อมูล) หากเราต้องการการประกาศตามเวลาที่แตกต่างกันมันเป็นเรื่องปกติที่จะสร้างแบบจำลองนี้ด้วยความหมายเชิงเวลาที่ชัดเจน - เช่นจาก "ลูกบอลแบน" ถึง "ลูกบอลแบน ณ เวลา T" หากเรามีการประกาศที่ขัดแย้งกันสองรายการเรามีระบบการประกาศที่ไม่สอดคล้องกันแม้ว่าสิ่งนี้อาจได้รับการแก้ไขโดยการแนะนำข้อ จำกัด ที่นุ่มนวล (ลำดับความสำคัญความน่าจะเป็น ฯลฯ ) หรือการใช้ประโยชน์จากตรรกะแบบ
อธิบายคอมพิวเตอร์ในสิ่งที่คุณต้องการไม่ใช่ทำอะไร
จินตนาการถึงหน้า excel ด้วยคอลัมน์ที่เต็มไปด้วยสูตรในการคำนวณการคืนภาษีของคุณ
ตรรกะทั้งหมดจะถูกประกาศในเซลล์ลำดับของการคำนวณคือกำหนดโดยสูตรเองแทนที่จะเป็นขั้นตอน
นั่นคือสิ่งที่โปรแกรมเกี่ยวกับการประกาศเกี่ยวกับ คุณประกาศพื้นที่ปัญหาและการแก้ปัญหาแทนการไหลของโปรแกรม
Prolog เป็นภาษาที่ฉันใช้เท่านั้น มันต้องใช้ความคิดที่แตกต่าง แต่มันเป็นการดีที่จะเรียนรู้ถ้าเพียงเพื่อให้คุณได้รู้จักกับสิ่งอื่นนอกเหนือจากภาษาการเขียนโปรแกรมตามขั้นตอนปกติ
ฉันได้ปรับปรุงความเข้าใจของฉันเกี่ยวกับการเขียนโปรแกรมที่ประกาศตั้งแต่ธันวาคม 2011 เมื่อฉันให้คำตอบสำหรับคำถามนี้ ที่นี่ติดตามความเข้าใจปัจจุบันของฉัน
รุ่นยาวของความเข้าใจของฉัน (การวิจัย) มีรายละเอียดที่ลิงค์นี้ซึ่งคุณควรอ่านเพื่อทำความเข้าใจอย่างลึกซึ้งของบทสรุปที่ฉันจะให้ด้านล่าง
การเขียนโปรแกรมเชิงซ้อนคือที่ที่สถานะไม่แน่นอนถูกจัดเก็บและอ่านดังนั้นการสั่งซื้อและ / หรือการทำซ้ำคำสั่งของโปรแกรมสามารถเปลี่ยนพฤติกรรม (ความหมาย) ของโปรแกรม (และยังทำให้เกิดข้อผิดพลาดเช่นพฤติกรรมที่ไม่ตั้งใจ)
ในความหมายที่ไร้เดียงสาและสุดขีด (ซึ่งฉันยืนยันในคำตอบก่อนหน้านี้) การเขียนโปรแกรมเชิงประกาศ (DP) กำลังหลีกเลี่ยงสถานะที่ไม่แน่นอนที่เก็บไว้ทั้งหมดดังนั้นการสั่งซื้อและ / หรือการทำซ้ำคำสั่งโปรแกรมไม่สามารถเปลี่ยนแปลงพฤติกรรม .
อย่างไรก็ตามคำจำกัดความที่สูงเช่นนี้จะไม่เป็นประโยชน์อย่างมากในโลกแห่งความเป็นจริงเนื่องจากเกือบทุกโปรแกรมเกี่ยวข้องกับสถานะที่ไม่แน่นอนที่เก็บไว้ ตัวอย่างสเปรดชีตสอดรับกับความหมายที่รุนแรงของ DP เพราะรหัสโปรแกรมทั้งหมดจะดำเนินการให้แล้วเสร็จพร้อมสำเนาแบบคงที่หนึ่งของรัฐใส่ก่อนที่รัฐใหม่จะถูกเก็บไว้ จากนั้นหากมีการเปลี่ยนแปลงสถานะใด ๆ สิ่งนี้จะถูกทำซ้ำ แต่โปรแกรมในโลกแห่งความเป็นจริงส่วนใหญ่ไม่สามารถ จำกัด รูปแบบเสาหินขนาดใหญ่ของการเปลี่ยนแปลงสถานะ
คำจำกัดความที่มีประโยชน์มากขึ้นของ DP คือการสั่งซื้อและ / หรือการทำซ้ำคำสั่งการเขียนโปรแกรมจะไม่เปลี่ยนแปลงความหมายทึบแสงใด ๆ กล่าวอีกนัยหนึ่งไม่มีการเปลี่ยนแปลงแบบสุ่มซ่อนอยู่ในซีแมนทิกส์ที่เกิดขึ้น - การเปลี่ยนแปลงใด ๆ ในคำสั่งโปรแกรมและ / หรือการทำซ้ำทำให้เกิดการเปลี่ยนแปลงพฤติกรรมของโปรแกรมอย่างตั้งใจและโปร่งใส
ขั้นตอนต่อไปคือการพูดคุยเกี่ยวกับรูปแบบการเขียนโปรแกรมหรือกระบวนทัศน์ที่ช่วยใน DP แต่นั่นไม่ใช่คำถามที่นี่
Functional programming
เป็นคำที่ฉวัดเฉวียนในทุกวันนี้ซึ่งเป็นส่วนหนึ่งของการเขียนโปรแกรมเชิงประกาศ LINQ ในภาษา C # เป็นองค์ประกอบของการเขียนโปรแกรมฟังก์ชั่นเมื่อภาษาตัวเองมีความจำเป็นโดยธรรมชาติ ดังนั้น C # จึงกลายเป็นไฮบริดตามนิยามนั้น
มันเป็นวิธีการเขียนโปรแกรมโดยอธิบายถึงสิ่งที่ควรทำหรือแทนที่จะอธิบายว่าควรใช้งานอย่างไร
กล่าวอีกนัยหนึ่งคุณไม่ได้เขียนอัลกอริธึมที่ทำจากนิพจน์คุณเพียงวางเลย์เอาต์ว่าคุณต้องการให้เป็นอย่างไร ตัวอย่างที่ดีสองตัวอย่างคือ HTML และ WPF
บทความ Wikipedia นี้เป็นภาพรวมที่ดี: http://en.wikipedia.org/wiki/Declarative_programming
ตั้งแต่ฉันเขียนคำตอบก่อนหน้านี้ฉันได้กำหนดคำนิยามใหม่ของคุณสมบัติที่ประกาศซึ่งอ้างถึงด้านล่าง ฉันยังได้กำหนดโปรแกรมที่จำเป็นให้เป็นคุณสมบัติคู่
คำจำกัดความนี้ดีกว่าคำที่ฉันให้ไว้ในคำตอบก่อนหน้านี้เพราะสั้นกระชับและกว้างกว่า แต่มันอาจเป็นเรื่องยากที่จะคร่ำครวญเพราะความหมายของทฤษฎีความไม่สมบูรณ์ที่ใช้กับการเขียนโปรแกรมและการใช้ชีวิตโดยทั่วไปนั้นเป็นเรื่องยากสำหรับมนุษย์ที่จะปิดล้อมจิตใจของพวกเขา
คำอธิบายที่ยกมาของคำนิยามกล่าวถึงบทบาทการเขียนโปรแกรมฟังก์ชั่นการทำงานที่บริสุทธิ์ในการเขียนโปรแกรมประกาศ
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 จดหมาย ฯลฯ ).
การเขียนโปรแกรมการสำแดงคือ "การกระทำของการเขียนโปรแกรมในภาษาที่สอดคล้องกับรูปแบบจิตของนักพัฒนามากกว่ารูปแบบการดำเนินงานของเครื่อง"
ความแตกต่างระหว่างการเขียนโปรแกรมการประกาศและความจำเป็นจะแสดงให้เห็นอย่างดีจากปัญหาของการแยกวิเคราะห์ข้อมูลที่มีโครงสร้าง
โปรแกรมที่จำเป็นจะใช้ฟังก์ชั่นวนซ้ำเพื่อกินอินพุตและสร้างข้อมูล โปรแกรมที่ประกาศจะแสดงไวยากรณ์ที่กำหนดโครงสร้างของข้อมูลเพื่อให้สามารถแยกวิเคราะห์ได้
ความแตกต่างระหว่างสองแนวทางนี้คือโปรแกรมการประกาศสร้างภาษาใหม่ที่มีการแมปอย่างใกล้ชิดกับแบบจำลองทางจิตของปัญหามากกว่าภาษาโฮสต์
ฉันจะอธิบายเพราะ DP เป็นวิธีในการแสดง
... และสถานที่ที่มีเอ็นจิ้นการหักมักจะทำงานร่วมกับอัลกอริทึมการรวมเพื่อค้นหาเป้าหมาย
เท่าที่ฉันสามารถบอกได้มันเริ่มถูกนำมาใช้เพื่ออธิบายระบบการเขียนโปรแกรมเช่น Prolog เพราะ Prolog นั้นเกี่ยวกับการประกาศสิ่งต่าง ๆ ในลักษณะที่เป็นนามธรรม
มันมีความหมายน้อยมากขึ้นเรื่อย ๆ เนื่องจากมีคำจำกัดความที่กำหนดโดยผู้ใช้ข้างต้น มันควรจะชัดเจนว่ามีช่องว่างระหว่างการเขียนโปรแกรมการประกาศของ Haskell เมื่อเทียบกับการเขียนโปรแกรมการประกาศของ HTML
ตัวอย่างอื่น ๆ ของการเขียนโปรแกรมที่ประกาศ:
การเขียนโปรแกรมการประกาศเป็นสิ่งที่ดีเพราะสามารถช่วยลดความซับซ้อนของรูปแบบรหัสจิตของคุณและในที่สุดมันก็สามารถปรับขนาดได้มากขึ้น
ตัวอย่างเช่นสมมติว่าคุณมีฟังก์ชันที่ทำบางสิ่งบางอย่างกับแต่ละองค์ประกอบในอาร์เรย์หรือรายการ รหัสดั้งเดิมจะมีลักษณะเช่นนี้:
foreach (object item in MyList)
{
DoSomething(item);
}
ไม่มีเรื่องใหญ่ที่นั่น แต่ถ้าคุณใช้ไวยากรณ์ที่มีการประกาศมากขึ้นและแทนที่จะกำหนด DoSomething () เป็นแอคชันแทน จากนั้นคุณสามารถพูดได้ด้วยวิธีนี้:
MyList.ForEach(DoSometing);
แน่นอนว่านี่กระชับกว่านี้ แต่ฉันแน่ใจว่าคุณมีข้อกังวลมากกว่าการบันทึกรหัสสองบรรทัดที่นี่และที่นั่น ตัวอย่างเช่นประสิทธิภาพ วิธีการประมวลผลแบบเก่าต้องทำตามลำดับ เกิดอะไรขึ้นถ้าเมธอด. ForEach () มีวิธีให้คุณส่งสัญญาณว่ามันสามารถจัดการการประมวลผลแบบขนานโดยอัตโนมัติได้หรือไม่ ในทันทีทันใดคุณได้ทำให้โค้ดของคุณเป็นแบบมัลติเธรดในวิธีที่ปลอดภัยมากและเปลี่ยนโค้ดเพียงบรรทัดเดียว และในความเป็นจริงมีส่วนขยายสำหรับ. Net ที่ให้คุณทำเช่นนั้นได้
ขึ้นอยู่กับวิธีที่คุณส่งคำตอบไปที่ข้อความ โดยรวมแล้วคุณสามารถดูโปรแกรมในมุมมองที่แน่นอน แต่ขึ้นอยู่กับมุมที่คุณมองปัญหา ฉันจะให้คุณเริ่มต้นกับโปรแกรม: Dim Bus, รถยนต์, เวลา, ส่วนสูงในฐานะ Integr
อีกครั้งมันขึ้นอยู่กับสิ่งที่เป็นปัญหาโดยรวม คุณอาจต้องย่อให้สั้นลงเนื่องจากโปรแกรม หวังว่าสิ่งนี้จะช่วยและต้องการความคิดเห็นถ้ามันไม่ได้ ขอบคุณ.