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

Здесь есть возможность читать онлайн «Брайан Керниган - UNIX — универсальная среда программирования» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва, Год выпуска: 1992, ISBN: 1992, Издательство: Финансы и статистика, Жанр: ОС и Сети, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

UNIX — универсальная среда программирования: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «UNIX — универсальная среда программирования»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

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

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

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

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

$ cat hoc.h

typedef struct Symbol { /* symbol table entry */

char *name;

short type; /* VAR, BLTIN, UNDEF */

union {

double val; /* if VAR */

double (*ptr)(); /* if BLTIN */

} u;

struct Symbol *next; /* to link to another */

} Symbol;

Symbol *install(), *lookup();

typedef union Datum { /* interpreter stack type */

double val;

Symbol *sym;

} Datum;

extern Datum pop();

typedef int (*Inst)(); /* machine instruction */

#define STOP (Inst) 0

extern Inst prog[];

extern eval(), add(), sub(), mul(), div(), negate(), power();

extern assign(), bltin(), varpush(), constpush(), print();

$

Процедуры, выполняющие машинные команды и управляющие стеком, хранятся в файле с именем code.c. Поскольку содержимое файла составляет около 150 строк, мы покажем его по частям:

$ cat code.c

#include "hoc.h"

#include "y.tab.h"

#define NSTACK 256

static Datum stack[NSTACK]; /* the stack */

static Datum *stackp; /* next free spot on stack */

#define NPROG 2000

Inst prog[NPROG]; /* the machine */

Inst *progp; /* next free spot for code generation */

Inst *pc; /* program counter during execution */

initcode() /* initialize for code generation */

{

stackp = stack;

progp = prog;

}

...

Управление стеком осуществляется путем обращений к двум процедурам pushи pop:

push(d) /* push d onto stack */

Datum d;

{

if (stackp >= &stack[NSTACK])

execerror("stack overflow", (char*)0);

*stackp++ = d;

}

Datum pop() /* pop and return top elem from stack */

{

if (stackp <= stack)

execerror("stack underflow", (char*)0);

return *--stackp;

}

Машинные команды создаются в процессе разбора при обращении к функции code, которая просто вносит команду на первое свободное место массива prog. Она возвращает адрес команды (который не используется в hoc4):

Inst *code(f) /* install one instruction or operand */

Inst f;

{

Inst *oprogp = progp;

if (progp >= &prog[NPROG])

execerror("program too big", (char*)0);

*progp++ = f;

return oprogp;

}

Выполнение машинной команды фантастически тривиально, а как мала процедура, которая "выполняет" машинные команды, когда уже определены все программы!

execute(p) /* run the machine */

Inst *p;

{

for (pc = p; *pc != STOP; )

(*(*pc++))();

}

В цикле выполняется функция, указываемая командой, на которую в свою очередь указывает счетчик команд pc. Значение pcувеличивается, что делает возможным выбор очередной команды. Команда с кодом операции STOPзавершает цикл. Некоторые команды, например constpushи varpush, сами увеличивают pc, чтобы "перескочить" через любые аргументы, следующие за командой.

constpush() /* push constant onto stack */

{

Datum d;

d.val = ((Symbol*)*pc++)->u.val;

push(d);

}

varpush() /* push variable onto stack */

{

Datum d;

d.sym = (Symbol*)(*pc++);

push(d);

}

Оставшаяся часть описания машины проста. Так, арифметические операции в основном те же, и создаются они редактированием одного образца. Ниже показана операция add:

add() /* add top two elems on stack */

{

Datum d1, d2;

d2 = pop();

d1 = pop();

d1.val += d2.val;

push(d1);

}

Другие процедуры также просты:

eval() /* evaluate variable on stack */

{

Datum d;

d = pop();

if (d.sym->type == UNDEF)

execerror("undefined variable", d.sym->name);

d.val = d.sym->u.val;

push(d);

}

assign() /* assign top value to next value */

{

Datum d1, d2;

d1 = pop();

d2 = pop();

if (d1.sym->type != VAR && d1.sym->type != UNDEF)

execerror("assignment to non-variable", d1.sym->name);

d1.sym->u.val = d2.val;

d1.sym->type = VAR;

push(d2);

}

print() /* pop top value from stack, print it */

{

Datum d;

d = pop();

printf("\t%.8g\n", d.val);

}

bltin() /* evaluate built-in on top of stack */

{

Datum d;

d = pop();

d.val = (*(double (*)())(*pc++))(d.val);

push(d);

}

Самый сложный момент здесь операция приведения в функции, которая требует, чтобы *pcрассматривался как указатель на функцию, возвращающую double, и эта функция выполняется с d.valв качестве аргумента.

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

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «UNIX — универсальная среда программирования»

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


Отзывы о книге «UNIX — универсальная среда программирования»

Обсуждение, отзывы о книге «UNIX — универсальная среда программирования» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x