Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX β€” ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ срСда программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 114

Автор ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½ Π‘Ρ€Π°ΠΉΠ°Π½ Уилсон

И снова о
make

По ΠΌΠ΅Ρ€Π΅ увСличСния исходного тСкста ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

hoc
возрастаСт Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ мСханичСски ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ измСнСния ΠΈ взаимозависимости. ΠΠ΅ΠΎΡ†Π΅Π½ΠΈΠΌΡƒΡŽ ΠΏΠΎΠΌΠΎΡ‰ΡŒ здСсь ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π°
make
: ΠΎΠ½Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ процСсс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ½Π°Ρ‡Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ (ΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° с ошибками) ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ для этого ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ».

ΠœΡ‹ сдСлаСм Π΅Ρ‰Π΅ Π΄Π²Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² Ρ„Π°ΠΉΠ»Π΅

makefile
. ΠŸΠ΅Ρ€Π²Π°Ρ связана с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ хотя нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ зависят ΠΎΡ‚ констант, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π² yacc ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ„Π°ΠΉΠ»Π°
y.tab.h
, Π½Π΅Ρ‚ Π½ΡƒΠΆΠ΄Ρ‹ ΠΈΡ… ΠΏΠ΅Ρ€Π΅Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ссли Π½Π΅ измСнились сами константы, Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² тСкстС Π‘ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°
hoc.y
Π½Π΅ влияСт Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹. Π’ Π½ΠΎΠ²ΠΎΠΉ вСрсии
makefile
Ρ„Π°ΠΉΠ»Ρ‹
.o
зависят ΠΎΡ‚ Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°
x.tab.h
, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ измСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π·Π°ΠΌΠ΅Π½Π΅ содСрТимого Ρ„Π°ΠΉΠ»Π°
y.tab.h
. Вторая модификация основана Π½Π° Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ для
pr
(ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ исходных Ρ„Π°ΠΉΠ»ΠΎΠ²) зависит лишь ΠΎΡ‚ самих исходных Ρ„Π°ΠΉΠ»ΠΎΠ², Π° ΠΈΠΌΠ΅Π½Π½ΠΎ, ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹.

ΠŸΠ΅Ρ€Π²Π°Ρ модификация позволяСт сущСствСнно ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ врСмя Π² случаС Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΊΠΎΠ³Π΄Π° Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° постоянна, Π° сСмантичСскиС дСйствия ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ (обычная ситуация). Π’Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ обСспСчиваСт экономию Π±ΡƒΠΌΠ°Π³ΠΈ.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ

makefile
для
hoc4
:

YFLAGS = -d

OBJS = hoc.o code.o init.o math.o symbol.o

hoc4: $(OBJS)

Β Β Β Β Β  cc $(OBJS) -lm -o hoc4

hoc.o code.o init.o symbol.o: hoc.h

code.o init.o symbol.o: x.tab.h

x.tab.h: y.tab.h

Β Β Β Β Β Β -cmp -s x.tab.h y.tab.h || cp y.tab.h x.tab.h

pr: hoc.y hoc.h code.c init.c math.c symbol.c

Β Β Β Β Β  @pr $?

Β Β Β Β Β  @touch pr

clean:

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

Π‘ΠΈΠΌΠ²ΠΎΠ»

'-'
ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ
cmp
Π΄Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅
make
ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Π°ΠΆΠ΅ Π² случаС Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ
cmp
; это позволяСт Π½Π΅ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈ ΠΏΡ€ΠΈ Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ Ρ„Π°ΠΉΠ»Π΅
x.tab.h
(Ρ„Π»Π°Π³
-s
прСдписываСт ΠΊΠΎΠΌΠ°Π½Π΄Π΅
cmp
Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Π½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ). ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡ
$?
раскрываСтся ΠΊΠ°ΠΊ список элСмСнтов ΠΈΠ· ΠΏΡ€Π°Π²ΠΈΠ»Π° с ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ вСрсиСй. К соТалСнию, Ρ„ΠΎΡ€ΠΌΠ° записи Π²
makefile
слабо связана с обозначСниями Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π΅.

ΠŸΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΡˆΠ΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ (Π² ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Ρ‡Ρ‚ΠΎ всС Ρ„Π°ΠΉΠ»Ρ‹ послСднСй вСрсии):

$ touch hoc.y
ИзмСним врСмя для Ρ„Π°ΠΉΠ»Π° hoc.y

$ make

yacc -d hoc.y

Β conflicts: 1 shift/reduce

сс -с y.tab.c

rm y.tab.c

mv y.tab.o hoc.o

cmp -s x.tab.h y.tab.h || cp y.tab.h x.tab.h

cc hoc.o code.o init.o math.o symbol.o -lm -o hoc4

$ make -n p
r ΠŸΠ΅Ρ‡Π°Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²

pr hoc.y

touch pr

$

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅

hoc.y
, Ρ„Π°ΠΉΠ»Ρ‹ Π½Π΅ ΠΏΠ΅Ρ€Π΅Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ„Π°ΠΉΠ»
y.tab.h
остался Ρ‚Π΅ΠΌ ΠΆΠ΅.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8.10

Π‘Π΄Π΅Π»Π°ΠΉΡ‚Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ стСка ΠΈ массива

prog
динамичСскими, Ρ‡Ρ‚ΠΎΠ±Ρ‹ для
hoc4
всСгда Ρ…Π²Π°Ρ‚Π°Π»ΠΎ объСма памяти, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, ΠΎΠ±Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
malloc
.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8.11

Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚Π΅

hoc4
Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
execute
вмСсто Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎ Π²ΠΈΠ΄Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ
+
. Каково ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ вСрсий ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ исходного тСкста ΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния? Как ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡ… ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎ слоТности развития ΠΈ поддСрТания?

8.5 Π­Ρ‚Π°ΠΏ 5: структуры управлСния ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ

ВСрсия

hoc5
ΠΎΠΏΡ€Π°Π²Π΄Ρ‹Π²Π°Π΅Ρ‚ всС Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹, связанныС с созданиСм ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°. Π’ Π½Π΅Π΅ допустимо Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹
if-else
Β  ΠΈ
while
, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌ языка Π‘ΠΈ, Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ
{
ΠΈ
}
ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€
print
. Она содСрТит ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ (
>
,
>=
, ΠΈ Ρ‚.Π΄.), Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ
AND
,
OR
,
&&
ΠΈ
||
. (Π”Π²Π΅ послСдниС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ вычислСния слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ, хотя Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ принят Π² Π‘ΠΈ; Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ ΠΎΠ±Π° условия, Π΄Π°ΠΆΠ΅ Ссли Π² этом Π½Π΅Ρ‚ нСобходимости.)

Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ

hoc5
Π΄ΠΎΠΏΠΎΠ»Π½ΡΡŽΡ‚ лСксСмы, Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ символы ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π° для
if
,
while
, Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Ρ… скобок ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠ½Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π°ΡΡŒ нСсколько большС, Π½ΠΎ Π½Π΅ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… вСрсий (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€Π°Π²ΠΈΠ» для
if
ΠΈ
while
):

$ cat hoc.y

%{

#include "hoc.h"

#define code2(c1,c2) code(c1); code(c2)

#define code3(c1,c2,c3) code(c1); code(c2); code(c3)

%}

%union {

Β Symbol *sym; /* symbol table pointer */

Β Inst *inst; /* machine instruction */

}