ทำไมชื่อ $ in identifier สำหรับหลายภาษา


15

ภาษาสคริปต์จำนวนมากเช่น Perl, Awk, Bash, PHP ฯลฯ ใช้เครื่องหมาย $ ก่อนชื่อตัวระบุ ฉันพยายามค้นหาสาเหตุ แต่ไม่เคยมีคำตอบที่น่าพอใจ


10
อาจเป็นเพราะขั้นตอนสุดท้ายในแผนธุรกิจของโปรแกรมเมอร์ส่วนใหญ่ - ... กำไร!
Oded

2
โพสต์ที่น่าสนใจเกี่ยวกับ SO ในคำถามเดียวกัน: ทำไมตัวแปร Perl ต้องเริ่มด้วย $,%, @ (sigils)
แบรดคริสตี้

คำตอบ:


4

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

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

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

การติดตาม$ที่ BASIC บางอันใช้สำหรับตัวแปรสตริง (ซึ่งต่างกับตัวแปรที่เป็นตัวเลข) ก็อาจเป็นแรงบันดาลใจเช่นกัน

ตัวเลือกของ Perl เพื่อใช้$สำหรับตัวแปรสเกลาร์นั้นได้รับแรงบันดาลใจอย่างไม่ต้องสงสัยจากเชลล์เช่น Bourne shell และ Perl รุ่นแรก ๆ ที่นิยมใช้ barewords เป็นตัวอักษรสตริง ( print FOOและprint "FOO"เทียบเท่า) การใช้งานของ barewords นี้ได้รับการคัดค้านในรุ่นที่ทันสมัยมากขึ้นของ Perl แต่ sigils ยังคงอยู่และมีการใช้ส่วนใหญ่จะเห็นความแตกต่างที่แตกต่างกันชนิดของตัวแปร บางทีถ้า Perl ได้รับการออกแบบมาตั้งแต่เริ่มต้นตัวแปรสเกลาร์อาจถูกแทนด้วย "sigil ที่ว่างเปล่า" แต่นั่นก็ไม่ได้เกิดขึ้น

(BTW, Awk ไม่ได้ใช้ sigils มันมี$ไวยากรณ์ แต่มันหมายถึงหมายเลขฟิลด์ NFคือจำนวนของฟิลด์; $NFเป็นฟิลด์สุดท้าย (the NFth))



14

ชื่อตัวแปร $ sign in เป็นกรณีพิเศษของ"Sigil" , ย้อนกลับไปในวันแรก ๆ ของ BASIC (1964 หรือมากกว่านั้น) $ ถูกใช้เพื่อแสดงถึงชื่อตัวแปรสตริง ฉันเดาว่าเนื่องจากทำให้คอมไพเลอร์แยกชื่อตัวแปรจากส่วนที่เหลือของไวยากรณ์ได้ง่ายขึ้นโดยใช้สัญลักษณ์บางตัวและเนื่องจากเป็นเรื่องธรรมดาสำหรับ BASIC การใช้งานจึงมีความก้าวหน้า อย่างไรก็ตามนี่ไม่ใช่สิ่งเดียวที่ใช้


2
$สำหรับสตริง (และ%สำหรับจำนวนเต็ม) ในขั้นพื้นฐานต่อท้ายมากกว่าคำนำหน้าอย่างน้อยใน (ที่ไม่ได้มาตรฐาน) สายพันธุ์ที่ฉันถูกลือกับ ไม่ว่านั่นเป็นเรื่องสำคัญแน่นอน - คำต่อท้ายกับคำนำหน้านั้นค่อนข้างตื้น ๆ อย่างน้อยที่สุดเท่าที่คอมไพเลอร์และการวิเคราะห์คำศัพท์เกี่ยวข้อง อาจมีความแตกต่างเล็กน้อยในแง่ของการอ่าน
Steve314

BTW - เหตุผลหนึ่งที่ทำงานใน Basic คือมีประเภทที่ จำกัด มากและไม่มีประเภทที่ผู้ใช้กำหนดดังนั้นจำเป็นต้องใช้ sigils ในช่วงที่ จำกัด เท่านั้น การใช้ Perl นั้นแตกต่างกัน - แม้ว่ามันจะนานมากแล้วสำหรับฉันดังนั้นฉันจำรายละเอียดไม่ได้จริงๆ
Steve314

@ steve314 คุณถูกต้องแน่นอน A $ = ... ขอบคุณที่สังเกตสิ่งนี้
NoChance

5

awk?

บางครั้งเรียกว่าsigilซึ่งใช้สำหรับการแปลชื่อของตัวแปร (และอื่น ๆ ) เป็นค่า


5

สิ่งนี้ดูเหมือนว่าเกิดขึ้นใน BASIC โดยที่ $ suffix จะระบุตัวแปรสตริงและยังออกเสียงเป็น "string" ตัวอย่างเช่นINKEY $ออกเสียงว่า "in key string"

แต่ทำไมเครื่องหมายดอลลาร์? $ ดูเหมือนบิตสำหรับ S และตามWikipedia :

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

(เหมาะสมสำหรับอีกไม่กี่ดอลลาร์อยู่บนจอแก้วขณะที่ฉันพิมพ์)


2

ทำไมจะไม่ล่ะ? มันง่ายกว่าที่จะเขียน lexer ที่สามารถบอกตัวระบุได้ว่าจะเป็นตัวแปร (และง่ายต่อการเขียน parser) โดยเฉพาะอย่างยิ่งสำหรับภาษาที่ตีความ เป็นไปได้ว่าทำไม$มันเป็นประเพณีส่วนใหญ่ - หนึ่งในผู้สร้างภาษายุคแรกโดยใช้โครงสร้าง (Bash หรือมีแนวโน้มมากกว่าที่บรรพบุรุษของมันใช้) ไม่ว่าด้วยเหตุผลใดและภาษาที่ตามมานำมาใช้


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