Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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