พลังการแสดงออกที่เฉพาะเจาะจงหมายถึงอะไร?


34

พลังความหมายถูกกำหนดโดย Wikipedia ในฐานะ:

.. ความกว้างของความคิดที่สามารถเป็นตัวแทนและสื่อสารในภาษานั้น

"ความคิด" หมายถึงสิ่งต่าง ๆ (การดำเนินงานโครงสร้างอัลกอริธึม ฯลฯ ) เราสามารถสื่อสารกับเครื่องได้หรือไม่? หรือมันอ้างถึงแนวคิด "มนุษย์" ที่สามารถบันทึกและสื่อสารกับภาษากับคนอื่น ๆ ?

พลังงานที่แสดงออกได้ประเมินและวัดค่าอย่างไร

ตัวอย่างเช่นหากเราใช้ภาษาเช่น JavaScript และกำหนดข้อ จำกัด แปลก ๆ สำหรับชื่อตัวแปรเช่นตัวแปรต้องเป็นตัวเลข 8 หลักที่นำหน้าด้วยขีดล่างการจับคู่/^_[0-9]{8}$/เราจะสูญเสียพลังในการแสดงออกหรือไม่?

หรือจะว่าเพียง แต่จะไร้สาระและน่ารำคาญ?


เพื่อชี้แจง:

อำนาจการแสดงออกที่วัดโดยความคิดทั่วไปที่มีอยู่ในภาษา:

  • จำนวนเต็มและสตริง
  • ลูป
  • เงื่อนไข

หรือหมายเลขของเฉพาะความคิดที่ไม่ซ้ำกันว่าภาษาที่สามารถเป็นตัวแทน:

  • จำนวนเต็ม 1, 2 ... 2 ^ 32
  • สตริงที่มี "สุนัขจิ้งจอกพูดว่าอะไร" และ "wha pah pah pah pah pah pow"
  • สำหรับกบแต่ละตัวในชุดกบของฉัน
  • ถ้ากบเป็นสีเขียวหรือบางสิ่งบางอย่างก็ให้ทำอะไรสักอย่าง

3
ควรสังเกตว่าการ จำกัด โปรแกรมให้มีตัวแปรมากที่สุด 100 ล้านตัวในขอบเขตที่กำหนดจะมีข้อ จำกัด บางประการเกี่ยวกับการแสดงออก มันอาจทำให้ไม่สามารถใช้ Firefox ได้ ;-)
R ..

1
โปรดทราบว่าในขณะที่คุณติดแท็ก "ภาษาการเขียนโปรแกรม" นี้ภาษาการเขียนโปรแกรมไม่ใช่ภาษาคอมพิวเตอร์เพียงประเภทเดียวที่อาจกล่าวถึงพลังการถ่ายทอด อันที่จริงหน้าที่คุณลิงก์ไปยังมีภาษาของ Ontology เป็นตัวอย่างแรก
Jon Hanna

คำตอบ:


39

กระดาษสถานที่สำคัญในการแสดงออกเป็นในการแสดงพลังของภาษาการเขียนโปรแกรมโดยแมตเธียสเฟลเลเซน (1991) มันมีคำจำกัดความที่เข้มงวดทางคณิตศาสตร์ของการแสดงออกทางภาษา

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

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


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

บางทีตัวอย่างของฉันใน OP อาจไม่ดี พิจารณาภาษา A และ B ทั้งสองมีอาร์เรย์ แต่ภาษา A ก็มีโครงสร้างเช่นกัน ในภาษาใดภาษาหนึ่งฉันสามารถแสดงชุดของการPointใช้อาร์เรย์ของอาร์เรย์ 2D แต่Aมีข้อได้เปรียบในการให้ฉันแสดงPointแนวคิดที่มนุษย์อ่านได้มากขึ้น คือแสดงออกมากขึ้น?
svidgen

@svidgen เนื่องจากภาษาทัวริงที่สมบูรณ์ทั้งหมดมีความสามารถในการคำนวณเทียบเท่ากันชุดของโปรแกรมที่เป็นไปได้ที่สามารถเขียนได้นั้นมีความเหมือนกันในทางทฤษฎีสำหรับพวกเขาทั้งหมด ตามคำนิยามข้างต้นภาษา B มีความหมายมากกว่าและถ้าโปรแกรมที่เขียนใน B ต้องจัดโครงสร้างใหม่ให้พอดีกับ A (ไม่เพียง แต่เปลี่ยนไวยากรณ์บรรทัดทีละบรรทัด แต่แนะนำคลาสใหม่ลูปเป็นต้นคิดเกี่ยวกับการเขียน Python ใหม่ โปรแกรม Java 7 ที่ใช้ lambdas, map, filterชั้นแรกประเภท / วิธีการ / ฟังก์ชั่นอาจจะมีevalให้มายากลคนเดียว metaclass หรือชนิดสร้างแบบไดนามิก ฯลฯ
marczellm

@marczellm ดังนั้น "ความคิด" ที่หมายถึงความหมายที่แสดงออกเป็นภาษาสร้างตัวเอง? เช่นความคิดแบบมีเงื่อนไขคืออะไร? การวนซ้ำเป็นแนวคิดหรือไม่? สตริง? จำนวน? ฯลฯ ?
svidgen

1
@ Jörgคุณช่วยยกตัวอย่างในคำตอบของคุณได้ไหม? มันเป็นคำจำกัดความที่น่ารัก แต่มันไม่ค่อยตอบคำถามเท่าไหร่
svidgen

10

พลังความหมายถูกกำหนดโดย Wikipedia ในฐานะ:

มาอ่านหน้านี้กันใหม่ หนึ่งในสิ่งแรกที่ควรทราบก็คือมันบอกว่า "ภาษา" ไม่ใช่ "ภาษาโปรแกรม" และตัวอย่างส่วนใหญ่ไม่ใช่ภาษาโปรแกรมเช่นตัวอย่างแรกที่กำหนดคือการเปรียบเทียบ OWL2 EL และ OWL2 RL ซึ่งเป็นทั้งภววิทยา ภาษา

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

"ความคิด" หมายถึงสิ่งต่าง ๆ (การดำเนินงานโครงสร้างอัลกอริธึม ฯลฯ ) เราสามารถสื่อสารกับเครื่องได้หรือไม่? หรือมันอ้างถึงแนวคิด "มนุษย์" ที่สามารถบันทึกและสื่อสารกับภาษากับคนอื่น ๆ ?

มันหมายถึงสิ่งที่สามารถแสดงในภาษานั้นถือว่าเป็นสิ่งในตัวเองอย่างหมดจด

ตัวอย่างเช่น (ฉันจะใช้จาวาสคริปต์สำหรับตัวอย่างของฉันเพราะคำถามของคุณระบุว่าเป็นหนึ่งในภาษาที่คุณรู้จัก) พิจารณาคำสั่งจาวาสคริปต์:

var x = 3 + 4;

นี่แสดงว่าผลรวมของ 3 และ 4 ถูกคำนวณและค่าที่เชื่อมโยงกับเลเบลxภายในขอบเขตเนมสเปซที่กำหนด

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

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

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

คำว่าพลังความหมายอาจใช้กับความหมายที่หลากหลาย อาจหมายถึงการวัดความคิดที่แสดงออกในภาษานั้น:

  • โดยไม่คำนึงถึงความสะดวก (การแสดงออกทางทฤษฎี)

  • รัดกุมและพร้อมใช้งาน (การแสดงออกในทางปฏิบัติ)

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

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

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

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

ตัวอย่างเช่นหากเราใช้ภาษาเช่น JavaScript และกำหนดข้อ จำกัด แปลก ๆ เกี่ยวกับชื่อตัวแปรเช่นตัวแปรต้องเป็นตัวเลข 8 หลักที่นำหน้าด้วยขีดล่างการจับคู่/^_[0-9]{8}$/เราจะสูญเสียพลังในการแสดงออกหรือไม่?

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

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

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

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

โดยคำจำกัดความที่ไม่เป็นทางการมากขึ้นมันมีความหมายมากขึ้นในบางสิ่งเช่นการปรับเปลี่ยนอาเรย์การจัดการข้อยกเว้นและ (อาจจะมากที่สุด) ในการรวมของนิพจน์ทั่วไป สิ่งเหล่านี้ไม่ได้ทำอะไรที่ไม่สามารถทำได้ใน javascript มาก่อนแม้ว่าพวกเขาจะสามารถทำอะไรบางอย่างในสองสามบรรทัดและเวลาในการประมวลผลย่อยที่จะใช้รหัสกิโลไบต์ในการเขียนใน javascript1.0 และใช้เวลานาน

ตามคำนิยามที่ไม่เป็นทางการมากกว่านี้อีกครั้งการเปลี่ยนแปลงจากการใช้งานครั้งแรกของ javascript ในเบราว์เซอร์ (สามารถเปลี่ยนค่าของรูปแบบการป้อนข้อมูลได้document.writeในขณะที่หน้าถูกแยกวิเคราะห์เป็นครั้งแรกและย้ายไปยังตำแหน่งใหม่หรือย้อนกลับหรือไปข้างหน้าในประวัติศาสตร์ จนถึงทุกวันนี้ (ไม่สามารถเปลี่ยนแปลงอะไรก็ได้บนหน้าเว็บรวมถึงบนพื้นฐานของข้อมูลจากการโทรศัพท์ผ่านเซิร์ฟเวอร์) นั้นมีขนาดใหญ่มากแม้ว่าส่วนใหญ่จะไม่เกี่ยวข้องกับจาวาสคริปต์ แต่เป็นรุ่นวัตถุและ API ที่สร้างขึ้น มีให้มากกว่าภาษา (เช่น vbscript ใน IE ได้รับประโยชน์จากการเปลี่ยนแปลงเหล่านั้นเท่า ๆ กัน)

ในใจของฉันการใช้งานครั้งสุดท้ายนั้นไม่เป็นทางการเท่าที่ควรจะไม่ถูกต้อง แต่นั่นเป็นปัญหาของคำจำกัดความที่ไม่เป็นทางการ

จากการ จำกัด อย่างเป็นทางการจริงๆแล้วมันไม่ได้แสดงออกมากขึ้นเลย


2
"คอมพิวเตอร์ต้องการวิทยาการคอมพิวเตอร์ แต่วิทยาการคอมพิวเตอร์ไม่จำเป็นต้องใช้คอมพิวเตอร์" ฉันชอบที่
chbaker0

เกี่ยวกับข้อ จำกัด การตั้งชื่อตัวแปรความสามารถในการอ้างถึงแนวคิดภายนอก (ชื่อภาษาพื้นเมืองสำหรับสิ่งต่าง ๆ ) ไม่เกี่ยวข้องกับความสามารถของภาษาในการแสดงความคิดหรือไม่? ... อาจจะเป็นรากเหง้าของคำถาม: ความคิดที่เรากำลังพูดถึงเป็นการแสดงเฉพาะภาษาทั่วไปหรือไม่? เช่นการบวกการลบการปฏิเสธอาร์เรย์คลาส ฯลฯ ? ตรงข้ามกับความคิดเฉพาะที่เราสามารถแสดงออกด้วยภาษาได้หรือไม่ เช่นอาร์เรย์เรียกว่าfishiesFishประเภท
svidgen

คุณสามารถดูการแก้ไขของฉันเพื่อความกระจ่างเพิ่มเติม ... มันเหมือนกับว่าคุณกำลังพูดว่ามันทั้งคู่ (หมายถึงการแก้ไขของฉัน); แต่รายการแรกคือ "เป็นทางการ" และรายการที่สองคือ "ไม่เป็นทางการ" หากเป็นเช่นนั้นจะมีบรรทัดฐานสำหรับวิธีการใช้อย่างไม่มีเงื่อนไขในการสนทนาหรือไม่? หรือ ... คุณแค่อยากจะขอคำชี้แจง?
svidgen

4

ฉันไม่คิดว่ากฎการตั้งชื่อตัวแปรนั้นสามารถจับความหมายของ "ความหมาย" ได้อย่างแท้จริง ฉันคิดว่า "ความหมาย" หมายถึงสิ่งพื้นฐานมากขึ้น ลองพิจารณา C # กับ Linq กับ C # ก่อน Linq เช่น หลังจากการเพิ่ม Linq มันเป็นไปได้ที่จะเขียนคำสั่ง SQL ที่คล้ายกันโดยตรงใน C # นี่เป็นวิธีที่ยอดเยี่ยมกว่าทางเลือกก่อนหน้าเช่นวาง SQL ลงในตัวอักษรสตริงแล้วส่งไปยังเซิร์ฟเวอร์หรือวนซ้ำคอลเลกชันโดยใช้ "for"

อีกตัวอย่างที่ดีอาจเป็นภาษาที่มีการสืบทอดตามต้นแบบ ในภาษาเหล่านั้นเป็นไปได้ที่จะเพิ่มวิธีการใหม่ให้กับอินสแตนซ์หรือแม้แต่คลาส (ด้วยชื่ออะไรก็ตาม "คลาส" อาจเป็นภาษาที่กำหนด ... ) ที่รันไทม์ คุณไม่สามารถทำเช่นนั้นได้ใน C ++ หรือ C # พวกเขาขาดความหมายในระดับนี้เมื่อเทียบกับภาษาต้นแบบ (C # มีแนวคิดของวิธีการขยายและแน่นอนว่าสามารถเพิ่มความหมายได้)


0

ตามที่อ้างถึงโดยบทความ Wikipedia พลังการแสดงออกหมายถึงชุดของโปรแกรมที่สามารถแสดงในภาษา ทุกสิ่งที่คุณคิดว่าเป็น "ภาษาการเขียนโปรแกรม" (JavaScript, LISP, C #, Perl, ฯลฯ ) นั้นมีความสมบูรณ์ทัวริงสมบูรณ์ซึ่งหมายความว่าพวกเขาสามารถแสดงสิ่งที่กล่าวว่าเป็น "คำนวณ"

อย่างไรก็ตามควรมีความชัดเจนว่านิพจน์ทั่วไปนั้นไม่สามารถแสดงออกได้เหมือนภาษาโปรแกรมปกติ นอกจากนี้สัญลักษณ์ตัวแทนเชลล์ยังมีความหมายน้อยกว่านิพจน์ทั่วไป

เวอร์ชันของ SQL ที่มีนิพจน์ตารางทั่วไปมีความหมายมากกว่ารุ่นที่ไม่มีเพราะ CTEs อนุญาตให้คุณแสดงเคียวรีแบบเรียกซ้ำที่ไม่สามารถแสดงใน SQL ได้


0

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

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

อย่าเข้าใจผิดโดยใช้ "คำว่า" โปรแกรม Java เป็นคำในภาษาจาวา (แม้ว่ามันอาจครอบคลุมไฟล์หลายไฟล์ที่มีสตริงอักขระหลายตัวคั่นด้วยช่องว่าง)

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

  • มานิยามภาษา A เพื่อเป็นสูตรทั้งหมดที่เกี่ยวข้องกับการบวกจำนวนเต็ม

  • มานิยามภาษา B เป็นภาษาของสูตรทั้งหมดที่เกี่ยวข้องกับการคูณจำนวนเต็ม

ในทั้งสองกรณีเราไม่อนุญาตให้ใช้องค์ประกอบข้อมูลประจำตัว ดังนั้นภาษา A มีคำว่า "1 + 1", "1 + 2", "1 + 3", "2 + 3" และอื่น ๆ ภาษา B มีคำว่า "2 * 2", "2 * 3", "2 * 4", "3 * 4" เป็นต้น นอกจากนี้เรายังกำหนดการตีความตามปกติให้กับ "*" และ "+" (การเพิ่มจำนวนเต็มและการคูณจำนวนเต็ม) ให้กับสัญลักษณ์ที่เกี่ยวข้อง ดังนั้นการตีความของ "1 + 1" จึงเป็น 2 และการตีความของ "2 * 2" คือ 4

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


เพื่อสรุปสิ่งนี้: ภาษา A สามารถพูดได้มากกว่าภาษา B เมื่อฟังก์ชั่นการตีความของพวกเขาแบ่งปันโดเมนร่วม แต่ภาพของฟังก์ชั่นการตีความของ B เป็นเซตย่อยที่เหมาะสมของภาพของฟังก์ชั่นการตีความของ A


-1

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

ข้อ จำกัด การตั้งชื่อตัวแปรไม่ลดความหมาย (เว้นแต่จะมีชื่อน้อยมากที่ไม่สามารถแสดงอัลกอริธึมทั้งหมดได้อีกต่อไปและไม่มีตัวแปรปลอมที่มีบางอย่างเช่นอาร์เรย์ + ดัชนี)

ตัวอย่างง่ายๆของการขาดพลังที่แสดงออกคือ: คุณต้องและdo_homework bring_down_trashนี่เป็นโค้ดที่เขียนง่าย:

do_homework();
bring_down_trash();

วิธีการแก้ปัญหานี้ดูค่อนข้างตรงไปตรงมา แต่จริง ๆ แล้วdo_homeworkและbring_down_trashไม่มีการเรียงลำดับใครสามารถเขียน:

bring_down_trash();
do_homework();

ซึ่งไม่แม่นยำเท่ากันเพราะมันไม่ได้แสดงว่าเราไม่ได้ตั้งใจที่จะบังคับใช้คำสั่ง เราไม่ต้องการใช้เธรด เราต้องการพูดอะไรแบบนี้:

compiler_or_interpreter_pick_one(
    {
        do_homework();
        bring_down_trash();
    },
    {
        bring_down_trash();
        do_homework();
    }
);

เท่าที่ฉันรู้ว่ามันเป็นเรื่องยากมากที่จะเป็นไปไม่ได้ที่จะแสดงในภาษาการเขียนโปรแกรมใด ๆ

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

การตัวอย่างจากคำตอบอื่น : c ++ ไม่สนับสนุนวิธีการที่จะเพิ่มชั้นเรียนหรืออินสแตนซ์ นี่เป็นความจริงอย่างไรก็ตามมันไม่ได้จำกัดความหมายของ C ++

struct Extensible{
    std::vector<std::function<void(Extensible *)>> instanceExtensions;
    static std::vector<std::function<void(Extensible *)>> classExtensions;
};

นี่คือคลาสที่คุณสามารถเพิ่มลบและเรียกใช้ฟังก์ชันสมาชิกแบบไม่ จำกัด จำนวนสำหรับอินสแตนซ์และคลาส ในทางเทคนิค C ++ อาจมีความหมายมากกว่าในเรื่องนี้มากกว่าภาษาการเขียนโปรแกรมที่รองรับคุณสมบัตินี้จริง ๆ เพราะใน C ++ คุณสามารถเลือกวิธีการเก็บฟังก์ชั่น (vector vs array vs forward_list)

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


2
ฉันค่อนข้างแน่ใจว่านี่ไม่ถูกต้อง - อย่างน้อยก็ไม่ใช่สิ่งที่ฉันเข้าใจ การเขียนไบนารี่ดิบไปยังดิสก์นั้นแสดงออกโดยนิยามนี้ซึ่งไร้สาระ
Telastyn

1
@Telastyn ทำไมจะไร้สาระ? แน่นอนว่าการเขียนไบนารี่ดิบไปยังดิสก์นั้นไม่ใช่การแสดงออก แต่ภาษาที่สามารถทำได้นั้นมีความหมายมากกว่าหนึ่งที่ไม่สามารถทำได้
nwp

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

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

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