YAzyk programmirovaniya Si.
Proizvodstvenno-vnedrencheskij kooperativ
"I N T E R F E J S"
Dialogovaya Edinaya Mobil'naya
Operacionnaya Sistema
Demos/P 2.1
YAzyk programmirovaniya Si.
Moskva
1988
Opisan universal'nyj yazyk programmirovaniya Si. Prive-
deny struktura i sintaksis yazyka, pravila napisaniya prog-
ramm, dany nachal'nye svedeniya o vzaimodejstvii programm na
Si s operacionnoj sistemoj Demos.
* 1. VVEDENIE
YAzyk Si - eto universal'nyj yazyk programmirovaniya, dlya
kotorogo harakterny ekonomichnost' vyrazheniya, sovremennyj
nabor operatorov i tipov dannyh. YAzyk Si ne yavlyaetsya ni
yazykom "ochen' vysokogo urovnya", ni "bol'shim" yazykom, i ne
prednaznachaetsya dlya nekotoroj special'noj oblasti primene-
niya, no otsutstvie ogranichenij i obshchnost' yazyka delayut ego
dlya mnogih zadach bolee udobnym i effektivnym, chem yazyki,
predpolozhitel'no bolee moshchnye. Operacionnaya sistema, kompi-
lyator s yazyka Si i po sushchestvu vse prikladnye programmy sis-
temy "DEMOS" napisany na Si. YAzyk Si ne svyazan s kakimi-
libo opredelennymi apparatnymi sredstvami ili sistemami, i
na nem legko pisat' programmy, kotorye mozhno propuskat' bez
izmenenij na lyuboj |VM, imeyushchej Si-kompilyator.
YAzyk Si yavlyaetsya universal'nym yazykom programmirovaniya.
On pervonachal'no poyavilsya v operacionnoj sisteme UNIX, i
razvivalsya kak osnovnoj yazyk sistem, sovmestimyh s OS UNIX.
Sam yazyk , odnako, ne svyazan s kakoj-libo odnoj operacionnoj
sistemoj ili mashinoj; i hotya ego nazyvayut yazykom sistemnogo
programmirovaniya, tak kak on udoben dlya napisaniya operacion-
nyh sistem, on mozhet ispol'zovat'sya dlya napisaniya lyubyh
bol'shih vychislitel'nyh programm, programm dlya obrabotki
tekstov i baz dannyh.
YAzyk Si - eto yazyk otnositel'no "nizkogo urovnya". |to
oznachaet, chto Si imeet delo s ob容ktami togo zhe vida, chto i
bol'shinstvo |VM, a imenno, s simvolami, chislami i adresami.
Oni mogut ob容dinyat'sya i peresylat'sya posredstvom obychnyh
arifmeticheskih i logicheskih operacij, osushchestvlyaemyh real'-
nymi |VM.
V yazyke Si otsutstvuyut operacii, imeyushchie delo nepos-
redstvenno s sostavnymi ob容ktami, takimi kak stroki simvo-
lov, mnozhestva, spiski ili s massivami, rassmatrivaemymi kak
celoe. Zdes', naprimer, net nikakogo analoga operaciyam PL/1,
operiruyushchim s massivami i strokami. YAzyk ne predostavlyaet
nikakih drugih vozmozhnostej raspredeleniya pamyati, krome sta-
ticheskogo opredeleniya i mehanizma stekov, obespechivaemogo
lokal'nymi peremennyh funkcij. Sam po sebe yazyk Si ne obes-
pechivaet nikakih vozmozhnostej vvoda-vyvoda. Vse eti meha-
nizmy vysokogo urovnya dolzhny obespechivat'sya yavno vyzyvaemymi
funkciyami.
Analogichno, yazyk Si predlagaet tol'ko prostye, posledo-
vatel'nye konstrukcii upravleniya: proverki, cikly, gruppiro-
vanie i podprogrammy, no ne mul'tiprogrammirovanie, paral-
lel'nye operacii, sinhronizaciyu ili soprogrammy.
Uderzhanie yazyka v skromnyh razmerah daet real'nye prei-
mushchestva. Tak kak Si otnositel'no mal, on ne trebuet mnogo
mesta dlya svoego opisaniya i mozhet byt' bystro vyuchen.
-1-
Kompilyator s Si mozhet byt' prostym i kompaktnym. |to obes-
pechivaet vysokuyu stepen' mobil'nosti yazyka. Poskol'ku tipy
dannyh i struktury upravleniya, imeyushchiesya v Si, neposredst-
venno podderzhivayutsya bol'shinstvom sushchestvuyushchih |VM, biblio-
teka, neobhodimaya vo vremya progona izolirovannyh programm,
okazyvaetsya ochen' malen'koj. Na SM-4, naprimer , ona soder-
zhit tol'ko programmy dlya 32-bitovogo umnozheniya i deleniya i
dlya upryatyvaniya i vosstanovleniya registrov pri vhode v funk-
ciyu. Konechno, kazhdaya realizaciya obespechivaet ischerpyvayushchuyu,
sovmestimuyu biblioteku funkcij dlya vypolneniya operacij
vvoda-vyvoda, obrabotki strok i raspredeleniya pamyati, no tak
kak obrashchenie k nim osushchestvlyaetsya tol'ko yavno, mozhno, esli
neobhodimo, izbezhat' ih vyzova; eti funkcii mogut byt' kom-
paktno napisany na samom Si.
Opyat' zhe iz-za togo, chto yazyk Si otrazhaet vozmozhnosti
sovremennyh komp'yuterov, programmy na Si okazyvayutsya dosta-
tochno effektivnymi, tak chto ne voznikaet pobuzhdeniya pisat'
vmesto etogo programmy na yazyke assemblera. Hotya Si soot-
vetstvuet vozmozhnostyam mnogih |VM, on ne zavisit ot kakoj-
libo konkretnoj arhitektury mashiny i v silu etogo bez osobyh
usilij pozvolyaet pisat' "perenosimye" programmy, t.e. prog-
rammy, kotorye mozhno propuskat' bez izmenenij na razlichnyh
apparatnyh sredstvah.
YAzyk Si ne yavlyaetsya yazykom so strogimi tipami dannyh v
smysle Paskalya ili Algola-68. On sravnitel'no snishoditelen
k preobrazovaniyu dannyh, hotya i ne budet bujno preobrazovy-
vat' tipy dannyh podobno yazyku PL/1. Kompilyator ne predus-
matrivaet nikakoj proverki indeksov massivov, tipov argumen-
tov i t.d. vo vremya vypolneniya programmy.
V teh situaciyah, kogda zhelatel'na strogaya proverka
tipov, ispol'zuetsya special'naya programma lint. Programma
lint ne generiruet mashinnogo koda, a delaet ochen' stroguyu
proverku vseh teh storon programmy, kotorye mozhno prokontro-
lirovat' vo vremya kompilyacii i zagruzki. Ona opredelyaet
nesootvetstvie tipov, nesovmestimost' argumentov, neispol'-
zovannye ili ochevidnym obrazom neinicializirovannye peremen-
nye, potencial'nye trudnosti perenosimosti i t.d.
Iz za togo, chto v yazyke otsutstvuyut sredstva
vvoda/vyvoda i t.p., pri programmirovanii na nem sushchestven-
nuyu rol' igraet biblioteka standartnyh programm, osushchestvlya-
yushchih vzaimodejstvie s sistemoj. Vo vseh sistemah, sovmesti-
myh s OS UNIX, k kotorym otnositsya i DEMOS, sushchestvuet sov-
mestimyj nabor programm dlya vvoda/vyvoda, upravleniya
pamyat'yu, preobrazovaniya dannyh i vypolnyayushchih drugie funkcii,
ispol'zovanie kotoryh obespechivaet vozmozhnost' perenosa
programm na drugie |VM.
V dannom dokumente opisyvaetsya yazyk Si, rasshireniya,
obespechivaemye special'nym preprocessorom (fakticheski oni
-2-
voshli uzhe v ponyatie "yazyk Si"), standartnaya biblioteka
vvoda/vyvoda, i dayutsya nachal'nye svedeniya o vzaimodejstvii
programm na Si s OS DEMOS. Polnoe opisanie bibliotechnyh
programm imeetsya v rukovodstve programmista OS DEMOS (chasti
3 i 4), i v operativnoj dokumentacii man(2) i man(3). Horo-
shim uchebnikom po yazyku Si yavlyaetsya kniga [1], kratkoe for-
mal'noe opisanie yazyka privedeno v [2].
V tekste vstrechayutsya primechaniya, otnosyashchiesya k realiza-
cii yazyka Si v OS DEMOS. Takie primechaniya vydelyayutsya verti-
kal'noj chertoj sprava (kak vydelen dannyj abzac).
* 2. SINTAKSICHESKAYA NOTACIYA
V ispol'zuemoj v etom rukovodstve sintaksicheskoj nota-
cii sintaksicheskie kategorii zapisyvayutsya russkimi bukvami i
simvolom "_", a vse ostal'nye simvoly rassmatrivayutsya kak
liternye (to est' izobrazhayushchie sami sebya). Al'ternativnye
kategorii perechislyayutsya na otdel'nyh strochkah. Neobyazatel'-
nyj simvol, terminal'nyj ili neterminal'nyj, ukazyvaetsya
indeksom "neob", tak chto
{ vyrazhenie }
neob
ukazyvaet na neobyazatel'noe vyrazhenie, zaklyuchennoe v figur-
nyh skobkah. Sintaksis opisyvaetsya v Prilozhenii 1.
Esli opisanie ne pomeshchaetsya na odnoj stroke, ono pro-
dolzhaetsya na sleduyushchej s nekotorym sdvigom vpravo, naprimer:
opisanie_struktury:
specifikator_tipa
spisok_opisatelej_struktury
Zdes' sleduet chitat':
opisanie_struktury:
specifikator_tipa spisok_opisatelej_struktury
Esli sdelan razbor vhodnogo potoka na leksemy vplot' do
dannogo simvola, to v kachestve sleduyushchej leksemy beretsya
samaya dlinnaya stroka simvolov,
IBM/370 (OS-360) 7 simvolov, 1 registr
VAX 11 (UNIX) 7 simvolov, 2 registra
2.1. Klyuchevye slova
Sleduyushchie identifikatory zarezervirovany dlya ispol'zo-
vaniya v kachestve klyuchevyh slov i ne mogut ispol'zovat'sya
inym obrazom:
-3-
int extern else
char register for
float typedef do
double static while
struct goto switch
union return case
long sizeof default
short break entry
unsigned continue
auto if
Klyuchevoe slovo entry v nastoyashchee vremya ne ispol'zuetsya
kakim-libo kompilyatorom; ono zarezervirovano dlya ispol'zova-
niya v budushchem. V nekotoryh realizaciyah rezerviruyutsya takzhe
slova fortran i asm.
2.2. Konstanty
Imeetsya neskol'ko vidov konstant, kotorye perechisleny
nizhe.
2.2.1. Celye konstanty
Celaya konstanta, sostoyashchaya iz posledovatel'nosti cifr,
schitaetsya vos'merichnoj, esli ona nachinaetsya s 0 (cifra
nul'), i desyatichnoj v protivnom sluchae. Cifry 8 i 9 imeyut
vos'merichnye znacheniya 10 i 11 sootvetstvenno. Posledova-
tel'nost' cifr, kotoroj predshestvuyut simvoly 0h (nul', h-
malen'koe) ili 0h (nul' X-bol'shoe), rassmatrivaetsya kak
shestnadcatirichnoe celoe. SHestnadcatirichnye cifry vklyuchayut
bukvy ot a (malen'koe) ili A (bol'shoe) do f (malen'koe) ili
F (bol'shoe) so znacheniyami ot 10 do 15. Desyatichnaya konstanta,
velichina kotoroj prevyshaet naibol'shee mashinnoe celoe so zna-
kom, schitaetsya dlinnoj; vos'merichnaya ili shestnadcatirichnaya
konstanta, kotoraya prevyshaet naibol'shee mashinnoe celoe bez
znaka, takzhe schitaetsya dlinnoj.
2.2.2. Dlinnye (long) konstanty
Desyatichnaya, vos'merichnaya ili shestnadcatirichnaya kons-
tanta, za kotoroj neposredstvenno sleduet l (el'-malen'koe)
ili L (el'-bol'shoe), yavlyaetsya dlinnoj konstantoj. Na nekoto-
ryh mashinah celye i dlinnye znacheniya mogut rassmatrivat'sya
kak identichnye.
2.2.3. Simvol'nye konstanty
Simvol'naya konstanta - eto simvol, zaklyuchennyj v odi-
nochnye kavychki, kak, naprimer, 'h'. Znacheniem simvol'noj
konstanty yavlyaetsya chislennoe znachenie etogo simvola v mashin-
nom predstavlenii nabora simvolov.
-4-
Nekotorye negraficheskie simvoly, odinochnaya kavychka ' i
obratnaya kosaya cherta \ mogut byt' predstavleny dvumya simvo-
lami v sootvetstvii so sleduyushchej tablicej uslovnyh posledo-
vatel'nostej:
Nazvanie Kod Oboznachenie
novaya stroka 012 \n
gorizontal'naya tabulyaciya 011 \t
simvol vozvrata na odnu 010 \v
poziciyu
vozvrat karetki 015 \r
perehod na novuyu stranicu 014 \f
obratnaya kosaya cherta 0133 \\
odinochnaya kavychka 047 \'
proizvol'nyj simvol 0ddd \ddd
Uslovnaya posledovatel'nost' \ddd sostoit iz obratnoj
kosoj cherty, za kotoroj sleduyut 1, 2 ili 3 vos'merichnyh
cifry, kotorye rassmatrivayutsya kak zadayushchie znachenie zhelae-
mogo simvola. Special'nym sluchaem etoj konstrukcii yavlyaetsya
posledovatel'nost' \0 (za nulem ne sleduet cifra), kotoraya
opredelyaet nulevoj simvol. Esli sleduyushchij za obratnoj kosoj
chertoj simvol ne sovpadaet s odnim iz ukazannyh, to obratnaya
kosaya cherta ignoriruetsya.
2.2.4. Veshchestvennye konstanty
Veshchestvennaya konstanta sostoit iz celoj chasti, desyatich-
noj tochki, drobnoj chasti, bukvy e (malen'kaya) ili E (bol'-
shaya) i celoj eksponenty s neobyazatel'nym znakom. Kak celaya,
tak i drobnaya chast' yavlyayutsya posledovatel'nost'yu cifr. Libo
celaya, libo drobnaya chast' (no ne obe) mozhet otsutstvovat';
libo desyatichnaya tochka, libo e i eksponenta (no ne to i dru-
goe odnovremenno) mozhet otsutstvovat'. Veshchestvennye kons-
tanty v bol'shinstve realizacij schitayutsya konstantami dvojnoj
tochnosti.
2.3. Stroki
Stroka - eto posledovatel'nost' simvolov, zaklyuchennaya v
dvojnye kavychki, kak, naprimer, "...". Stroka imeet tip mas-
siv simvolov i klass pamyati static (sm. nizhe). Stroka inici-
alizirovana ukazannymi v nej simvolami. Vse stroki, dazhe
identichno zapisannye, schitayutsya razlichnymi. Kompilyator
pomeshchaet v konec kazhdoj stroki nulevoj bajt \0, s tem chtoby
prosmatrivayushchaya stroku programma mogla opredelit' ee konec.
Pered stoyashchim vnutri stroki simvolom dvojnoj kavychki " dol-
zhen byt' postavlen simvol obratnoj kosoj cherty \; krome
togo, mogut ispol'zovat'sya te zhe uslovnye posledovatel'-
nosti, chto i v simvol'nyh konstantah. Obratnaya kosaya cherta
\, za kotoroj neposredstvenno sleduet simvol novoj stroki,
-5-
ignoriruetsya.
Imeyutsya makroprocessornye sredstva, pozvolyayushchie ob容di-
nyat' sovpadayushchie stroki pri translyacii s cel'yu ekonomii
pamyati (sm. komandu xstr).
2.4. Harakteristiki apparatnyh sredstv
Sleduyushchaya nizhe tablica summiruet nekotorye svojstva
apparatnogo oborudovaniya, kotorye menyayutsya ot mashiny k
mashine. Hotya oni i vliyayut na perenosimost' programm, na
praktike oni predstavlyayut men'shuyu problemu, chem eto mozhet
kazat'sya zaranee.
Tablica 1.
-----------------------------------------
| CM-|VM IBM 370 (OS) VAX-11 |
| KOI-8 ebcdic ASCII |
| char 8 bit 8 bit 8 bit |
| int 16 32 32 |
| short 16 16 16 |
| long 32 32 32 |
| float 32 32 32 |
| double 64 64 64 |
| range -38/+38 -76/+76 -76/+76 |
|_______________________________________|
* 3. OB'EKTY YAZYKA SI
3.1. Interpretaciya identifikatorov
S kazhdym identifikatorom v Si svyazano dva atributa: ego
klass pamyati i ego tip. Klass pamyati opredelyaet mesto i
vremya hraneniya pamyati, svyazannoj s identifikatorom; tip
opredelyaet smysl velichin, nahodyashchihsya v pamyati, opredelennoj
pod identifikatorom.
Imeyutsya chetyre klassa pamyati: avtomaticheskaya, statiches-
kaya, vneshnyaya i registrovaya. Avtomaticheskie peremennye yavlya-
yutsya lokal'nymi dlya kazhdogo vyzova bloka i ischezayut pri
vyhode iz etogo bloka. Staticheskie peremennye yavlyayutsya
lokal'nymi, no sohranyayut svoi znacheniya dazhe posle togo, kak
upravlenie peredaetsya za predely bloka. Vneshnie peremennye
sushchestvuyut i sohranyayut svoi znacheniya v techenie vypolneniya
vsej programmy i mogut ispol'zovat'sya dlya svyazi mezhdu funk-
ciyami, v tom chisle i mezhdu nezavisimo skompilirovannymi
funkciyami. Registrovye peremennye hranyatsya (esli eto voz-
mozhno) v bystryh registrah mashiny; podobno avtomaticheskim
peremennym oni yavlyayutsya lokal'nymi dlya kazhdogo bloka i ische-
zayut pri vyhode iz etogo bloka.
V yazyke Si predusmotreno neskol'ko osnovnyh tipov
ob容ktov:
-6-
Simvol'nyj.
- Ob容kty, opisannye kak simvoly (char), dostatochno
veliki, chtoby hranit' lyuboj chlen iz sootvetstvuyushchego
dannoj realizacii vnutrennego nabora simvolov, i esli
dejstvitel'nyj simvol iz etogo nabora simvolov hra-
nitsya v simvol'noj peremennoj, to ee znachenie ekviva-
lentno celomu kodu etogo simvola. V simvol'nyh pere-
mennyh mozhno hranit' i drugie velichiny, no realizaciya
budet mashinno-zavisimoj. (Na SM |VM znachenie simvol'-
nyh peremennyh izmenyaetsya ot -0177 do 0177.)
Celyj.
- Mozhno ispol'zovat' do treh razmerov celyh, opisyvae-
myh kak short int, int i long int. Dlinnye celye
zanimayut ne men'she pamyati, chem korotkie, no v konk-
retnoj realizacii mozhet okazat'sya, chto libo korotkie
celye, libo dlinnye celye, libo te i drugie budut
ekvivalentny prostym celym. "Prostye" celye imeyut
estestvennyj razmer, predusmatrivaemyj arhitekturoj
ispol'zuemoj mashiny; drugie razmery vvodyatsya dlya
udovletvoreniya special'nyh potrebnostej.
Bezznakovyj.
- Celye bez znaka, opisyvaemye kak unsigned, podchinya-
yutsya zakonam arifmetiki po modulyu 2**n, gde n - chislo
bitov v ih predstavlenii. (Na CM-|VM dlinnye veli-
chiny bez znaka ne predusmotreny).
Veshchestvennyj.
- Veshchestvennye odinarnoj tochnosti (float) i veshchestven-
nye dvojnoj tochnosti (double) v nekotoryh realizaciyah
mogut byt' sinonimami. (Na SM |VM float zanimaet 32
bita pamyati, a double - 64).
V yazyke net logicheskogo tipa dannyh, a v kachestve logicheskih
znachenij ispol'zuyutsya celye "0" - "lozh'" i "1" - "istina"
(pri proverkah lyuboe celoe, ne ravnoe 0, traktuetsya kak
"istina").
Poskol'ku ob容kty upomyanutyh vyshe tipov mogut byt'
razumno interpretirovany kak chisla, eti tipy budut nazy-
vat'sya arifmeticheskimi. Tipy char i int vseh razmerov sov-
mestno budut nazyvat'sya celochislennymi. Tipy float i double
sovmestno budut nazyvat'sya veshchestvennymi tipami.
Krome osnovnyh arifmeticheskih tipov sushchestvuet koncep-
tual'no beskonechnyj klass proizvodnyh tipov, kotorye obrazu-
yutsya iz osnovnyh tipov sleduyushchim obrazom:
- massivy ob容ktov bol'shinstva tipov;
- funkcii, kotorye vozvrashchayut ob容kty zadannogo tipa;
-7-
- ukazateli na ob容kty dannogo tipa;
- struktury, soderzhashchie posledovatel'nost' ob容ktov
razlichnyh tipov;
- ob容dineniya, sposobnye soderzhat' odin iz neskol'kih
ob容ktov razlichnyh tipov.
Voobshche govorya, eti metody postroeniya ob容ktov mogut
primenyat'sya rekursivno.
3.2. Ob容kty i l_znacheniya
Ob容kt yavlyaetsya dostupnym obrabotke uchastkom pamyati;
l_znachenie (levoe znachenie) - eto vyrazhenie, ssylayushcheesya na
ob容kt. Ochevidnym primerom vyrazheniya l_znacheniya yavlyaetsya
identifikator. Sushchestvuyut operacii, rezul'tatom kotoryh
yavlyayutsya l_znacheniya; esli, naprimer, e - vyrazhenie tipa uka-
zatel', to *e yavlyaetsya vyrazheniem l_znacheniya, ssylayushchimsya na
tot ob容kt, na kotoryj ukazyvaet e. Nazvanie "l_znachenie"
proishodit ot vyrazheniya prisvaivaniya e1=e2, v kotorom levaya
chast' dolzhna byt' vyrazheniem l_znacheniya. Pri posleduyushchem
obsuzhdenii kazhdoj operacii budet ukazyvat'sya, ozhidaet li ona
operandov l_znacheniya i vydaet li ona l_znachenie.
3.3. Preobrazovaniya
Ryad operacij mozhet v zavisimosti ot svoih operandov
vyzyvat' preobrazovanie znacheniya operanda iz odnogo tipa v
drugoj. V etom razdele ob座asnyayutsya rezul'taty, kotorye sle-
duet ozhidat' ot takih preobrazovanij. V konce podvodyatsya
itogi preobrazovanij, trebuemye bol'shinstvom obychnyh opera-
cij; eti svedeniya dopolnyayutsya neobhodimym obrazom pri obsuzh-
denii kazhdoj operacii.
3.3.1. Simvoly i celye
Simvol ili korotkoe celoe mozhno ispol'zovat' vsyudu, gde
mozhno ispol'zovat' celoe. Vo vseh sluchayah znachenie preobra-
zuetsya k celomu. Preobrazovanie bolee korotkogo celogo k
bolee dlinnomu vsegda soprovozhdaetsya znakovym rasshireniem;
celye yavlyayutsya velichinami so znakom. Osushchestvlyaetsya ili net
znakovoe rasshirenie dlya simvolov, zavisit ot ispol'zuemoj
mashiny, na SM-|VM takoe preobrazovanie osushchestvlyaetsya tak,
chto russkie bukvy pri pryamom preobrazovanii poluchat otrica-
tel'nye kody. Oblast' znachenij simvol'nyh peremennyh na
CM-|VM menyaetsya ot -128 do 127; simvoly iz nabora ASCII
imeyut polozhitel'nye znacheniya. Simvol'naya konstanta, zadan-
naya s pomoshch'yu vos'merichnoj uslovnoj posledovatel'nosti, pod-
vergaetsya znakovomu rasshireniyu i mozhet okazat'sya otricatel'-
noj; naprimer, '\377' imeet znachenie -1.
-8-
Kogda bolee dlinnoe celoe preobrazuetsya v bolee korot-
koe ili v char, ono obrezaetsya sleva; lishnie bity prosto
otbrasyvayutsya.
3.3.2. Tipy float i double
Vsya veshchestvennaya arifmetika v Si vypolnyaetsya s dvojnoj
tochnost'yu. Kazhdyj raz, kogda ob容kt tipa float poyavlyaetsya v
vyrazhenii, on udlinyaetsya do double posredstvom dobavleniya
nulej v ego drobnuyu chast'. Kogda ob容kt tipa double dolzhen
byt' preobrazovan k tipu float, naprimer, pri prisvaivanii,
pered usecheniem double okruglyaetsya do dliny float.
Edinstvennoe isklyuchenie mozhet byt' sdelano v kompilyato-
rah dlya |VM, na kotoryh net apparatnyh operacij nad chislami
tipa double (naprimer, SM-4). Utochnit' eto mozhno po opisa-
niyu kompilyatora (komanda cc).
3.3.3. Veshchestvennye i celochislennye velichiny
Preobrazovanie veshchestvennyh znachenij k celochislennomu
tipu v nekotoroj stepeni mashinno-zavisimo; v chastnosti, nap-
ravlenie usecheniya otricatel'nyh chisel menyaetsya ot mashine k
mashine. Rezul'tat ne opredelen, esli znachenie ne pomeshchaetsya
v predostavlyaemoe prostranstvo.
Preobrazovanie celochislennyh znachenij v veshchestvennye
vypolnyaetsya bez oslozhnenij. Mozhet proizojti nekotoraya poterya
tochnosti, esli dlya rezul'tata ne hvatit dliny mantissy.
3.3.4. Ukazateli i celye
Celoe ili dlinnoe celoe mozhet byt' pribavleno k ukaza-
telyu ili vychteno iz nego; v etom sluchae pervaya velichina pre-
obrazuetsya tak, kak ukazyvaetsya v opisanii operacii slozhe-
niya.
Dva ukazatelya na ob容kty odinakovogo tipa mogut byt'
vychteny; v etom sluchae rezul'tat preobrazuetsya k celomu, kak
ukazyvaetsya v opisanii operacii vychitaniya.
3.3.5. Celoe bez znaka
Vsyakij raz, kogda celoe bez znaka ob容dinyaetsya s pros-
tym celym, prostoe celoe preobrazuetsya v celoe bez znaka i
rezul'tat okazyvaetsya celym bez znaka. Znacheniem yavlyaetsya
naimen'shee celoe bez znaka, sootvetstvuyushchee celomu so znakom
(po modulyu 2**razmer slova). V dvoichnom dopolnitel'nom
predstavlenii eto preobrazovanie yavlyaetsya chisto umozritel'-
nym i ne izmenyaet fakticheskuyu kombinaciyu bitov.
Kogda celoe bez znaka preobrazuetsya k tipu long, znache-
nie rezul'tata sovpadaet so znacheniem celogo bez znaka.
-9-
Takim obrazom, eto preobrazovanie svoditsya k dobavleniyu
nulej sleva.
3.3.6. Arifmeticheskie preobrazovaniya
Podavlyayushchee bol'shinstvo operacij vyzyvaet preobrazova-
nie i opredelyaet tipy rezul'tata analogichnym obrazom. Privo-
dimaya nizhe shema v dal'nejshem budet nazyvat'sya "obychnymi
arifmeticheskimi preobrazovaniyami". Snachala lyubye operandy
tipa char ili short preobrazuyutsya v int, a lyubye operandy
tipa float preobrazuyutsya v double. Zatem, esli kakoj-libo
operand imeet tip double, to drugoj preobrazuetsya k tipu
double, i eto budet tipom rezul'tata. V protivnom sluchae,
esli kakoj-libo operand imeet tip long, to drugoj operand
preobrazuetsya k tipu long, i eto i budet tipom rezul'tata.
V protivnom sluchae, esli kakoj-libo operand imeet tip
unsigned, to drugoj operand preobrazuetsya k tipu unsigned, i
eto budet tipom rezul'tata. V protivnom sluchae oba operanda
budut imet' tip int, i eto budet tipom rezul'tata.
* 4. VYRAZHENIYA
Starshinstvo operacij v vyrazheniyah sovpadaet s poryadkom
sledovaniya osnovnyh podrazdelov nastoyashchego razdela, nachinaya
s samogo vysokogo urovnya starshinstva. Tak, naprimer, vyrazhe-
niyami, ukazyvaemymi v kachestve operandov operacii + (p.0.4),
yavlyayutsya vyrazheniya, opredelennye v p.p.0.1-0.3. Vnutri kazh-
dogo podrazdela operacii imeyut odinakovoe starshinstvo. V
kazhdom podrazdele dlya opisyvaemyh tam operacij ukazyvaetsya
ih associativnost' sleva ili sprava. Starshinstvo i associa-
tivnost' vseh operacij v vyrazheniyah rezyumiruyutsya v grammati-
cheskoj svodke v prilozhenii.
V protivnom sluchae poryadok vychislenij vyrazhenij ne
opredelen. V chastnosti, kompilyator mozhet vychislyat' podvyra-
zheniya v tom poryadke, kotoryj on nahodit naibolee effektiv-
nym, dazhe esli eti podvyrazheniya privodyat k pobochnym effek-
tam. Poryadok, v kotorom proishodyat pobochnye effekty, ne spe-
cificiruetsya. Vyrazheniya, vklyuchayushchie kommutativnye i associa-
tivnye operacii (*,+,&,|,^), mogut byt' pereuporyadocheny pro-
izvol'nym obrazom dazhe pri nalichii kruglyh skobok; v etom
sluchae neobhodimo ispol'zovat' yavnye promezhutochnye peremen-
nye.
Pri vychislenii vyrazhenij obrabotka perepolneniya i pro-
verka pri delenii yavlyayutsya mashinno-zavisimymi. Bol'shinstvo
realizacij yazyka Si (v tom chisle i v OS DEMOS) ignoriruyut
perepolnenie celyh; obrabotka oshibki pri delenii na 0 i pri
vseh osobyh sluchayah v operaciyah s veshchestvennymi chislami
menyaetsya ot mashiny k mashine i obychno vypolnyaetsya s pomoshch'yu
bibliotechnoj funkcii.
-10-
4.1. Pervichnye vyrazheniya
Pervichnye vyrazheniya, vklyuchayushchie ., ->, indeksaciyu i
obrashcheniya k funkciyam, gruppiruyutsya sleva napravo.
pervichnoe vyrazhenie:
identifikator
konstanta
stroka
(vyrazhenie)
pervichnoe_vyrazhenie [vyrazhenie]
pervichnoe_vyrazhenie (spisok_vyrazhenij)
neob
pervichnoe_l_znachenie . Identifikator
pervichnoe_vyrazhenie -> identifikator
spisok_vyrazhenij:
vyrazhenie
spisok_vyrazhenij, vyrazhenie
Identifikator yavlyaetsya pervichnym vyrazheniem pri uslovii, chto
on opisan podhodyashchim obrazom, kak eto obsuzhdaetsya nizhe. Tip
identifikatora opredelyaetsya ego opisaniem. Esli, odnako,
tipom identifikatora yavlyaetsya massiv ..., to znacheniem vyra-
zheniya, sostoyashchego iz etogo identifikatora, yavlyaetsya ukaza-
tel' na pervyj ob容kt v etom massive, a tipom vyrazheniya
budet ukazatel' na .... Bolee togo, identifikator massiva ne
yavlyaetsya vyrazheniem l_znacheniya. Podobnym obrazom interpreti-
ruetsya identifikator, kotoryj opisan kak funkciya, vozvrashchayu-
shchaya .... Za isklyucheniem togo sluchaya, kogda on ispol'zuetsya v
pozicii imeni funkcii pri obrashchenii, preobrazuetsya v ukaza-
tel' na funkciyu, kotoraya vozvrashchaet ....
Konstanta yavlyaetsya pervichnym vyrazheniem. V zavisimosti
ot ee formy tipom konstanty mozhet byt' int, long ili double.
Stroka yavlyaetsya pervichnym vyrazheniem. Ishodnym ee tipom
yavlyaetsya massiv simvolov; no sleduya tem zhe samym pravilam,
kotorye privedeny vyshe dlya identifikatorov, on modificiru-
etsya v ukazatel' na simvoly, i rezul'tatom yavlyaetsya ukaza-
tel' na pervyj simvol stroki. (Imeetsya isklyuchenie v nekoto-
ryh inicializatorah; sm. nizhe.)
Vyrazhenie v kruglyh skobkah yavlyaetsya pervichnym vyrazhe-
niem, tip i znachenie kotorogo identichny tipu i znacheniyu
etogo vyrazheniya bez skobok. Nalichie kruglyh skobok ne vli-
yaet na to, yavlyaetsya li vyrazhenie l_znacheniem ili net.
Pervichnoe vyrazhenie, za kotorym sleduet vyrazhenie v
kvadratnyh skobkah, yavlyaetsya pervichnym vyrazheniem. |to vyra-
zhenie s indeksom. Obychno pervichnoe vyrazhenie imeet tip uka-
zatel' na ..., indeksnoe vyrazhenie imeet tip int, a tipom
rezul'tata yavlyaetsya "...". Vyrazhenie e1[e2] po opredeleniyu
identichno vyrazheniyu * ((e1) + (e2)). Vse, chto neobhodimo
-11-
dlya ponimaniya etoj zapisi, soderzhitsya v etom razdele; vop-
rosy, svyazannye s ponyatiem identifikatorov i operacij * i +
rassmatrivayutsya v p.p. 0.1, 0.2 i 0.4 sootvetstvenno; vyvody
summiruyutsya nizhe.
Obrashchenie k funkcii yavlyaetsya pervichnym vyrazheniem, za
kotorym sleduet zaklyuchennyj v kruglye skobki vozmozhno pustoj
spisok vyrazhenij, razdelennyh zapyatymi, kotorye i predstav-
lyayut soboj fakticheskie argumenty funkcii. Pervichnoe vyrazhe-
nie dolzhno byt' tipa funkciya, vozvrashchayushchaya ..., a rezul'tat
obrashcheniya k funkcii imeet tip "...". Kak ukazyvaetsya nizhe,
ranee ne vstrechavshchijsya identifikator, za kotorym neposredst-
venno sleduet levaya kruglaya skobka, schitaetsya opisannym po
kontekstu, kak predstavlyayushchij funkciyu, vozvrashchayushchuyu celoe;
sledovatel'no chashche vsego vstrechayushchijsya sluchaj funkcii, vozv-
rashchayushchej celoe znachenie, ne nuzhdaetsya v opisanii.
Pered obrashcheniem lyubye fakticheskie argumenty tipa float
preobrazuyutsya k tipu double, lyubye argumenty tipa char ili
short preobrazuyutsya k tipu int, i, kak obychno, imena massi-
vov preobrazuyutsya v ukazateli. Nikakie drugie preobrazovaniya
ne vypolnyayutsya avtomaticheski; v chastnosti, ne sravnivayutsya
tipy fakticheskih argumentov s tipami formal'nyh argumentov.
Esli preobrazovanie neobhodimo, ispol'zujte yavnoe preobrazo-
vanie.
Pri podgotovke k vyzovu funkcii delaetsya kopiya kazhdogo
fakticheskogo parametra; takim obrazom, vse peredachi argumen-
tov v yazyke Si osushchestvlyayutsya strogo po znacheniyu. Funkciya
mozhet izmenyat' znacheniya svoih formal'nyh parametrov, no eti
izmeneniya ne vliyayut na znacheniya fakticheskih parametrov. S
drugoj storony, imeetsya vozmozhnost' peredavat' ukazatel',
pri etom funkciya mozhet izmenyat' znachenie ob容kta, na kotoryj
etot ukazatel' ukazyvaet. Poryadok vychisleniya argumentov v
yazyke ne opredelen; razlichnye kompilyatory vychislyayut po raz-
nomu.
Dopuskayutsya rekursivnye obrashcheniya k lyuboj funkcii.
Pervichnoe vyrazhenie, za kotorym sleduet tochka i identi-
fikator, yavlyaetsya vyrazheniem. Pervoe vyrazhenie dolzhno byt'
l_znacheniem, imenuyushchim strukturu ili ob容dinenie, a identi-
fikator dolzhen byt' imenem chlena struktury ili ob容dineniya.
Rezul'tatom yavlyaetsya l_znachenie, ssylayushcheesya na poimenovan-
nyj chlen struktury ili ob容dineniya.
Pervichnoe vyrazhenie, za kotorym sleduet strelka (sos-
tavlennaya iz znakov - i >) i identifikator, yavlyaetsya vyrazhe-
niem. Pervoe vyrazhenie dolzhno byt' ukazatelem na strukturu
ili ob容dinenie, a identifikator dolzhen imenovat' chlen etoj
struktury ili ob容dineniya. Rezul'tatom yavlyaetsya l_znachenie,
ssylayushcheesya na poimenovannyj chlen struktury ili ob容dineniya,
na kotoryj ukazyvaet ukazatel'noe vyrazhenie.
-12-
Sledovatel'no, vyrazhenie e1->mos yavlyaetsya tem zhe samym,
chto i vyrazhenie (*e1).mos. Struktury i ob容dineniya rassmat-
rivayutsya nizhe. Privedennye zdes' pravila ispol'zovaniya
struktur i ob容dinenij ne navyazyvayutsya strogo, dlya togo
chtoby imet' vozmozhnost' obojti mehanizm tipov (sm. "Dopol-
nitel'naya informaciya o tipah").
4.2. Unarnye operacii
Vyrazhenie s unarnymi operaciyami gruppiruetsya sprava
nalevo.
unarnoe_vyrazhenie:
* vyrazhenie
& l_znachenie
- vyrazhenie
! vyrazhenie
~ vyrazhenie
++ l_znachenie
-- l_znachenie
l_znachenie ++
l_znachenie --
(imya-tipa) vyrazhenie
sizeof vyrazhenie
sizeof (imya_tipa)
Unarnaya operaciya * oznachaet kosvennuyu adresaciyu: vyrazhenie
dolzhno byt' ukazatelem, a rezul'tatom yavlyaetsya l_znachenie,
ssylayushcheesya na tot ob容kt, na kotoryj ukazyvaet vyrazhenie.
Esli tipom vyrazheniya yavlyaetsya ukazatel' na ..., to tipom
rezul'tata budet "...".
Rezul'tatom unarnoj operacii & yavlyaetsya ukazatel' na
ob容kt, k kotoromu ssylaetsya l_znachenie. Esli l_znachenie
imeet tip "...", to tipom rezul'tata budet ukazatel' na ....
Rezul'tatom unarnoj operacii - (minus) yavlyaetsya ee ope-
rand, vzyatyj s protivopolozhnym znakom. Dlya velichiny tipa
unsigned rezul'tat poluchaetsya vychitaniem ee znacheniya iz 2**n
(dva v stepeni n), gde n-chislo bitov v int. Unarnoj operacii
+ (plyus) ne sushchestvuet.
Rezul'tatom operacii logicheskogo otricaniya ! yavlyaetsya
1, esli znachenie ee operanda ravno 0, i 0, esli znachenie ee
operanda otlichno ot nulya. Rezul'tat imeet tip int. |ta ope-
raciya primenima k lyubomu arifmeticheskomu tipu ili ukazate-
lyam.
Operaciya ~ (simvol "til'da", nahoditsya na klavishe ^ v
nizhnem registre) daet obratnyj kod (ili dopolnenie do edi-
nicy) svoego operanda. Vypolnyayutsya obychnye arifmeticheskie
preobrazovaniya. Operand dolzhen byt' celochislennogo tipa.
-13-
Ob容kt, na kotoryj ssylaetsya operand l_znacheniya pre-
fiksnoj operacii ++, uvelichivaetsya. Znacheniem yavlyaetsya novoe
znachenie operanda, no eto ne l_znachenie. Vyrazhenie ++h ekvi-
valentno h += 1 . Informaciyu o preobrazovaniyah smotri v raz-
bore operacii slozheniya (p. 0.4) i operacii prisvaivaniya (p.
0.14).
Prefiksnaya operaciya -- analogichna prefiksnoj operacii
++, no privodit k umen'sheniyu svoego operanda l_znacheniya.
Pri primenenii postfiksnoj operacii ++ k l_znacheniyu
rezul'tatom yavlyaetsya znachenie ob容kta, na kotoryj ssylaetsya
l_znachenie. Posle togo, kak rezul'tat prinyat k svedeniyu,
ob容kt uvelichivaetsya tochno takim zhe obrazom, kak i v sluchae
prefiksnoj operacii ++. Rezul'tat imeet tot zhe tip, chto i
vyrazhenie l_znacheniya.
Pri primenenii postfiksnoj operacii -- k l_znacheniyu
rezul'tatom yavlyaetsya znachenie ob容kta, na kotoryj ssylaetsya
l_znachenie. Posle togo, kak rezul'tat prinyat k svedeniyu,
ob容kt umen'shaetsya tochno takim zhe obrazom, kak i v sluchae
prefiksnoj operacii --. Rezul'tat imeet tot zhe tip, chto i
vyrazhenie l_znacheniya.
Zaklyuchennoe v kruglye skobki imya tipa dannyh, stoyashchee
pered vyrazheniem, vyzyvaet preobrazovanie znacheniya etogo
vyrazheniya k ukazannomu tipu. |ta konstrukciya nazyvaetsya
perevod (cast). Imena tipov opisyvayutsya v sleduyushchem razdele.
Operaciya sizeof vydaet razmer svoego operanda v bajta.
(Ponyatie bajt v yazyke ne opredeleno, razve tol'ko, kak zna-
chenie operacii sizeof. Odnako vo vseh sushchestvuyushchih realiza-
ciyah bajtom yavlyaetsya prostranstvo, neobhodimoe dlya hraneniya
ob容kta tipa char). Pri primenenii k massivu rezul'tatom
yavlyaetsya polnoe chislo bajtov v massive. Razmer opredelyaetsya
iz opisanij ob容ktov v vyrazhenii. |to vyrazhenie semanticheski
yavlyaetsya celoj konstantoj i mozhet byt' ispol'zovano v lyubom
meste, gde trebuetsya konstanta. Osnovnoe primenenie eta ope-
raciya nahodit pri vyzove procedur, podobnyh raspredelitelyam
pamyati, i v sistemah vvoda- vyvoda.
Operaciya sizeof mozhet byt' takzhe primenena i k zaklyu-
chennomu v kruglye skobki imeni tipa. V etom sluchae ona
vydaet razmer v bajtah ob容kta ukazannogo tipa.
Konstrukciya sizeof (tip) rassmatrivaetsya kak celoe, tak
chto vyrazhenie sizeof (tip) - 2 ekvivalentno vyrazheniyu
(sizeof (tip)) - 2.
4.3. Mul'tiplikativnye operacii
Mul'tiplikativnye operacii *, /, i % gruppiruyutsya sleva
napravo. Vypolnyayutsya obychnye arifmeticheskie preobrazovaniya.
-14-
mul'tiplikativnoe_vyrazhenie:
vyrazhenie * vyrazhenie
vyrazhenie / vyrazhenie
vyrazhenie % vyrazhenie
Binarnaya operaciya * oznachaet umnozhenie. Operaciya *
associativna, i vyrazheniya s neskol'kimi umnozheniyami na odnom
i tom zhe urovne mogut byt' peregruppirovany kompilyatorom.
Binarnaya operaciya / oznachaet delenie. Pri delenii polo-
zhitel'nyh celyh osushchestvlyaetsya usechenie po napravleniyu k
nulyu, no esli odin iz operandov otricatelen, to forma useche-
niya zavisit ot ispol'zuemoj mashiny. Ostatok imeet tot zhe
znak, chto i delimoe. Vsegda spravedlivo, chto (a/b)*b+a%b
ravno a (esli b ne ravno 0).
Binarnaya operaciya % vydaet ostatok ot deleniya pervogo
vyrazheniya na vtoroe. Vypolnyayutsya obychnye arifmeticheskie pre-
obrazovaniya. Operandy dolzhny byt' celogo tipa.
4.4. Additivnye operacii
Additivnye operacii + i - gruppiruyutsya sleva napravo.
Vypolnyayutsya obychnye arifmeticheskie preobrazovaniya. Dlya kazh-
doj operacii imeyutsya nekotorye dopolnitel'nye vozmozhnosti,
svyazannye s tipami operandov.
additivnoe_vyrazhenie:
vyrazhenie + vyrazhenie
vyrazhenie - vyrazhenie
Rezul'tatom operacii + yavlyaetsya summa operandov. Mozhno takzhe
skladyvat' ukazatel' na ob容kt v massive i znachenie lyubogo
celochislennogo tipa. Poslednee preobrazuetsya v adresnoe
smeshchenie posredstvom umnozheniya ego na dlinu ob容kta, na
kotoryj ukazyvaet etot ukazatel'. Rezul'tatom yavlyaetsya uka-
zatel' togo zhe samogo tipa, chto i ishodnyj ukazatel', koto-
ryj ukazyvaet na drugoj ob容kt v tom zhe massive, smeshchennyj
sootvetstvuyushchim obrazom otnositel'no pervonachal'nogo
ob容kta. Takim obrazom, esli p yavlyaetsya ukazatelem ob容kta v
massive, to vyrazhenie p+1 yavlyaetsya ukazatelem na sleduyushchij
ob容kt v etom massive.
Nikakie drugie kombinacii tipov dlya ukazatelej ne raz-
reshayutsya.
Operaciya + associativna, i vyrazhenie s neskol'kimi slo-
zheniyami na odnom i tom zhe urovne mogut byt' pereuporyadocheny
kompilyatorom.
-15-
Rezul'tatom operacii - yavlyaetsya raznost' operandov.
Vypolnyayutsya obychnye arifmeticheskie preobrazovaniya. Krome
togo, iz ukazatelya mozhet byt' vychteno znachenie lyubogo celo-
chislennogo tipa, prichem, provodyatsya te zhe samye preobrazova-
niya, chto i pri operacii slozheniya.
Esli vychitayutsya dva ukazatelya na ob容kty odinakovogo
tipa, to rezul'tat preobrazuetsya (deleniem na dlinu ob容kta)
k tipu int, predstavlyaya soboj chislo ob容ktov, razdelyayushchih
ukazyvaemye ob容kty. Esli eti ukazateli ne na ob容kty iz
odnogo i togo zhe massiva, to takoe preobrazovanie, voobshche
govorya, dast neozhidannye rezul'taty, potomu chto dazhe ukaza-
teli na ob容kty odinakovogo tipa ne obyazany otlichat'sya na
velichinu, kratnuyu dline ob容kta.
4.5. Operacii sdviga
Operacii sdviga << i >> gruppiruyutsya sleva napravo.
Dlya obeih operacij provodyatsya obychnye arifmeticheskie preob-
razovaniya ih operandov, kazhdyj iz kotoryh dolzhen byt' celogo
tipa. Zatem pravyj operand preobrazuetsya k tipu int; rezul'-
tat imeet tip levogo operanda. Rezul'tat ne opredelen, esli
pravyj operand otricatelen ili bol'she ili raven, chem dlina
ob容kta v bitah.
vyrazhenie_sdviga:
vyrazhenie << vyrazhenie
vyrazhenie >> vyrazhenie
Znacheniem vyrazheniya e1<<e2 yavlyaetsya e1 (interpretiruemoe kak
kombinaciya bitov), sdvinutoe vlevo na e2 bitov; osvobozhdayu-
shchiesya bity zapolnyayutsya nulem. Znacheniem vyrazheniya e1>>e2
yavlyaetsya e1, sdvinutoe vpravo na e2 bitovyh pozicij. Esli e1
imeet tip unsigned, to sdvig vpravo garantirovanno budet
logicheskim (zapolnenie nulem); v protivnom sluchae sdvig
mozhet byt' (kak na CM-|VM) arifmeticheskim (osvobozhdayushchiesya
bity zapolnyayutsya kopiej znakovogo bita).
4.6. Operacii otnosheniya
Operacii otnosheniya gruppiruyutsya sleva napravo, no etot
fakt ne ochen' polezen; vyrazhenie a<b<c ne oznachaet togo, chto
ono ,kazalos' by, dolzhno oznachat', a oznachaet ((a<b)<c).
vyrazhenie_otnosheniya:
vyrazhenie < vyrazhenie
vyrazhenie > vyrazhenie
vyrazhenie <= vyrazhenie
vyrazhenie >= vyrazhenie
Operacii < (men'she), > (bol'she), <= (men'she ili ravno) i >=
(bol'she ili ravno) dayut 0, esli ukazannoe otnoshenie lozhno,
i 1, esli ono istinno. Rezul'tat imeet tip int. Vypolnyayutsya
-16-
obychnye arifmeticheskie preobrazovaniya. Mogut sravnivat'sya
dva ukazatelya; rezul'tat zavisit ot otnositel'nogo raspolo-
zheniya ukazyvaemyh ob容ktov v adresnom prostranstve. Sravne-
nie ukazatelej perenosimo tol'ko v tom sluchae, esli ukaza-
teli ukazyvayut na ob容kty iz odnogo i togo zhe massiva.
4.7. Operacii ravenstva
vyrazhenie_ravenstva:
vyrazhenie == vyrazhenie
vyrazhenie != vyrazhenie
Operacii == (ravno)