Logo

27 декабря 2013 г.

Отказ от встроенных типов

Ранее считалось, что в языке Кантор есть встроенные типы, обозначаемые ключевыми словами int, word, float, bool, byte, char, string, text и wiki. Компромисс основывался на допущении, что встроенных типов будет достаточно для общих случаев, особенно при наличии развитого вывода типов.

По мере написания все большего числа примеров становилось ясно, что встроенные типы — груз традиций и ничего более. По большому счету, встроенные типы важны лишь на первых этапах формирования (или изучения) языка, поскольку облегчают написание примеров. В дальнейшем они ложатся тяжким бременем совместимости и даже ломают концепции, как и любые другие компромиссы.

Можно ли обойтись встроенными типами?

Как говорилось, встроенные типы предназначались для неких общих и простых случаев. Высказывалось предположение, что такие случаи бывают, и возможностей встроенных типов окажется достаточно для их покрытия. Допущение было чисто умозрительным, поскольку на ранних этапах еще не было примеров кода на Канторе, а у его автора не было опыта программирования на нем. Позже, когда примеры появились, вместе с опытом пришло понимание, что «общие» и «простые» случаи весьма затруднительно отделить от всех остальных, что делает аргумент о надобности встроенных типов негодным, а выбор конкретных типов из множества — волюнтаристским. В самом деле, почему именно эти типы делать встроенными?

Так связь встроенных типов с общими и простыми случаями инвертировалась: общими и простыми стали считаться те блоки кода, для которых достаточно встроенных типов. Такое понятие есть доказательство через самого себя, выливающееся на практике в банальное ограничение программиста в угоду вкусу автора, не сумевшего вовремя избавиться от гнета традиций.

Неоднородность синтаксиса

Мысль об отказе от встроенных типов возникла из-за видимой глазом неоднородности синтаксиса в примерах: встроенные типы обозначаются ключевым словом, а остальные — обычным идентификатором. Сравните два описания:
var of
  int IntValue1 = 0;
  Integer IntValue2 = 0;
end;
IntValue1 и IntValue2 — целые переменные, а объявлены по-разному. Никакого скрытого смысла здесь нет, просто так захотелось программисту. Если язык допускает подобную самодеятельность, — это плохой язык.

Как обойтись без встроенных типов?

Язык Кантор — чисто объектно-ориентированный, то есть все типы в нем являются классами. Это означает, что имеется только один встроенный тип — class, функциональность которого обеспечивается компилятором. Данная концепция — прямая и однозначная реализация как понятия чистого ОО-языка, так и принятого в Канторе архитектурного подхода, что ключевыми словами обозначаются только те понятия, которые могут быть реализованы только магией компилятора и никак иначе.

Поскольку Кантор изначально проектировался как язык, синтаксис которого реализуется RTL, вывод типов в нем привязывался к предопределенным классам RTL. Затем часть предопределенных классов обозначалась ключевыми словами, что и давало встроенные типы. Предполагалось, что при компиляции ключевые слова будут развертываться в классы, поскольку в байт-коде могут храниться только ссылки на классы, а ключевые слова — синтаксическое понятие. Отказ от встроенных типов лишь избавит компилятор и отекстовщик от работы по развертыванию ключевых слов в классы RTL и наоборот, не затрагивая остальных концепций.

Межпространственная адресация

Очень редко отказ от чего-либо проходит полностью безболезненно. Отказ от встроенных типов в Канторе требует решения другой проблемы — упрощения ссылок на классы из другого пространства. Проще пояснить это на примере:
public class Model of
  public class CantorSys of
    public class HelloWorld of
      public out :Core:String Hello;
    end;
  end;
end;
Фрактал, в котором работает Кантор, делится на пространства — корневые контейнеры, инкапсулирующие среды с разным временем жизни объектов и способом доступа к ним, играющие также роль пространства имен. Корень всех пространств обозначается двоеточием, вложенные объекты в пространствах также разделяются двоеточием.

В примере выше корневые пространства :Model и :Core являются классами, а описание свойства :Model:CantorSys:HelloWorld.Hello ссылается на класс :Core:String. Во фрактальной среде вложенных описаний не избежать никак, и даже в простом примере они уже не такие короткие. На будущее нужно продумать механизм, упрощающий межпространственную адресацию, делающий это очевидным способом и однозначно ложащийся в байт-код.

Комментариев нет :

Отправить комментарий

Выбрав в выпадающем списке пункт «Имя/URL», можно оставить комментарий от своего имени без предварительной регистрации.