กระบวนทัศน์การเขียนโปรแกรม

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

กระบวนทัศน์การเขียนโปรแกรมสามารถแยกได้โดยทั่วไปดังนี้ (ในวิทยาการคอมพิวเตอร์มีการจำแนกกระบวนทัศน์การเขียนโปรแกรมไว้มากกว่าที่กล่าวไว้ด้านล่าง):

* การเขียนโปรแกรมเชิงคำสั่ง (imperative programming) โปรแกรมเมอร์จะสั่งให้คอมพิวเตอร์เปลี่ยนสถานะด้วยคำสั่งเป็นขั้นตอน
** การเขียนโปรแกรมเชิงกระบวนการ (procedural programming) จัดมัดกลุ่มคำสั่งให้กลายเป็นกระบวนการ (คำสั่งหลายคำสั่ง -> กระบวนการ)
** การเขียนโปรแกรมเชิงวัตถุ (object-oriented programming) จับมัดกลุ่มคำสั่งกับสถานะโปรแกรมที่รันอยู่ มีจุดประสงค์เพื่อทำให้โค้ดโปรแกรมมีลักษณะเหมือนวัตถุที่จับต้องได้ในชีวิตจริง

* การเขียนโปรแกรมเชิงประกาศ (declarative programming)
** การเขียนโปรแกรมเชิงฟังก์ชัน (functional programming)
** การเขียนโปรแกรมเชิงตรรกะ (logic programming)
** การเขียนโปรแกรมเชิงคณิตศาสตร์ (mathematical programming)

## ภาพรวม
กระบวนทัศน์การเขียนโปรแกรมเป็นภาวะนามธรรมของระบบคอมพิวเตอร์ ตัวอย่างเช่น ตัวแบบของฟอน นอยแมน (Von Neumann architecture) เป็นกระบวนทัศน์สำหรับคอมพิวเตอร์แบบลำดับ สำหรับการคำนวณแบบคู่ขนานมีกระบวนทัศน์ที่เป็นไปได้หลายกระบวนทัศน์ซึ่งมีหลายวิธีการที่โปรเซสเซอร์สามารถติดต่อกันได้ วิธีการพื้นฐานเช่น การใช้หน่วยความจำร่วมกัน การส่งข้อมูลให้กับหน่วยความจำอื่น หรือใช้ทั้งสองวิธีร่วมกัน 
ภาษาโปรแกรมหนึ่ง ๆ สามารถรองรับกระบวนทัศน์การเขียนโปรแกรมหลายกระบวนทัศน์ ตัวอย่างเช่น ภาษา C++ หรือ Object Pascal สามารถใช้เขียนได้ทั้งแบบการโปรแกรมเชิงกระบวนการ และการโปรแกรมเชิงวัตถุ หรือทั้งสองแบบในโปรแกรมเดียวกัน ผู้ออกแบบซอฟต์แวร์ และผู้เขียนโปรแกรมจะเป็นผู้ตัดสินใจว่าโปรแกรมจะเขียนแบบใด 
การเขียนโปรแกรมเชิงวัตถุ ผู้เขียนโปรแกรมจะมองโปรแกรมในลักษณะที่เป็นการทำงานร่วมกันของวัตถุ ในขณะที่การโปรแกรมเชิงฟังก์ชันจะมองการทำงานของโปรแกรมในลักษณะลำดับของการประเมินฟังก์ชันแบบไม่มีสถานะ เมื่อเขียนโปรแกรมคอมพิวเตอร์ หรือระบบให้ประมวลผลแบบหลายโปรเซสเซอร์ การโปรแกรมเชิงกระบวนงาน ผู้เขียนโปรแกรมจะมองแอพลิเคชันในลักษณะเซตของกระบวนงานที่ทำพร้อม ๆ กัน ซึ่งทำงานบนโครงสร้างข้อมูลที่ใช้ร่วมกันทางตรรกะ 
เช่นเดียวกับกลุ่มของวิศวกรรมซอฟต์แวร์ที่ต่างกันที่สนับสนุนวิธีการที่แตกต่างกัน ภาษาโปรแกรมแต่ละภาษาก็สนับสนุนกระบวนทัศน์การเขียนโปรแกรมที่แตกต่างกัน ภาษาโปรแกรมบางภาษาถูกออกแบบมาสำหรับกระบวนทัศน์การโปรแกรมกระบวนทัศน์เดียว (เช่น Smalltalk สนับสนุนเฉพาะการเขียนโปรแกรมเชิงวัตถุ Haskell สนับสนุนเพียงการเขียนโปรแกรมเชิงฟังก์ชัน เป็นต้น) ในขณะที่ภาษาโปรแกรมอื่น ๆ สนับสนุนกระบวนทัศน์การโปรแกรมหลายกระบวนทัศน์ (เช่น Object Pascal, C++, Java, C#, Visual Basic, Common Lisp,Scheme, Perl, Python, Ruby, Oz and F#) กระบวนทัศน์การโปรแกรมหลายกระบวนทัศน์เป็นที่รู้กันดีว่ามีเทคนิคอะไรบ้างที่หายไปและมีเทคนิคอะไรบ้างที่ทำได้ ตัวอย่างเช่น กระบวนทัศน์การเขียนโปรแกรมเชิงฟังก์ชัน ไม่ยอมให้มีการใช้ side-effects ส่วนการเขียนโปรแกรมเชิงโครงสร้างไม่ยอมให้มีคำสั่ง goto ด้วยเหตุผลนี้ กระบวนทัศน์การโปรแกรมใหม่ มักพิจารณาหลักยึด หรือเข้มงวดมาก โดยยึอถือตามกระบวนทัศน์ก่อนหน้า การหลีกเลี่ยงเทคนิคที่แน่นอนสามารถทำให้การพิสูจน์ทฤษฎีเกี่ยวกับความถูกต้องของโปรแกรมหรือการทำความเข้าใจพฤติกรรมของมันทำได้ง่ายขึ้น

## ภาษาโปรแกรมหลายกระบวนทัศน์
ภาษาโปรแกรมหลายกระบวนทัศน์เป็นภาษาโปรแกรมที่สนับสนุนกระบวนทัศน์การเขียนโปรแกรมมากกว่าหนึ่งกระบวนทัศน์ เช่นภาษา Leda ซึ่งสร้างขึ้นโดย Timothy Budd เขาได้ใส่แนวคิดกับภาษาดังนี้ "แนวคิดของภาษาโปรแกรมหลายกระบวนทัศน์ คือการจัดเตรียมกรอบงานสำหรับผู้เขียนโปรแกรมให้สามารถเขียนโปรแกรมได้หลายวิธี สามารถรวมกระบวนทัศน์การเขียนโปรแกรมต่าง ๆ ได้อย่างอิสระ" จุดมุ่งหมายของภาษานี้ คือการยอมให้ผู้เขียนโปรแกรมใช้เครื่องมือที่ดีที่สุดสำหรับงานของเขา การยอมรับว่าไม่มีกระบวนทัศน์การโปรแกรมใดที่แก้ได้ทุกปัญหาด้วยวิธีการที่ง่ายที่สุดหรือมีประสิทธิภาพมากที่สุด ภาษาโปรแกรมอีกภาษาหนึ่งที่รู้จักกันดี คือ C# F# และอีกภาษาหนึ่งคือ Oz ซึ่งเป็นภาษาในกลุ่มตรรกะ และสามารถเขียนโปรแกรมได้ทั้งแบบฟังก์ชัน เชิงวัตถุ และการทำงานพร้อมกัน รวมถึงกระบวนทัศน์การโปรแกรมอื่น ๆ ด้วย Oz ถูกออกแบบมามากกว่า10 ปี เพื่อที่รวมกระบวนทัศน์การโปรแกรมแบบต่าง ๆ อย่างกลมกลืน กระบวนทัศน์การโปรแกรมได้จัดเตรียมวิธีการและโครงสร้างสำหรับการประมวลผลโปรแกรมสำหรับผู้เขียนโปรแกรม