Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - Kemet

Страницы: 1 ... 37 38 [39] 40
571
А чем ОБЪЕКТ отличается от ЗАПИСИ?
ОБЪЕКТ (OBJECT) это ссылочный тип, в остальном он подобен POINTER TO RECORD (у нас эапись также может иметь конструктор), за исключением делегатов.
А вообще концепция ОБЪЕКТА здесь ближе к концепции МОДУЛЯ, это так сказать, логически, модули в модуле ) и синтаксис у них практически идентичен, планировалось сделать в объекте секцию импорт где указывать  классы, по отношению к которым объект будет считаться "дружественным" и иметь доступ к приватным членам, но отказались от этого, а также секцию, для определения общих, связанных с типом переменных, но также это не реализовано.

572
Блок GUARD списокпеременных DO ... END; занимается охраной экземпляров, все изменения указателей на защищаемые переменные замораживается.

573
Наибольший интерес (для нас) представлял именно объектный тип и механизмы связанные с расширением типов.
Реализованный подход (абстрактные типы ОБЪЕКТ и ЗАПИСЬ, возможность уточнения типов аргументов и результата в наследниках, пример выше) позволяет легко строить иерархию типов и, частично, освобождает от необходимости иметь дженерики, которые мы пытались реализовать, но, впоследствии, по некоторым причинам, от них отказались.

Конструкторы начинаются с ключевого слова CONSTRUCTOR и всегда общедоступны.
И объекты и модули, наряду с секцией BEGIN, имеют секцию CLOSE, которая вызывается при финализации объекта/модуля.
BEGIN
  Init;
CLOSE
  Done;
END

574
По просьбе камрадов попробую описать отличия от оберонов и ответить на вопросы по поводу языка Сириус и компилятора.
Учитывая, что я не Вирт, строгого и понятного изложения не получится.
Что качается самого компилятора, то планируется сделать его общедоступным и открыть исходники, но это будет не раньше осени и только после удаления ряда зависимостей. в паблик пойдёт только компилятор с рантаймом и несколько пакетов, всё остальное, включая среду разработки раскрывать мы не имеем права, а то нас закроют )))
Поддерживаются бакэнды для i386, ARM, Alpha, VAX-11, PDP-11, PPC, AVR32. В паблике будет только i386 и, возможно, ARM и AVR.

Сразу необходимо отметить, что язык и компилятор постоянно развиваются и за 7 лет эксплуатации претерпели значительные изменения.
Никаких оснований для полной совместимости с Оберонами у нас не было и нет, но стандартный Оберон-2 компилируется.
Из отличий - наличие делегатов, специальный объектный тип OBJECT, специальный строковой тип STRING, типы CHAR, WIDECHAR, LONGCHAR,
ключи или модификаторы, которые могут менять поведение некоторых механизмов в блоке, синтаксис и семантика IMPORT заимствована из OO2C, есть SYSTEM.DISPOSE, защищаемые переменные, оператор TYPECAST для приведения типов, модификатор [SAFE/UNSAFE] обеспечивает безопасное или любое приведение типов (по умолчанию безопасное - safe). Синтаксис его соответствует одноветочному WITH со списком приведения:
TYPECAST a:T1, b:T2 DO ... END;
WITH - многоветочный, описан в другой ветке.
Подобный механизм (typecast) очень сильно облегчил нам работу, т.к. в таком блоке нет необходимости в принудительном трехэтажном кастовании при каждом обращении к переменной расширенного типа.

Следующее отличие - возможность уточнения типов аргументов и результата у методов расширенного типа (уточнение должно расширять тип), также в наследниках допустимо уточнение абстрактных типов RECORD и OBJECT, т.е. корректны определения:

R0 = RECORD END;
R1 = RECORD (R0) END;

O0 = OBJECT
  PROCEDURE P(a:OBJECT, CONST b:RECORD): OBJECT;
END O0;

O1 = OBJECT (O0)
    PROCEDURE P(a:O1, CONST b:R0): O1; //здесь может быть любое уточнение для абстрактных OBJECT и RECORD
END O1;

O2 = OBJECT (O1)
    PROCEDURE P(a:O2, CONST b:R1): O2; //здесь уже может быть уточнение только расширения типа
END O2;

575
Ваша реализация ему противоречит. Тут нет ни слова про запрет присваивания. Следовательно в правильной Оберон программе при вашей реализации WITH может возникнуть исключение.
Ну так что не запрещено - разрешено ) Всё, что выше описано наш WITH реализует.
В правильной Оберон программе не меняют охраняемую переменную через другой указатель - какой в этом смысл?

576
Так вот именно что нет. Семантика WITH в Обероне определяет только охрану типа, т.е. запрещено только тип менять, но присваивания не запрещены.
Может быть, я же не говорю, что я прав. В принципе, разрешить присваивание, но при этом контролировать тип не так уж и сложно, просто добавится проверка типа, это можно ключиком/модификатором WITH сделать - это 10 минут работы, но нужно ли?

577
Значит всё что вы написали не имеет совершенно никакого отношения к WITH и к Оберонам. В Оберонах присваивание указателей ptr1 := ptr2 можно делать когда угодно и сколько угодно.
Можно, за исключением тех, которые охраняются в данный момент. Это никак не противоречит Оберону, как раз наоборот, полностью соответствует семантике WITH, в моём понимании, но никто пока это не опроверг.
Гы-гы-гы, а что там в Сириусе если объект защищён, то ни одному указателю на него нельзя даже NIL присвоить???
Пока он защищен - нет, иначе зачем его защищать.

578
И ещё. Ну допустим какими-то хитрокрючкотворными способами удаётся (с потерей производительности) избежать в данном примере порчи памяти.
Да ничего особохитрого нет - всё прозрачно. Производительность несколько потеряется только на операциях типа NEW, :=, т.к. требуется проверка не защищен ли объект.
Между тем в ветке WITH по её семантике тип фиксируется во время компиляции.
Так ведь это сугубо Ваше личное представление о семантике WITH, ничем не подкрепленное - ничего подобного в описании языка-то нет.

579
...
Защищается объект (участок памяти с ним связанный). Не имеет значения, сколько на него указателей, ссылок, ссылок на указатели, потому что все операции по смене экземпляра блокированы, а значит и любой указатель на объект изменить невозможно по определению - Вы просто не сможете изменить globalPointer, потому что объект, на который он указывает в это время защищён.
Сами указатели не защищены - просто как только указатель оказывается lvalue происходит проверка guard=0 и если это не так значит мы пытаемся отстрелить себе помидоры.

580
Kemet, а вы еще и язык изменили?!  :)
Можете подробно описать вашу версию Оберона/компилятора в отдельной ветке?
Что значит изменили? Расширили! Я не вижу в этом криминала, во первых мы не ставили целью совместимость с оригиналом, нам нужен был удобный (для нас) инструмент.
Возьмите Оберон-2 и компиляторы POW!, XDS, OO2C - это Оберон-2, но скомпилировать код написанный под OO2C не удасться скомпилировать другими компиляторами, кто в этом видит криминал? В то же время, я так думаю, код написанный в соответствии со стандартом Оберон-2 они все скомпилируют.
Я не уверен, что все конструкции Оберона-2 наш компилятор обработает так, как ожидается от компилятора Оберон-2 (но тесты вроде проходят), но мы его никогда и не называли Обероном или Обероном-2 или активным Обероном, мы его называем оберонопободный язык ), а между собой кличем Сириусом )))
Описать, конечно, можно, но, плчему-то, у меня какие-то технические проблемы на этом форуме, то авторизация слетает, то странички не открываются, да и редактировать не могу свои сообщения. Не иначе КомКон бдит (((

581
М... на тему адекватности мы дискутировали много здесь, но что интересно - Вирт ответил на этот вопрос отрицательно.
Так не ответил он ))
А вообще, в таком простом языке как Оберон07 (и, соответственно, в таком простом компиляторе) не нужна такая сложная в реализации вещь как правильный WITH, а вот для "простокастинга" была бы полезна имеющаяся у нас конструкция типа TYPECAST [SAFE] a:x, b:y, c:z ... END;

582
ЗЫ: Почему-то не могу отредактировать свое сообщение, дополню - Под неизменностью экземпляра я имею ввиду неизменность самого экземпляра, но не его данных.

Сдается мне я поспешил с фразой "В общем примерно понятно"  :D
Это просто я мутно выразился.
Просто если у нас есть, к примеру, указатель P0 на объект, у которого guard#0, то операция P0.x :=123 корректна, а NEW (P0) вызовет исключение, потому что происходит попытка смены экземпляра.

583
Хм... у вас какая-то иная семантика WITH получилась. Я бы даже сказал совсем не WITH  ;)
В общем примерно понятно.
Как я ее тогда понял, так и реализовал )))
Но, в принципе, она примерно так и работает, как ожидается (мной )))
Я наверно туплю, но фраза "и ни разу не сработали" меня совсем запутала.  :)
Не сработала в том плане, что ни разу не встретилась ситуация, когда нужно было срабатывать ) не пишем мы такой код и всё тут.
И еще не очень понятно как вы разыменования контролируете. Обычным кастингом, как в Оберон-07?
Не понял, что подразумевается под контролем разыменования и причём здесь кастинг?
Возможно мы о разных вещах думаем, нужен пример кода.

584
ЗЫ: Почему-то не могу отредактировать свое сообщение, дополню - Под неизменностью экземпляра я имею ввиду неизменность самого экземпляра, но не его данных.

585
Зачем поле "guard"?
Что значит "контролируется при присваивании/создании"?
Что значит "в случае обращения к защищенному участку памяти"?
Изначально данное поле предназначалось для защиты объектов. Обычно это поле равно 0, что говорит о том, что "дверь открыта" и с объектом (вернее с выделенным участком памяти, где и лежит нужный нам объект) можно делать всё что угодно и кому угодно. Если значение отлично от 0, то объект защищен и его нельзя трогать - нельзя пересоздать (что гарантирует присутствие нужного экземпляра), нельзя собрать сборщиком мусора и т.д., а WITH использует этот механизм для того, чтобы гарантировать неизменность не только типа, но и экземпляра.
В оригинальном Обероне WITH тупой до безобразия. Во время компиляции просто временно меняется тип переменной и далее соответственно разыменования контролируются с этим временным типом (контроль времени компиляции). А у вас я так понимаю в рантайме при каждом разыменовании контроль происходит?
В оригинальном Обероне опять же в рантайме контроль осуществляется ровно один раз при входе в блок WITH.
Ничего не могу сказать про оригинальный Оберон, потому что когда мы писали компилятор я видел только описание языка и никакого реального компилятора у нас не было. Возможно, я неверно интерпретировал описание WITH, потому что в моём понимании любое обращение к защищаемой переменной должно вызывать проверку типа, либо должен быть механизм, гарантирующий неизменность типа и экземпляра. Т.к. это относительно медленное дело, то мы и решили уже имеющийся у нас механизм с полем guard использовать и здесь - ведь залоченный объект гарантированно неизменен (т.е. защищен) и проверять это при каждом обращении совершенно бессмысленно, хотя это тоже поддерживается через ключи компиляции. В тоже время за 7 лет эксплуатации данные предосторожности были использованы только при разработке для отслеживания возможных казусов, и ни разу не сработали, потому что изменение защищенной переменной говорит о дыре не в языке или реализации компилятора, а в голове у программиста.

Страницы: 1 ... 37 38 [39] 40