Subversion Repositories Kolibri OS

Rev

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