Новости :

Командный интерпретатор Cshell

Командный интерпретатор Cshell

Крутиков М. П., Суперкомпьютерный Центр


Введение

Командный интерпретатор в среде UNIX выполняет две основные функции:
  • представляет интерактивный интерфейс с пользователем, т.е. выдает приглашение, и обрабатывает вводимые пользователем команды;
  • обрабатывает и исполняет текстовые файлы, содержащие команды интерпретатора (командные файлы);

В последнем случае, операционная система позволяет рассматривать командные файлы как разновидность исполняемых файлов. Соответственно различают два режима работы интерпретатора: интерактивный и командный.

В среде UNIX (в отличие, скажем, от DOS) имеются несколько различных командных интерпретаторов. Перечислим наиболее популярные:

  • /bin/sh - Bourne shell. Исторически это первая командная оболочка, разработанная для первой версии ОС UNIX. В настоящее время эта оболочка является основной в версиях UNIX System V.
  • /bin/csh - С-shell. Оболочка, синтаксис командного языка которой приближен к языку C. Является основной оболочкой для Берклеевской разновидности ОС UNIX.
  • /bin/ksh - k-shell.
  • /bin/rsh - Restricted shell. Представляет собой sh с ограниченными возможностями (прежде всего для защиты ОС от несанкционированных действий пользователя).

Операционная система ConvexOS является разновидностью 4.3 BSD UNIX( )BSD - Berkeley Series Distribution и, следовательно, базовой командной оболочкой является csh.

1 Основные возможности

Работа с командной строкой

Набираемую пользователем строку интерпретатор воспринимает как команду (или несколько команд). Синтаксис командного интерпретатора позволяет набирать

несколько команд в одной строке, разделяя их точкой с запятой. Например

% cd /tmp; lf

эквивалентно двум последовательно введенным командам:

% cd /tmp

% lf

Наоборот, при желании пользователь может

продолжить набор длинной команды на следующей строке, закончив текущую строку знаком \. До завершения ввода команды вы будете получать ``вторичное приглашение'' > вместо основного (%). Например,

% tar tv Makefile star.o star.c star.dat main.o main.c

эквивалентно

% tar tv Makefile star.o \

> star.c star.dat \

> main.o main.c

Управление потоками ввода-вывода осуществляется, подобно DOS(Точнее, синтаксис перенаправления потоков ОС DOS восприняла от UNIX) с помощью символов > , > > , < , < < , |. Отметим здесь только следующее: в отличие от DOS при создании программного канала между двумя процессами ОС UNIX запускает оба процесса одновременно и осуществляет передачу информации через системный буфер (без промежуточной записи на жесткий диск). Таким образом, программные каналы в ОС UNIX являются весьма эффективным способом обмена. В случае переполнения системного буфера (например если ``передающая'' программа выдает информацию в канал быстрее чем ее может обработать ``принимающая'' программа) ОС автоматически приостанавливает тот процесс, который осуществляет запись в канал до освобождения буфера.

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

% cat < /dev/null > myfile

создаст в текущей директории пустой файл myfile.

Дополнительно C-shell позволяет группировать команды с помощью круглых скобок. В этом случае вся конструкция внутри скобок рассматривается интерпретатором как одна команда. Сие полезно, например, в таких конструкциях:

% (command1 | command2) < myfile

Если же скобки опустить, shell не сможет определить какой из команд вы хотите подать на вход файл myfile.

Следующие ``удобства'' существуют в данной реализации C-shell:

  • Вы можете не набирать длинную команду до конца, а попробовать после частичного набора команды (или имени файла) нажать клавишу табуляции < Tab> . C-shell попытается сама дополнить недостающие символы, либо ответит писком, если выбор неоднозначен.
  • Если вы набрали команду, но забыли ее опции, наберите последовательность < Esc> H. C-shell выдаст краткую помощь. Например,
    
    % ps< EscH> 
    
    
  • Набирая полное имя файла пользуйтесь комбинацией клавиш ^D. Вы сможете получить листинг набираемого каталога в формате команды lf.
  • Командный буфер запоминает 20 последних команд. Вместо набора команды вы можете вызвать ее из буфера с помощью стрелочной клавиатуры (конечно только в том случае, если эта команда есть в буфере).

Разбор командной строки

Интерпретатор, получив командную строку, выполняет над ней ряд преобразований, а именно:
  1. Раскрывает псевдонимы ( alias)
  2. Раскрывает метасимволы (*, ?, [, ], ~, {, })
  3. Подставляет переменные shell
  4. Выполняет команду, если она - встроенная команда интерпретатора, или запускает процесс, если команда внешняя.

Разберем эти действия по этапам.

Псевдонимы (alias). Встроенная команда alias позволяет определять псевдонимы команд. Пример:

% alias mycat 'cat | more'

определяет mycat как псевдоним строки cat | more. Поэтому далее вы вправе пользоваться командой mycat, которая будет раскрыта интерпретатором везде, где вы ее используйте. Это - способ определения коротких имен для длинных составных команд.

Встроенная команда unalias mycat уничтожает ранее введенный псевдоним mycat.

Метасимволы. Метасимволы позволяют кратко записывать целые списки слов (главным образом - имен файлов). Shell рассматривает слово, в котором встречаются метасимволы, как шаблон для составления списка имен файлов:

  • * в шаблоне заменяет любую последовательность символов. Например m* раскроется в список всех файлов, начинающихся с буквы m. Существует небольшое исключение из этого правила: просто * опускает в списке те файлы, имена которых начинаются с точки.
  • ? заменяет один символов. Например m? раскроется в список всех имен файлов, начинающихся с буквы m и состоящих точно из двух букв.
  • [.-.] позволяет указать интервал для подставляемого символа. Например m[a-e] будет раскрыто в ma mb mc me.
  • {...,...} позволяет перечислить слова для подстановки. Так, например m{red,blue,green} будет раскрыто в mred mblue mgreen.

Наконец, тильда позволяет указать домашний каталог пользователя:

  • ~name/ эквивалентно указанию полного пути в домашний каталог пользователя name (Скажем, /usr1/name/)
  • ~/ эквивалентно указанию полного пути в ваш собственный домашний каталог.

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

Встроенная команда set name=value позволяет определить простую переменную с именем name и дать ей значение value. Встретив в командной строке выражение $name интерпретатор заменит его на value. Например,


% set color=blue

% echo $color

выдаст на терминал строчку blue. А

% set color=blue

% echo new$color

даст newblue. Наконец, введя

% set color=blue

% echo ${color}new

получим colornew. Последний пример демонстрирует как надо использовать фигурные скобки для выделения имени переменной из слова (на echo $colornew интерпретатор бы ответил, что переменная colornew не определена.

Команда unset уничтожает ранее определенные переменные.

Чтобы определить переменную равной строке из нескольких слов, заключите ее в простые кавычки. Пример


% set color='blue or red or green'

Простые переменные могут быть массивами слов (что надо отличать от только что рассмотренного случая, когда переменная содержит строку из нескольких слов. Для объявления массива надо использовать круглые скобки:


% set colors=(blue red green)

Теперь команда echo $colors выдаст строку из трех цветов (попробуйте!). Однако вы можете также работать в отдельными элементами массива (элементы нумеруются с нулевого значения), например так:

% echo $colors[2]

(получим green). Количество элементов в массиве содержится в переменной $#colors.

% echo $#colors

даст на терминал цифру 3.

Возможны довольно сложные комбинации с использованием шаблонов, например:


% set files=(m*)

% echo $#files

выдаст число файлов в текущем каталоге, начинающихся с буквы m.

Переменные окружения вызываются точно также как и простые переменные. Разница заключается в способе их определения:

Команда % setenv name value устанавливает переменную окружения с именем name. Обратите внимание на раздражающую разницу в синтаксисе: определяя переменную окружения не надо ставить знак =.

Список всех переменных окружения можно получить с помощью встроенной команды printenv.

Отменить определения переменной окружения можно с помощью unsetenv.

Наконец, для определения массива переменных окружения НЕ используются круглые скобки, а используются двоеточия в качестве разделителей элементов массива:


% setenv MANPATH /usr/man/:/usr/local/man:/usr/man/X11:~/man

Встроенные команды и переменные

Список важнейших встроенных команд C-shell с краткими пояснениями:

  • alias определяет псевдоним

  • bg переводит задачу в фоновый режим исполнения

  • chdir path команда перехода в каталог path.

  • echo выводит на стандартный вывод все свои аргументы

  • exec filename запускает процесс из файла filename вместо текущей shell (т.е. поверх нее). Возврат в shell невозможен.

  • exit заканчивает работу shell.

  • fg переводит фоновый процесс в синхронный.

  • file filename выдает информацию о том, что операционная система думает об этом файле.

  • goto label осуществляет безусловный переход на строку командного файла, помеченную меткой label. Не используется в интерактивном режиме.

  • kill pid посылает сигнал аварийного завершения процессу с номером pid, что обычно приводит к уничтожению процесса.

  • source filename считывает и исполняет команды из файла filename.

  • set, setenv установка внутренних переменных и переменных окружения.

  • shift var сдвигает элементы массива var влево. При этом размер массива уменьшается на единицу, а нулевой элемент массива теряется. Переменная var должна быть массивом.

  • time command выполняет команду command и выводит на терминал затраченное на ее выполнение время.

  • unset уничтожает переменную shell.

  • unalias уничтожает ранее определенный псевдоним команды.

  • @ name=expr заносит результат арифметического выражения expr в переменную name.

Список важнейших встроенных переменных C-shell с краткими пояснениями:

  • argv массив параметров командной строки (используется в командном режиме)

  • cdpath каталог, куда shell переходит, получив команду chdir без аргумента.

  • history размер буфера для запоминания команд.

  • home домашний каталог пользователя

  • mail местоположение в файловой системе почтового ящика пользователя.

  • path путь поиска внешних команд.

  • prompt основное приглашение shell.

  • prompt1 вторичное приглашение.

  • shell полный путь исполняемого файла текущей оболочки (/bin/csh)

Управляющие операторы и операторы цикла

Из списка встроенных команд оболочки мы сознательно исключили условные операторы и операторы цикла, которые будут рассмотрены здесь.

Условное выполнение

Синтаксис условного оператора if в C-shell таков

if (expr ) command

if (expr ) then

...

else

...

endif

В качестве expr может стоять либо арифметическое выражение, либо проверка атрибутов файла. Пример:


if ( $i< 10 ) echo $i

или

if ( -f /etc/hosts ) cat /etc/hosts

Рассмотрим последний случай подробнее. Возможны следующие проверки атрибутов файла:

-r доступен на чтение

-w доступен на запись

-x доступен на исполнение

-e проверка существования файла

-o проверка что вы являетесь хозяином данного файла

-z файл имеет нулевой размер

-f файл является обычным файлом

-p файл является именованным программным каналом

-d файл является директорией

Цикл while

while ( expr )

...

end

Цикл выполняется до тех пор, пока условие истинно. Пример:


while ( $#files >  0 )

echo $files[0]

shift files

end

Цикл foreach

Это чрезвычайно полезный оператор, позволяющий организовать цикл по элементам массива слов

foreach varname ( list )

...

end

Тело цикла выполняется столько раз, сколько элементов в массиве list. При этом переменная varname содержит очередное значение элемента массива. Пример


foreach color ( blue red green )

echo The color is $color

end

Более содержательный пример: переименовывает все файлы в текущей директории с суффиксом .for в файлы с суффиксом .f.

foreach file ( *.for )

echo Renaming $file

mv $file `basename $file .for`.f

end

Здесь использована стандартная команда basename, которая ``отрезает'' у слова, заданного в первом аргументе суффикс, заданный вторым аргументом и выводит получившееся слово на стандартный вывод. Об использовании обратных кавычек в языке C-shell будет рассказано несколько позже.

Многовариантный условный оператор

Синтаксис условного оператора switch в C-shell таков

switch (string )

case pattern1 : ... breaksw case {\it pattern2} :

...

breaksw

...

default:

...

endsw

Оператор позволяет передавать управление в зависимости от того, удовлетворяет ли строка string какому-либо шаблону из набора pattern1, pattern2, ...( в этом случае управление передается в блок, ограниченный case ... breaksw) или нет (в этом случае управление передается на ветвь default:... endsw. В целом, оператор switch очень похож на аналогичный опреатор языка C. Такие конструкции часто используются в командных файлах для анализа ответа пользователя на заданный вопрос ([Yes/No]).

2 Работа оболочки в командном режиме

Уже отмечалось, что csh может быть запущена в командном режиме. Более того, условные операторы и операторы цикла чаще используются именно в командных файлах. Здесь мы рассмотрим особенности такой ``командной'' работы.

Идентификация интерпретатора

Проще всего осуществить запуск оболочки в режиме исполнения некоторого файла mycommand придав этому файлу атрибут исполняемости командой chmod:

% chmod +x mycommand

Теперь достаточно ввести с клавиатуры команду mycommand и ОС автоматически запустит shell в командном режиме исполнения данного файла. В таком пути есть один подводный камень: командных интерпретаторов в системе много и синтаксис команд у них разный. Как ОС определит нужный вам? Ответ - никак. Вы должны явно указать ОС какой интерпретатор вы хотите запускать для исполнения данного командного файла. Для этого первая строчка вашего файла должна иметь следующий стандартный вид:

#! /bin/csh

что и позволит ОС правильно поступить. Если же вы не задали этой информации, то ОС будет считать (по историческим причинам), что файл написан на языке Bourne shell и вы вероятнее всего получите множество сообщений о синтаксических ошибках.

Заметим еще одно полезное свойство работы оболочки в командном режиме: все строки, начинающиеся со знака # будут проигнорированы. Это позволяет вносить в текст командного файла комментарии.

Следующий факт позволяет вам работать с командной строкой средствами csh: при запуске командного файла mycommand автоматически становится определенной внутренняя переменная с именем argv, представляющая массив параметров командной строки. Например, следующий командный файл просто выводит все свои аргументы и их количество на терминал:


#! /bin/csh

#

# This file simply outputs its arguments

# and the total number of arguments

#

echo Arguments: $argv

echo Number of arguments: $#argv

Явный запуск

Вы можете применить более прямой, но менее удобный способ запуска командного файла - вызвав shell с ключом -c filename. Пример:

% /bin/csh -c mycommand arg1 arg2 arg3...

где сразу же за ключом должно следовать имя запускаемого файла. Требуемые аргументы указываются после. Отметим, что при таком способе запуска файл может и не иметь атрибута исполняемости.

Кавычки

В синтаксисе shell кавычки играют важную роль. Есть три типа кавычек: простые ('), двойные (") и обратные (`).

Простые кавычки используются для выделения текста, который оболочка должна понимать буквально. Иными словами, текст внутри простых кавычек не подлежит раскрытию и интерпретации. Пример:

echo 'Dollar is $good'

получим букально Dollar is $good несмотря на то, что знак доллара является метасимволом оболочки.

Двойные кавычки выделяют строку символов, которую оболочка будет считать одним словом. Пример:

set colors="green blue red"; echo $#colors

выдаст цифру 1, что означает, что переменная colors простая, а не массив. Все что находится внутри двойных кавычек подлежит интерпретации оболочкой.

Обратные кавычки позволяют представить строку, которая состоит из результата выполнения команды. Так что выражение в обратных кавычках рассматривается как команда, которую оболочка выполняет, а то, что эта команда выведет на стандартный вывод подставляется как строка на то место, где стоят эти обратные кавычки. Пример:

set mytty=`tty`

занесет в переменную mytty ту строку, которую выдает команда tty (а именно имя и номер текущего терминала).

Комментарии: (0) | UNIX | 2006-05-29

Язык обработки данных AWK

Язык обработки данных AWK

Галина О. В., Суперкомпьютерный Центр


Part: ОБЩАЯ ИНФОРМАЦИЯ

1. Назначение и Формат использования

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

Утилита AWK изначально объединяла свойства утилит UNIX - sed и grep. В дальнейшем ее возможности значительно расширились. Настоящая документация ограничивается описанием возможностей утилиты AWK реализованной для компьютеров CONVEX. Утилита AWK была создана в 1977г, американскими авторами: Alfred V.Aho, Brian W.Kernighan и Peter J.Weinberger. Подробное описание всех возможностей утилиты AWK для UNIX дает их издание: ``The AWK Programming Language'', 1988.

AWK сканирует input (стандартный или указываемый набор файлов), и над строками, удовлетворяющими заданному образцу, выполняет указываемые действия. Строка может содержать максимально до 256 символов.

Формат:

awk [-Fc] [-f file] [files]

awk [-Fc] [prog] [files]

prog - программа, вида: ' образец ${$действие$}$'

file - файл с AWK-программой:

образец { действие}

образец { действие}

...

files - файлы, предназначенные для AWK-обработки.

-Fc - устанавливает разделитель полей в ``с'' (См. 1.2.1 и 2.4)

2. Общая структура AWK-программы

1. Язык программирования AWK допускает использование:
  • Полей;
  • Переменных (Стандартных, Массивов);
  • Арифметических выражений.

2. Образец:

  • Регулярное выражение;
  • Выражение отношения;
  • Комбинация образцов;
  • BEGIN и END.

3. Действие:

  • Последовательность предложений, разделенных ``;'' или ``\n'' (новая строка)

Предложение:

  1. Вывод (Печать);
  2. Присваивание;
  3. Встроенная функция;
  4. Управляющая структура.

Part: СТРУКТУРА AWK-ПРОГРАММЫ

1. Язык AWK

1.1 Поля

Каждая сканируемая строка input рассматривается как состоящая из полей, разделенных разделительными символами (по умолчанию - пробел).

На поля можно ссылаться из AWK программы следующим образом:

  1. - Первое поле;
  2. - Второе поле;
  3. ... и так далее...
  4. {PAGE_ROW_TEXT} - Ссылается на всю строку целиком.

Строка может содержать максимально до 100 полей.

1.2 Переменные

1.2.1 Стандартные переменные


< Drawing or tabular insertion skipped...>

1.2.2 Значения переменных

Переменные могут интерпретироваться как числовые или строковые. Они принимают значения в зависимости от контекста, например:

x = 1, x воспринимается как число;

x = " ", x - строка;

x + "abc" - результат операции интерпретируется как число независимо от того, было ли х числом или строкой. Если строка не может быть интерпретирована как число ("abc"), то ее значение становится 0.

Строка может содержать максимально до 256 символов.

1.2.3 Переменные поля

Ссылки на поля , , ... могут интерпретироваться в качестве переменных, например:

= "3" + - первое поле принимает значение второго поля, увеличенного на 3.

$(i+1) - интерпретируется как поле, номер которого зависит от значения переменной i.

1.2.4 Массивы

Допускается использование массивов. Массивы не объявляются, а принимают значения из контекста, например:

x[NR] = {PAGE_ROW_TEXT} - элементу массива x, индексированному NR, присваивается обрабатываемая строка.

x["apple"] - элементы массива могут индексироваться не числовым значением, т.е. строкой.

1.3 Арифметические выражения

Выражение:
  • Переменная;
  • Число;
  • Строка;
  • Встроенная функция;
  • Выражение < Операция> Выражение.

< Операция> : "+", "-", "*", "/", "%"

2. Образцы /patterns/

2.1 Регулярное выражение

Для осуществление поиска в AWK языке допускается использование регулярных выражений, определенных в описании SED, (см. ``Неинтерактивный текстовый редактор SED'' 2.1), заключенных в``/ /''. Дополнения к использованию регулярных выражений, допускаемые в AWK-языке:

  • "( )" - Скобки допускаются для группирования;
  • " |" - Указание альтернативы "или";
  • " + " - Плюс, стоящий за регулярным выражением означает любую последовательность вхождений этого выражения, начиная с 1;
  • " ? " - Знак вопроса за регулярным выражением означает 0 или 1 вхождений этого выражения;
  • [A-Z] - Допускается сокращенная форма записи для рангов ASCII символов;
  • Установленный порядок выполнения операторов на одном скобочном уровне: "[] * + ? конкатенация |".

Например:

/Olga/ - Указывает на строки, содержащие Olga.

/[Oo]lga|[Mm]ike|[Mm]al/ - Указывает на строки, содержащие Olga или olga или Mike или mike или Mal или mal.

/number[0-9]/ - Указывает на строки, содержащие number0 или number1 или ... number9.

/\/.+\// - Указывает на строки, содержащие любое количество символов, больше или равное 1, заключенных в / /.

2.2 Выражение отношения

Выражение отношение может быть двух типов:
  • < Выражение> < Принадлежность> < Выражение>
  • < Выражение> < Лог. Операция> < Выражение>

Принадлежность:

~ - Содержится;

!~ - Не содержится.

Лог. Операция: < , < =, ==, !=, > =, > .

Например:

~ /[Oo]lga/ - Указывает на строки, первое поле которых содержит Olga или olga.

> = "s" - Указывает на строки, начинающиеся с символа s или следующих за ним по порядку: t, u, v...

2.3 Комбинация образцов

Допускается логическая комбинация образцов с использованием следующих знаков: || - ``или'', & & - ``и'', ! - ``не''.

Последовательности образцов, соединенных одним из знаков читаются слева направо.

Комбинация: ``образец1, образец2'' указывает, что действие выполняется над строками, попадающими в указанный ранг: то есть, начиная от строки, удовлетворяющей ``образец1" и вплоть до строки, удовлетворяющей ``образец2", включая ее саму.

Например:

/02\.95/ & & ( !~ /\.su/ !~ /\.su/) - Указывает на строки, содержащие 02.95 и не имеющие .su одновременно в первом и во втором поле.

NR == 100, NR == 200 - Указывает строки с номерами от 100 до 200.

2.4 BEGIN и END

Образец BEGIN указывает на начало input или на те действия, которые должны быть выполнены до какого бы то ни было анализа строк. Образец END указывает на конец input или на те действия, которые должны быть выполнены после обработки всех строк.

Например:

BEGIN {FS = ":"} - Устанавливает разделитель полей в ":" до начала обработки строк. Эквивалентно опции "-F:" при AWK вызове.

END { print NR } - Печатает номер последней строки input, т.е. количество обработанных входных строк.

3. Действия

3.1 Вывод /Печать/

Формат оператора печати:

PRINT [< список выражений> ] [ > < выражение1> ]

Если в списке выражения находятся через запятую, то значения этих выражений выводятся на output (печатаются) через символ-разделитель OFS (по умолчанию пробел). Если же выражения стоят через пробел, то на печати происходит их конкатенация.

Значение < выражения1> рассматривается как имя файла. Само его присутствие означает печать в файл. Если вместо ``> '' стоит ``> > '', то это означает добавление к уже существующему файлу. Можно использовать в одной программе максимально до 10 output файлов.

Оператор форматированной печати:

PRINTF формат [,список выражений] [ > выражение1]

формат: символьная строка в двойных кавычках. Идентичен формату, используемому в функции printf в языке ``С''. Формат может содержать:

  • обычные символы, они копируются на output.
  • escпоследовательности, представляющие неграфические символы, например, "\n" - новая строка.
  • спецификации для вывода аргументов, они следуют после символа ``%''. Число спецификаций должно быть равно числу аргументов. (Если оно меньше числа аргументов, то лишние аргументы игнорируются, если же больше - то это ошибка)

3.2 Присваивание

Оператор присваивания имеет вид:

< переменная> = < выражение>

Начальное значение переменной 0 или `` '' (пробел). Допускаются другие типы присваивания в соответствии с языком ``С'': "+=","-=","*=","/=","%=".

< переменная> ++, ++< переменная> - увеличение значения переменной на 1.

< переменная> --, --< переменная> - уменьшение значения переменной на 1.

3.3 Встроенные функции

length(arg) - Функция длины arg. Если arg не указан, то выдает длину текущей строки.

exp(),log(),sqrt() - Математические функции экспонента, логарифм и квадратный корень.

int() - Функция целой части числа.

substr(s,m,n) - Возвращает подстроку строки s, начиная с позиции m, всего n символов.

index(s,t) - Возвращает начальную позицию подстроки t в строке s. (Или 0, если t в s не содержится.)

sprintf(fmt,exp1,exp2,...) - Осуществляет форматированную печать (вывод) в строку, идентично PRINTF.

split(s,array,sep) - Помещает поля строки s в массив array и возвращает число заполненных элементов массива. Если указан sep, то при анализе строки он понимается как разделитель.

3.4 Управляющие структуры

Условное предложение:

if ( < условие> ) < предложение>

\hskip 1cm [else < предложение> ]

Предложения цикла:

while ( < условие> ) < предложение>

for (< выражение> ; < условие> ; < выражение> )

\hskip 1cm < предложение>

Например:

for(i=1; i< =NF; i++) - Аналогично циклу for в языке ``С''

for (i in array) - Цикл по элементам массива. Но, элементы массива доступны в этом случае в случайном порядке.

break - Немедленный выход из цикла.

continue - Переход к выполнению следующего предложения.

next - Немедленный переход к анализу следующей строки.

exit - Выход из программы (на конец input).

# - Комментарий

Part: Сравнительное решение задач с помощью SED и AWK

Система UNIX обладает несколькими программами, которые обрабатывают входной поток данных: grep, egrep, fgrep, lex и sed. Неинтерактивный редактор sed обеспечивает выполнение в пакетном режиме большинства функций редактирования редактора ed. Как показано на примерах ниже, некоторые задачи обработки текстов могут быть решены как с помощью awk, так и с помощью sed и время решения простых задач с помощью sed будет меньше. Однако, решения некоторых примеров (как 4. и 5.) выглядят более наглядно с использованием awk. Кроме того, утилита awk безусловно шире по своим возможностям и позволяет численные манипуляции с данными, логические отношения, использование переменных и т.п., чего не обеспечивает ни одна из вышеперечисленных программ.

Примеры:

1. Посчитать количество строк (input)

SED: $= (10.2 c.)

AWK: END { PRINT NR } (15.0 c.)

2. Напечатать все строки, содержащие "olga"

SED: /olga/p (11.6 c.)

AWK: /olga/ (25.6 c.)

3. Напечатать все строки, содержащие "olga", "mike" или "mal"


SED:  /olga/p

      /olga/d

      /mike/p

      /mike/d

      /mal/p

      /mal/d            (15.8 c.)



AWK:  /olga\bverb mike\everb mal/   (29.9 c.)

4. Напечатать третье поле каждой строки

SED: /[^ ]* [ ]*[^ ]* [ ]*\([^ ]*\).*/s///p (29.0 c.)

AWK: {PRINT } (33.3 c.)

5. Напечатать сначала третье, а затем второе поля каждой строки

SED: /[^ ]* [ ]*\([^ ]*\) [ ]*\([^ ]*\).*/s///p (30.5 c.)

AWK: {PRINT } (38.9 c.)

6. Добавить строки, содержащие "olga", "mike" или "mal" соответственно к файлам: folga, fmike, fmal


SED:     /olga/w folga

         /mike/w fmike

         /mal/w fmal         (16.1 c.)



AWK:     /olga/ {print >  "folga"}

         /mike/ {print >  "fmike"}

         /mal/  {print >  "fmal"}   (46.4 c.)

Комментарии: (0) | UNIX | 2006-05-29

UNIX 5-th Edition на x86, или не забывайте историю

UNIX 5-th Edition на x86, или не забывайте историю

Александр Поляков aka polachok

Немного истории

Я думаю, стоит для начала напомнить читателю об истории развития . Начну я с самого начала, а именно с первой ее редакции (другими словами - версии). Науке неизвестно, откуда пошел этот термин, в книге А.Робачевского рассказывается такая легенда: "каждая версия снабжалась соответствующей редакцией Руководства Программиста, откуда и сами версии получили название редакций (Edition)". Существует 10 редакций. Расскажу о наиболее важных.

Первая - 1971 г. Написана была на ассемблере для PDP-11. Включала компилятор B и много известных команд (таких как chmod, cp, find, mail, rm, mkfs, who, chdir - теперь зовется cd, и страшный редактор ed).

Третья - 1973 г. Появился компилятор C (команда cc).

Четвертая-пятая - 1973-1974гг. Завершение переписывания ядра на языке C.

Шестая - 1975 г. Полностью переписана на C. На ее основе выпущена первая система BSD.

Седьмая - 1979г. Включала Bourne Shell и C-компилятор Кернигана и Ритчи.

На этом обзор редакций UNIX прошу считать оконченным. Теперь перейду к вопросу о терминологии. Некоторые (и я, каюсь, до недавнего времени) ошибочно называют UNIX 5-th Edition UNIX System V. Вещи это совершенно разные и вот почему. С 1975 года AT&T начала активно предоставлять лицензии на UNIX, и появилось несколько различных ее версий. Но в AT&T инициативу терять не хотели, и в 1982 на базе нескольких существующих версий была создана System III UNIX. Через год была выпущена System V.

Практические занятия

Для проведения оных нам понадобится: какая-нибудь современная (относительно) UNIX-подобная ОС для intel-совместимых процессоров (типа Linux или FreeBSD), компилятор C(GCC?), исходный код программы SIMH и образ диска интересующей версии UNIX (для примера возьму UNIX Version 5).

Надеюсь, что подходящая ОС и компилятор у нас имеются, и поэтому перейду к собственно SIMH. Это - рекурсивная аббревиатура: SIMH is the Computer History Simulation system. Основная цель проекта - написание симуляторов компьютеров, представляющих исторический интерес. К таким, по мнению разработчиков, относятся следующий системы:

Разработчик Модели
Digital Equipment Corporation PDP-1, PDP-4, PDP-7, PDP-8, PDP-9, PDP-10, PDP-11, PDP-15, VAX
Data General Corporation Nova Eclipse
IBM Corporation 1130, 1401, 1620, System 3
GRI Corporation GRI-909
Honeywell Corporation H316/516
Hewlett Packard Corporation HP2116, HP2100, HP21MX
Interdata Corporation 16b systems, 7/32, 8/32
Scientific Data Systems SDS-940
MITS Altair 8080, Altair Z80
Royal-Mcbee LGP-30, LGP-21

Cкачать SIMH и образы дисков можно на сайте: http://simh.trailing-edge.com.

Перейдем к установке и настройке. Установка проста как дважды-два: распаковываем архив, входим в свежесозданную директорию и вводим:

gmake all

для GNU Make в не-Linux системах. В Linux можно использовать просто make. Или

gmake USE_NETWORK=1 all

если хочется поддержки сети.

После успешной сборки заходим в подкаталог BIN и копируем оттуда файл pdp11 куда-нибудь, например, в каталог ~/unix-v5 (предварительно созданный, конечно), туда же распаковываем образ диска. и приступаем к заклинаниям. Запускаем pdp11 - получаем следующее приглашение:

PDP-11 simulator V3.3-2
sim>

Вводим туда последовательно следуюшие команды:

set cpu u18
att rk0 unix_v5_rk.dsk
set rk1 RK02
att rk1 rl1.dsk
att tm0 tm0.tap
boot rk

не забывая после ввода каждой жать клавишу ENTER. После всего этого получаем приглашения загрузчика в виде собаки: @, вводим туда unix, жмем ENTER...

И вот он - UNIX Version 5. Подтвердит это вывод команды date. uname тогда еще не было.

P.S. Логин root.

P.P.S. Там нет команды cd - она называется chdir.

Комментарии: (0) | UNIX | 2006-05-29

Программирование на GTK2 в среде GNOME (Anjuta, Glade и LibGlade)

Программирование на GTK2 в среде GNOME (Anjuta, Glade и LibGlade)

Автор: decvar
E-mail: decvar at inbox dot ru
Сайт: nixp.ru

Об инструментах:

  • Anjuta 1.2.2  — среда разработки на C/C++ и других языках для среды GNOME.
  • Glade 2.5.0 — инструмент проектирования интерфейсов программы для LibGlade или использования отдельно.
  • LibGlade 2.4.0 — библиотека для создания виджетов на GTK, описываемых файлом Glade, и некоторые полезные функции.

Опционально рекомендую установить DevHelp — это справочная система с модулями для разных средств. Необходимо установить модуль с GTK2.0 API. Чаще всего он идет в комплекте с самой программой.

1. Создание проекта

Запускаем Anjuta. [System Menu->Programming->Anjuta IDE.] Когда она запустится, предложит открыть старый проект, создать новый или импортировать его из какой-нибудь директории (рис. 1).

Выбираем создание нового, появится визард создания проекта. Жмем Forward и попадаем в выбор типа проекта (Project Type). Выбираем GNOME 2.0 Project, если нам нужна поддежка GNOME-расширений, и GTK 2.0 Project — если нет. Выбираем GNOME 2.0 Project. Жмем Forward — пишем Basic Information о проекте: Название, Версия, Автор, Project Target — это как будет называться executable-файл вашего проекта. Пишем соответственно:

    Project name: Gnome-test
    Project Version: 0.1
    Project Author: <YOUR name>

    Project Target: gnome-test

Дальше выбираем язык программирования — C. Если хотите использовать C++, прочитайте начальную документацию про Gtkmm, расширение GTK для C++. Официальная документация: developer.gnome.org/doc/API/2.0/gtk — предполагает использование С.

Дальше Forward — Дополнительная информация о проекте — пишем «Тестовый проект для GNOME». Жмем Forward. Попадаем в Additional Options.

Include GNU Copyright Statements — будет добавлять форму с упоминанием лицензии GNU в каждый созданный файл .h.

Enable Gettext Support — позволит использовать скандартную систему многоязычных интерфейсов. Вместо «…..» будет использован макрос _(«….»), который с помощью файлов .po для нужного языка будет подменять текст в виджетах. Просто оставьте как есть.

Generate source code using glade or glademm — создавать код с использованием glade и ее расширений для C++ (glademm). Включить.

Ниже вы можете выбрать, в какую категорию меню будет попадать ваше приложение и какая у него будет иконка. На ваш выбор. Жмем Forward — смотрим, что нигде не ошиблись и жмем Apply.

Anjuta начнет создание нового проекта, вам нужно немного подождать.

2. Проектируем интерфейс

Созжание проекта завершится словами:

Auto generation completed.................Succesfull

Now build the project to have a LOOK at it

(рис. 2)

Собственно, проект создан — надо его наполнить чем-нибудь полезным. Для начала нажмите F11. Это скомпилирует созданный проект. Поскольку он у нас пустой, мы только проверим его работу.

(F11= Build -> Build). По кнопке F3 (Build->Execute) проект запустится на выполнение.

Слева вы видите папку gnome-test-0.1, в ней src — это папка с исходными кодами приложения. Сейчас там описано создание пустой формы. Выберите Project->Edit Aplication GUI (Alt+G), чтобы запустить Glade и спроектировать интерфейс. Запустится Glade. В главном окне Glade (там, где New, Open и Save) вы видите форму с именем window1. Двойной клик по ней для редактирования (рис. 3).

В окне Palette вы видите доступные вам виджеты. Для переноса их на форму кликните по виджету в Pallete, а потом по контейнеру на форме. Рекомендуется ознакомиться с информацией о контейнерах в GTK2.0. Для учебного примера мы выберем виджет Fixed Positions и уже на него будем добавлять остальные виджеты. Виджет Fixed Positions сам является контейнером, его не рекомендуют использовать из-за проблем с отображением добавленных виджетов при изменение размеров формы.

В главном окне Glade выберите View->Widget Tree. Это покажет дерево размещения виджетов на всех формах проекта. Добавьте на виджет Fixed Positions два виджета Text Entry и один Button (рис. 4).

Теперь пора заняться обработчиками событий. Выберите Кнопку (Botton), которую вы добавили на форму, и посмотрите на окно Properties: button1. В поле label написано button1 — измените на «нажми меня». Перейдите на закладку Signal. Рядом со строкой Signal вы видите кнопку, на которой написано «». Нажмите ее. Вы попадете в меню выбора сигнала. Каждый виджет в GTK2.0 в ответ на какое-либо действие (событие) посылает сигнал о нем. Программист должен написать обработчика этого события, если оно имеет для него значение. Нам нужно выбрать clicked. Мы будем обрабатывать событие нажатия на кнопку. После этого нажмите Add (рис. 5).

Теперь на гдавной панели Glade нажмите Save, а потом Build. Это добавит созданную вами форму в проект Anjuta.

3. Обработчики

Закройте Glade.

Вы должны увидеть в правой части Anjuta файлы проекта.

interface.c — внешный вид приложения. То, что вы создавали в Glade.

Interface.h — заголовочный файл, описывающий функции создания форм интерфейса. Нужен для доступа к ним из других частей приложения.

Callbacks.c — здесь нужно писать обработкичи событий. Там уже есть заготовок для on_button1_clicked, который мы создали в Glade.

Callbacks.h — то же самое, что и для Interface.

support.c\h — файлы созданы для внутренних нужд LibGlade.

Main.c — файл, который запустит создание интерфейса, и его код будет выполняться первым.

Нам нужно написать код в обработчике on_button1_clicked. Переходим в callbacks.c и пишем между { и }.

{
GtkWidget* edit1;
GtkWidget* edit2;
gchar* text;
edit1=lookup_widget(GTK_WIDGET(button),"entry1");
edit2=lookup_widget(GTK_WIDGET(button),"entry2");
text=(gchar*)gtk_entry_get_text(GTK_ENTRY(edit1));
gtk_entry_set_text(GTK_ENTRY(edit2),text);
}

Т.е. с начала создаем указатели на два поля ввода на форме и указатель на текстовую строку. Заполняем указатели функцией lookup_widget, передавая ей как второй параметр имя искомого виджета (описано при создании виджета в Glade в interface.c). После этого пишем содержимое edit1 в текстовую строку, а потом эту строку в edit2. Компилируем — F11. И запускаем — F3.

Вот, что должно получиться (рис. 6).

P.S. За дополнительной информацией по функциям работы с GtkEntry смотреть http://developer.gnome.org/doc/API/2.2/gtk/GtkEntry.html.

Комментарии: (0) | UNIX | 2006-05-29

UNIX: достоинства, недостатки и эмоции

UNIX: достоинства, недостатки и эмоции

Сергей Кузнецов

Зеленеет один,
Осеннему ветру наперекор,
Спелый каштан.

Мацуо Басе (1644-1694)

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

Люблю тебя (UNIX), но странною любовью... К сожалению, ее не победит рассудок мой. Вы же знаете, как бывает с любимой женщиной. Мы видим в ней массу недостатков. Мы знаем, какой бы она должна быть. Но она существует (какая она есть), и мы ее любим. Так и с UNIX. Неэмоциональный человек скажет, что это всего лишь программа. Пока она его устраивает, он ей пользуемся. Когда появляется лучшая операционная система (только вот где она?), он начинает пользоваться ей. Наверное, это правильно, но скучно, господа!

На мой взгляд, наиболее правильная комбинация человеческих качеств включает жизненный опыт, теоретические знания, практику, эмоциональный комплекс, привычки и способность критического отношения к себе и к миру (и конечно же, чувство юмора). Мой приятель злится, когда мы с коллегами начинаем эмоционально обсуждать достоинства UNIX и недостатки NT (другая точка зрения - выдающиеся достижения Билла Гейтса и застой и прострацию в мире UNIX). А что тут злиться? Главное, чтобы эмоции не перекрывали здравый смысл и смягчались юмором.

Могу привести два примера. Год назад на факультете ВМиК Московского университета мы со студентами проводили вечерний абсолютно неформальный семинар под условным названием "Операционная система UNIX". На самом деле, на этом семинаре обсуждались разнообразные вопросы архитектурной организации различных операционных систем, и иногда и систем управления базами данных. Хотя, конечно, основной состав семинара был заражен вирусом "UNIX". Так вот, двое моих студентов внимательно проштудировали одну из немногих хороших книг по архитектуре Windows NT и сделали развернутый доклад часа на четыре. Доклад сопровождался массой шуток и выкриков с места, но в результате все остались очень довольны, получив представление об NT изнутри.

Другой пример. На заре NT в завершение семинара, целиком посвященного ОС UNIX, было решено провести диспут (в стиле революционных традиций первых годов Советской власти) на тему "Придет ли NT на смену UNIX?". Мы с коллегой (тоже старым UNIX-истом) договорились, что я буду представлять сторону UNIX, а он - отстаивать преимущества NT. Естественно, мы оба хорошо знали UNIX, а NT (в то время) представляли в лучшем случае на уровне рядовых пользователей. Поэтому весовые категории участников диспута оказались существенно неравными, и несмотря на дружеские отношения и обладание чувством юмора к концу диспута мы благополучно переругались. Довольная публика в зале не наблюдалась.

Попробую умерить свои эмоции и немного более серьезно поговорить о достоинствах и недостатках ОС UNIX, о прошлом, настоящем и будущем этого явления.

Вы знаете, что и до и после появления ОС UNIX существовали гораздо более элегантные операционные системы: например, Miltics, Mach, Chorus и т.д. Красивые, основанные на единой идее, проектировавшиеся и разрабатывавшиеся выдающими специалистами. Мне нравятся эти ОС, я часто о них пишу, рассказываю студентам. Более того, некоторое время назад в Институте проблем кибернетики РАН, а затем в Институте системного программирования РАН в составе группы опытных специалистов в области операционных систем я участвовал в проектировании и разработки отечественной объектно-ориентированной операционной системы КЛОС. Тоже была очень красивая система.

Но только UNIX в своих разных ипостасях смог благополучно и с большой пользой прожить более 25 лет. В чем причина такого долголетия? Почему человек, вошедший в мир UNIX, не может, да и не хочет его покинуть? Почему за весь период использования ОС UNIX область применения этой ОС непрерывно расширялась? Чем, в конце концов, объяснить феномен университетов Беркли и Хельсинки, где независимо разработаны популярные некоммерческие варианты ОС UNIX?

Краткий перечень ответов на эти вопросы (возможно, неполный):

  • простота
  • мощность базового набора средств
  • развитость интерфейсов
  • демократичность
  • открытость
  • переносимость
Прокомментируем этот список более подробно.

По моему мнению, исходным побуждение к разработке ОС UNIX было стремление создать простую и понятную операционную среду. Простота начальных версий ОС UNIX во многом явилась следствием удачного выбора основных понятий, которые, с одной стороны, отражали основные потребности пользователей, а с другой - были интуитивно понятными: пользователь, терминал, программа, процесс, файл с примитивной внутренней структурой. На пальцах любой из этих понятий объясняется за считанные минуты. В среде классической ОС UNIX очень легко проектировать, разрабатывать и отлаживать программы. Создателям системы удалось найти удачный компромисс между разумной ограниченностью доступных средств (известно, что чем более ограничен средний программист, тем легче ему жить) и достаточностью этих средств для разработки широкого класса программ.

Базовый набор средств, опирающихся на эти понятия, оказался очень мощным. В частности, комбинируя средства, поддерживающие разработку программ, управление пользовательскими процессами, перенаправление ввода/вывода на основе абстрактной трактовки понятия файла, стало возможным динамически создавать сложные программы со внутренней асинхронностью из простых и небольших по размеру программных компонентов. Достаточно быстро в ядре ОС UNIX появилась поддержка взаимодействия независимо образованных процессов (именованные программные каналы, очереди сообщений, программные гнезда). Это позволило решать в среде ОС UNIX задачи, близкие по своему характеру к задачам "мягкого" реального времени. Разработка в университете Беркли стека сетевых протоколов TCP/IP, реализация этого стека в UNIX BSD.3 и стыковка TCP/IP с механизмом программных гнезд привели к тому, что ОС UNIX стала истинной сетевой операционной системой. Именно тогда Билл Джой произнес свою знаменитую фразу "Сеть - это компьютер". Протоколы TCP/IP положили основу Всемирной сети сетей Internet, а их комбинация с механизмом программных гнезд во многом способствовала становлению архитектурной концепции "клиент-сервер".

Удачной находкой явилась идея использования развитого командного языка в качестве базового интерфейса пользователя с операционной системой. Командные языки использовались и в предшествовавших ОС UNIX интерактивных операционных системах, но пользователи этих ОС всегда испытывали по меньшей мере неудобства при написании командных файлов (или, как принято называть их в теперешней молодежной программистской среде, скриптов). Семейство командных языков shell (Bourne-shell, C-shell, Korn-shell и т.д.) предоставляет пользователям мощные средства текстовой обработки, которые в сочетании с принятыми в ОС UNIX стандартными (и не обременительными) правилами написания новых команд позволяют, не выходя из сеанса взаимодействия с командным интерпретатором, создавать команды, комбинировать существующие команды и т.д. Конечно, по мере развития и удешевления аппаратуры графических видеотерминалов, в ОС UNIX не могли не появиться графические пользовательские интерфейсы. На сегодняшний день в основе большинства таких интерфейсов лежит разработанная в Массачусетском технологическом институте оконная система X (X Window System). Конечно, графический интерфейс удобнее строчного. Но тем не менее, значимость командных языков семейства shell от этого не уменьшилась. Каким бы убогим не было терминальное оснащение UNIX-компьютера, пользователь имеет все возможности взаимодействия с системой. Более того, трудно найти программиста, работающего в среде X, у которого хотя бы в одном окне экрана не был вызван традиционный строчный интерпретатор shell.

Трудно (а может быть, и не нужно) различать демократичность ОС UNIX и демократичность UNIX-сообщества. (Замечу, что под UNIX-сообществом я понимаю сообщество технических специалистов, связанных с использованием, разработкой, администрированием или сопровождением ОС UNIX. Как правило, я не отношу к этому сообществу продавцов. Обычно им достаточно все равно, чем торговать, лишь бы получить большую прибыль. Хотя я знаком с некоторым числом salesmen, давно уже торгующих ОС UNIX или UNIX-компьютерами, но так и не излечившихся от вируса UNIX.) Наверное, следует сказать так: демократичность UNIX-сообщества существует благодаря демократичности UNIX. ОС UNIX демократична, поскольку открывает любому квалифицированному пользователю или разработчику возможности своего совершенствования. UNIX-сообщество демократично, поскольку его члены имеют общую цель (независимую от используемой аппаратуры, используемой версии UNIX, конкретных требований нанимателя и т.д.) - получить более удобную, более надежную, более мощную операционную систему. Как правило, в мире UNIX существует очень небольшой объем скрываемого "know how". Предметом гордости является возможность опубликовать (в печати или в Сети) содержимое своей новой идеи или результаты новой разработки.

UNIX-сообщество не могло бы быть демократичным, если бы сама операционная система не была открытой. Под открытостью мы понимаем публичную доступность спецификаций интерфейсов, протоколов и даже внутренних алгоритмов работы системы. Открытость системы нужна пользователям (чтобы не испытывать неприятных потрясений при смене варианта ОС), разработчикам (чтобы иметь возможность внесения согласованных усовершенствований), продавцам (чтобы иметь возможность четко объяснить покупателю возможности его покупки). Спецификации интерфейсов и протоколов ОС UNIX публикуются в документах SVID, XPG, POSIX и частично приняты в качестве международных стандартов мобильных операционных систем. Открытость UNIX имела по меньшей мере два выдающихся последствия. Во-первых (это мое личное мнение), она способствовала становлению и внедрению в практику общей концепции Открытых Систем (грубо говоря и не вдаваясь в детали, я бы сформулировал ее так: следуй правильно подобранному набору признанных стандартов - и все будет хорошо). Во-вторых, именно открытость UNIX позволила одновременно существовать двум ветвям операционной системы: коммерческой ветви, развиваемой такими компаниями, как Santa Cruz Operation, Sun Soft, Digital Equipment, IBM, Hewlett Packard и т.д., и некоммерческой ветви, представленной разными вариантами UNIX BSD (FreeBSD, BSDNet и т.д.) и Linux. Феномен Linux вообще ошеломляет. Начиная с нуля, бывший студент Хельсинского университета Линус Торвальдс смог реализовать свое собственное ядро операционной системы, которое привлекло к коллоборации (как любят говорить физики) громадное число заинтересованных людей в Internet. Сегодня Linux - это качественная, развитая ОС, способная конкурировать с коммерческими вариантами ОС UNIX. Конференции по Linux собирают тысячи людей, а Линус не менее популярен в мире UNIX, чем Деннис Ритчи.

Переносимость следует понимать в двух смыслах. Во-первых, правильно написанное ядро ОС UNIX само обладает свойством простоты переноса на другую аппаратную платформу. Это стало возможным благодаря применению двух технологических приемов. (1) Большая часть ядра (и все дополнительное программное обеспечение) написана на машинно-независимом языке Си и сама является машинно-независимой. (2) Та часть ядра, которая не может быть машинно-независимой (включающая, например, компоненты, связанные с управлением виртуальной памятью на аппаратном уровне) обладает небольшими размерами и спроектирована в весьма модульной манере. Перепись этой части с учетом особенностей аппаратуры целевого компьютера не представляет собой неподъемную задачу. В результате, фактически, стало возможным иметь одну и ту же операционную среду (здесь я несколько идеализирую) на абсолютно разных аппаратных платформах. Во-вторых, даже при наличии на разных аппаратных платформах различающихся реализаций UNIX, которые соответствуют открытым спецификациям, можно сравнительно просто обеспечить переносимость прикладного программного обеспечения. Для этого нужно всего лишь не выходить за пределы специфицированных средств. Причем эти возможности распространяются даже на такие сложные "над ядерные" системы как СУБД. СУБД Oracle, предназначенная для использования на UNIX-платформах, имеет (почти) один и тот же исходный текст для любой конкретной платформы. Тексты СУБД Oracle, работающей в среде NT, существенно отличаются.

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

Имеется две возможности ругать ОС UNIX. В каждом конкретном варианте можно найти массу дефектов. Например, если говорить о классических реализациях (например, ранних выпусках System V), можно найти недостатки в организации механизма общесистемной буферизации, управлении файлами и т.д. Но дело в том, что в каждом следующем выпуске эти недостатки смягчаются или удаляются вовсе. Так что анализ этих недостатков - это дело скорее историков ОС UNIX, и мы на этом останавливаться не будем. Вторая возможность сказать "гадость" по поводу UNIX относится к некоторым абсолютным новшествам этой системы. Лично для меня соответствующим основанием является внедрение в ОС UNIX механизма "легковесных процессов" (в просторечии "threads"), т.е. процессов, которые совместно выполняются в общей виртуальной памяти. Не люблю я LWP (Light Weight Processes). Программисты среднего и старшего поколения все это проходили. Программирование с использованием LWP порождает многочисленные трудности, хотя и является на сегодняшний день единственным способом использования возможностей симметричных мультипроцессорных архитектур (SMP - Symmetric Multi Processors).

Ну вот, я похвалил и немного поругал UNIX, не сказав ни одного плохого слова про Microsoft. Да и нет в NT ничего плохого, кроме того, что эта система не обладает

  • простотой
  • демократичностью
  • открытостью
(Не давайте мне много говорить про NT, я слишком эмоционален!)

Каково будущее UNIX? Я оптимист, и надеюсь, что в недалеком будущем мы увидим 64-разрядные, высокомобильные, стандартизованные, надежные реализации системы, наличие которых позволит дожить операционной системе (надеюсь, вместе с нами) до 50 лет.

Комментарии: (0) | UNIX | 2006-05-29


Страница 3 из 4«1234 »