Subversion Repositories Kolibri OS

Rev

Rev 7597 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1.         Êîìïèëÿòîð ÿçûêà ïðîãðàììèðîâàíèÿ Oberon-07/16 äëÿ i486
  2.                 Windows/Linux/KolibriOS.
  3. ------------------------------------------------------------------------------
  4.  
  5.         Ïàðàìåòðû êîìàíäíîé ñòðîêè
  6.  
  7.   Âõîä - òåêñòîâûå ôàéëû ìîäóëåé ñ ðàñøèðåíèåì ".ob07", êîäèðîâêà ANSI èëè
  8. UTF-8 ñ BOM-ñèãíàòóðîé.
  9.   Âûõîä - èñïîíÿåìûé ôàéë ôîðìàòà PE32, ELF èëè MENUET01/MSCOFF.
  10.   Ïàðàìåòðû:
  11.   1) èìÿ ãëàâíîãî ìîäóëÿ
  12.   2) èìÿ ðåçóëüòèðóþùåãî ôàéëà
  13.   3) òèï ïðèëîæåíèÿ è ïëàòôîðìà
  14.       "console" - Windows console
  15.       "gui" - Windows GUI
  16.       "dll" - Windows DLL
  17.       "kos" - KolibriOS
  18.       "obj" - KolibriOS DLL
  19.       "elfexe" - Linux ELF-EXEC
  20.       "elfso"  - Linux ELF-SO
  21.   4) íåîáÿçàòåëüíûå ïàðàìåòðû-êëþ÷è
  22.       -stk <size> ðàçìåð ñòýêà â ìåãàáàéòàõ (ïî óìîë÷àíèþ 2 Ìá)
  23.       -base <address> àäðåñ çàãðóçêè èñïîëíÿåìîãî ôàéëà â êèëîáàéòàõ
  24.       -ver <major.minor> âåðñèÿ ïðîãðàììû (òîëüêî äëÿ obj)
  25.       -nochk <"ptibcwra"> îòêëþ÷èòü ïðîâåðêè ïðè âûïîëíåíèè (ñì. íèæå)
  26.  
  27.       ïàðàìåòð -nochk çàäàåòñÿ â âèäå ñòðîêè èç ñèìâîëîâ:
  28.       "p" - óêàçàòåëè
  29.       "t" - òèïû
  30.       "i" - èíäåêñû
  31.       "b" - íåÿâíîå ïðèâåäåíèå INTEGER ê BYTE
  32.       "c" - äèàïàçîí àðãóìåíòà ôóíêöèè CHR
  33.       "w" - äèàïàçîí àðãóìåíòà ôóíêöèè WCHR
  34.       "r" - ýêâèâàëåíòíî "bcw"
  35.       "a" - âñå ïðîâåðêè
  36.  
  37.       Ïîðÿäîê ñèìâîëîâ ìîæåò áûòü ëþáûì. Íàëè÷èå â ñòðîêå òîãî èëè èíîãî
  38.       ñèìâîëà îòêëþ÷àåò ñîîòâåòñòâóþùóþ ïðîâåðêó.
  39.  
  40.       Íàïðèìåð: -nochk it - îòêëþ÷èòü ïðîâåðêó èíäåêñîâ è îõðàíó òèïà.
  41.       -nochk a - îòêëþ÷èòü âñå îòêëþ÷àåìûå ïðîâåðêè.
  42.  
  43.   Íàïðèìåð:
  44.  
  45.   Compiler.exe "C:\example.ob07" "C:\example.exe" console -stk 1
  46.   Compiler.exe "C:\example.ob07" "C:\example.dll" dll
  47.   Compiler.exe "C:\example.ob07" "C:\example.exe" gui -stk 4
  48.   Compiler.exe "C:\example.ob07" "C:\example.exe" console -nochk pti
  49.   Compiler.kex "/tmp0/1/example.ob07" "/tmp0/1/example.kex" kos -stk 2
  50.   Compiler.kex "/tmp0/1/example.ob07" "/tmp0/1/example.obj" obj -ver 2.7
  51.   Compiler.exe "C:\example.ob07" "C:\example" elfexe
  52.  
  53.    ñëó÷àå óñïåøíîé êîìïèëÿöèè, êîìïèëÿòîð ïåðåäàåò êîä çàâåðøåíèÿ 0, èíà÷å 1.
  54. Ïðè ðàáîòå êîìïèëÿòîðà â KolibriOS, êîä çàâåðøåíèÿ íå ïåðåäàåòñÿ.
  55.  
  56. ------------------------------------------------------------------------------
  57.         Îòëè÷èÿ îò îðèãèíàëà
  58.  
  59. 1.      Ðàñøèðåí ïñåâäîìîäóëü SYSTEM
  60. 2.      Â èäåíòèôèêàòîðàõ äîïóñêàåòñÿ ñèìâîë "_"
  61. 3.      Äîáàâëåíû ñèñòåìíûå ôëàãè
  62. 4.      Óñîâåðøåíñòâîâàí îïåðàòîð CASE (äîáàâëåíû êîíñòàíòíûå âûðàæåíèÿ â
  63.         ìåòêàõ âàðèàíòîâ è íåîáÿçàòåëüíàÿ âåòêà ELSE)
  64. 5.      Ðàñøèðåí íàáîð ñòàíäàðòíûõ ïðîöåäóð
  65. 6.      Ñåìàíòèêà îõðàíû/ïðîâåðêè òèïà óòî÷íåíà äëÿ íóëåâîãî óêàçàòåëÿ
  66. 7.      Ñåìàíòèêà DIV è MOD óòî÷íåíà äëÿ îòðèöàòåëüíûõ ÷èñåë
  67. 8.      Äîáàâëåíû îäíîñòðî÷íûå êîììåíòàðèè (íà÷èíàþòñÿ ñ ïàðû ñèìâîëîâ "//")
  68. 9.      Ðàçðåøåíî íàñëåäîâàíèå îò òèïà-óêàçàòåëÿ
  69. 10.     Äîáàâëåí ñèíòàêñèñ äëÿ èìïîðòà ïðîöåäóð èç âíåøíèõ áèáëèîòåê
  70. 11.     "Ñòðîêè" ìîæíî çàêëþ÷àòü òàêæå â îäèíî÷íûå êàâû÷êè: 'ñòðîêà'
  71. 12.     Äîáàâëåí òèï WCHAR
  72.  
  73. ------------------------------------------------------------------------------
  74.         Îñîáåííîñòè ðåàëèçàöèè
  75.  
  76. 1.      Îñíîâíûå òèïû
  77.  
  78.           Òèï              Äèàïàçîí çíà÷åíèé               Ðàçìåð, áàéò
  79.  
  80.         INTEGER       -2147483648 .. 2147483647                 4
  81.         REAL          4.94E-324 .. 1.70E+308                    8
  82.         CHAR          ñèìâîë ASCII (0X .. 0FFX)                 1
  83.         BOOLEAN       FALSE, TRUE                               1
  84.         SET           ìíîæåñòâî èç öåëûõ ÷èñåë {0 .. 31}        4
  85.         BYTE          0 .. 255                                  1
  86.         WCHAR         ñèìâîë þíèêîäà (0X .. 0FFFFX)             2
  87.  
  88. 2.      Ìàêñèìàëüíàÿ äëèíà èäåíòèôèêàòîðîâ - 1024 ñèìâîëîâ
  89. 3.      Ìàêñèìàëüíàÿ äëèíà ñòðîêîâûõ êîíñòàíò - 1024 ñèìâîëîâ (UTF-8)
  90. 4.      Ìàêñèìàëüíàÿ ðàçìåðíîñòü îòêðûòûõ ìàññèâîâ - 5
  91. 5.      Ïðîöåäóðà NEW çàïîëíÿåò íóëÿìè âûäåëåííûé áëîê ïàìÿòè
  92. 6.      Ãëîáàëüíûå è ëîêàëüíûå ïåðåìåííûå èíèöèàëèçèðóþòñÿ íóëÿìè
  93. 7.      Â îòëè÷èå îò ìíîãèõ Oberon-ðåàëèçàöèé, ñáîðùèê ìóñîðà è äèíàìè÷åñêàÿ
  94.         ìîäóëüíîñòü îòñóòñòâóþò
  95. 8.      Òèï BYTE â âûðàæåíèÿõ âñåãäà ïðèâîäèòñÿ ê INTEGER
  96. 9.      Êîíòðîëü ïåðåïîëíåíèÿ çíà÷åíèé âûðàæåíèé íå ïðîèçâîäèòñÿ
  97. 10.     Îøèáêè âðåìåíè âûïîëíåíèÿ:
  98.  
  99.         - ASSERT(x), ïðè x = FALSE
  100.         - ðàçûìåíîâàíèå íóëåâîãî óêàçàòåëÿ
  101.         - öåëî÷èñëåííîå äåëåíèå íà 0
  102.         - âûçîâ ïðîöåäóðû ÷åðåç ïðîöåäóðíóþ ïåðåìåííóþ ñ íóëåâûì çíà÷åíèåì
  103.         - îøèáêà îõðàíû òèïà
  104.         - íàðóøåíèå ãðàíèö ìàññèâà
  105.         - íåïðåäóñìîòðåííîå çíà÷åíèå âûðàæåíèÿ â îïåðàòîðå CASE
  106.         - îøèáêà êîïèðîâàíèÿ ìàññèâîâ v := x, åñëè LEN(v) < LEN(x)
  107.         - íåÿâíîå ïðèâåäåíèå x:INTEGER ê v:BYTE, åñëè (x < 0) OR (x > 255)
  108.         - CHR(x), åñëè (x < 0) OR (x > 255)
  109.         - WCHR(x), åñëè (x < 0) OR (x > 65535)
  110.  
  111. ------------------------------------------------------------------------------
  112.         Ïñåâäîìîäóëü SYSTEM
  113.  
  114.   Ïñåâäîìîäóëü SYSTEM ñîäåðæèò íèçêîóðîâíåâûå è íåáåçîïàñíûå ïðîöåäóðû,
  115. îøèáêè ïðè èñïîëüçîâàíèè ïðîöåäóð ïñåâäîìîäóëÿ SYSTEM ìîãóò ïðèâåñòè ê
  116. ïîâðåæäåíèþ äàííûõ âðåìåíè âûïîëíåíèÿ è àâàðèéíîìó çàâåðøåíèþ ïðîãðàììû.
  117.  
  118.         PROCEDURE ADR(v: ëþáîé òèï): INTEGER
  119.                 v - ïåðåìåííàÿ èëè ïðîöåäóðà;
  120.                 âîçâðàùàåò àäðåñ v
  121.  
  122.         PROCEDURE SADR(x: ñòðîêîâàÿ êîíñòàíòà (CHAR UTF-8)): INTEGER
  123.                 âîçâðàùàåò àäðåñ x
  124.  
  125.         PROCEDURE WSADR(x: ñòðîêîâàÿ êîíñòàíòà (WCHAR)): INTEGER
  126.                 âîçâðàùàåò àäðåñ x
  127.  
  128.         PROCEDURE SIZE(T): INTEGER
  129.                 âîçâðàùàåò ðàçìåð òèïà T
  130.  
  131.         PROCEDURE TYPEID(T): INTEGER
  132.                 T - òèï-çàïèñü èëè òèï-óêàçàòåëü,
  133.                 âîçâðàùàåò íîìåð òèïà â òàáëèöå òèïîâ-çàïèñåé
  134.  
  135.         PROCEDURE INF(): REAL
  136.                 âîçâðàùàåò ñïåöèàëüíîå âåùåñòâåííîå çíà÷åíèå "áåñêîíå÷íîñòü"
  137.  
  138.         PROCEDURE GET(a: INTEGER;
  139.                 VAR v: ëþáîé îñíîâíîé òèï, PROCEDURE, POINTER)
  140.                 v := Ïàìÿòü[a]
  141.  
  142.         PROCEDURE PUT(a: INTEGER; x: ëþáîé îñíîâíîé òèï, PROCEDURE, POINTER)
  143.                 Ïàìÿòü[a] := x;
  144.                 Åñëè x: BYTE èëè x: WCHAR, òî çíà÷åíèå x áóäåò ðàñøèðåíî
  145.                 äî 32 áèò, äëÿ çàïèñè áàéòîâ èñïîëüçîâàòü SYSTEM.PUT8,
  146.                 äëÿ WCHAR -- SYSTEM.PUT16
  147.  
  148.         PROCEDURE PUT8(a: INTEGER; x: INTEGER, SET, BYTE, CHAR, WCHAR)
  149.                 Ïàìÿòü[a] := ìëàäøèå 8 áèò (x)
  150.  
  151.         PROCEDURE PUT16(a: INTEGER; x: INTEGER, SET, BYTE, CHAR, WCHAR)
  152.                 Ïàìÿòü[a] := ìëàäøèå 16 áèò (x)
  153.  
  154.         PROCEDURE MOVE(Source, Dest, n: INTEGER)
  155.                 Êîïèðóåò n áàéò ïàìÿòè èç Source â Dest,
  156.                 îáëàñòè Source è Dest íå ìîãóò ïåðåêðûâàòüñÿ
  157.  
  158.         PROCEDURE COPY(VAR Source: ëþáîé òèï; VAR Dest: ëþáîé òèï; n: INTEGER)
  159.                 Êîïèðóåò n áàéò ïàìÿòè èç Source â Dest.
  160.                 Ýêâèâàëåíòíî
  161.                 SYSTEM.MOVE(SYSTEM.ADR(Source), SYSTEM.ADR(Dest), n)
  162.  
  163.         PROCEDURE CODE(byte1, byte2,... : INTEGER)
  164.                 Âñòàâêà ìàøèííîãî êîäà,
  165.                 byte1, byte2 ... - êîíñòàíòû â äèàïàçîíå 0..255,
  166.                 íàïðèìåð:
  167.                 SYSTEM.CODE(08BH, 045H, 008H) (* mov eax, dword [ebp + 08h] *)
  168.  
  169.   Òàêæå â ìîäóëå SYSTEM îïðåäåëåí òèï CARD16 (2 áàéòà). Äëÿ òèïà CARD16 íå
  170. äîïóñêàþòñÿ íèêàêèå ÿâíûå îïåðàöèè, çà èñêëþ÷åíèåì ïðèñâàèâàíèÿ.
  171. Ïðåîáðàçîâàíèÿ CARD16 -> INTEGER è INTEGER -> CARD16 ìîãóò áûòü ðåàëèçîâàíû
  172. òàê:
  173.  
  174.         PROCEDURE Card16ToInt (w: SYSTEM.CARD16): INTEGER;
  175.         VAR i: INTEGER;
  176.         BEGIN
  177.             SYSTEM.PUT(SYSTEM.ADR(i), w)
  178.             RETURN i
  179.         END Card16ToInt;
  180.  
  181.         PROCEDURE IntToCard16 (i: INTEGER): SYSTEM.CARD16;
  182.         VAR w: SYSTEM.CARD16;
  183.         BEGIN
  184.             SYSTEM.GET(SYSTEM.ADR(i), w)
  185.             RETURN w
  186.         END IntToCard16;
  187.  
  188.   Ôóíêöèè ïñåâäîìîäóëÿ SYSTEM íåëüçÿ èñïîëüçîâàòü â êîíñòàíòíûõ âûðàæåíèÿõ.
  189.  
  190. ------------------------------------------------------------------------------
  191.         Ñèñòåìíûå ôëàãè
  192.  
  193.   Ïðè îáúÿâëåíèè ïðîöåäóðíûõ òèïîâ è ãëîáàëüíûõ ïðîöåäóð, ïîñëå êëþ÷åâîãî
  194. ñëîâà PROCEDURE ìîæåò áûòü óêàçàí ôëàã ñîãëàøåíèÿ î âûçîâå: [stdcall],
  195. [ccall], [ccall16], [windows], [linux]. Íàïðèìåð:
  196.  
  197.         PROCEDURE [ccall] MyProc (x, y, z: INTEGER): INTEGER;
  198.  
  199.   Åñëè óêàçàí ôëàã [ccall16], òî ïðèíèìàåòñÿ ñîãëàøåíèå ccall, íî ïåðåä
  200. âûçîâîì óêàçàòåëü ñòýêà áóäåò âûðàâíåí ïî ãðàíèöå 16 áàéò.
  201.   Ôëàã [windows] - ñèíîíèì äëÿ [stdcall], [linux] - ñèíîíèì äëÿ [ccall16].
  202.   Çíàê "-" ïîñëå èìåíè ôëàãà ([stdcall-], [linux-], ...) îçíà÷àåò, ÷òî
  203. ðåçóëüòàò ïðîöåäóðû ìîæíî èãíîðèðîâàòü (íå äîïóñêàåòñÿ äëÿ òèïà REAL).
  204.  
  205.   Ïðè îáúÿâëåíèè òèïîâ-çàïèñåé, ïîñëå êëþ÷åâîãî ñëîâà RECORD ìîæåò áûòü
  206. óêàçàí ôëàã [noalign]. Ôëàã [noalign] îçíà÷àåò îòñóòñòâèå âûðàâíèâàíèÿ ïîëåé
  207. çàïèñè. Çàïèñè ñ ñèñòåìíûì ôëàãîì íå ìîãóò èìåòü áàçîâûé òèï è íå ìîãóò áûòü
  208. áàçîâûìè òèïàìè äëÿ äðóãèõ çàïèñåé.
  209.   Äëÿ èñïîëüçîâàíèÿ ñèñòåìíûõ ôëàãîâ, òðåáóåòñÿ èìïîðòèðîâàòü SYSTEM.
  210.  
  211. ------------------------------------------------------------------------------
  212.         Îïåðàòîð CASE
  213.  
  214.   Ñèíòàêñèñ îïåðàòîðà CASE:
  215.  
  216.         CaseStatement =
  217.                 CASE Expression OF Ñase {"|" Ñase}
  218.                         [ELSE StatementSequence] END.
  219.         Case = [CaseLabelList ":" StatementSequence].
  220.         CaseLabelList = CaseLabels {"," CaseLabels}.
  221.         CaseLabels = ConstExpression [".." ConstExpression].
  222.  
  223.   Íàïðèìåð:
  224.  
  225.         CASE x OF
  226.         |-1:    DoSomething1
  227.         | 1:    DoSomething2
  228.         | 0:    DoSomething3
  229.         ELSE
  230.                 DoSomething4
  231.         END
  232.  
  233.   Â ìåòêàõ âàðèàíòîâ ìîæíî èñïîëüçîâàòü êîíñòàíòíûå âûðàæåíèÿ, âåòêà ELSE
  234. íåîáÿçàòåëüíà. Åñëè çíà÷åíèå x íå ñîîòâåòñòâóåò íè îäíîìó âàðèàíòó è ELSE
  235. îòñóòñòâóåò, òî ïðîãðàììà ïðåðûâàåòñÿ ñ îøèáêîé âðåìåíè âûïîëíåíèÿ.
  236.  
  237. ------------------------------------------------------------------------------
  238.         Òèï WCHAR
  239.  
  240.   Òèï WCHAR äîáàâëåí â ÿçûê äëÿ óäîáíîé ïîääåæêè þíèêîäà. Äëÿ òèïîâ WCHAR è
  241. ARRAY OF WCHAR äîïóñêàþòñÿ âñå òå æå îïåðàöèè, êàê äëÿ òèïîâ CHAR è
  242. ARRAY OF CHAR, çà èñêëþ÷åíèåì âñòðîåííîé ïðîöåäóðû CHR, êîòîðàÿ âîçâðàùàåò
  243. òîëüêî òèï CHAR. Äëÿ ïîëó÷åíèÿ çíà÷åíèÿ òèïà WCHAR, ñëåäóåò èñïîëüçîâàòü
  244. ïðîöåäóðó WCHR âìåñòî CHR. Äëÿ ïðàâèëüíîé ðàáîòû ñ òèïîì, íåîáõîäèìî ñîõðàíÿòü
  245. èñõîäíûé êîä â êîäèðîâêå UTF-8 c BOM.
  246.  
  247. ------------------------------------------------------------------------------
  248.         Ïðîâåðêà è îõðàíà òèïà íóëåâîãî óêàçàòåëÿ
  249.  
  250.   Îðèãèíàëüíîå ñîîáùåíèå î ÿçûêå íå îïðåäåëÿåò ïîâåäåíèå ïðîãðàììû ïðè
  251. âûïîëíåíèè îõðàíû p(T) è ïðîâåðêè òèïà p IS T ïðè p = NIL. Âî ìíîãèõ
  252. Oberon-ðåàëèçàöèÿõ âûïîëíåíèå òàêîé îïåðàöèè ïðèâîäèò ê îøèáêå âðåìåíè
  253. âûïîëíåíèÿ. Â äàííîé ðåàëèçàöèè îõðàíà òèïà íóëåâîãî óêàçàòåëÿ íå ïðèâîäèò ê
  254. îøèáêå, à ïðîâåðêà òèïà äàåò ðåçóëüòàò FALSE.  ðÿäå ñëó÷àåâ ýòî ïîçâîëÿåò
  255. çíà÷èòåëüíî ñîêðàòèòü ÷àñòîòó ïðèìåíåíèÿ îõðàíû òèïà.
  256.  
  257. ------------------------------------------------------------------------------
  258.         Äîïîëíèòåëüíûå ñòàíäàðòíûå ïðîöåäóðû
  259.  
  260.         DISPOSE (VAR v: ëþáîé_óêàçàòåëü)
  261.                 Îñâîáîæäàåò ïàìÿòü, âûäåëåííóþ ïðîöåäóðîé NEW äëÿ
  262.                 äèíàìè÷åñêîé ïåðåìåííîé v^, è ïðèñâàèâàåò ïåðåìåííîé v
  263.                 çíà÷åíèå NIL.
  264.  
  265.         COPY (x: ARRAY OF CHAR/WCHAR; VAR v: ARRAY OF CHAR/WCHAR);
  266.                 v := x;
  267.                 Åñëè LEN(v) < LEN(x), òî ñòðîêà x áóäåò ñêîïèðîâàíà
  268.                 íå ïîëíîñòüþ
  269.  
  270.         LSR (x, n: INTEGER): INTEGER
  271.                 Ëîãè÷åñêèé ñäâèã x íà n áèò âïðàâî.
  272.  
  273.         MIN (a, b: INTEGER): INTEGER
  274.                 Ìèíèìóì èç äâóõ çíà÷åíèé.
  275.  
  276.         MAX (a, b: INTEGER): INTEGER
  277.                 Ìàêñèìóì èç äâóõ çíà÷åíèé.
  278.  
  279.         BITS (x: INTEGER): SET
  280.                 Èíòåðïðåòèðóåò x êàê çíà÷åíèå òèïà SET.
  281.                 Âûïîëíÿåòñÿ íà ýòàïå êîìïèëÿöèè.
  282.  
  283.         LENGTH (s: ARRAY OF CHAR/WCHAR): INTEGER
  284.                 Äëèíà 0X-çàâåðøåííîé ñòðîêè s, áåç ó÷åòà ñèìâîëà 0X.
  285.                 Åñëè ñèìâîë 0X îòñóòñòâóåò, ôóíêöèÿ âîçâðàùàåò äëèíó
  286.                 ìàññèâà s. s íå ìîæåò áûòü êîíñòàíòîé.
  287.  
  288.         WCHR (n: INTEGER): WCHAR
  289.                 Ïðåîáðàçîâàíèå òèïà, àíàëîãè÷íî CHR(n: INTEGER): CHAR
  290.  
  291. ------------------------------------------------------------------------------
  292.         DIV è MOD
  293.  
  294.          x         y      x DIV y   x MOD y
  295.  
  296.          5         3         1         2
  297.         -5         3        -2         1
  298.          5        -3        -2        -1
  299.         -5        -3         1        -2
  300.  
  301. ------------------------------------------------------------------------------
  302.         Èìïîðòèðîâàííûå ïðîöåäóðû
  303.  
  304.   Ñèíòàêñèñ èìïîðòà:
  305.  
  306.   PROCEDURE [callconv, "library", "function"] proc_name (FormalParam): Type;
  307.  
  308.   - callconv -- ñîãëàøåíèå î âûçîâå
  309.   - "library" -- èìÿ ôàéëà äèíàìè÷åñêîé áèáëèîòåêè
  310.   - "function" -- èìÿ èìïîðòèðóåìîé ïðîöåäóðû
  311.  
  312.   íàïðèìåð:
  313.  
  314.   PROCEDURE [windows, "kernel32.dll", "ExitProcess"] exit (code: INTEGER);
  315.  
  316.   PROCEDURE [stdcall, "Console.obj", "con_exit"] exit (bCloseWindow: BOOLEAN);
  317.  
  318.   Â êîíöå îáúÿâëåíèÿ ìîæåò áûòü äîáàâëåíî (íåîáÿçàòåëüíî) "END proc_name;"
  319.  
  320.   Îáúÿâëåíèÿ èìïîðòèðîâàííûõ ïðîöåäóð äîëæíû ðàñïîëàãàòüñÿ â ãëîáàëüíîé
  321.   îáëàñòè âèäèìîñòè ìîäóëÿ ïîñëå îáúÿâëåíèÿ ïåðåìåííûõ, âìåñòå ñ îáúÿâëåíèåì
  322.   "îáû÷íûõ" ïðîöåäóð, îò êîòîðûõ èìïîðòèðîâàííûå îòëè÷àþòñÿ òîëüêî îòñóòñòâèåì
  323.   òåëà ïðîöåäóðû. Â îñòàëüíîì, ê òàêèì ïðîöåäóðàì ïðèìåíèìû òå æå ïðàâèëà:
  324.   èõ ìîæíî âûçâàòü, ïðèñâîèòü ïðîöåäóðíîé ïåðåìåííîé èëè ïîëó÷èòü àäðåñ.
  325.  
  326.   Òàê êàê èìïîðòèðîâàííàÿ ïðîöåäóðà âñåãäà èìååò ÿâíîå óêàçàíèå ñîãëàøåíèÿ î
  327.   âûçîâå, òî ñîâìåñòèìûé ïðîöåäóðíûé òèï òîæå äîëæåí áûòü îáúÿâëåí ñ óêàçàíèåì
  328.   ñîãëàøåíèÿ î âûçîâå:
  329.  
  330.   VAR
  331.       ExitProcess: PROCEDURE [windows] (code: INTEGER);
  332.       con_exit:    PROCEDURE [stdcall] (bCloseWindow: BOOLEAN);
  333.  
  334.   Â KolibriOS èìïîðòèðîâàòü ïðîöåäóðû ìîæíî òîëüêî èç áèáëèîòåê, ðàçìåùåííûõ
  335.   â /rd/1/lib. Èìïîðòèðîâàòü è âûçûâàòü ôóíêöèè èíèöèàëèçàöèè áèáëèîòåê
  336.   (lib_init, START) ïðè ýòîì íå íóæíî.
  337.  
  338.   Äëÿ Linux, èìïîðòèðîâàííûå ïðîöåäóðû íå ðåàëèçîâàíû.
  339.  
  340. ------------------------------------------------------------------------------
  341.         Ñêðûòûå ïàðàìåòðû ïðîöåäóð
  342.  
  343.   Íåêîòîðûå ïðîöåäóðû ìîãóò èìåòü ñêðûòûå ïàðàìåòðû, îíè îòñóòñòâóþò â ñïèñêå
  344. ôîðìàëüíûõ ïàðàìåòðîâ, íî ó÷èòûâàþòñÿ êîìïèëÿòîðîì ïðè òðàíñëÿöèè âûçîâîâ.
  345. Ýòî âîçìîæíî â ñëåäóþùèõ ñëó÷àÿõ:
  346.  
  347. 1.      Ïðîöåäóðà èìååò ôîðìàëüíûé ïàðàìåòð îòêðûòûé ìàññèâ:
  348.                 PROCEDURE Proc (x: ARRAY OF ARRAY OF REAL);
  349.         Âûçîâ òðàíñëèðóåòñÿ òàê:
  350.                 Proc(LEN(x), LEN(x[0]), SYSTEM.ADR(x))
  351. 2.      Ïðîöåäóðà èìååò ôîðìàëüíûé ïàðàìåòð-ïåðåìåííóþ òèïà RECORD:
  352.                 PROCEDURE Proc (VAR x: Rec);
  353.         Âûçîâ òðàíñëèðóåòñÿ òàê:
  354.                 Proc(SYSTEM.TYPEID(Rec), SYSTEM.ADR(x))
  355.  
  356. ------------------------------------------------------------------------------
  357.         Ìîäóëü RTL
  358.  
  359.   Âñå ïðîãðàììû íåÿâíî èñïîëüçóþò ìîäóëü RTL. Êîìïèëÿòîð òðàíñëèðóåò
  360. íåêîòîðûå îïåðàöèè (ïðîâåðêà è îõðàíà òèïà, ñðàâíåíèå ñòðîê, ñîîáùåíèÿ îá
  361. îøèáêàõ âðåìåíè âûïîëíåíèÿ è äð.) êàê âûçîâû ïðîöåäóð ýòîãî ìîäóëÿ. Íå
  362. ñëåäóåò ÿâíî âûçûâàòü ýòè ïðîöåäóðû, çà èñêëþ÷åíèåì ïðîöåäóð SetDll è SetFini
  363. åñëè ïðèëîæåíèå êîìïèëèðóåòñÿ êàê Windows DLL èëè Linux SO, ñîîòâåòñòâåííî:
  364.  
  365.         PROCEDURE SetDll
  366.             (process_detach, thread_detach, thread_attach: DLL_ENTRY);
  367.         ãäå TYPE DLL_ENTRY =
  368.             PROCEDURE (hinstDLL, fdwReason, lpvReserved: INTEGER);
  369.  
  370. SetDll íàçíà÷àåò ïðîöåäóðû process_detach, thread_detach, thread_attach
  371. âûçûâàåìûìè ïðè
  372. - âûãðóçêå dll-áèáëèîòåêè (process_detach)
  373. - ñîçäàíèè íîâîãî ïîòîêà (thread_attach)
  374. - óíè÷òîæåíèè ïîòîêà (thread_detach)
  375.  
  376.  
  377.         PROCEDURE SetFini (ProcFini: PROC);
  378.         ãäå TYPE PROC = PROCEDURE (* áåç ïàðàìåòðîâ *)
  379.  
  380. SetFini íàçíà÷àåò ïðîöåäóðó ProcFini âûçûâàåìîé ïðè âûãðóçêå so-áèáëèîòåêè.
  381.  
  382. Äëÿ ïðî÷èõ òèïîâ ïðèëîæåíèé, âûçîâ ïðîöåäóð SetDll è SetFini íå âëèÿåò íà
  383. ïîâåäåíèå ïðîãðàììû.
  384.  
  385.   Ñîîáùåíèÿ îá îøèáêàõ âðåìåíè âûïîëíåíèÿ âûâîäÿòñÿ â äèàëîãîâûõ îêíàõ
  386. (Windows), â òåðìèíàë (Linux), íà äîñêó îòëàäêè (KolibriOS).
  387.  
  388. ------------------------------------------------------------------------------
  389.         Ìîäóëü API
  390.  
  391.   Ñóùåñòâóþò íåñêîëüêî ðåàëèçàöèé ìîäóëÿ API (äëÿ ðàçëè÷íûõ ÎÑ).
  392.   Êàê è ìîäóëü RTL, ìîäóëü API íå ïðåäíàçíà÷åí äëÿ ïðÿìîãî èñïîëüçîâàíèÿ.
  393. Îí îáåñïå÷èâàåò ñâÿçü RTL ñ ÎÑ.
  394.  
  395. ------------------------------------------------------------------------------
  396.         Ãåíåðàöèÿ èñïîëíÿåìûõ ôàéëîâ DLL
  397.  
  398.   Ðàçðåøàåòñÿ ýêñïîðòèðîâàòü òîëüêî ïðîöåäóðû. Äëÿ ýòîãî, ïðîöåäóðà äîëæíà
  399. íàõîäèòüñÿ â ãëàâíîì ìîäóëå ïðîãðàììû, è åå èìÿ äîëæíî áûòü îòìå÷åíî ñèìâîëîì
  400. ýêñïîðòà ("*"). KolibriOS DLL âñåãäà ýêñïîðòèðóþò èäåíòèôèêàòîðû "version"
  401. (âåðñèÿ ïðîãðàììû) è "lib_init" - àäðåñ ïðîöåäóðû èíèöèàëèçàöèè DLL:
  402.  
  403.         PROCEDURE [stdcall] lib_init (): INTEGER
  404.  
  405. Ýòà ïðîöåäóðà äîëæíà áûòü âûçâàíà ïåðåä èñïîëüçîâàíèåì DLL.
  406. Ïðîöåäóðà âñåãäà âîçâðàùàåò 1.