Парадигма Windows и парадигма UNIX

На портале easyelectronics.ru некто MikeSmith поднял интересный вопрос. У Михаила возникла проблема при компиляции проекта.

В двух словах, Махаил работает в Виндовсе, компилирует проект GNU-компилятором. Поскольку проект оказался большим, то команда (в командной строке) для компилятора оказалась очень длинной — длиннее, чем допускает Виндовая среда. Компиляция завершилась неудачей.

Особенно мне понравилось вот это место:

Причём любопытно, что выпадает только каждый 8192-й символ, а вся остальная строка передаётся правильно. Ну а верхний лимит командной строки — 32768 байт (проверено), сверх этого передать ничего уже не получится.

http://we.easyelectronics.ru/Soft/problema-2000h-ili-kak-sobrat-gcc-arm-embedded-linkerom-bolshoy-proekt.html

Проблемы возникают когда смешивают разные парадигмы. Затронутая Михаилом тема — пример такой проблемы.

Парадигма UNIX/Linux основана на том, что взаимодействие пользователя и программ осуществляется посредством «телетайпа». А парадигма Windows — на визуальном интерфейсе.

Что такое «телетайп»? Телетайп — это текстовый экран и клавиатура. И более ничего другого!  Другие названия телетайпа — терминал, консоль. (Для нас пока их отличия друг от друга не важны!)
Причем, парадигма UNIX рассматривает телетайп и сам компьютер как два независимых (отдельных) устройства. Комп обычно называют «хостом». Согласно этому положению, телетайп может находится в любом месте. Примеры:

* на том же компе (ноутбук, настольный комп)
* на соседнем столе, в соседней комнате (локальная сеть, сервер + клиент)
* в другом городе, в другой стране
* в космосе (космическая станция), в атмосфере (дрон)

Ну и так далее. Важно понять, что хост находится в одном месте, а пульт управления — в другом. Между хостом и пультом управления имеется канал связи.

Следует заметить, что поскольку UNIX/Linux — это есть многозадачные многопользовательские ОС-и, то они допускают одновременное подключение к хосту сразу нескольких терминалов (пользователей).

Так вот, поскольку терминал — это текстовый экран и клавиатура, то это положение накладывает серьезное ограничение на способы взаимодействия пользователя и программы. Здесь нельзя, как Виндовсе указать мышкой или получить графическую картинку. Здесь допустимо только текстовое взаимодействие. Другими словами, интерфейс — ТЕКСТОВЫЙ. В связи с этим в UNIX развиты текстовые методы взаимодействия пользователя и программ.

Жизнь день ото дня становится всё сложнее и сложнее. И даже в сложном мире жить как-то надо. Поэтому в мире UNIX нет ничего удивительного в том, что посредством командной строки в программу приходится передавать много-килобайтные данные. Как-то давно я что-то компилировал, и я хорошо помню, что команда на компиляцию занимала целых два экрана! Да, тогда я удивлялся и негодовал — как такое вообще имеет право жить! Но прошло несколько лет, и я понял, что мои представления о «правильности» мирового устройства основаны на парадигме Виндовса. А UNIX — это совершенно другой мир.

Проблемы стали появляться, когда начали натягивать технологии из мира UNIX на парадигму Виндовс. Ну, совмещать несовместимое можно до поры-до времени, пока оно незначительно. Но потом начинаются проблемы, на подобие этой.

Скажу еще пару слов о парадигме Виндовс.

UNIX писался программистами для программистов, прежде всего как инструмент для работы. Предполагалось, что использовать UNIX будут люди с достаточно высокой квалификацией. Этот факт (наряду с еще неразвитыми техническими возможностями и мощностью компов) повлиял на парадигму взаимодействия пользователя и программ.

Windows, в отличие от UNIX, изначально разрабатывалась как КОММЕРЧЕСКАЯ Операционная система, назначение которой — продаваться на рынке, принося владельце бабло. Поэтому Виндовс разрабатывалась в прицеле не на специалистов (готовых изучать «компьютерную» науку), а на необученных широких народных масс, которым любое упоминание об учёбе наводит на тоску. Учиться мало-кто любит и хочет. И чтобы продажи операционки не встали колом, пользователь не должен испытывать негатив от её освоения. Всё должно быть просто и понятно, как велосипед — сел и поехал!

Понимание этого положения привело к пониманию того, что нужно делать. Нужно на экран вывести варианты и предоставить пользователю ткнуть пальцем и выбрать один из них. Учить, запоминать ничего не надо! Нужно только овладеть умением пользоваться мышкой. В пределе — даже не надо уметь читать — цветные картинки рулят!

Так вот, согласно парадигме Виндовс взаимодействие пользователя и программы должно происходить посредством выбора того, что отображено на экране — радиокнопки, чек-боксы, списки, менюшечки и так далее. Когда это всё графическое хозяйство будет настроено нужно нажать единственную кнопку «ОК» («Выполнить», «Откомпилировать», «Сделать мне приятно» …)

Причем, заданные таким образом параметры уже находятся во власти программы. То есть на самом деле, если их перевести в текстовый эквивалент, их объем может быть очень большой. Мне сложно назвать какую-то цифру. Ну, предположим, — несколько мегабайт! И это не проблема!

Непроблема потому, что мы осуществляем взаимодействие (пользователь и программа) в своей родной среде. Если в Винде работать по-Виндовому, а в Линуксе — по Линуксовому, то проблем вообще не возникает! Проблемы возникают когда одну технологию напяливают на другую.

И в самом деле, когда в среде UNIX/Linux мы пытаемся что-то откомпилировать и набираем в консоли длинную команду, то компилятор (программа) еще не работает! Мы только-только готовим задание для работы. Поэтому среда должна нам обеспечить очень большие возможности для указания очень большого числа параметров. Но противоречия здесь нет! Это и есть парадигма UNIX.

Когда в Виндовой программе мы указываем очень большое количество параметров, то программа уже работает. Виндовая среда в этом взаимодействии не участвует. Поэтому всё взаимодействие (пользователя и программы) протекает внутри программы и под её контролем. Это парадигма Виндовс. И противоречия здесь так же нет!

Всё вроде бы хорошо, если оставаться в рамках выбранной технологии, то можно очень даже комфортно жить.

Однако, мир стал интернет-ориентированным. Это наложило отпечаток на технологии. Технологии UNIX изначально подразумевали, что хост и терминал — это два устройства, связанные между собой какими-то линиями связи. А вот Виндовс — это персональный компьютер, у которого процессорный блок, клавиатура и дисплей — это единое целое. И нельзя одно от другого дистанцировать.

Поэтому, UNIX/Linux легко допускает удаленное взаимодействие (пользователя и программ), а Виндовс — с определенными трудностями. Удаленное управление в UNIX/Linux находится под контролем самой операционной системы. Поэтому ЛЮБЫЕ (неграфические) программы в Линуксе уже сразу готовы к сетевым операциям.

К стати сказать, что в Линуксе многие графические программы — это оболочки для консольных (текстовых ) программ. То есть у вас есть некая текстовая программа, например тот же GCC, вы пишите (на Pytnon или Java) к нему графическую оболочку, где присутствуют те же графические элементы управления (кнопочки-пимпочки, рюшечки-менюшечки) и кнопка «ОК». При нажатии этой кнопки ваша программа создает текстовую строку на основе данных из этих органов управления и запускает процесс GCC. После чего, получает сообщения от GCC и выводи их в нужные текст-боксы.

Иначе говоря, есть программа, которая отвечает за функциональность (это сам GCC) и есть программа, которая отвечает за взаимодействие с пользователем. Разделяй и властвуй!

А поскольку для UNIX программ нет никакой разницы — программа, отвечающая за функционал, работает на локальном хосте или она удаленная, то такая графическая оболочка автоматически сразу является сетевой программой.

А вот в Виндовсе — не всё так просто! Если программа должна взаимодействовать с удаленным пользователем, то она сама должна решать эти сетевые проблемы. И если Виндовая программа не умеет работать удаленно, то — проблемы!

В среде UNIX/Linux — контроль взаимодействия между программой и пользователем осуществляется самой средой. Поэтому программе достаточно принимать данные из стандартного потока ввода, а результат работы выдавать в стандартный поток — и этого уже достаточно для любого взаимодействия между пользователем и программой — будь то взаимодействие локально (на том же самом компе (хосте)) или удаленно (управление космическим аппаратом, умным домом и т.д.).

Виндовая программа «считает», что она живет одна в мире. Ну, по крайней мере, она готова «сотрудничать» только с теми программами, о которых она «знает» и которые её «знают». Поэтому бесполезно соединять две программы, которые о существовании друг друга ничего не знают.

В мире UNIX/Linux программы «считают», что они живут среди других таких же как она сама программ. Поэтому они могут легко взаимодействовать друг с другом. Взаимодействие это осуществляется через упомянутые стандартны ввод и стандартный вывод. А поскольку взаимодействие находится под юрисдикцией среды, а среда изначально поддерживает сетевые взаимодействия, то программам без разницы  — как они работают: удаленно или локально.

Другими словами, программисту, пишущему такую программу не надо напрягаться на предмет того, что программа должна быть сетевой. Для программиста, программу, которую он пишет, — это просто обычная программа, ничего в ней сетевого нет. «Сетёвность» программы обеспечивается средой, а не самой программой.

— Громче! Не слышу ваш вздох облегчения!

Надеюсь, я не очень утомил вас своим рассказом. Я попытался объяснить, чем объясняется что настоящие специалисты выбирают тяжелое оружие, не смотря на его брутальность и отсутствие розовеньких бантиков.

Им нужно РЕШАТЬ задачи, а не ВЫГЛЯДЕТЬ красиво.

Реклама

7 responses to “Парадигма Windows и парадигма UNIX

  1. Оттуда же: «В очередной раз посетила мысль: ну неужели никто проблему 2000h так и не решил? И о, чудо! Гуглер наконец выдал свежее решение. Нужно всего лишь взять пропатченные Build Tools.»

    А наблудили там все участники обсуждения уже по самые Нидерланды.

  2. Ну я тут не открою ничего нового но вывод изображения через фреймбуфер в консоль…или проброс X-сервера по сети из терминала тоже интересные штуки с запуском приложений уже на компьютере удаленном. И я даже не знаю есть ли в виндовом терминале аналог MC или htop ?

    • На Win используется Remote Desctop. Соответственно, получаешь на нем всё, что тебе разрешено политиками той системы, на которую ты зашел.

      • В Линуксе тоже есть программа удаленного рабочего стола. С запахом мышей и нижнего белья шлюх. Но программа «Удаленный рабочий стол» (Remote Desktop) — это совсем другой уровень, это совсем не то, что удаленный терминал, хотя позволяет выполнять какой-то ограниченный круг действий.

        Допустим, я пишу программу. Моя программа ничего не знает о Вашей программе. И тем не менее в полном соответствие с парадигмой UNIX наши программы могут взаимодействовать. И тот факт, что они могут оказаться на компах, которые установлены на разных континентах, это никак не скажется на успехе выполнения задачи.

        Для Винды это тоже достижимо, но какими усилиями!

        На easyelectronics чётко сказали, что установка на комп дополнительного ПО решает практически любые проблемы. Единственное, что не уточнили — это как узнать заранее, а какое ПО нужно установливать.

        А что делать в случае, если (утрированно) специалист забыл поставить прогу и отравил аппарат к Юпитеру? Или установил комп, который собирает данные, на станции в Антарктиде, потом закрыл серверную на ключ и свалил домой вместе со всеми другими учеными. А по приезду оказалось, что в каком-то драйвере обнаружилась ошибка и нужно срочно установить исправленную версию, которую нужно скачать из интернета. Вот, я посмотрел бы, как в этом случае Виндувс-админ будет дистанционно вырезать аппендикс и накладывать швы! А не дай Бог во время операции что-нибудь пойдет не так!

    • mc — это Вы о midnight commander?
      В Винде есть NC, Far Manager и возможно что-то еще, о чём я не знаю. А вот прямого аналога htop — точно нет.

      Но ведь это всего лишь утилиты! Гораздо интереснее сама оболочка, которая не сливает в программам шаблоны типа *.c, а расшифровывает и отдает уже готовые имена файлов. А как Вам такое:

      $ ls -l m*.[ch]

      которое выведет на экран все хэдерные и си-шные файлы, начинающиеся на ‘m’.

      Помниться, я где-то блоге писал как я забирал данные с рабочего компа (который на работе). Суть этого получения данных состояла в том, что данные сжимались на лету, передавались по интернету, а по приему декомпрессировались. При этом збрать много-мегабайтный файл получалось за пару секунд на канале 512 кбит/с (если в ту пору у меня было вообще не 256 кбит/с).

      В общем, в Линуксе можно творить самые настоящие чудеса. Хотя, опять же, «чудеса» — это с точки зрения Виндовс, а с точки зрения Линукса — обычная работа.

      Если не знаешь технологии, то всё выглядит как магия.

  3. «Вот, я посмотрел бы, как в этом случае Виндувс-админ будет дистанционно вырезать аппендикс и накладывать швы! А не дай Бог во время операции что-нибудь пойдет не так!»

    Полно сплошь и рядом. На серверных версиях Win есть telnet, например (правкой реестра открыть можно и на обычных). И через командную строку можно сделать всё, что надо.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s