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
7597 akron1 1
Компилятор языка программирования Oberon-07/16 для i486
2
                Windows/Linux/KolibriOS.
6613 leency 3
------------------------------------------------------------------------------
4
 
7597 akron1 5
        Параметры командной строки
6613 leency 6
 
7597 akron1 7
  Вход - текстовые файлы модулей с расширением ".ob07", кодировка ANSI или
8
UTF-8 с BOM-сигнатурой.
9
  Выход - испоняемый файл формата PE32, ELF или MENUET01/MSCOFF.
10
  Параметры:
11
  1) имя главного модуля
7696 akron1 12
  2) тип приложения
7597 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"> отключить проверки при выполнении (см. ниже)
7597 akron1 27
      -ver  версия программы (только для obj)
6613 leency 28
 
7597 akron1 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
7597 akron1 54
 
55
  В случае успешной компиляции, компилятор передает код завершения 0, иначе 1.
56
При работе компилятора в KolibriOS, код завершения не передается.
57
 
6613 leency 58
------------------------------------------------------------------------------
7597 akron1 59
        Отличия от оригинала
6613 leency 60
 
7597 akron1 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
6613 leency 74
 
75
------------------------------------------------------------------------------
7597 akron1 76
        Особенности реализации
6613 leency 77
 
7597 akron1 78
1.      Основные типы
6613 leency 79
 
7597 akron1 80
          Тип              Диапазон значений               Размер, байт
6613 leency 81
 
7597 akron1 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
6613 leency 89
 
7597 akron1 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.     Ошибки времени выполнения:
6613 leency 100
 
7597 akron1 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
 
6613 leency 113
------------------------------------------------------------------------------
7597 akron1 114
        Псевдомодуль SYSTEM
6613 leency 115
 
116
  Псевдомодуль SYSTEM содержит низкоуровневые и небезопасные процедуры,
117
ошибки при использовании процедур псевдомодуля SYSTEM могут привести к
118
повреждению данных времени выполнения и аварийному завершению программы.
119
 
7597 akron1 120
        PROCEDURE ADR(v: любой тип): INTEGER
121
                v - переменная или процедура;
122
                возвращает адрес v
6613 leency 123
 
7597 akron1 124
        PROCEDURE SADR(x: строковая константа (CHAR UTF-8)): INTEGER
125
                возвращает адрес x
6613 leency 126
 
7597 akron1 127
        PROCEDURE WSADR(x: строковая константа (WCHAR)): INTEGER
128
                возвращает адрес x
6613 leency 129
 
7597 akron1 130
        PROCEDURE SIZE(T): INTEGER
131
                возвращает размер типа T
6613 leency 132
 
7597 akron1 133
        PROCEDURE TYPEID(T): INTEGER
134
                T - тип-запись или тип-указатель,
135
                возвращает номер типа в таблице типов-записей
6613 leency 136
 
7597 akron1 137
        PROCEDURE INF(): REAL
138
                возвращает специальное вещественное значение "бесконечность"
6613 leency 139
 
7597 akron1 140
        PROCEDURE GET(a: INTEGER;
141
                VAR v: любой основной тип, PROCEDURE, POINTER)
142
                v := Память[a]
6613 leency 143
 
7597 akron1 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
7107 akron1 149
 
7693 akron1 150
        PROCEDURE PUT8(a: INTEGER; x: INTEGER, SET, BYTE, CHAR, WCHAR)
7597 akron1 151
                Память[a] := младшие 8 бит (x)
6613 leency 152
 
7693 akron1 153
        PROCEDURE PUT16(a: INTEGER; x: INTEGER, SET, BYTE, CHAR, WCHAR)
7597 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
 
6613 leency 171
 
172
  Функции псевдомодуля SYSTEM нельзя использовать в константных выражениях.
173
 
174
------------------------------------------------------------------------------
7597 akron1 175
        Системные флаги
6613 leency 176
 
177
  При объявлении процедурных типов и глобальных процедур, после ключевого
7597 akron1 178
слова PROCEDURE может быть указан флаг соглашения о вызове: [stdcall],
179
[ccall], [ccall16], [windows], [linux]. Например:
6613 leency 180
 
7597 akron1 181
        PROCEDURE [ccall] MyProc (x, y, z: INTEGER): INTEGER;
6613 leency 182
 
7597 akron1 183
  Если указан флаг [ccall16], то принимается соглашение ccall, но перед
184
вызовом указатель стэка будет выравнен по границе 16 байт.
185
  Флаг [windows] - синоним для [stdcall], [linux] - синоним для [ccall16].
186
  Знак "-" после имени флага ([stdcall-], [linux-], ...) означает, что
187
результат процедуры можно игнорировать (не допускается для типа REAL).
188
 
6613 leency 189
  При объявлении типов-записей, после ключевого слова RECORD может быть
7597 akron1 190
указан флаг [noalign]. Флаг [noalign] означает отсутствие выравнивания полей
191
записи. Записи с системным флагом не могут иметь базовый тип и не могут быть
6613 leency 192
базовыми типами для других записей.
193
  Для использования системных флагов, требуется импортировать SYSTEM.
194
 
195
------------------------------------------------------------------------------
7597 akron1 196
        Оператор CASE
6613 leency 197
 
198
  Синтаксис оператора CASE:
199
 
7597 akron1 200
        CaseStatement =
201
                CASE Expression OF Сase {"|" Сase}
202
                        [ELSE StatementSequence] END.
203
        Case = [CaseLabelList ":" StatementSequence].
204
        CaseLabelList = CaseLabels {"," CaseLabels}.
205
        CaseLabels = ConstExpression [".." ConstExpression].
6613 leency 206
 
207
  Например:
208
 
7597 akron1 209
        CASE x OF
210
        |-1:    DoSomething1
211
        | 1:    DoSomething2
212
        | 0:    DoSomething3
213
        ELSE
214
                DoSomething4
215
        END
6613 leency 216
 
217
  В метках вариантов можно использовать константные выражения, ветка ELSE
7597 akron1 218
необязательна. Если значение x не соответствует ни одному варианту и ELSE
219
отсутствует, то программа прерывается с ошибкой времени выполнения.
6613 leency 220
 
221
------------------------------------------------------------------------------
7597 akron1 222
        Тип WCHAR
6613 leency 223
 
7597 akron1 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
 
6613 leency 234
  Оригинальное сообщение о языке не определяет поведение программы при
235
выполнении охраны p(T) и проверки типа p IS T при p = NIL. Во многих
236
Oberon-реализациях выполнение такой операции приводит к ошибке времени
237
выполнения. В данной реализации охрана типа нулевого указателя не приводит к
238
ошибке, а проверка типа дает результат FALSE. В ряде случаев это позволяет
239
значительно сократить частоту применения охраны типа.
240
 
241
------------------------------------------------------------------------------
7597 akron1 242
        Дополнительные стандартные процедуры
6613 leency 243
 
7597 akron1 244
        DISPOSE (VAR v: любой_указатель)
245
                Освобождает память, выделенную процедурой NEW для
246
                динамической переменной v^, и присваивает переменной v
247
                значение NIL.
6613 leency 248
 
7597 akron1 249
        COPY (x: ARRAY OF CHAR/WCHAR; VAR v: ARRAY OF CHAR/WCHAR);
250
                v := x;
251
                Если LEN(v) < LEN(x), то строка x будет скопирована
252
                не полностью
6613 leency 253
 
7597 akron1 254
        LSR (x, n: INTEGER): INTEGER
255
                Логический сдвиг x на n бит вправо.
7107 akron1 256
 
7597 akron1 257
        MIN (a, b: INTEGER): INTEGER
258
                Минимум из двух значений.
7107 akron1 259
 
7597 akron1 260
        MAX (a, b: INTEGER): INTEGER
261
                Максимум из двух значений.
6613 leency 262
 
7597 akron1 263
        BITS (x: INTEGER): SET
264
                Интерпретирует x как значение типа SET.
265
                Выполняется на этапе компиляции.
6613 leency 266
 
7597 akron1 267
        LENGTH (s: ARRAY OF CHAR/WCHAR): INTEGER
268
                Длина 0X-завершенной строки s, без учета символа 0X.
269
                Если символ 0X отсутствует, функция возвращает длину
270
                массива s. s не может быть константой.
6613 leency 271
 
7597 akron1 272
        WCHR (n: INTEGER): WCHAR
273
                Преобразование типа, аналогично CHR(n: INTEGER): CHAR
6613 leency 274
 
275
------------------------------------------------------------------------------
7597 akron1 276
        DIV и MOD
6613 leency 277
 
7597 akron1 278
         x         y      x DIV y   x MOD y
6613 leency 279
 
7597 akron1 280
         5         3         1         2
281
        -5         3        -2         1
282
         5        -3        -2        -1
283
        -5        -3         1        -2
6613 leency 284
 
285
------------------------------------------------------------------------------
7597 akron1 286
        Импортированные процедуры
6613 leency 287
 
7597 akron1 288
  Синтаксис импорта:
6613 leency 289
 
7597 akron1 290
  PROCEDURE [callconv, "library", "function"] proc_name (FormalParam): Type;
6613 leency 291
 
7597 akron1 292
  - callconv -- соглашение о вызове
293
  - "library" -- имя файла динамической библиотеки
294
  - "function" -- имя импортируемой процедуры
6613 leency 295
 
7597 akron1 296
  например:
6613 leency 297
 
7597 akron1 298
  PROCEDURE [windows, "kernel32.dll", "ExitProcess"] exit (code: INTEGER);
6613 leency 299
 
7597 akron1 300
  PROCEDURE [stdcall, "Console.obj", "con_exit"] exit (bCloseWindow: BOOLEAN);
6613 leency 301
 
7597 akron1 302
  В конце объявления может быть добавлено (необязательно) "END proc_name;"
6613 leency 303
 
7597 akron1 304
  Объявления импортированных процедур должны располагаться в глобальной
305
  области видимости модуля после объявления переменных, вместе с объявлением
306
  "обычных" процедур, от которых импортированные отличаются только отсутствием
307
  тела процедуры. В остальном, к таким процедурам применимы те же правила:
308
  их можно вызвать, присвоить процедурной переменной или получить адрес.
6613 leency 309
 
7597 akron1 310
  Так как импортированная процедура всегда имеет явное указание соглашения о
311
  вызове, то совместимый процедурный тип тоже должен быть объявлен с указанием
312
  соглашения о вызове:
6613 leency 313
 
7597 akron1 314
  VAR
315
      ExitProcess: PROCEDURE [windows] (code: INTEGER);
316
      con_exit:    PROCEDURE [stdcall] (bCloseWindow: BOOLEAN);
6613 leency 317
 
7597 akron1 318
  В KolibriOS импортировать процедуры можно только из библиотек, размещенных
319
  в /rd/1/lib. Импортировать и вызывать функции инициализации библиотек
320
  (lib_init, START) при этом не нужно.
6613 leency 321
 
7597 akron1 322
  Для Linux, импортированные процедуры не реализованы.
6613 leency 323
 
324
------------------------------------------------------------------------------
7597 akron1 325
        Скрытые параметры процедур
6613 leency 326
 
7597 akron1 327
  Некоторые процедуры могут иметь скрытые параметры, они отсутствуют в списке
328
формальных параметров, но учитываются компилятором при трансляции вызовов.
329
Это возможно в следующих случаях:
6613 leency 330
 
7597 akron1 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))
6613 leency 339
 
340
------------------------------------------------------------------------------
7597 akron1 341
        Модуль RTL
6613 leency 342
 
7597 akron1 343
  Все программы неявно используют модуль RTL. Компилятор транслирует
344
некоторые операции (проверка и охрана типа, сравнение строк, сообщения об
345
ошибках времени выполнения и др.) как вызовы процедур этого модуля. Не
7693 akron1 346
следует явно вызывать эти процедуры, за исключением процедур SetDll и SetFini
347
если приложение компилируется как Windows DLL или Linux SO, соответственно:
6613 leency 348
 
7597 akron1 349
        PROCEDURE SetDll
350
            (process_detach, thread_detach, thread_attach: DLL_ENTRY);
351
        где TYPE DLL_ENTRY =
352
            PROCEDURE (hinstDLL, fdwReason, lpvReserved: INTEGER);
6613 leency 353
 
7597 akron1 354
SetDll назначает процедуры process_detach, thread_detach, thread_attach
355
вызываемыми при
356
- выгрузке dll-библиотеки (process_detach)
357
- создании нового потока (thread_attach)
358
- уничтожении потока (thread_detach)
6613 leency 359
 
7693 akron1 360
 
361
        PROCEDURE SetFini (ProcFini: PROC);
362
        где TYPE PROC = PROCEDURE (* без параметров *)
363
 
364
SetFini назначает процедуру ProcFini вызываемой при выгрузке so-библиотеки.
365
 
366
Для прочих типов приложений, вызов процедур SetDll и SetFini не влияет на
7597 akron1 367
поведение программы.
7693 akron1 368
 
7597 akron1 369
  Сообщения об ошибках времени выполнения выводятся в диалоговых окнах
370
(Windows), в терминал (Linux), на доску отладки (KolibriOS).
6613 leency 371
 
372
------------------------------------------------------------------------------
7597 akron1 373
        Модуль API
6613 leency 374
 
7597 akron1 375
  Существуют несколько реализаций модуля API (для различных ОС).
376
  Как и модуль RTL, модуль API не предназначен для прямого использования.
377
Он обеспечивает связь RTL с ОС.
6613 leency 378
 
379
------------------------------------------------------------------------------
7597 akron1 380
        Генерация исполняемых файлов DLL
6613 leency 381
 
7597 akron1 382
  Разрешается экспортировать только процедуры. Для этого, процедура должна
383
находиться в главном модуле программы, и ее имя должно быть отмечено символом
384
экспорта ("*"). KolibriOS DLL всегда экспортируют идентификаторы "version"
385
(версия программы) и "lib_init" - адрес процедуры инициализации DLL:
6613 leency 386
 
7597 akron1 387
        PROCEDURE [stdcall] lib_init (): INTEGER
6613 leency 388
 
7597 akron1 389
Эта процедура должна быть вызвана перед использованием DLL.
7693 akron1 390
Процедура всегда возвращает 1.