ภาษาการเขียนโปรแกรมที่ทุกการแสดงออกเหมาะสม


23

ต่อคำแนะนำของฉันกำลัง reposting นี้จากกองมากเกิน

เมื่อเร็ว ๆ นี้ฉันกำลังคิดเกี่ยวกับปัญหาต่อไปนี้

พิจารณารหัสสำหรับมาตรฐาน "Hello world!" โปรแกรม:

main()
{
    printf("Hello World");

}

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

main(5
{
    printf("Hello World");

}

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

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

  2. "Postfix" พร้อมกับสแต็กของตัวแปร ตัวแปรจะถูกเก็บไว้ในสแต็ก ทุกการดำเนินการใช้สองตัวแปรจากด้านบนและวางผลลัพธ์ไว้ในตำแหน่งของพวกเขา โปรแกรมจะสิ้นสุดลงเมื่อถึงการดำเนินการหรือตัวแปรสุดท้าย

ส่วนตัวฉันเกลียดทั้งสองอย่างนี้ ไม่เพียง แต่จะถูก จำกัด เท่านั้น พวกเขาไม่ได้แก้ปัญหาที่แท้จริงเช่นการแก้ปัญหาโดยเฉพาะอย่างยิ่ง "offshoring" งานบางอย่างกับกระบวนการภายนอก

ใครบ้างมีความคิดอื่น ๆ วิธีแก้ปัญหานี้หรือไม่


48
ได้รับคอมไพเลอร์สร้างเรียบเรียงใหม่ซึ่งทำงานดังต่อไปนี้: แหล่งที่มารับ , ผ่านไปยังCถ้ามีความสุขกับมันและสร้างปฏิบัติการได้นั่นก็คือ แต่ถ้าบ่นแล้วส่งออกไฟล์ปฏิบัติการที่พิมพ์ออกมาคอมไพเลอร์ยอมรับทุกสตริงว่าเป็นโปรแกรมที่ถูกต้อง C s C C C C CCsCCCYou are a bimbo.C
Andrej Bauer

1
BF ต้องการ[ ]คำสั่งที่ตรงกัน(ตามหน้า Wiki) ความคิดของฉันคือดูที่ opcodes ของ CPU แต่ถึงอย่างนั้นบางรูปแบบอาจทำให้เกิดปัญหา (เช่นถ้า opcode เป็น 3 บิต แต่โปรแกรมของคุณมีเพียง 2 บิต) ยกเว้นปัญหาที่อาจเกิดจากการแพ็ดด้วย 0 บิตพิเศษบางอย่างสามารถคิดบน CPU ใด ๆ ที่มี ชุด opcode ที่สมบูรณ์ซึ่งจะตอบสนองการอ้างสิทธิ์ "ทุกสตริงเป็นโปรแกรมที่ถูกต้อง" อาจไม่มีความหมาย แต่ก็ยังใช้ได้
Ran G.

1
ปล่อยให้ฮาร์ดแวร์ของคุณเป็นซีพียู Z-80 พร้อม RAM 64k เขียนคอมไพเลอร์ที่เพียงแค่คัดลอกซอร์สโค้ด ASCII ที่เข้ารหัสลงในหน่วยความจำ 64k (ตัดทอนหรือเว้นระยะศูนย์ถ้าจำเป็น) คอมไพเลอร์นี้ไม่เคยให้ข้อผิดพลาดทางไวยากรณ์
Ben Crowell

1
@RanG A 'คอมไพเลอร์' ซึ่งประมวลผลบิตสตรีมใด ๆ และแก้ไขมันให้เป็นบิตของรหัสวัตถุที่ถูกต้องสำหรับตัวประมวลผลที่กำหนดฉันคิดว่าเป็นไปตามข้อกำหนดของ OPs มันอาจจะไม่ยากอย่างยิ่งสำหรับระบบที่มีชุดคำสั่งที่ซับซ้อนเช่น x86 ฉันอ่านกระดาษเมื่อหลายปีก่อนเกี่ยวกับความถูกต้องของการสุ่มไบต์เป็นโปรแกรม x86 และพบว่า x86 นั้นแข็งแกร่งกว่าที่ผู้เขียนคาดไว้
otakucode

2
หากไม่มีเงื่อนไขเพิ่มเติมคำถามนี้น่าเบื่อ: ความคิดเห็นของ Andrej และคำตอบของเดวิดให้คำตอบ "ไม่สำคัญ" คุณต้องตอกย้ำสิ่งที่คุณต้องการอย่างแม่นยำมากขึ้น
ราฟาเอล

คำตอบ:


31

Redcode ภาษาแอสเซมบลีที่อยู่เบื้องหลัง codewars ถูกเขียนขึ้นอย่างชัดเจนว่ามีคำสั่งหยุดทำงานน้อยมากเพราะโค้ดมักจะถูกทำให้ยุ่งเหยิงก่อนที่มันจะให้ออกมาในที่สุดและโอกาสที่จะหยุดเกมก็ยิ่งน่าสนใจน้อยลง

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

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

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


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

2
@tel: Cort อาจพูดถึงการสังเคราะห์โปรตีนผ่าน mRNA แทนที่จะทำซ้ำ ลำดับพันธุกรรมใด ๆ ที่สามารถถอดความได้และนำไปใส่ในเครื่องสังเคราะห์โปรตีน: โปรตีนที่ออกมานั้นมีความเสถียรเพียงพอหรือไม่ซึ่งไม่ได้สลายตัวไปตามเวลาที่มันถูกสร้างขึ้นมาและถ้าเป็นเช่นนั้น สิ่งมีชีวิตที่เป็นอีกเรื่องหนึ่ง ...
สตีฟเจสซอพ

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

TECOเป็นอีกตัวอย่างที่แท้จริงของโลก
cjm

1
@cjm ว้าว "API ไม่เสร็จสิ้นเมื่อคุณเพิ่มทุกอย่างเสร็จแล้ว แต่เมื่อคุณเลิกใช้ทุกอย่างเรียบร้อยแล้ว" นอกจากว่าคุณเป็น TECO แล้วคุณจะเสร็จสิ้นเมื่ออักขระหมดเพื่อกำหนดความหมาย
Cort Ammon - Reinstate Monica

16

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

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

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


13

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

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

อีกวิธีหนึ่งในการแก้ไขปัญหานี้คือการกำหนดความหมายของอินพุตที่เป็นไปได้ทั้งหมดอย่างสมบูรณ์รวมถึงการระบุข้อผิดพลาดเวลาคอมไพล์เวลาโหลดหรือข้อผิดพลาดในการรวบรวมสำหรับแต่ละอินพุตหากมี นั่นคือ“ ยกเลิกโปรแกรมหลังจากพิมพ์Syntax error at line 42บนสตรีมข้อผิดพลาดมาตรฐาน” เป็นส่วนหนึ่งของความหมายที่กำหนดไว้ของภาษา ทุกการแสดงออก“ เข้าท่า” ว่ามันมีความหมายที่กำหนดไว้ นั่นเป็นความหมายที่มีประโยชน์หรือไม่? อาจ - หลังจากทั้งหมดหากโปรแกรมผิดอย่างชัดเจนการปฏิเสธจะเป็นประโยชน์


12

ลองใช้Jotซึ่งเป็นภาษาทัวริงที่สมบูรณ์โดยใช้ตรรกะเชิงการประสานซึ่งทุก ๆ ลำดับของ 0s และ 1s (รวมถึงลำดับที่ว่างเปล่า) เป็นโปรแกรมที่ถูกต้อง


2
นี่ไม่ใช่คำตอบวิทยาศาสตร์คอมพิวเตอร์
Raphael

2
@Abdulrhman มันตรงไปข้างหน้าเพื่อกำหนด bijection ระหว่างสตริงไบนารีและจำนวนธรรมชาติ ดังนั้นคุณสามารถเข้ารหัสโปรแกรมใด ๆ เป็นจำนวนธรรมชาติถ้าคุณต้องการ
CodesInChaos

7
@ ราฟาเอลกรุณาอธิบายอย่างละเอียดหรือเสนอแนะการปรับปรุงคำตอบฉันยินดีที่จะปรับปรุงหากคุณให้เหตุผลสำหรับการวิจารณ์ของคุณ
Petr Pudlák

+1, ฉันกำลังจะให้คำตอบที่คล้ายกันสำหรับภาษาการเขียนโปรแกรมสมมติตามตัวเลขธรรมชาติ แต่นี่คล้ายกัน AFAIK ไม่มีการเขียนโปรแกรม (ใช้งานจริง) ซึ่งมีคุณสมบัตินี้ แต่สามารถสร้างได้โดยใช้ตัวเลขเพียงอย่างเดียวสมมติว่าทุกชุดมีความหมาย (ทำหน้าที่เป็นตัวดำเนินการและตัวถูกดำเนินการ) นี่คือกุญแจ
Nikos M

8

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

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


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

นี่ไม่ใช่คำตอบวิทยาศาสตร์คอมพิวเตอร์ (นอกจากนี้ "ทุกสตริงช่องว่าง"! = "ทุกสตริง")
Raphael

2
@ ราฟาเอล: แต่สตริงที่เป็นไปได้ทั้งหมด (รวมถึงสตริงที่ไม่มีช่องว่าง) เป็นโปรแกรมช่องว่างที่ถูกต้อง - โปรดทราบว่าตัวอักษรใด ๆ ที่ไม่ใช่ช่องว่างเป็นเพียงความเห็นในภาษาการเขียนโปรแกรมช่องว่าง
Slebetman

2
@slebetman คุณกำลังตีความความคิดเห็นในวงเล็บของฉันอย่างแท้จริง ฉันกำลังพูดถึงโทเค็นลูปที่ไม่มีการจับคู่ ปัญหาที่คล้ายกันบางอย่างในช่องว่างอาจเป็นได้: การส่งคืนโดยไม่มีการโทรก่อนหน้านี้ทำงานได้หรือไม่ (เข้ารหัสเป็น[LF][Tab][LF]) จะเกิดอะไรขึ้นถ้าคุณเปิดสแต็กเปล่า จะเกิดอะไรขึ้นถ้าคุณข้ามไปยังป้ายกำกับที่ไม่ได้กำหนด จะเกิดอะไรขึ้นถ้าคุณกำหนดป้ายกำกับที่ซ้ำกัน
CodesInChaos

7

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

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

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

สถานการณ์อื่นที่เราอาจต้องการให้ทุกสายเป็นโปรแกรมที่ถูกต้องคือเมื่อมีการระบุโปรแกรม สิ่งนี้เกี่ยวข้องกับความน่าเชื่อถือของ CodesInChaos ที่กล่าวถึง แต่เราอาจต้องการใช้งานบนสายอักขระแทนการใช้ Natural Number ด้วยเหตุผลหลายประการ:

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

ในแง่ของภาษาตัวอย่างระบบการคำนวณวิวัฒนาการจำนวนมากใช้ภาษาสแต็กเช่นตระกูลพุช สิ่งเหล่านี้มีแนวโน้มที่จะอนุญาตให้ใช้โทเค็นสตรีมโดยพลการ บางครั้ง (เช่นเดียวกับตัวอย่าง Brainfuck ของ BrainSlugs83) มีข้อ จำกัด ในการปรับสมดุลของวงเล็บ แต่เราสามารถสร้างความสัมพันธ์นี้ในการโปรแกรมด้วยตนเอง delimitingในการที่สตริงเช่น[อาจจะไม่ถูกต้องโปรแกรมแต่มันเป็นที่ถูกต้องคำนำหน้าโปรแกรม ถ้าเราจินตนาการว่าคอมไพเลอร์ / ล่ามอ่านซอร์สโค้ดจาก stdin แล้วมันจะไม่ปฏิเสธสตริงเหมือน[มันก็จะรออินพุตเพิ่มเติมก่อนดำเนินการต่อ

ภาษาเช่น Binary Combinatory Logic และ Binary Lambda แคลคูลัสเกิดขึ้นโดยตรงจากการทำงานในทฤษฎีข้อมูลอัลกอริทึมเช่น จากhttp://tromp.github.io/cl/cl.html

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


2

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

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


0

ในbrainfuck Programming Language , เกือบทุกแสดงออกไบนารีที่เป็นไปได้สามารถตีความได้ว่าโปรแกรม - นั่นคือคุณสามารถใช้โปรแกรมที่ดีอย่างสมบูรณ์พิมพ์พวงขยะลงไปในนั้นและมันจะยังคงสามารถคอมไพล์ / ตีความได้โดยไม่มีปัญหาใด ๆ

( แก้ไข:ปรากฎว่าคุณต้องจับคู่การเปิดและปิดวงเล็บเหลี่ยม แต่ไม่เช่นนั้นข้างต้นจะเป็นจริง)

ทำได้โดยใช้วิธีการสองวิธีต่อไปนี้:

  1. คำสั่งทั้งหมดที่เข้าใจเป็นไบต์เดียว (ใน BF จะเป็นอักขระ ASCII เดียวทั้งหมดเช่น *)

  2. ตัวละครทุกตัวที่มันไม่เข้าใจมันทิ้งไว้เป็นความคิดเห็น

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

*: ปรากฎว่าไม่ใช่คำสั่ง BF ทั้งหมดที่เป็น ASCII ไบต์เดียว - เช่นวงเล็บต้องจับคู่ดังนั้นภาษานั้นไม่ตรงกับเกณฑ์แรกที่มี - แต่ภาษาใดที่มีคุณสมบัติตรงตามเกณฑ์ทั้งสองจะตอบสนองสิ่งที่ OP ขอ


2
ไม่เพียงแค่นี้ไม่ได้ตอบคำถามที่ว่ามันไม่ได้เป็นคอมพิวเตอร์วิทยาศาสตร์คำตอบ
ราฟาเอล

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

1
@ ราฟาเอลคำถามของ OP คือ "มีภาษาการเขียนโปรแกรมหรือไม่ที่มีการรวมกันของสัญลักษณ์ต่างๆ - นั่นคือทุกการแสดงออก - เข้าท่า?" - คำตอบของฉันคือ "ใช่นี่คือตัวอย่างของคนที่เข้ามาใกล้และนี่คือทฤษฎีที่อยู่เบื้องหลัง" - นอกเหนือจากการกำหนดกฎที่แน่นอนสำหรับภาษาหนึ่งคลาสที่จะตอบสนองความต้องการของ OP ฉันไม่แน่ใจว่าจะมีที่ว่างสำหรับวิทยาศาสตร์อีกมากที่นี่ คุณสามารถยกตัวอย่างหรือลิงค์ไปยังแหล่งข้อมูลว่าคุณหวังที่จะเห็นที่นี่หรือไม่? -- ขอขอบคุณ.
BrainSlugs83

2
David และ Gilles ให้คำตอบทางวิทยาศาสตร์คอมพิวเตอร์ พวกเขาสำรวจหลักการและไม่เพียง แต่พูดว่า "ภาษา X ทำอย่างนั้น (เกือบ)" หากคุณอ่านคำตอบของพวกเขาคุณจะได้เรียนรู้ว่าคำตอบของแบบฟอร์มหลังนั้นค่อนข้างน่าเบื่อเช่นกัน นั่นไม่ใช่ความผิดของคุณ แต่ OP ของ - คำถาม (เป็นคำถามวิทยาศาสตร์คอมพิวเตอร์) น่าเบื่อ; มีความเข้าใจผิดเกี่ยวกับความซับซ้อน
ราฟาเอล

หนึ่งได้อย่างง่ายดาย "แก้ไข" BF เพื่อให้สตริงใด ๆ ที่จะได้รับการยอมรับ: คุณเพียงแค่หลอกว่ามีพอ]ตัวละครในตอนท้ายของแหล่งที่มาเพื่อให้ตรงกับทุกตรงกัน[s และเพียงพอที่จุดเริ่มต้นเพื่อให้ตรงกับที่ไม่ตรงกันทั้งหมด[ ]ความหมายของ[และ]สามารถเปลี่ยนแปลงได้อย่างง่ายดายเพื่อให้เทียบเท่ากับสิ่งนี้ (เช่นถ้าไม่มีการจับคู่]แล้ว[เพียงแค่หยุดการดำเนินการถ้าไบต์ที่ชี้ข้อมูลเป็นศูนย์. ]เพียงแค่กระโดดไปเริ่มต้นของโปรแกรมในสถานการณ์ที่คล้ายกัน.) ภาษาที่เกิดจะได้รับการทัวริงสมบูรณ์และจะยอมรับสตริง
นาธาเนียล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.