Почему именования системных вызовов UNIX / POSIX так неразборчивы?


43

В чем причина использования таких неописуемых имен системных вызовов, как timeи creatвместо getCurrentTimeSecsи, createFileили, возможно, более подходящих для Unix get_current_time_secsи create_file. Что подводит меня к следующему пункту: почему кто-то хочет что-то вроде cfsetospeedбез верблюжьего футляра или, по крайней мере, подчеркивает, чтобы сделать его читабельным? Конечно, в вызовах будет больше символов, но мы все знаем, что читаемость кода важнее, верно?


42
Потому что они были изобретены за несколько десятилетий до того, как венгерская нотация, верблюжья, змеиная и тому подобное стали модными. Кроме того, потому что тогда компиляторы имели очень мало ресурсов, а имена идентификаторов были ограничены (IIRC) 8 символами.
lcd047

3
@phresnel Не уверен, какую связь вы видите между именами файлов и идентификаторами переменных, но да, я колебался между 8, 12 и 14. Возможно, ограничение было также 14 для идентификаторов переменных. Это конечно не было 256+. Что касается обозначений: пожалуйста, определите «всегда». Ли Арминий использовать CamelCase слова? Возможно, нет. AFAIR, венгерская нотация была введена для Windows в начале 1990-х годов. CamelCase и sneak_case были более поздними вариантами. Оба были, конечно, использованы до этого. Я говорю о том, что они стали популярными примерно в середине 1990-х годов.
lcd047

6
@phresnel: обратите внимание, что ваша ссылка говорит об ограничениях первой файловой системы Unix . Когда Томпсон, Ричи и соавт. были проектирования Unix, они должны были самонастройки Unix на машинах , которые не работают Unix еще , т.е. , вероятно , еще более стесненных условиях.
DevSolar

11
Вы могли бы также спросить, почему они не написаны на немецком языке, потому что это - самое близкое приближение естественного языка, о котором я могу думать для слишком длинных чудовищ, которые Java научил программистов принимать ...
R ..

12
Я так счастлив, что это так. Представьте , как ls -la | grepбудет выглядеть так: listAllHiddenAndNormalFiles() | globallySearchARegularExpressionAndPrint().
Пуя

Ответы:


61

Это связано с техническими ограничениями времени. Стандарт POSIX был создан в 1980-х годах и относился к UNIX, который родился в 1970-х годах. Несколько компиляторов C в то время были ограничены идентификаторами длиной 6 или 8 символов, так что они соответствовали стандарту для длины переменной и функции. имена.

Смежные вопросы:


5
Я не думаю, что применяются технические ограничения . У вас могут быть файлы размером более 6 байт, у вас могут быть программы, занимающие тысячи строк кода; деревья абстрактного синтаксиса намного глубже, чем просто шесть уровней, и с гораздо большим количеством узлов на уровень. Просто по причине, ограничение в 6 символов не может быть техническим, а скорее разработанным. И это не объясняет, почему «создавать» лучше, чем «создавать». Кроме того, не могли бы вы назвать несколько компиляторов Си, о которых вы говорите? Ваш ответ действительно звучит как «когда-нибудь слышал».
френел

41
@phresnel: он не говорит о размере файла, количестве строк или глубине синтаксического дерева. Старые версии языка C не требовали, чтобы компиляторы и компоновщики хранили больше, чем первые 31 символ идентификатора с внутренней связью, или более 6 для внешних идентификаторов . Таким образом, get_current_date()и get_current_time()некоторые из этих ранних наборов инструментов не могут быть отличены друг от друга. Причина была в том, что эти системы работали на крошечных отпечатках в несколько килобайт.
DevSolar

34
Но ты прав creat(). Кена Томпсона однажды спросили, что бы он сделал по-другому, если бы он переделывал систему UNIX. Его ответ: «Я произнесу тварь с помощью е».
DevSolar

8
@phresnel: Наличие только ограниченной памяти не является жестким ограничением. Имея только ограниченную гарантированную поддерживаемую длину идентификаторов это . Если вам гарантировано только 6 значимых персонажей, это то, с чем вы работаете, если вы стоите своей соли.
DevSolar

6
FWIW, старые стандарты Fortran ограничены идентифицирует до 6 символов. Из этой книги : «Правило Фортрана шести символов в одном идентификаторе проистекает из того факта, что шесть символов могут быть представлены в одном слове IBM 704». Я не могу говорить за C, но я предполагаю, что ограничение имеет очень похожее происхождение (или, возможно, идентичное происхождение)
tpg2114

26

dr01 прав, но есть и другая причина - удобство использования. Раньше у вас не было такой удобной клавиатуры, чтобы набирать текст. Если вам повезло, у вас было что-то похожее на машинку старой школы. Если вам не повезло, вам приходилось иметь дело с системами, для работы которых требовалась реальная физическая работа (например, для нажатия «клавиши» потребовалось много сил), или вы вручную пробивали отверстия в карточке.

Это означало, что даже в пределах 6-8 символов вы пытались сделать свои команды максимально короткими. Вот почему вы lsвместо list, а creatвместо create. Код из той эпохи полон переменных, как a, xи i- и, конечно, x2и друзей. Печатание было большой работой - сегодня вы меньше listIndexиспытываете необходимость печатать, чем раньше - «печатать» i- и это даже не так уж и медленно (особенно при использовании дополнительных технологий, таких как автозаполнение).

Реальный вопрос - почему так много идиом Unix сохраняется, хотя они больше не желательны?


23
В тот день, когда мое ядро ​​изменится timeна getCurrentTimeSecsили что-то в этом роде, я просто перестану его обновлять. Даже с моей удобной клавиатурой и новейшим оборудованием эти названия остаются чрезвычайно удобными и простыми (простота является одной из основ UNIX). Я действительно не чувствую необходимости переводить такого рода имена в стиле Java / C # на язык C, не говоря уже о ядре Linux. IMO, с точки зрения разработчика ядра или разработчика UNIX в целом, эти идиомы ничем близко не нежелательны .
Джон У. С. Смит,

11
@Benjoyo unRootlyLongNamed.Packaged.nonsensicalFunctionэто некрасиво ко мне, и я предпочел бы быть уверен , что он делает, делая man 2 timeчем гадать, что это , кажется, делает.
Муру

7
@ Benjoyo Ну, любой, кто не привык к этой среде , не должен использовать системные вызовы, так как они специально предназначены для тех, кто это делает . (Стандартные) библиотеки здесь для других. UNIX не следует этим модным «правилам» дизайна , которые сделали бы его понятным на первый взгляд. Те, кто использует его, не заглядывая в какой-либо документ, могут столкнуться с большими трудностями, и мало кто из сообщества UNIX посчитает, что проблему нужно решить.
Джон У. С. Смит

4
@JohnWHS - уверен, что разработчики режима ядра будут знать свою систему и ее документы, но это не является причиной отсутствия кратких и чётких имен.
Бенжойо

7
@JohnWHSmith Как непритязательный разработчик, который когда-либо писал только драйверы ядра и предпочитает значимые имена, которые не полны аббревиатур, я должен не согласиться. Но это нормально, потому что если вы посмотрите, например, на оригинальный исходный код git, вы обнаружите, что по крайней мере один разработчик ядра согласен со мной. Хотя , если вы скажете , что Линус его get_Xили remove_file_from_cache(я бы предложить rmfc?) Нежелательны для разработчиков ядра, пожалуйста , сделайте это публично - я люблю , чтобы увидеть его реакцию.
Во

22

В дополнение к другим ответам я хотел бы отметить, что Unix был разработан как реакция на Multics, CTSS и другие современные операционные системы, которые были значительно более многословны в своих соглашениях об именах. Вы можете ознакомиться с этими операционными системами по адресу http://www.multicians.org/devdoc.html . Например, http://www.multicians.org/mspm-bx-1-00.html дает change_nameкоманду для переименования файла; сравнить Unix mv.

Кроме того , основная причина , почему имена очень короткий системного вызова сохраняются является обратная совместимость. Вы заметите, что более новые API имеют тенденцию быть более явными; например, gettimeofdayа clock_gettimeне просто time.

(Даже сегодня использование whateverIndexв iкачестве индекса цикла вместо индекса автоматической проверки кода в моей книге ;-)


2
Да. Забавно слышать технологический аргумент об аппаратных возможностях, когда LISP Machines предшествовали UNIX. Конечно, машины UNIX были дешевле купить , но это все. Добавление затрат на обслуживание (которые, конечно, не учитываются на земле * nix) перевернуло таблицы даже тогда, но в любом случае это не было достаточно убедительным аргументом. (И да, iэто хорошо для индекса, когда вы, скажем, итерируете массив. Координаты? Использовать xи y. Обращаться к некоторому порядковому
номеру

Машины @Luaan LISP НЕ предшествуют Unix. Ты облажался.
pizdelect

@pizdelect Это технически верно, но техническая правда не является достаточной причиной, чтобы бросаться в глаза.
Звол

@pizdelect Извините, я имел в виду Lisp, предшествующий UNIX (и C). Но машины LISP были по сути современными, если сравнивать их коммерческое влияние (UNIX имел преимущество около трех лет, но к тому времени, когда появились машины LISP, коммерческих машин UNIX было еще немного, и большая часть UNIX была в академических кругах или без поддержки). В любом случае, это ответ на общепринятые технологические аргументы того времени, когда 80-е годы люди фактически выбирали между машинами UNIX и LISPM, и они ошибались. Это изменилось с микрокомпьютерами, которые в любом случае могли запускать LISP быстрее.
Луан

10

Деннис Ритчи ограничил себя тем, что C не будет полагаться на какие-либо функции компоновщика, которые также не требуются Фортрану. Отсюда ограничение в 6 символов для внешних имен.


@ downvoter Вы можете не согласиться с Денни Ричи по этому поводу, но именно это он и сделал. Извлекать его из этого ответа бесполезно.
user207421
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.