แบบแผนของการตั้งชื่ออาร์กิวเมนต์บรรทัดคำสั่งเป็น 'argv' มาจากไหน


18

ดูเหมือนว่าPython , PHPและRubyทั้งหมดใช้ชื่อ "argv" เพื่ออ้างถึงรายการอาร์กิวเมนต์บรรทัดคำสั่ง ชื่อ "argv" มาจากไหน ทำไมไม่เหมือน "args" ล่ะ?

ฉันเดาว่ามันมาจาก C ซึ่ง v จะยืนสำหรับ "เวกเตอร์" Wikipedia มีเชิงอรรถที่ระบุว่า:

คำเวกเตอร์ในชื่อของตัวแปรนี้ใช้ในความหมายดั้งเดิมเพื่ออ้างถึงสตริง

อย่างไรก็ตามไม่มีแหล่งข้อมูลสำหรับข้อมูลนี้ จริง ๆ ฉันอยากรู้ว่ามันมีรากที่ติดตามแม้กระทั่งไกลออกไป C ใช้เพราะบางสิ่งก่อนหน้านั้นใช้หรือไม่


2
และฉันมักจะ "v" หมายถึง "ค่า"
วอร์เรน

คำตอบ:


25

ในขณะที่คำตอบอื่น ๆ ทราบว่าargvมาจาก C, C ได้ความคิดที่จะเรียกว่า "เวกเตอร์" อาร์เรย์?

โดยตรงมาจาก BCPL แม้ว่าจะargvอ้างถึงเวกเตอร์ของอาร์กิวเมนต์ (สตริง) BCPL มีสตริงที่เก็บไว้ในเวกเตอร์ แต่พวกเขาเป็นตัวอักษรสตริงและพวกเขาทำงานเหมือนสตริงปาสกาล เวกเตอร์มีสององค์ประกอบ: ความยาวที่และตัวละครที่literal!0 literal!1อ้างอิงจากสไคลฟ์เฟธ มีการจัดการสตริงโดย "เปิดออก" เป็นอาเรย์อักขระเปลี่ยนอาเรย์จากนั้น "บรรจุใหม่" ลงในสตริง: เปรียบเทียบกับ C โดยที่สตริงเป็นอาร์เรย์อักขระ

ใช่แล้ว C ใช้ v สำหรับเวกเตอร์เพราะมีบางอย่างเกิดขึ้นมาก่อน ตอนนี้มีอะไรเกิดขึ้นก่อนที่ BCPL จะใช้เวกเตอร์ด้วยวิธีนี้? BCPL นั้นย่อมาจากภาษาโปรแกรมเคมบริดจ์ "หรือ [รวม]": สิ่งนี้ใช้vectorเป็นคำพ้องความหมายสำหรับอาร์เรย์ 1 มิติและmatrixเป็นคำพ้องสำหรับอาร์เรย์ 2 มิติ สิ่งนี้สอดคล้องกับสัญกรณ์ในคณิตศาสตร์ของเวกเตอร์และเมทริกซ์ถึงแม้ว่าใน CPL มันเป็นเพียงตัวช่วยจำที่มีประโยชน์และไม่มีคุณสมบัติใด ๆ ที่เกี่ยวข้องกับโครงสร้างทางคณิตศาสตร์

เราสามารถย้อนเวลากลับไปเกี่ยวกับภาษาคอมพิวเตอร์ได้หรือไม่ สาขาหนึ่งที่มีศักยภาพของเส้นทางของเราจะเย็น CPL ได้รับอิทธิพลอย่างมากจาก Algol 60 (การอัพเดตปี 1963) ตอนนี้ ALGOL 68 มีประเภทที่ถูกอธิบายว่าเป็น "เวกเตอร์ที่อัดแน่น" เช่นbitsและbytes: แต่สิ่งเหล่านี้ไม่ได้อยู่ในรุ่นก่อนหน้าของ Algol ซึ่งเพิ่งจะARRAYอ้างถึงอาร์เรย์ ในฐานะที่เป็น BCPL มาจากปี 1966 CPL ต้องมาก่อน (แต่หลังจากปี 1963): ALGOL 68 (มาตรฐานในปี 1968 และ 1973) ไม่สามารถมีอิทธิพลโดยตรง

บนมืออื่น ๆ , คุณสมบัติหลักของ CPLยังทำให้การอ้างอิงถึงระบบเสียงกระเพื่อมของแมคคาร์ แม้ว่าสิ่งนี้จะไม่ใช้เวกเตอร์เพื่ออ้างถึงโครงสร้างข้อมูลในระบบ แต่เป็นS-expressions , M-expressionsและL-expressions (L-expressions นั้นเป็นสตริงดังนั้นความสัมพันธ์ระหว่างเวกเตอร์และสตริงจึงหายไป) จะใช้เวกเตอร์ในแง่อื่นเพื่อแสดง "ค่าของตัวแปรจำนวนหนึ่ง" แทน "สถานะของเครื่องได้ตลอดเวลา" ดังนั้นเราจึงมีหลักฐานสำหรับการสันนิษฐานในความคิดเห็น: การใช้คำว่า 'เวกเตอร์' เพื่อหมายถึง 'อาร์เรย์' ในการคำนวณมาจากการใช้คำที่คล้ายกันในคณิตศาสตร์


1
มันมีอยู่ใน B ด้วยเช่นกันระหว่าง C & BCPL
Robbie Dee

5
และ BCPL ได้รับมาจากที่ใด จากคณิตศาสตร์ซึ่ง "เวกเตอร์" เป็นรายการค่าหนึ่งมิติ
แม็กเคเล็บ

2
เป็นตัวแทนของสายอักขระเวกเตอร์เป็นวิธีเก่ากว่า BCPL (ดูตัวอย่างเช่นหนังสือเก่า ๆ ในทฤษฎีของการคำนวณ) ในความเป็นจริงแนวคิดอาจเก่ากว่าคำว่า "สตริง" (เป็นลำดับของตัวละคร)ตัวเอง ..
BlueRaja - Danny Pflughoeft

1
@Caleb ถูกต้อง ในช่วงเวลาของ BCPL (~ 1967) และ APL (~ 1960) โปรแกรมเมอร์ส่วนใหญ่ได้รับการศึกษาในแผนกคณิตศาสตร์ ในสมัยนั้นแทบจะไม่มีหลักสูตร CS ระดับปริญญาตรี
Ross Patterson

2
@RossPatterson CPL มาจาก Cambridge ซึ่งมีปริญญาวิทยาศาสตร์คอมพิวเตอร์มาตั้งแต่ปี 1953 (แม้ว่าจะเป็นหลักสูตรการแปลง) เป็นไปได้ว่าจะเป็นหนึ่งในไม่กี่แห่งที่ไม่ได้สำเร็จการศึกษาจาก CS ในปี 1960

12

argvมาจาก C ซึ่งmain()ฟังก์ชันใช้argvพารามิเตอร์ที่แทนเวกเตอร์ของการขัดแย้งกับโปรแกรม คุณอาจบอกได้ว่ามันมาจาก Unix ซึ่งเกือบจะเหมือนกับที่บอกว่ามาจาก C เนื่องจากการพัฒนา Unix ส่วนใหญ่เกิดขึ้นใน C และ Unix และ C มีประวัติที่ใช้ร่วมกันมานาน


1
มักจะคิดว่า argv หมายถึง "ค่าอาร์กิวเมนต์" ดีใจที่ผมได้เรียนรู้สิ่งใหม่ ๆ :)
Honza Brabec

2
ด้านขวาและargc(จำนวนอาร์กิวเมนต์) คือจำนวนรายการในargvเพราะใน C อาร์เรย์ไม่ได้มีมิติคงที่
Ross Patterson

9

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

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