มันเป็นเรื่องยากที่จะตอบคำถามประเภท "คือX Y " หากผู้เข้าร่วมในการใช้งานการอภิปรายคำนิยามที่แตกต่างกันของXและY อาจเป็นได้ว่าสำหรับคำจำกัดความบางคำตอบคือ "ใช่" และสำหรับคำจำกัดความบางคำตอบคือ "ไม่" โดยเฉพาะอย่างยิ่งถ้าคำตอบนั้นขึ้นอยู่กับรายละเอียดทางเทคนิคที่คำจำกัดความต่างกัน นอกจากนี้การสนทนานี้มีข้อมูลที่ผิดดังนั้นโปรดอดทนด้วยคำตอบที่ยาวกว่า
" ภาษาโปรแกรม " หมายถึงอะไร
คำตอบง่ายๆอาจเป็น "ภาษาที่ใช้ในการสร้างโปรแกรม" แน่นอน แต่: โปรแกรมประเภทใด ภาษาใดบ้างที่สามารถใช้สร้างโปรแกรมบางประเภท แต่ไม่ใช่โปรแกรมประเภทอื่น ต่อไปนี้เป็นตัวอย่างเฉพาะสองตัวอย่างเพื่อแสดงกรณีและปัญหาที่รุนแรง:
1) ภาษาจินตภาพที่ชื่อว่า M ทำงานดังนี้: หากโปรแกรมมีตัวอักษร "m" ตัวเดียวมันจะสร้างเกม Minesweeper ทุกอย่างอื่นเป็นข้อผิดพลาดทางไวยากรณ์
โดยสังเขปนี่ไม่ใช่สิ่งที่เราหมายถึงโดยการพูดว่า "ภาษาการเขียนโปรแกรม" แต่ฝ่ายการตลาดของ M สามารถโต้แย้งว่าในทางเทคนิคนั้นเป็นไปตามคำนิยามเพราะสามารถใช้ในการสร้างโปรแกรมได้ แน่นอนว่าคอมไพเลอร์ทำบางส่วนที่สำคัญสำหรับคุณ แต่นั่นคือสิ่งที่คอมไพเลอร์ทำใช่มั้ย คอมไพเลอร์ของภาษา C ยังแปลคำศัพท์ง่าย ๆ เป็นคำสั่งต่าง ๆ ของโปรเซสเซอร์ คอมไพเลอร์ M ก้าวไปอีกขั้นและทำให้งานของคุณง่ายขึ้น
2) ถ้าคุณติดตั้ง Turbo Pascal เวอร์ชั่นดั้งเดิมคุณสามารถเขียนโปรแกรมได้หลายแบบ แต่คุณไม่สามารถเขียนเกมที่ทำงานในเว็บเบราว์เซอร์ได้เพราะ API ที่จำเป็นนั้นไม่มีอยู่ในนั้น
แล้วอะไรคือสิ่งที่ทำให้ Turbo Pascal เป็นภาษาโปรแกรม แต่ M ไม่มีหรือ? เพียงแค่พูดคุณสามารถทำอะไรได้มากกว่าในปาสกาลกว่าในเอ็ม แต่คิดว่าเรามี M.NET ซึ่งสร้างเกมเรือกวาดทุ่นระเบิดทำงานในเว็บเบราว์เซอร์ ดังนั้นตอนนี้เรามีสิ่งที่ Pascal สามารถทำได้และ M.NET ไม่สามารถทำได้ แต่เราก็มีบางอย่างที่ M.NET สามารถทำได้และ Pascal ไม่สามารถทำได้ ทำไมเราต้องพิจารณาข้อดีของ Pascal สำคัญและข้อดีของ M.NET ที่ไม่เกี่ยวข้อง?
คำตอบคือคุณสามารถเขียนอัลกอริทึมทุกชนิดใน Pascal แต่คุณไม่สามารถเขียนอัลกอริทึมใน M หรือ M.NET แน่นอนว่า M รวบรวมคำสั่งของคุณ "m" และ C รวบรวมคำสั่งของคุณ "strcmp" แต่คุณสามารถใส่ "strcmp" ในบริบทที่มีขนาดใหญ่กว่าตัวอย่างเช่นเปรียบเทียบไฟล์สองไฟล์ต่อบรรทัดหรืออ่านพันสตริงและจัดเรียงตามลำดับตัวอักษรหรือ ... ดีมีอีกหลายล้านรายการ และมันก็เป็นอย่างแม่นยำความสามารถในการใช้คำสั่งที่กำหนดไว้ในขั้นตอนวิธีการใด ๆซึ่งจะทำให้สาระสำคัญของภาษาการเขียนโปรแกรม
อัลกอริทึมคืออะไรและที่สำคัญกว่านั้นคืออะไร "อัลกอริทึมใด ๆ "? ในสาขาวิทยาศาสตร์คอมพิวเตอร์ที่เราใช้คำว่าทัวริงสมบูรณ์ แนวคิดคือมีชุดภาษาคอมพิวเตอร์ซึ่งแต่ละภาษาสามารถจำลองได้ทั้งหมด หนึ่งในภาษาเหล่านั้นคือเครื่องจักรทัวริงซึ่งเป็นเหตุผลว่าทำไมพวกเขาถึงถูกเรียกเช่นนั้น ปาสคาลอยู่ที่นั่น, C อยู่ตรงนั้น, จาวาอยู่ที่นั่น, Python อยู่ที่นั่น, Lisp อยู่ที่นั่น, Smalltalk อยู่ที่นั่น, แม้แต่ XSLT ก็อยู่ที่นั่น สมมติฐาน M และ M.NET ของเราไม่อยู่ที่นั่น คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้ได้ที่มหาวิทยาลัยใดก็ตามที่เปิดสอนหลักสูตรวิทยาการคอมพิวเตอร์ที่เหมาะสม แต่แนวคิดคือภาษาทัวริงที่สมบูรณ์สามารถทำอะไรก็ได้ภาษาทัวริงที่สมบูรณ์แบบอื่นสามารถทำได้หากคุณให้ API ขั้นต่ำที่จำเป็นแก่พวกเขา (ถ้าคุณมอบ API ของเว็บเบราว์เซอร์ให้กับ Pascal คุณสามารถสร้างเกมได้ทุกประเภทในเว็บเบราว์เซอร์ถ้าคุณมอบ API ของเว็บเบราว์เซอร์ให้กับ M คุณจะสามารถสร้าง Minesweeper ได้เท่านั้น) เราสามารถพูดเชิงเปรียบเทียบได้ว่า คุณลบ API ทั้งหมดออกจากภาษาการเขียนโปรแกรมสิ่งสำคัญคือสิ่งที่เหลืออยู่
เราหมายถึงอะไรโดย " การแสดงออกปกติ "?
ภาษาการเขียนโปรแกรมที่แตกต่างกันนำไปใช้แตกต่างกันเล็กน้อย แต่ความคิดเดิมคือการที่แสดงออกปกติแสดงที่เรียกว่าภาษาปกติ โปรดทราบว่าเราไม่ได้พูดเกี่ยวกับภาษาการเขียนโปรแกรมที่นี่ แต่เกี่ยวกับ (หลอก) ภาษามนุษย์ ลองนึกภาพว่าคุณพบชนเผ่าแปลกใหม่บางคนกำลังพูดภาษาที่ประกอบด้วยคำว่า "ba", "baba", "bababa" เป็นต้น คุณสามารถอธิบายภาษานี้ด้วยวาจาว่า "พยางค์ 'ba' ซ้ำหนึ่งครั้งขึ้นไป" หรือใช้นิพจน์ทั่วไปเป็น "(ba) +"
นิพจน์ทั่วไปควรแสดง: "ไม่มีอะไร", "จดหมายนี้", "สิ่งนี้, ตามด้วย", "นี่หรืออย่างนั้น", "นี่, ทำซ้ำหนึ่งครั้งหรือมากกว่า" และ "ไม่ใช่สิ่งนี้" - นั่นคือนิยามทางคณิตศาสตร์ สิ่งอื่นเป็นเพียงทางลัดที่สะดวกสบายที่สร้างขึ้นจากส่วนประกอบก่อนหน้า ตัวอย่างเช่น "นี่ทำซ้ำสองหรือสามครั้ง" สามารถแปลว่า "นี่ตามด้วยสิ่งนี้ตามด้วย (นี่หรือไม่มีอะไร)" แต่มันจะสะดวกกว่าถ้าเขียน "ba {2,3}" มากกว่า "baba (BA)?"
ในชีวิตจริงการดำเนินงานตามแบบฉบับของ "การแสดงออกปกติ" การดำเนินการมากขึ้นกว่านี้ ตัวอย่างเช่นการใช้คำจำกัดความทางคณิตศาสตร์ภาษา "aba", "aabaa", "aaabaaa" และอื่น ๆ - จำนวน "a" s ใด ๆ ตามด้วย "b" ตามด้วยหมายเลขเดียวกันของ "a "s - ไม่ใช่ภาษาปกติ อย่างไรก็ตาม "นิพจน์ทั่วไป" ที่ใช้กันทุกวันนี้สามารถตรวจจับได้โดยใช้แนวคิดเพิ่มเติมของ "สิ่งเดียวกับที่เราพบมาก่อน" เขียนเป็น "(a +) b \ 1" ใช้แนวคิดเพิ่มเติมนี้เราสามารถทำสิ่งดีๆบางอย่างเช่นการตรวจสอบคำประกอบด้วยนายกจำนวนตัวอักษร ถึงกระนั้นเราไม่สามารถทำอัลกอริทึมใด ๆ ... สำหรับคำอธิบายว่าทำไม
ดังนั้นกลับไปที่หัวข้อดั้งเดิม: เป็นนิพจน์ทั่วไป (กำหนดเป็น: นิพจน์ที่อธิบายภาษาปกติในลำดับชั้น Chomsky หรือเป็น: อดีตรวมกับการดำเนินงาน \ 1) ภาษาโปรแกรม (กำหนดเป็น: ทัวริงสมบูรณ์)? คำตอบคือไม่มี ไม่คุณไม่สามารถใช้อัลกอริทึมใด ๆโดยใช้นิพจน์ทั่วไปและความสามารถในการใช้อัลกอริทึมใด ๆคือสิ่งที่ผู้คนเรียนวิทยาศาสตร์คอมพิวเตอร์มักเข้าใจว่าเป็นสาระสำคัญของภาษาโปรแกรม
แน่นอนว่าทุกคนสามารถเปลี่ยนคำตอบโดยยืนยันในความหมายที่แตกต่างกัน อย่างที่ฉันเขียนไว้ตอนแรกรายละเอียดทางเทคนิคมีความสำคัญที่นี่ หากคุณเข้าใจผิดคุณจะได้คำตอบที่ผิด
และถ้าคุณไม่สนใจรายละเอียดทางเทคนิคคำตอบก็คือคุณสามารถใช้นิพจน์ทั่วไป (และไม่มีอะไรอื่น) ในการสร้างโปรแกรมได้หรือไม่? ไม่งั้นทำไมเรียกมันว่าภาษาโปรแกรม? (อย่างไรก็ตามคำตอบเช่นนี้ถูกดาวน์โหลดและลบที่นี่ซึ่งเป็นสาเหตุที่ฉันเขียนรุ่นที่ยาวกว่านี้)
แก้ไข: นอกจากนี้ทุกคนสามารถสร้างห้องสมุดที่ใช้ชุดตัวเลือกใหม่ของ "นิพจน์ทั่วไป" พร้อมกับคุณสมบัติใหม่ที่เพิ่มเข้ามา ในขณะที่คุณสมบัติใหม่อาจจะเพียงพอสำหรับทั้งระบบที่จะกลายเป็นทัวริงที่สมบูรณ์ ตัวอย่างเล็กน้อยจะฝังภาษาทัวริงที่สมบูรณ์โดยใช้ไวยากรณ์ใหม่บางอย่าง; แต่มันก็สามารถเกิดขึ้นได้อย่างชัดเจนน้อยลง บางทีมันอาจจะเกิดขึ้นแล้ว