Subversion Repositories Kolibri OS

Rev

Rev 7693 | Go to most recent revision | Details | Compare with Previous | 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) имя главного модуля
7696 akron1 12
  2) тип приложения
7623 akron1 13
      "console" - Windows console
14
      "gui" - Windows GUI
15
      "dll" - Windows DLL
16
      "kos" - KolibriOS
17
      "obj" - KolibriOS DLL
18
      "elfexe" - Linux ELF-EXEC
7693 akron1 19
      "elfso"  - Linux ELF-SO
7696 akron1 20
  3) необязательные параметры-ключи
21
      -out  имя результирующего файла; по умолчанию,
22
      совпадает с именем главного модуля, но с другим расширением
23
      (соответствует типу исполняемого файла)
24
      -stk  размер стэка в мегабайтах (по умолчанию 2 Мб,
25
       допустимо от 1 до 32 Мб)
26
      -nochk <"ptibcwra"> отключить проверки при выполнении (см. ниже)
7623 akron1 27
      -ver  версия программы (только для 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
 
7696 akron1 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
7623 akron1 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
 
7693 akron1 150
        PROCEDURE PUT8(a: INTEGER; x: INTEGER, SET, BYTE, CHAR, WCHAR)
7623 akron1 151
                Память[a] := младшие 8 бит (x)
152
 
7693 akron1 153
        PROCEDURE PUT16(a: INTEGER; x: INTEGER, SET, BYTE, CHAR, WCHAR)
7623 akron1 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
ошибках времени выполнения и др.) как вызовы процедур этого модуля. Не
7693 akron1 346
следует явно вызывать эти процедуры, за исключением процедур SetDll и SetFini
347
если приложение компилируется как Windows DLL или Linux SO, соответственно:
7623 akron1 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
 
7693 akron1 360
 
361
        PROCEDURE SetFini (ProcFini: PROC);
362
        где TYPE PROC = PROCEDURE (* без параметров *)
363
 
364
SetFini назначает процедуру ProcFini вызываемой при выгрузке so-библиотеки.
365
 
366
Для прочих типов приложений, вызов процедур SetDll и SetFini не влияет на
7623 akron1 367
поведение программы.
7693 akron1 368
 
7623 akron1 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.
7693 akron1 390
Процедура всегда возвращает 1.