Откуда взялось соглашение об именовании аргументов командной строки как argv?

18

Кажется, что Python , PHP и Ruby все используют имя «argv» для ссылки на список аргументов командной строки. Откуда происходит название «argv»? Почему не что-то вроде "арги"?

Я предполагаю, что это происходит от C, где v будет означать «вектор». В Википедии есть сноска, которая гласит:

векторный термин в имени этой переменной используется в традиционном смысле для обозначения строк.

Тем не менее, нет никакого источника для этой информации. Действительно, мне любопытно, есть ли у него корни, которые прослеживаются еще дальше. C использовал это, потому что кое-что до этого использовало это?

Марк Хилдрет
источник
2
и я всегда "v" обозначал "ценности"
Уоррен

Ответы:

25

В то время как другие ответы отмечают, что это argvот C, откуда у C появилась идея назвать массив «вектором»?

Непосредственно, это прибыло из BCPL . Хотя это argvотносится к вектору (строковых) аргументов, в BCPL строки хранятся в векторах, но они были строковыми литералами и работают как строки Паскаля. Вектор имел два элемента: длину at literal!0и символы at 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 - Дэнни Пфлугхофт
1
@ Калеб правильный. Во времена BCPL (~ 1967) и APL (~ 1960) большинство программистов получили образование на математических факультетах. В те дни почти не было программ бакалавриата.
Росс Паттерсон
2
@RossPatterson CPL родом из Кембриджа, который с 1953 года получил степень в области компьютерных наук (хотя и был курсом конверсии). Вероятно, это было одно из немногих мест, где не осталось выпускников CS к 1960-м годам.
12

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

Калеб
источник
1
Всегда думал, что argv означает «значения аргументов», рад, что узнал что-то новое :)
Хонза Брабек
2
Право и argc(количество аргументов) было количеством элементов в argv, потому что в C массивы не имеют фиксированных измерений.
Росс Паттерсон
9

В языке Си main()функция может принимать два параметра: argc«число аргументов» и argv«вектор аргументов». В C у вас нет причудливых объектов, таких как векторы, поэтому вы должны передать количество элементов как argc. В отличие от языков, которые вы упомянули, есть такие вещи, как векторы или списки, которые знают свой собственный размер, поэтому в argcэтом нет необходимости. Но имя argvзастряло.

Дима
источник