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

ช่องว่างเป็นภาษาการเขียนโปรแกรมเฉพาะ ที่มีไวยากรณ์ที่อักขระช่องว่าง ( ช่องว่างแท็บและขึ้นบรรทัดใหม่ ) เท่านั้นที่มีความหมาย ซึ่งแตกต่างจากภาษาทั่วไปที่ส่วนใหญ่ไม่สนใจอักขระช่องว่าง[ 1 ] [ 2 ]
เนื่องจากไวยากรณ์ของมันโค้ดต้นฉบับที่ มีช่องว่าง สามารถบรรจุอยู่ภายในช่องว่างของโค้ดที่เขียนในภาษาที่ไม่สนใจช่องว่าง ทำให้ข้อความนั้นเป็นภาษาหลายภาษา[ 2 ]
Whitespace เป็น ภาษา เชิงคำสั่งที่ใช้โครงสร้างข้อมูลแบบสแต็กโปรแกรมเมอร์สามารถผลักค่าจำนวนเต็มที่ มีความกว้างตามต้องการลงบน สแต็กและเข้าถึงฮีปเพื่อจัดเก็บข้อมูลได้
ผู้สร้าง Whitespace ได้จัด เตรียมตัวแปลภาษาพร้อมด้วยซอร์สโค้ดภาษา Haskell ไว้ให้ด้วย
ประวัติศาสตร์
Edwin Brady และ Chris Morris ซึ่งเป็นผู้พัฒนาภาษา Kaya และIdrisได้สร้าง Whitespace ขึ้นในปี 2002 ที่มหาวิทยาลัย Durham Slashdot ได้เผยแพร่บทวิจารณ์ในวัน April Fool's Dayปี 2003 [ 3 ]
แนวคิดในการใช้อักขระเว้นวรรคเป็นตัวดำเนินการสำหรับ ภาษา C++ได้รับการเสนอแนะอย่างขบขันเมื่อ 5 ปีก่อนหน้านี้โดยBjarne Stroustrup [ 4 ]
ไวยากรณ์
คำสั่ง Whitespace กำหนดคำสั่งเป็นลำดับของอักขระเว้นวรรค ตัวอย่างเช่น คำสั่งนี้[Tab][Space][Space][Space]จะทำการบวกเลขระหว่างสององค์ประกอบบนสุดของสแต็ก
คำสั่งจะถูกเขียนเป็นพารามิเตอร์การแก้ไขคำสั่ง (IMP) ตามด้วยการดำเนินการและพารามิเตอร์ใดๆ [ 1 ]
ลำดับ IMP ประกอบด้วย:
| อิมพีแดนซ์ | ความหมาย |
|---|---|
| [ช่องว่าง] | การจัดการสแต็ก |
| [แท็บ][เว้นวรรค] | เลขคณิต |
| [แท็บ][แท็บ] | การเข้าถึงฮีป |
| [ขึ้นบรรทัดใหม่] | การควบคุมการไหล |
| [แท็บ][ขึ้นบรรทัดใหม่] | อินพุต/เอาต์พุต |
ลำดับการดำเนินการที่จัดเรียงตาม IMP ประกอบด้วย: [ 1 ]
| อิมพีแดนซ์ | ผู้ปฏิบัติงาน | พารามิเตอร์ | ความหมาย | ขนาดขั้นต่ำของกองที่ต้องการ* |
|---|---|---|---|---|
| [ช่องว่าง] | [ช่องว่าง] | ตัวเลข | ดันตัวเลขลงบนกอง | 0 |
| [ช่องว่าง] | [LF][Space] | - | คัดลอกรายการบนสุดในกอง | 1 |
| [ช่องว่าง] | [แท็บ][เว้นวรรค] | หมายเลขn | คัดลอกรายการที่ n บนสแต็ก (ที่กำหนดโดยอาร์กิวเมนต์) ไปไว้ด้านบนสุดของสแต็ก** | n +1 |
| [ช่องว่าง] | [LF][แท็บ] | - | สลับตำแหน่งของสิ่งของสองชิ้นบนสุดในกอง | 2 |
| [ช่องว่าง] | [LF][LF] | - | ทิ้งสิ่งของชิ้นบนสุดในกอง | 1 |
| [ช่องว่าง] | [แท็บ][LF] | หมายเลขn | เลื่อนสิ่งของ n ชิ้นออกจากกอง โดยเก็บสิ่งของชิ้นบนสุดไว้** | อาจน้อยกว่าn + 1 แต่ต้องมีอย่างน้อย 1 รายการ (อยู่บนสุดของกอง) |
| [แท็บ][เว้นวรรค] | [พื้นที่][พื้นที่] | - | ส่วนที่เพิ่มเข้าไป | 2 |
| [แท็บ][เว้นวรรค] | [เว้นวรรค][แท็บ] | - | การลบ | 2 |
| [แท็บ][เว้นวรรค] | [Space][LF] | - | การคูณ | 2 |
| [แท็บ][เว้นวรรค] | [แท็บ][เว้นวรรค] | - | การหารจำนวนเต็ม | 2 (ค่าสูงสุดอาจไม่ใช่ 0) |
| [แท็บ][เว้นวรรค] | [แท็บ][แท็บ] | - | โมดูลัส | 2 (ค่าสูงสุดอาจไม่ใช่ 0) |
| [แท็บ][แท็บ] | [ช่องว่าง] | - | จัดเก็บเป็นกอง | 2 |
| [แท็บ][แท็บ] | [แท็บ] | - | ดึงข้อมูลจากกองข้อมูล | 1 |
| [LF] | [พื้นที่][พื้นที่] | ฉลาก | ทำเครื่องหมายตำแหน่งในโปรแกรม | 0 |
| [LF] | [เว้นวรรค][แท็บ] | ฉลาก | เรียกใช้ซับรูทีน | 0 |
| [LF] | [Space][LF] | ฉลาก | ข้ามไปยังป้ายกำกับ | 0 |
| [LF] | [แท็บ][เว้นวรรค] | ฉลาก | กระโดดไปยังป้ายกำกับหากด้านบนสุดของสแต็กเป็นศูนย์ | 1 |
| [LF] | [แท็บ][แท็บ] | ฉลาก | กระโดดไปยังป้ายกำกับหากด้านบนสุดของสแต็กเป็นค่าลบ | 1 |
| [LF] | [แท็บ][LF] | - | สิ้นสุดซับรูทีนและส่งการควบคุมกลับไปยังผู้เรียก | 0 (callstack: 1) |
| [LF] | [LF][LF] | - | ยุติโปรแกรม | 0 |
| [แท็บ][LF] | [พื้นที่][พื้นที่] | - | แสดงอักขระที่อยู่บนสุดของสแต็ก | 1 |
| [แท็บ][LF] | [เว้นวรรค][แท็บ] | - | แสดงตัวเลขที่อยู่บนสุดของสแต็ก | 1 |
| [แท็บ][LF] | [แท็บ][เว้นวรรค] | - | อ่านอักขระหนึ่งตัวแล้ววางไว้ในตำแหน่งที่กำหนดโดยส่วนบนสุดของกองอักขระ | 1 |
| [แท็บ][LF] | [แท็บ][แท็บ] | - | อ่านตัวเลขแล้ววางไว้ในตำแหน่งที่กำหนดโดยด้านบนสุดของกองตัวเลข | 1 |
*เนื่องจาก Haskell ใช้การประเมินแบบเลซี่ (lazily evaluated) ผลกระทบของสแต็กที่เล็กเกินไปอาจปรากฏให้เห็นเฉพาะเมื่อเรียกใช้ฟังก์ชันแสดงผล ตัวเลข เท่านั้น
** มีการเพิ่ม การคัดลอกและ การ เลื่อนใน Whitespace 0.3 [ 1 ]
ความคิดเห็น
อักขระอื่นๆ นอกเหนือจากspace, tabและlinefeedจะถูกละเว้น และสามารถนำไปใช้สำหรับแสดงความคิดเห็นได้
ตัวเลข
ค่าตัวเลขจะถูกแทนด้วยลำดับของ ตัวอักษร 0 spaceและtab1 โดยตัวอักษร 0 แทน 0 และ 1 ตามลำดับ และปิดท้ายด้วยlinefeedเครื่องหมาย 0 ตัวอักษรตัวแรกแทนเครื่องหมายของค่า – space0 สำหรับค่าบวก และ 1 tabสำหรับค่าลบ ตัวอักษรที่อยู่ก่อนเครื่องหมายปิดท้ายแทนตัวเลขฐานสองของค่านั้น
ตัวอย่างเช่น:
- [space][tab][space][space][tab][space][tab][linefeed] (STSSTSTTL) เป็นค่าบวก เนื่องจากเริ่มต้นด้วย
spaceและแทนค่า 1001011 ในเลขฐานสอง ซึ่งเท่ากับ 75 ในเลขฐานสิบ - [tab][tab][tab][space][space][tab][space][linefeed] (TTTSSTSL) เป็นค่าลบ เนื่องจากขึ้นต้นด้วย
tabและแทนค่า -110010 ในเลขฐานสอง ซึ่งเท่ากับ -50 ในเลขฐานสิบ
ป้ายกำกับ
ป้ายกำกับใช้สำหรับควบคุมการไหล เป็น ลำดับlinefeedของอักขระที่ลงท้ายด้วย - spaceและtabเนื่องจากมีเนมสเปซเพียงแห่งเดียว ป้ายกำกับทั้งหมดจึงต้องไม่ซ้ำกัน [ 1 ]
ตัวอย่างโค้ด
โค้ดต้นฉบับต่อไปนี้เป็น โปรแกรม "Hello, world!" ที่ใช้ช่องว่างเป็นตัวคั่น เพื่อความชัดเจน จึงมีการใส่คำอธิบายประกอบด้วยS, TและLก่อนแต่ละ space, tab, linefeedและ
S S S T S S T S S S L:Push_+1001000=72='H'_onto_the_stack ทีแอล S S :Output_'H';_S S S T T S S T S T L:Push_+1100101=101='e'_onto_the_stack ทีแอล S S :Output_'e';_S S S T T S T T S S L :+1101100=108='l' ทีแอล S S S S S T T S T T S S L :+1101100=108='l' ทีแอล S S S S S T T S T T T T L :+1101111=111='o' ทีแอล S S S S S T S T T S S L :+101100=44=',' ทีแอล S S S S S T S S S S S L:+100000=32=Space ทีแอล S S S S S T T T S T T T L :+1110111=119='w' ทีแอล S S S S S T T S T T T T L :+1101111=111='o' ทีแอล S S S S S T T T S S T S L :+1110010=114='r' ทีแอล S S S S S T T S T T S S L :+1101100=108='l' ทีแอล S S S S S T T S S T S S L =+1100100=100='d' ทีแอล S S S S S T S S S S T L :+100001=33='!' ทีแอล S S :เอาต์พุต_'!';_L แอล L: จบโปรแกรม
เมื่อแสดงผลโค้ดต้นฉบับที่มีช่องว่างในบางเบราว์เซอร์ ระยะห่างแนวนอนที่เกิดจากอักขระแท็บจะไม่คงที่ แต่ขึ้นอยู่กับตำแหน่งของอักขระแท็บในข้อความเมื่อเทียบกับจุดหยุดแท็บแนวนอน ถัดไป และขึ้นอยู่กับซอฟต์แวร์ อักขระแท็บอาจถูกแทนที่ด้วยอักขระเว้นวรรคจำนวนแปรผันที่สอดคล้องกันได้เช่นกัน
ลิงก์ภายนอก
- เว็บไซต์อย่างเป็นทางการ
- ประกาศวางจำหน่ายบน Slashdot
- คลังข้อมูล Whitespace:ชุดของตัวแปลภาษา ตัวคอมไพเลอร์ และโปรแกรมสำหรับ Whitespace
- ชุดเครื่องมือแปลช่องว่างในภาษาเขียนต่างๆ
- คอมไพเลอร์ Whitespace.NET - ตัวคอมไพล์โปรแกรม Whitespace ให้เป็นไบต์โค้ด .NET
- Acme::BleachโมดูลPerlที่เขียนทับส่วนเนื้อหาของโมดูลของคุณให้เป็นการเข้ารหัสเฉพาะช่องว่าง ("เพื่อ โปรแกรมที่สะอาดตา อย่างแท้จริง ")
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ ช่องว่าง (ภาษาโปรแกรม)
ช่องว่างเป็นภาษาการเขียนโปรแกรมเฉพาะ ที่มีไวยากรณ์ที่อักขระช่องว่าง ( ช่องว่างแท็บและขึ้นบรรทัดใหม่ ) เท่านั้นที่มีความหมาย ซึ่งแตกต่างจากภาษาทั่วไปที่ส่วนใหญ่ไม่สนใจอักขระช่องว่าง
ประวัติศาสตร์
Edwin Brady และ Chris Morris ซึ่งเป็นผู้พัฒนาภาษา Kaya และ Idris ได้สร้าง Whitespace ขึ้นในปี 2002 ที่ มหาวิทยาลัย Durham Slashdot ได้ เผยแพร่บทวิจารณ์ใน วัน April Fool's Day ปี 2003 [ 3 ]
ไวยากรณ์
คำสั่ง Whitespace กำหนดคำสั่งเป็นลำดับของอักขระเว้นวรรค ตัวอย่างเช่น คำสั่งนี้ [Tab][Space][Space][Space] จะทำการบวกเลขระหว่างสององค์ประกอบบนสุดของสแต็ก
ความคิดเห็น
อักขระอื่นๆ นอกเหนือจาก space , tab และ linefeed จะถูกละเว้น และสามารถนำไปใช้สำหรับแสดงความคิดเห็นได้