ในหลาย ๆ บทความที่อธิบายถึงประโยชน์ของการเขียนโปรแกรมเชิงปฏิบัติฉันได้เห็นภาษาโปรแกรมที่ใช้งานได้เช่น Haskell, ML, Scala หรือ Clojure เรียกว่า "ภาษาที่ประกาศ" ซึ่งแตกต่างจากภาษาที่จำเป็นเช่น C / C ++ / C # / Java คำถามของฉันคือสิ่งที่ทำให้ภาษาโปรแกรมการทำงานประกาศเมื่อเทียบกับความจำเป็น
คำอธิบายที่พบบ่อยซึ่งอธิบายถึงความแตกต่างระหว่างการเขียนโปรแกรมเชิงประกาศและเชิงบังคับคือในการเขียนโปรแกรมเชิงบังคับคุณต้องบอกคอมพิวเตอร์ว่า "ทำอย่างไร" ซึ่งต่างจาก "สิ่งที่ต้องทำ" ในภาษาที่ประกาศ ปัญหาที่ฉันมีกับคำอธิบายนี้คือคุณกำลังทำทั้งสองอย่างในภาษาการเขียนโปรแกรมทั้งหมด แม้ว่าคุณจะลงไปที่แอสเซมบลีระดับต่ำสุดที่คุณยังบอกคอมพิวเตอร์ว่า "สิ่งที่ต้องทำ" คุณบอกซีพียูเพื่อเพิ่มตัวเลขสองตัวคุณไม่ได้บอกวิธีการเพิ่ม ถ้าเราไปที่ปลายอีกด้านหนึ่งของภาษาที่มีฟังก์ชั่นบริสุทธิ์ระดับสูงอย่าง Haskell คุณกำลังบอกคอมพิวเตอร์ว่าจะทำภารกิจเฉพาะอย่างได้อย่างไร นั่นคือสิ่งที่โปรแกรมของคุณเป็นลำดับของคำแนะนำเพื่อให้ได้งานเฉพาะซึ่งคอมพิวเตอร์ไม่ทราบว่าจะบรรลุผลได้อย่างไร ฉันเข้าใจว่าภาษาเช่น Haskell, Clojure ฯลฯ มีระดับที่สูงกว่า C / C ++ / C # / Java อย่างเห็นได้ชัดและมีคุณสมบัติเช่นการประเมินแบบขี้เกียจโครงสร้างข้อมูลที่ไม่เปลี่ยนรูปแบบฟังก์ชันที่ไม่ระบุชื่อการปิดบังโครงสร้างข้อมูลถาวร ฟังก์ชั่นการเขียนโปรแกรมเป็นไปได้และมีประสิทธิภาพ แต่ฉันจะไม่แยกพวกเขาเป็นภาษาที่เปิดเผย
ภาษาที่ประกาศบริสุทธิ์สำหรับฉันจะเป็นภาษาที่ประกอบด้วยการประกาศทั้งหมดเท่านั้นตัวอย่างของภาษาดังกล่าวจะเป็น CSS (ใช่ฉันรู้ CSS จะเป็นภาษาโปรแกรมไม่ได้ในทางเทคนิค) CSS มีเพียงการประกาศสไตล์ซึ่ง HTML และ Javascript ใช้ในหน้าเว็บ CSS ไม่สามารถทำสิ่งอื่นนอกจากทำการประกาศมันไม่สามารถสร้างฟังก์ชั่นคลาสได้เช่นฟังก์ชั่นที่กำหนดรูปแบบการแสดงตามพารามิเตอร์บางตัวคุณไม่สามารถเรียกใช้งานสคริปต์ CSS และอื่น ๆ ได้สำหรับฉันอธิบายถึงภาษาที่ประกาศภาษาโปรแกรม )
ปรับปรุง:
ฉันได้เล่นกับ Prolog เมื่อเร็ว ๆ นี้และสำหรับฉันแล้ว Prolog เป็นภาษาการเขียนโปรแกรมที่ใกล้เคียงที่สุดกับภาษาที่ประกาศอย่างเต็มที่ (อย่างน้อยก็ในความคิดของฉัน) ถ้าไม่ใช่ภาษาการเขียนโปรแกรมแบบเต็ม ในการทำรายการอย่างละเอียดใน Prolog จะทำโดยการประกาศซึ่งรัฐทั้งข้อเท็จจริง (ฟังก์ชั่นกริยาซึ่งส่งกลับจริงสำหรับอินพุตที่เฉพาะเจาะจง) หรือกฎ (ฟังก์ชั่นกริยาซึ่งส่งกลับจริงสำหรับเงื่อนไข / รูปแบบที่กำหนดขึ้นอยู่กับอินพุต) กฎ ถูกกำหนดโดยใช้เทคนิคการจับคู่รูปแบบ เมื่อต้องการทำสิ่งใดในอารัมภบทคุณค้นหาฐานความรู้โดยการแทนที่อินพุตหนึ่งรายการหรือมากกว่าของเพรดิเคตด้วยตัวแปรและโปรล็อกพยายามค้นหาค่าสำหรับตัวแปรที่เพรดิเคตสำเร็จ
ประเด็นของฉันอยู่ในอารัมภบทไม่มีคำสั่งที่จำเป็นคุณบอก (คอมพิวเตอร์) สิ่งที่รู้แล้วถาม (สอบถาม) เกี่ยวกับความรู้ ในภาษาโปรแกรมที่ใช้งานได้คุณยังคงให้คำแนะนำเช่นรับค่า, เรียกใช้ฟังก์ชัน X และเพิ่ม 1 เข้าไป, ฯลฯ แม้ว่าคุณจะไม่ได้จัดการตำแหน่งหน่วยความจำโดยตรงหรือเขียนขั้นตอนการคำนวณทีละขั้นตอน ฉันจะไม่พูดว่าการเขียนโปรแกรมใน Haskell, ML, Scala หรือ Clojure เป็นการประกาศในแง่นี้แม้ว่าฉันอาจจะผิด เหมาะสมถูกต้องจริงและบริสุทธิ์การทำงานของโปรแกรมประกาศในแง่ที่ฉันอธิบายไว้ข้างต้น
(let [x 1] (let [x (+ x 2)] (let [x (* x x)] x)))
(หวังว่าคุณจะเข้าใจอย่างนั้น Clojure) คำถามเดิมของฉันคือสิ่งที่ทำให้สิ่งนี้แตกต่างจาก int นี้x = 1; x += 2; x *= x; return x;
ในความเห็นของฉันส่วนใหญ่เหมือนกัน