Звідки взялася умова про іменування аргументів командного рядка як 'argv'?


18

Схоже, що Python , PHP та Ruby всі використовують ім'я "argv" для позначення списку аргументів командного рядка. Звідки походить назва "argv"? Чому б не щось на кшталт "аргументи"?

Я здогадуюсь, що він походить від C, де v позначатиметься "вектор". У Вікіпедії є виноска, яка говорить:

векторний термін у назві цієї змінної використовується в традиційному розумінні для позначення рядків.

Однак для цієї інформації немає жодного джерела. Дійсно, мені цікаво, чи є у нього коріння, які простежуються ще далі. Чи користувався Ц, тому що щось до цього використовував?


2
і я завжди "v" виступав за "цінності"
warren

Відповіді:


25

Хоча інші відповіді зазначають, що argvпоходить від C, звідки у C з'явилася ідея називати масив "вектором"?

Безпосередньо, це прийшло з BCPL . Хоча це argvстосується і вектора (рядкових) аргументів, у BCPL були рядки, збережені у векторах, але вони були рядковими літералами, і вони працювали як рядки Паскаля. Вектор мав два елементи: довжину в literal!0та символи на literal!1. За словами Клайва Пера , рядками маніпулювали, "розпаковуючи" їх у масиви символів, трансформуючи масив, а потім "перепаковуючи" їх у рядки: порівняйте це з C, де рядки є масивами символів.

Так, так, C використовував v для вектора, тому що щось інше робив раніше. Тепер, чи робив щось перед тим, як BCPL використовував вектор таким чином? BCPL саме по собі було спрощенням "Кембриджської [або комбінованої] мови програмування": вона використовується vectorяк синонім для одновимірного масиву і matrixяк синонім для двовимірного масиву. Це узгоджується з позначеннями з математики векторів і матриць, хоча в CPL вони просто зручні мнемоніки і не мають жодних властивостей, пов'язаних з математичними структурами.

Чи можемо ми просуватися далі у часі щодо мов обчислень? Одна потенційна гілка нашої стежки холодна. CPL сильно впливав на Algol 60 (оновлення 1963 р.). Тепер ALGOL 68 мав типи, які були описані як "упаковані вектори", такі як bitsі bytes: але їх не було в більш ранніх випусках Algol, які просто мали ARRAYпосилання на масив. Оскільки BCPL походить з 1966 року, CPL повинен був бути до цього (але після 1963 р.): ALGOL 68 (стандартизований у 1968 та 1973 рр.) Не міг бути прямим впливом.

З іншого боку, Основні характеристики CPL також посилаються на систему LISP Маккарті . Хоча це не використовує вектор для позначення структури даних у самій системі, це S-вирази , M-вирази та L-вирази (L-вирази - це рядки, тому будь-яка асоціація між вектором та рядком зникла), вона робить використання вектора в іншому сенсі , щоб представити «значення числа змінних» , що представляє «стан машини в будь-який час». Таким чином, ми маємо докази для припущення, висловленого в коментарях: використання слова "вектор" для позначення "масив" в обчисленнях походить від застосування аналогічного терміна в математиці.


1
Він також був присутній у B, коли він відбувся між C & BCPL.
Роббі Ді

5
І звідки його взяв BCPL? З математики, в якій "вектор" - це одномірний перелік значень.
Калеб

2
Представлення ряду символів як вектора набагато старше BCPL (див., Наприклад, будь-яку стару книгу з теорії обчислення) . Насправді, поняття, ймовірно, старше самого слова "рядок" (як послідовності символів) .
BlueRaja - Danny Pflughoeft

1
@Caleb правильний. На момент BCPL (~ 1967) та APL (~ 1960) більшість програмістів отримували освіту на кафедрах математики. У ті часи майже не було програм для бакалавратів з КС.
Росс Паттерсон

2
@RossPatterson CPL походить з Кембриджу, який мав ступінь інформатики з 1953 року (хоча і як курс перетворення). Ймовірно, це було одне з небагатьох місць, не бракувало випускників КС до 1960-х.

12

argvпоходить від C, де main()функція приймає argvпараметр, який представляє вектор аргументів для програми. Ви також можете сказати, що він походить від Unix, що майже те саме, що говорити про те, що він походить з C, оскільки більшість розробок Unix відбувалися в C, а Unix і C мають давню спільну історію.


1
Завжди думав, що argv означає "значення аргументу" радий, що я дізнався щось нове :)
Honza Brabec

2
Правильно і argc(кількість аргументів) було число елементів у argv, тому що в C масиви не мають фіксованих розмірів.
Росс Паттерсон

9

У C main()функція може приймати два параметри:, argcщо означає "аргумент кількість", і argv, який означає "вектор аргументу". У C у вас немає фантазійних об'єктів, таких як вектори, тому вам доведеться передати кількість елементів як argc. Навпаки, мови, які ви згадали, мають такі речі, як вектори чи списки, які знають свій розмір, тому argcне потрібні. Але назва argvзастрягла.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.