Разумной аналогией было бы обучение вождению.
Существуют правила, протоколы, которым необходимо следовать, и стандарты качества и надежности как для автомобиля, так и для водителя.
- У машин есть руль.
- У кого-то механическая коробка передач, у кого-то автомат.
- Вы (в большинстве стран) едете по правой стороне дороги.
- Знаки дают инструкции о том, как двигаться по той или иной дороге.
- Единицы измерения (в основном) в км/ч.
- Топливо, используемое в автомобиле, имеет определенную смесь и стандарт.
- Водители проходят обучение и должны следовать определенному стандарту вождения.
Теперь вы можете предположить (хотя я не настолько культурен и позволяю себе поэтическую вольность), что европейские дороги «соответствуют стандартам» друг друга, так что если вы научитесь водить машину в Испании, вы потенциально сможете ездить где угодно в Европе, потенциально с той же машиной или, по крайней мере, с другой машиной, где все придатки и палки находятся в том месте, где вы могли бы их ожидать.
Вы могли бы, например, изобрести совершенно новый способ вождения, возможно, с совершенно другими знаками, когда вы едете по обеим сторонам дороги, используете джойстик для вождения и измеряете расстояние в локтях в час, однако, переходя на эту систему из тот, к которому вы привыкли, требует гораздо больше усилий.
POSIX как бы соответствует аналогичной модели, но вместо автомобилей, дорог, скоростей и пунктов назначения он относится к входам, обмену сообщениями, программам, выходам и функциям.
Как правило, лучше всего (как программисту и пользователю) иметь определенные правила, управляющие свойствами/функциями и входными/выходными данными, доступными для вас, чтобы вы, возможно, могли написать программу, которая соответствует этим стандартам, а затем без особых усилий перестроить ту же программу для работы на ней. другая система, которая также использует те же входы/выходы.
Например, системные вызовы Linux читать и записывать являются posix-совместимыми. Они принимают определенные входные данные в определенном порядке и возвращают определенные выходные данные с правилами, определяющими, какие выходные данные могут быть или представляться в определенных обстоятельствах.
Вы можете написать программу в Linux, которая открывает два файла, использует читать
и записывать
для передачи данных между ними и снова их закрывает. Затем, возможно, перестройте его для работы на Mac без необходимости переписывать базовый исходный код.
Однако вы также можете выполнить точно такую же операцию — намного быстрее — открыв два файла с помощью послать файл
системный вызов для перемещения данных между ними и повторного закрытия (если только вы не используете очень-очень старые ядра). Беда здесь в том, что послать файл
системный вызов не является Совместимость с POSIX - вы не можете гарантировать, что такой системный вызов правильно существует в системе, чтобы делать то, что вы хотите.
На самом деле, если вы заглянете на справочную страницу Mac для послать файл
call, хотя это и называется той же операцией, она принимает другой набор параметров и предлагает другие функции (также технически вы не можете использовать ее для копирования из одного файла на диске в другой на диске).
Следовательно, вы не сможете запустить программу с помощью Linux. послать файл
предсказуемо в системе, по крайней мере, без изменения программы или использования какого-либо другого уровня совместимости.
Вот почему люди заботятся о POSIX. Это позволяет не изобретать велосипед и потенциально позволяет вам перейти на более совершенную, «совместимую с posix» операционную систему или, по крайней мере, сосредоточиться на доставке вашего продукта, а не беспокоиться о качестве материалов, используемых для создания фундамента.
Я пропустил большую часть вопросов о том, когда POSIX на самом деле не полностью и полностью соблюдается даже теми, кто утверждает, что их система совместима с POSIX, но это суть концепции.
И последний момент, который я хотел бы прояснить. Если вы кодируете в соответствии с наименьшим общим знаменателем стандарта (например, POSIX), вы упустите большой прирост производительности, который в противном случае вы могли бы использовать, используя нестандартные расширения в операционной системе, для которой вы кодируете.
Таким образом, это также выбор дизайна, если вы стремитесь к высокой производительности/высокой пропускной способности, чтобы добиться того, что вы не можете кодировать для соответствия POSIX.
Хотя, наняв программиста, который знает, как программировать «позиксально» (знает, как открытым
, читать
, записывать
пнить
и близко
работает в POSIX) будет гораздо проще, чем нанять кого-то, кто программирует только по какому-то странному неиспользуемому стандарту.
Так что дело не только в производительности (автомобили), но и в адаптационном потенциале (их умение управлять автомобилем).