Êîìïèëÿòîð ÿçûêà ïðîãðàììèðîâàíèÿ Oberon-07/16 äëÿ i486
Windows/Linux/KolibriOS.
------------------------------------------------------------------------------
Ïàðàìåòðû êîìàíäíîé ñòðîêè
Âõîä - òåêñòîâûå ôàéëû ìîäóëåé ñ ðàñøèðåíèåì ".ob07", êîäèðîâêà ANSI èëè
UTF-8 ñ BOM-ñèãíàòóðîé.
Âûõîä - èñïîíÿåìûé ôàéë ôîðìàòà PE32, ELF èëè MENUET01/MSCOFF.
Ïàðàìåòðû:
1) èìÿ ãëàâíîãî ìîäóëÿ
2) èìÿ ðåçóëüòèðóþùåãî ôàéëà
3) òèï ïðèëîæåíèÿ è ïëàòôîðìà
"console" - Windows console
"gui" - Windows GUI
"dll" - Windows DLL
"kos" - KolibriOS
"obj" - KolibriOS DLL
"elfexe" - Linux ELF-EXEC
4) íåîáÿçàòåëüíûå ïàðàìåòðû-êëþ÷è
-stk <size> ðàçìåð ñòýêà â ìåãàáàéòàõ (ïî óìîë÷àíèþ 2 Ìá)
-base <address> àäðåñ çàãðóçêè èñïîëíÿåìîãî ôàéëà â êèëîáàéòàõ
-ver <major.minor> âåðñèÿ ïðîãðàììû (òîëüêî äëÿ obj)
-nochk <"ptibcwra"> îòêëþ÷èòü ïðîâåðêè ïðè âûïîëíåíèè (ñì. íèæå)
ïàðàìåòð -nochk çàäàåòñÿ â âèäå ñòðîêè èç ñèìâîëîâ:
"p" - óêàçàòåëè
"t" - òèïû
"i" - èíäåêñû
"b" - íåÿâíîå ïðèâåäåíèå INTEGER ê BYTE
"c" - äèàïàçîí àðãóìåíòà ôóíêöèè CHR
"w" - äèàïàçîí àðãóìåíòà ôóíêöèè WCHR
"r" - ýêâèâàëåíòíî "bcw"
"a" - âñå ïðîâåðêè
Ïîðÿäîê ñèìâîëîâ ìîæåò áûòü ëþáûì. Íàëè÷èå â ñòðîêå òîãî èëè èíîãî
ñèìâîëà îòêëþ÷àåò ñîîòâåòñòâóþùóþ ïðîâåðêó.
Íàïðèìåð: -nochk it - îòêëþ÷èòü ïðîâåðêó èíäåêñîâ è îõðàíó òèïà.
-nochk a - îòêëþ÷èòü âñå îòêëþ÷àåìûå ïðîâåðêè.
Íàïðèìåð:
Compiler.exe "C:\example.ob07" "C:\example.exe" console -stk 1
Compiler.exe "C:\example.ob07" "C:\example.dll" dll
Compiler.exe "C:\example.ob07" "C:\example.exe" gui -stk 4
Compiler.exe "C:\example.ob07" "C:\example.exe" console -nochk pti
Compiler.kex "/tmp0/1/example.ob07" "/tmp0/1/example.kex" kos -stk 2
Compiler.kex "/tmp0/1/example.ob07" "/tmp0/1/example.obj" obj -ver 2.7
Compiler.exe "C:\example.ob07" "C:\example" elfexe
 ñëó÷àå óñïåøíîé êîìïèëÿöèè, êîìïèëÿòîð ïåðåäàåò êîä çàâåðøåíèÿ 0, èíà÷å 1.
Ïðè ðàáîòå êîìïèëÿòîðà â KolibriOS, êîä çàâåðøåíèÿ íå ïåðåäàåòñÿ.
------------------------------------------------------------------------------
Îòëè÷èÿ îò îðèãèíàëà
1. Ðàñøèðåí ïñåâäîìîäóëü SYSTEM
2. Â èäåíòèôèêàòîðàõ äîïóñêàåòñÿ ñèìâîë "_"
3. Äîáàâëåíû ñèñòåìíûå ôëàãè
4. Óñîâåðøåíñòâîâàí îïåðàòîð CASE (äîáàâëåíû êîíñòàíòíûå âûðàæåíèÿ â
ìåòêàõ âàðèàíòîâ è íåîáÿçàòåëüíàÿ âåòêà ELSE)
5. Ðàñøèðåí íàáîð ñòàíäàðòíûõ ïðîöåäóð
6. Ñåìàíòèêà îõðàíû/ïðîâåðêè òèïà óòî÷íåíà äëÿ íóëåâîãî óêàçàòåëÿ
7. Ñåìàíòèêà DIV è MOD óòî÷íåíà äëÿ îòðèöàòåëüíûõ ÷èñåë
8. Äîáàâëåíû îäíîñòðî÷íûå êîììåíòàðèè (íà÷èíàþòñÿ ñ ïàðû ñèìâîëîâ "//")
9. Ðàçðåøåíî íàñëåäîâàíèå îò òèïà-óêàçàòåëÿ
10. Äîáàâëåí ñèíòàêñèñ äëÿ èìïîðòà ïðîöåäóð èç âíåøíèõ áèáëèîòåê
11. "Ñòðîêè" ìîæíî çàêëþ÷àòü òàêæå â îäèíî÷íûå êàâû÷êè: 'ñòðîêà'
12. Äîáàâëåí òèï WCHAR
------------------------------------------------------------------------------
Îñîáåííîñòè ðåàëèçàöèè
1. Îñíîâíûå òèïû
Òèï Äèàïàçîí çíà÷åíèé Ðàçìåð, áàéò
INTEGER -2147483648 .. 2147483647 4
REAL 4.94E-324 .. 1.70E+308 8
CHAR ñèìâîë ASCII (0X .. 0FFX) 1
BOOLEAN FALSE, TRUE 1
SET ìíîæåñòâî èç öåëûõ ÷èñåë {0 .. 31} 4
BYTE 0 .. 255 1
WCHAR ñèìâîë þíèêîäà (0X .. 0FFFFX) 2
2. Ìàêñèìàëüíàÿ äëèíà èäåíòèôèêàòîðîâ - 1024 ñèìâîëîâ
3. Ìàêñèìàëüíàÿ äëèíà ñòðîêîâûõ êîíñòàíò - 1024 ñèìâîëîâ (UTF-8)
4. Ìàêñèìàëüíàÿ ðàçìåðíîñòü îòêðûòûõ ìàññèâîâ - 5
5. Ïðîöåäóðà NEW çàïîëíÿåò íóëÿìè âûäåëåííûé áëîê ïàìÿòè
6. Ãëîáàëüíûå è ëîêàëüíûå ïåðåìåííûå èíèöèàëèçèðóþòñÿ íóëÿìè
7.  îòëè÷èå îò ìíîãèõ Oberon-ðåàëèçàöèé, ñáîðùèê ìóñîðà è äèíàìè÷åñêàÿ
ìîäóëüíîñòü îòñóòñòâóþò
8. Òèï BYTE â âûðàæåíèÿõ âñåãäà ïðèâîäèòñÿ ê INTEGER
9. Êîíòðîëü ïåðåïîëíåíèÿ çíà÷åíèé âûðàæåíèé íå ïðîèçâîäèòñÿ
10. Îøèáêè âðåìåíè âûïîëíåíèÿ:
- ASSERT(x), ïðè x = FALSE
- ðàçûìåíîâàíèå íóëåâîãî óêàçàòåëÿ
- öåëî÷èñëåííîå äåëåíèå íà 0
- âûçîâ ïðîöåäóðû ÷åðåç ïðîöåäóðíóþ ïåðåìåííóþ ñ íóëåâûì çíà÷åíèåì
- îøèáêà îõðàíû òèïà
- íàðóøåíèå ãðàíèö ìàññèâà
- íåïðåäóñìîòðåííîå çíà÷åíèå âûðàæåíèÿ â îïåðàòîðå CASE
- îøèáêà êîïèðîâàíèÿ ìàññèâîâ v := x, åñëè LEN(v) < LEN(x)
- íåÿâíîå ïðèâåäåíèå x:INTEGER ê v:BYTE, åñëè (x < 0) OR (x > 255)
- CHR(x), åñëè (x < 0) OR (x > 255)
- WCHR(x), åñëè (x < 0) OR (x > 65535)
------------------------------------------------------------------------------
Ïñåâäîìîäóëü SYSTEM
Ïñåâäîìîäóëü SYSTEM ñîäåðæèò íèçêîóðîâíåâûå è íåáåçîïàñíûå ïðîöåäóðû,
îøèáêè ïðè èñïîëüçîâàíèè ïðîöåäóð ïñåâäîìîäóëÿ SYSTEM ìîãóò ïðèâåñòè ê
ïîâðåæäåíèþ äàííûõ âðåìåíè âûïîëíåíèÿ è àâàðèéíîìó çàâåðøåíèþ ïðîãðàììû.
PROCEDURE ADR(v: ëþáîé òèï): INTEGER
v - ïåðåìåííàÿ èëè ïðîöåäóðà;
âîçâðàùàåò àäðåñ v
PROCEDURE SADR(x: ñòðîêîâàÿ êîíñòàíòà (CHAR UTF-8)): INTEGER
âîçâðàùàåò àäðåñ x
PROCEDURE WSADR(x: ñòðîêîâàÿ êîíñòàíòà (WCHAR)): INTEGER
âîçâðàùàåò àäðåñ x
PROCEDURE SIZE(T): INTEGER
âîçâðàùàåò ðàçìåð òèïà T
PROCEDURE TYPEID(T): INTEGER
T - òèï-çàïèñü èëè òèï-óêàçàòåëü,
âîçâðàùàåò íîìåð òèïà â òàáëèöå òèïîâ-çàïèñåé
PROCEDURE INF(): REAL
âîçâðàùàåò ñïåöèàëüíîå âåùåñòâåííîå çíà÷åíèå "áåñêîíå÷íîñòü"
PROCEDURE GET(a: INTEGER;
VAR v: ëþáîé îñíîâíîé òèï, PROCEDURE, POINTER)
v := Ïàìÿòü[a]
PROCEDURE PUT(a: INTEGER; x: ëþáîé îñíîâíîé òèï, PROCEDURE, POINTER)
Ïàìÿòü[a] := x;
Åñëè x: BYTE èëè x: WCHAR, òî çíà÷åíèå x áóäåò ðàñøèðåíî
äî 32 áèò, äëÿ çàïèñè áàéòîâ èñïîëüçîâàòü SYSTEM.PUT8,
äëÿ WCHAR -- SYSTEM.PUT16
PROCEDURE PUT8(a: INTEGER; x: INTEGER, BYTE, CHAR, WCHAR)
Ïàìÿòü[a] := ìëàäøèå 8 áèò (x)
PROCEDURE PUT16(a: INTEGER; x: INTEGER, BYTE, CHAR, WCHAR)
Ïàìÿòü[a] := ìëàäøèå 16 áèò (x)
PROCEDURE MOVE(Source, Dest, n: INTEGER)
Êîïèðóåò n áàéò ïàìÿòè èç Source â Dest,
îáëàñòè Source è Dest íå ìîãóò ïåðåêðûâàòüñÿ
PROCEDURE COPY(VAR Source: ëþáîé òèï; VAR Dest: ëþáîé òèï; n: INTEGER)
Êîïèðóåò n áàéò ïàìÿòè èç Source â Dest.
Ýêâèâàëåíòíî
SYSTEM.MOVE(SYSTEM.ADR(Source), SYSTEM.ADR(Dest), n)
PROCEDURE CODE(byte1, byte2,... : INTEGER)
Âñòàâêà ìàøèííîãî êîäà,
byte1, byte2 ... - êîíñòàíòû â äèàïàçîíå 0..255,
íàïðèìåð:
SYSTEM.CODE(08BH, 045H, 008H) (* mov eax, dword [ebp + 08h] *)
Òàêæå â ìîäóëå SYSTEM îïðåäåëåí òèï CARD16 (2 áàéòà). Äëÿ òèïà CARD16 íå
äîïóñêàþòñÿ íèêàêèå ÿâíûå îïåðàöèè, çà èñêëþ÷åíèåì ïðèñâàèâàíèÿ.
Ïðåîáðàçîâàíèÿ CARD16 -> INTEGER è INTEGER -> CARD16 ìîãóò áûòü ðåàëèçîâàíû
òàê:
PROCEDURE Card16ToInt (w: SYSTEM.CARD16): INTEGER;
VAR i: INTEGER;
BEGIN
SYSTEM.PUT(SYSTEM.ADR(i), w)
RETURN i
END Card16ToInt;
PROCEDURE IntToCard16 (i: INTEGER): SYSTEM.CARD16;
VAR w: SYSTEM.CARD16;
BEGIN
SYSTEM.GET(SYSTEM.ADR(i), w)
RETURN w
END IntToCard16;
Ôóíêöèè ïñåâäîìîäóëÿ SYSTEM íåëüçÿ èñïîëüçîâàòü â êîíñòàíòíûõ âûðàæåíèÿõ.
------------------------------------------------------------------------------
Ñèñòåìíûå ôëàãè
Ïðè îáúÿâëåíèè ïðîöåäóðíûõ òèïîâ è ãëîáàëüíûõ ïðîöåäóð, ïîñëå êëþ÷åâîãî
ñëîâà PROCEDURE ìîæåò áûòü óêàçàí ôëàã ñîãëàøåíèÿ î âûçîâå: [stdcall],
[ccall], [ccall16], [windows], [linux]. Íàïðèìåð:
PROCEDURE [ccall] MyProc (x, y, z: INTEGER): INTEGER;
Åñëè óêàçàí ôëàã [ccall16], òî ïðèíèìàåòñÿ ñîãëàøåíèå ccall, íî ïåðåä
âûçîâîì óêàçàòåëü ñòýêà áóäåò âûðàâíåí ïî ãðàíèöå 16 áàéò.
Ôëàã [windows] - ñèíîíèì äëÿ [stdcall], [linux] - ñèíîíèì äëÿ [ccall16].
Çíàê "-" ïîñëå èìåíè ôëàãà ([stdcall-], [linux-], ...) îçíà÷àåò, ÷òî
ðåçóëüòàò ïðîöåäóðû ìîæíî èãíîðèðîâàòü (íå äîïóñêàåòñÿ äëÿ òèïà REAL).
Ïðè îáúÿâëåíèè òèïîâ-çàïèñåé, ïîñëå êëþ÷åâîãî ñëîâà RECORD ìîæåò áûòü
óêàçàí ôëàã [noalign]. Ôëàã [noalign] îçíà÷àåò îòñóòñòâèå âûðàâíèâàíèÿ ïîëåé
çàïèñè. Çàïèñè ñ ñèñòåìíûì ôëàãîì íå ìîãóò èìåòü áàçîâûé òèï è íå ìîãóò áûòü
áàçîâûìè òèïàìè äëÿ äðóãèõ çàïèñåé.
Äëÿ èñïîëüçîâàíèÿ ñèñòåìíûõ ôëàãîâ, òðåáóåòñÿ èìïîðòèðîâàòü SYSTEM.
------------------------------------------------------------------------------
Îïåðàòîð CASE
Ñèíòàêñèñ îïåðàòîðà CASE:
CaseStatement =
CASE Expression OF Ñase {"|" Ñase}
[ELSE StatementSequence] END.
Case = [CaseLabelList ":" StatementSequence].
CaseLabelList = CaseLabels {"," CaseLabels}.
CaseLabels = ConstExpression [".." ConstExpression].
Íàïðèìåð:
CASE x OF
|-1: DoSomething1
| 1: DoSomething2
| 0: DoSomething3
ELSE
DoSomething4
END
 ìåòêàõ âàðèàíòîâ ìîæíî èñïîëüçîâàòü êîíñòàíòíûå âûðàæåíèÿ, âåòêà ELSE
íåîáÿçàòåëüíà. Åñëè çíà÷åíèå x íå ñîîòâåòñòâóåò íè îäíîìó âàðèàíòó è ELSE
îòñóòñòâóåò, òî ïðîãðàììà ïðåðûâàåòñÿ ñ îøèáêîé âðåìåíè âûïîëíåíèÿ.
------------------------------------------------------------------------------
Òèï WCHAR
Òèï WCHAR äîáàâëåí â ÿçûê äëÿ óäîáíîé ïîääåæêè þíèêîäà. Äëÿ òèïîâ WCHAR è
ARRAY OF WCHAR äîïóñêàþòñÿ âñå òå æå îïåðàöèè, êàê äëÿ òèïîâ CHAR è
ARRAY OF CHAR, çà èñêëþ÷åíèåì âñòðîåííîé ïðîöåäóðû CHR, êîòîðàÿ âîçâðàùàåò
òîëüêî òèï CHAR. Äëÿ ïîëó÷åíèÿ çíà÷åíèÿ òèïà WCHAR, ñëåäóåò èñïîëüçîâàòü
ïðîöåäóðó WCHR âìåñòî CHR. Äëÿ ïðàâèëüíîé ðàáîòû ñ òèïîì, íåîáõîäèìî ñîõðàíÿòü
èñõîäíûé êîä â êîäèðîâêå UTF-8 c BOM.
------------------------------------------------------------------------------
Ïðîâåðêà è îõðàíà òèïà íóëåâîãî óêàçàòåëÿ
Îðèãèíàëüíîå ñîîáùåíèå î ÿçûêå íå îïðåäåëÿåò ïîâåäåíèå ïðîãðàììû ïðè
âûïîëíåíèè îõðàíû p(T) è ïðîâåðêè òèïà p IS T ïðè p = NIL. Âî ìíîãèõ
Oberon-ðåàëèçàöèÿõ âûïîëíåíèå òàêîé îïåðàöèè ïðèâîäèò ê îøèáêå âðåìåíè
âûïîëíåíèÿ. Â äàííîé ðåàëèçàöèè îõðàíà òèïà íóëåâîãî óêàçàòåëÿ íå ïðèâîäèò ê
îøèáêå, à ïðîâåðêà òèïà äàåò ðåçóëüòàò FALSE.  ðÿäå ñëó÷àåâ ýòî ïîçâîëÿåò
çíà÷èòåëüíî ñîêðàòèòü ÷àñòîòó ïðèìåíåíèÿ îõðàíû òèïà.
------------------------------------------------------------------------------
Äîïîëíèòåëüíûå ñòàíäàðòíûå ïðîöåäóðû
DISPOSE (VAR v: ëþáîé_óêàçàòåëü)
Îñâîáîæäàåò ïàìÿòü, âûäåëåííóþ ïðîöåäóðîé NEW äëÿ
äèíàìè÷åñêîé ïåðåìåííîé v^, è ïðèñâàèâàåò ïåðåìåííîé v
çíà÷åíèå NIL.
COPY (x: ARRAY OF CHAR/WCHAR; VAR v: ARRAY OF CHAR/WCHAR);
v := x;
Åñëè LEN(v) < LEN(x), òî ñòðîêà x áóäåò ñêîïèðîâàíà
íå ïîëíîñòüþ
LSR (x, n: INTEGER): INTEGER
Ëîãè÷åñêèé ñäâèã x íà n áèò âïðàâî.
MIN (a, b: INTEGER): INTEGER
Ìèíèìóì èç äâóõ çíà÷åíèé.
MAX (a, b: INTEGER): INTEGER
Ìàêñèìóì èç äâóõ çíà÷åíèé.
BITS (x: INTEGER): SET
Èíòåðïðåòèðóåò x êàê çíà÷åíèå òèïà SET.
Âûïîëíÿåòñÿ íà ýòàïå êîìïèëÿöèè.
LENGTH (s: ARRAY OF CHAR/WCHAR): INTEGER
Äëèíà 0X-çàâåðøåííîé ñòðîêè s, áåç ó÷åòà ñèìâîëà 0X.
Åñëè ñèìâîë 0X îòñóòñòâóåò, ôóíêöèÿ âîçâðàùàåò äëèíó
ìàññèâà s. s íå ìîæåò áûòü êîíñòàíòîé.
WCHR (n: INTEGER): WCHAR
Ïðåîáðàçîâàíèå òèïà, àíàëîãè÷íî CHR(n: INTEGER): CHAR
------------------------------------------------------------------------------
DIV è MOD
x y x DIV y x MOD y
5 3 1 2
-5 3 -2 1
5 -3 -2 -1
-5 -3 1 -2
------------------------------------------------------------------------------
Èìïîðòèðîâàííûå ïðîöåäóðû
Ñèíòàêñèñ èìïîðòà:
PROCEDURE [callconv, "library", "function"] proc_name (FormalParam): Type;
- callconv -- ñîãëàøåíèå î âûçîâå
- "library" -- èìÿ ôàéëà äèíàìè÷åñêîé áèáëèîòåêè
- "function" -- èìÿ èìïîðòèðóåìîé ïðîöåäóðû
íàïðèìåð:
PROCEDURE [windows, "kernel32.dll", "ExitProcess"] exit (code: INTEGER);
PROCEDURE [stdcall, "Console.obj", "con_exit"] exit (bCloseWindow: BOOLEAN);
 êîíöå îáúÿâëåíèÿ ìîæåò áûòü äîáàâëåíî (íåîáÿçàòåëüíî) "END proc_name;"
Îáúÿâëåíèÿ èìïîðòèðîâàííûõ ïðîöåäóð äîëæíû ðàñïîëàãàòüñÿ â ãëîáàëüíîé
îáëàñòè âèäèìîñòè ìîäóëÿ ïîñëå îáúÿâëåíèÿ ïåðåìåííûõ, âìåñòå ñ îáúÿâëåíèåì
"îáû÷íûõ" ïðîöåäóð, îò êîòîðûõ èìïîðòèðîâàííûå îòëè÷àþòñÿ òîëüêî îòñóòñòâèåì
òåëà ïðîöåäóðû. Â îñòàëüíîì, ê òàêèì ïðîöåäóðàì ïðèìåíèìû òå æå ïðàâèëà:
èõ ìîæíî âûçâàòü, ïðèñâîèòü ïðîöåäóðíîé ïåðåìåííîé èëè ïîëó÷èòü àäðåñ.
Òàê êàê èìïîðòèðîâàííàÿ ïðîöåäóðà âñåãäà èìååò ÿâíîå óêàçàíèå ñîãëàøåíèÿ î
âûçîâå, òî ñîâìåñòèìûé ïðîöåäóðíûé òèï òîæå äîëæåí áûòü îáúÿâëåí ñ óêàçàíèåì
ñîãëàøåíèÿ î âûçîâå:
VAR
ExitProcess: PROCEDURE [windows] (code: INTEGER);
con_exit: PROCEDURE [stdcall] (bCloseWindow: BOOLEAN);
 KolibriOS èìïîðòèðîâàòü ïðîöåäóðû ìîæíî òîëüêî èç áèáëèîòåê, ðàçìåùåííûõ
â /rd/1/lib. Èìïîðòèðîâàòü è âûçûâàòü ôóíêöèè èíèöèàëèçàöèè áèáëèîòåê
(lib_init, START) ïðè ýòîì íå íóæíî.
Äëÿ Linux, èìïîðòèðîâàííûå ïðîöåäóðû íå ðåàëèçîâàíû.
------------------------------------------------------------------------------
Ñêðûòûå ïàðàìåòðû ïðîöåäóð
Íåêîòîðûå ïðîöåäóðû ìîãóò èìåòü ñêðûòûå ïàðàìåòðû, îíè îòñóòñòâóþò â ñïèñêå
ôîðìàëüíûõ ïàðàìåòðîâ, íî ó÷èòûâàþòñÿ êîìïèëÿòîðîì ïðè òðàíñëÿöèè âûçîâîâ.
Ýòî âîçìîæíî â ñëåäóþùèõ ñëó÷àÿõ:
1. Ïðîöåäóðà èìååò ôîðìàëüíûé ïàðàìåòð îòêðûòûé ìàññèâ:
PROCEDURE Proc (x: ARRAY OF ARRAY OF REAL);
Âûçîâ òðàíñëèðóåòñÿ òàê:
Proc(LEN(x), LEN(x[0]), SYSTEM.ADR(x))
2. Ïðîöåäóðà èìååò ôîðìàëüíûé ïàðàìåòð-ïåðåìåííóþ òèïà RECORD:
PROCEDURE Proc (VAR x: Rec);
Âûçîâ òðàíñëèðóåòñÿ òàê:
Proc(SYSTEM.TYPEID(Rec), SYSTEM.ADR(x))
------------------------------------------------------------------------------
Ìîäóëü RTL
Âñå ïðîãðàììû íåÿâíî èñïîëüçóþò ìîäóëü RTL. Êîìïèëÿòîð òðàíñëèðóåò
íåêîòîðûå îïåðàöèè (ïðîâåðêà è îõðàíà òèïà, ñðàâíåíèå ñòðîê, ñîîáùåíèÿ îá
îøèáêàõ âðåìåíè âûïîëíåíèÿ è äð.) êàê âûçîâû ïðîöåäóð ýòîãî ìîäóëÿ. Íå
ñëåäóåò ÿâíî âûçûâàòü ýòè ïðîöåäóðû, çà èñêëþ÷åíèåì ïðîöåäóðû SetDll,
åñëè ïðèëîæåíèå êîìïèëèðóåòñÿ êàê Windows DLL:
PROCEDURE SetDll
(process_detach, thread_detach, thread_attach: DLL_ENTRY);
ãäå TYPE DLL_ENTRY =
PROCEDURE (hinstDLL, fdwReason, lpvReserved: INTEGER);
SetDll íàçíà÷àåò ïðîöåäóðû process_detach, thread_detach, thread_attach
âûçûâàåìûìè ïðè
- âûãðóçêå dll-áèáëèîòåêè (process_detach)
- ñîçäàíèè íîâîãî ïîòîêà (thread_attach)
- óíè÷òîæåíèè ïîòîêà (thread_detach)
Äëÿ ïðî÷èõ òèïîâ ïðèëîæåíèé, âûçîâ ïðîöåäóðû SetDll íå âëèÿåò íà
ïîâåäåíèå ïðîãðàììû.
Ñîîáùåíèÿ îá îøèáêàõ âðåìåíè âûïîëíåíèÿ âûâîäÿòñÿ â äèàëîãîâûõ îêíàõ
(Windows), â òåðìèíàë (Linux), íà äîñêó îòëàäêè (KolibriOS).
------------------------------------------------------------------------------
Ìîäóëü API
Ñóùåñòâóþò íåñêîëüêî ðåàëèçàöèé ìîäóëÿ API (äëÿ ðàçëè÷íûõ ÎÑ).
Êàê è ìîäóëü RTL, ìîäóëü API íå ïðåäíàçíà÷åí äëÿ ïðÿìîãî èñïîëüçîâàíèÿ.
Îí îáåñïå÷èâàåò ñâÿçü RTL ñ ÎÑ.
------------------------------------------------------------------------------
Ãåíåðàöèÿ èñïîëíÿåìûõ ôàéëîâ DLL
Ðàçðåøàåòñÿ ýêñïîðòèðîâàòü òîëüêî ïðîöåäóðû. Äëÿ ýòîãî, ïðîöåäóðà äîëæíà
íàõîäèòüñÿ â ãëàâíîì ìîäóëå ïðîãðàììû, è åå èìÿ äîëæíî áûòü îòìå÷åíî ñèìâîëîì
ýêñïîðòà ("*"). KolibriOS DLL âñåãäà ýêñïîðòèðóþò èäåíòèôèêàòîðû "version"
(âåðñèÿ ïðîãðàììû) è "lib_init" - àäðåñ ïðîöåäóðû èíèöèàëèçàöèè DLL:
PROCEDURE [stdcall] lib_init (): INTEGER
Ýòà ïðîöåäóðà äîëæíà áûòü âûçâàíà ïåðåä èñïîëüçîâàíèåì DLL.
Ïðîöåäóðà âñåãäà âîçâðàùàåò 1.
Äëÿ Linux, ãåíåðàöèÿ äèíàìè÷åñêèõ áèáëèîòåê íå ðåàëèçîâàíà.