-->

UNIX — универсальная среда программирования

На нашем литературном портале можно бесплатно читать книгу UNIX — универсальная среда программирования, Керниган Брайан Уилсон-- . Жанр: ОС и Сети / Интернет. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
UNIX — универсальная среда программирования
Название: UNIX — универсальная среда программирования
Дата добавления: 16 январь 2020
Количество просмотров: 434
Читать онлайн

UNIX — универсальная среда программирования читать книгу онлайн

UNIX — универсальная среда программирования - читать бесплатно онлайн , автор Керниган Брайан Уилсон

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

shell.

 

Для программистов-пользователей операционной системы UNIX.

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

Перейти на страницу:

}

double Sqrt(x)

 double x;

{

 return errcheck(sqrt(x), "sqrt");

}

double Exp(x)

 double x;

{

 return errcheck(exp(x), "exp");

}

double Pow(x, y)

 double x, y;

{

 return errcheck(pow(x,y), "exponentiation");

}

double integer(x)

 double x;

{

 return (double)(long)x;

}

double errcheck(d, s) /* check result of library call */

 double d;

 char *s;

{

 if (errno == EDOM) {

  errno = 0;

  execerror(s, "argument out of domain");

 } else if (errno == ERANGE) {

  errno = 0;

  execerror(s, "result out of range");

 }

 return d;

}

Любопытная, хотя грамматически неясная, диагностики появится при запуске yacc с новой грамматикой:

$ yacc hoc.y

conflicts: 1 shift/reduce

$

Сообщение

shift/reduce
означает, что грамматика
hoc3
неоднозначна: единственная входная строка

x=1

может быть разобрана двумя способами.

UNIX — универсальная среда программирования - img_5.jpeg

Анализатор может решить, что присв сводится к выраж, а затем к список, как показано в левом дереве разбора, или что нужно применить заключающий символ

n
сразу (shift — перенос) и преобразовать все в список, не используя промежуточных выводов, как в правом дереве разбора. Встретив неоднозначность,
yacc
выбирает перенос, так как это почти всегда правильное решение для реальных грамматик. Вы должны понимать такие сообщения, чтобы быть уверенным, что
yacc
сделал правильный выбор [16]. Запуск
yacc
с флагом
-v
порождает обширный файл с именем
y.output
, который поможет вам найти причины конфликтов.

Упражнение 8.5

В данной версии

hoc3
допустимо присваивание:

PI=3

Хорошо ли это? Как бы вы изменили

hoc3
, чтобы запретить присваивание "констант"?

Упражнение: 8.6

Добавьте к грамматике встроенную функцию

atan2(x, y)
для вычисления величины угла, тангенс которого равен
x/y
. Добавьте встроенную функцию
rand()
, вырабатывающую случайные вещественные числа, равномерно распределенные на интервале [0,1). Как бы вам пришлось изменить грамматику, чтобы разрешить встроенные функции с разным числом аргументов?

Упражнение 8.7

Как ввести дополнительное средство для выполнения команд прямо в

hoc
, подобно операции
!
в программах UNIX?

Упражнение 8.8

Переработайте текст

math.c
так, чтобы можно было использовать таблицу, а не предложенное выше множество идентичных функций.

Еще одно замечание относительно
make

Поскольку теперь программа

hoc3
размещается не в одном, а в пяти файлах,
makefile
становится более сложным:

$ cat makefile

YFLAGS = -d # force creation of y.tab.h

OBJS = hoc.o init.o math.o symbol.o # abbreviation

hoc3: $(OBJS)

      cc $(OBJS) -lm -o hoc3

hoc.o: hoc.h

init.o symbol.o: hoc.h y.tab.h

pr:

       @pr hoc.y hoc.h init.c math.c symbol.c makefile

clean:

       rm -f $(OBJS) y.tab.[ch]

$

Строка

YFLAGS = -d
добавляет флаг
-d
в командную строку запуска yacc, создаваемую
make
. Этот флаг предписывает yacc создать файл
y.tab.h
, содержащий операторы
#define
. Строка
OBJS = ...
вводит сокращение для записи конструкции, используемой последовательно несколько раз. Синтаксис здесь не такой, как для переменных интерпретатора, скобки обязательны. Флаг
-lm
указывает, что математические функции нужно искать в библиотеке
libm.a
.

Теперь программа

hoc3
образуется из четырех файлов
, причем некоторые из них в свою очередь зависят от файлов
.h
. "Зная" эти зависимости,
make
может рассчитать, какая требуется перетрансляция в случае изменения любого из указанных файлов. Если вы хотите выяснить действия
make
, не запуская процесс, то попробуйте ввести команду

Перейти на страницу:
Комментариев (0)
название