dragon писал(а):
Отлично. Чему будет равен размер word на 8-битном процессоре? На 16-битном процессоре (или в 16-битном режиме x86)? Правильно ли я понимаю, QuadWord на 8-битном процессоре будет 32 бит? Как мне задать тип беззнакового целого размерностью не менее 32 бит?
Наконец-то я понял суть претензий. На данный момент в Канторе немного не так.
Идентификаторы XxxxInt и XxxxWord я рассматриваю как устоявшиеся эвфемизмы типов данных конкретной размерности, поэтому их размерность фиксирована на всех платформах. Можно не согласиться с принципом, предложить свои аргументы, тогда я буду думать. Цифры по-прежнему не хочу.
Связь типов с аппаратной платформой также немного отличается от общепринятой. Дело в том, что в Канторе есть только один тип --
class, при наличии параметров он становится обобщением (generic). Все остальные типы определены через классы и обобщения, как если бы в C++ все встроенные типы объявили бы через
template <>. Класс в Канторе является функцией, поэтому возможны перегруженные типы, различающиеся набором параметров:
Код:
public class Integer[Word scale]; // обобщение знакового целого типа
public class Word[Word scale]; // обобщение беззнакового целого типа
public class Integer = Integer[registerBits]; // целое размером с регистр, registerBits передается компилятором
public class Word = Word[registerBits]; // беззнаковое целое размером с регистр
Приступая к компиляции, компилятор загружает свою библиотеку и раскрывает обобщения, передавая конкретное значение registerBits, взятое из параметров целевой платформы. Так обеспечивается переносимость.
Я могу разнести обобщенные и конкретные определения по разным идентификаторам, но сути это не изменит:
Код:
public class SignedInteger[Word scale];
public class UnsignedInteger[Word scale];
public class Integer = SignedInteger[registerBits];
public class Word = UnsignedInteger[registerBits];
Разумеется, программист всегда может определить свои типы, -- обобщения-то публичны:
Код:
public class UInt = Word[16];
Классы можно определить даже через частичное применение:
Код:
public class UInt = partial Word;
Данное определение создаст синоним UInt каждому классу Word, сохраняя набор параметров. Хороший пример, почему удобно держать одноименные перегруженные классы.
SII писал(а):
При этом, конечно, потенциально будет страдать переносимость программ (формально всё скомпилируется и запустится, но дальше может работать неправильно -- например, не помещаться в диапазон или терять точность).
А что компилировать-то будет? Само, что ли? Компилятор не надо писать?