OberonCore
https://forum.oberoncore.ru/

Проблемы трансляции Оберон на Си++
https://forum.oberoncore.ru/viewtopic.php?f=30&t=1713
Страница 1 из 3

Автор:  Vlad [ Понедельник, 13 Июль, 2009 20:41 ]
Заголовок сообщения:  Проблемы трансляции Оберон на Си++

Модератор: выделена тема. Инициирующее сообщение - viewtopic.php?p=31833#p31833

Info21 писал(а):
Да, настоящие модули -- вещь.
Начинаешь это остро ощущать, когда приходится типа переносить на какой-нибудь С++ программу с Оберона.
Какие трудности? Оно один в один транслируется. Вот наоборот - это да... Или у вас каждая программа на обероне жить не может без динамической загрузки модулей и рефлекшина?

Автор:  slava [ Понедельник, 13 Июль, 2009 21:24 ]
Заголовок сообщения:  Re: есть ли ООП в Обероне-07

Цитата:
Какие трудности?
Частично экспортируемые записи в C++ будут выглядеть как полностью открытые структуры или у Вас есть другое решение?

Автор:  Vlad [ Вторник, 14 Июль, 2009 00:02 ]
Заголовок сообщения:  Re: есть ли ООП в Обероне-07

slava писал(а):
Цитата:
Какие трудности?
Частично экспортируемые записи в C++ будут выглядеть как полностью открытые структуры или у Вас есть другое решение?


Они буду выглядеть как private...

Автор:  slava [ Вторник, 14 Июль, 2009 00:07 ]
Заголовок сообщения:  Re: есть ли ООП в Обероне-07

И как их юзать "вне модуля"?
Если предложите аксессоры, так это тот же public.
Короче, как всегда, вам бы поспорить.

Автор:  Vlad [ Вторник, 14 Июль, 2009 00:26 ]
Заголовок сообщения:  Re: есть ли ООП в Обероне-07

slava писал(а):
И как их юзать "вне модуля"?


В смысле как? Если они неэкспортируемые, то зачем их юзать вне модуля? Все экспортируемые сущности прописываете в .h-файле, некспортируемые поля прописываете private, все методы кладете в одноименный .cpp. Вот вам прямое отображение обероновского модуля в плюсовый "модуль". Где "острые" ощущения?

slava писал(а):
Если предложите аксессоры, так это тот же public.
Короче, как всегда, вам бы поспорить.


Это вам - лишь бы пнуть C++ :) Надо быть хоть чуть-чуть объективнее.

Автор:  Info21 [ Вторник, 14 Июль, 2009 01:06 ]
Заголовок сообщения:  Re: есть ли ООП в Обероне-07

Vlad писал(а):
Вот вам прямое отображение обероновского модуля в плюсовый "модуль". Где "острые" ощущения?
В кавычках вокруг слова модуль.

Острое ощущение -- это непривычное ощущение полной уязвимости со всех возможных сторон с одновременным ощущением категорического желания организма как можно быстрее отойти от этой феноменальной херни как можно дальше.

Автор:  Vlad [ Вторник, 14 Июль, 2009 01:16 ]
Заголовок сообщения:  Re: есть ли ООП в Обероне-07

Info21 писал(а):
Vlad писал(а):
Вот вам прямое отображение обероновского модуля в плюсовый "модуль". Где "острые" ощущения?
В кавычках вокруг слова модуль.


А. Значит шашечки. Так бы сразу и сказали :)

Автор:  slava [ Вторник, 14 Июль, 2009 10:25 ]
Заголовок сообщения:  Re: Проблемы трансляции Оберон на Си++

Это значит, что у народа закончилось терпение с Вами дискуссировать.
Один я еще на что то надеюсь.

Автор:  slava [ Вторник, 14 Июль, 2009 10:35 ]
Заголовок сообщения:  Re: есть ли ООП в Обероне-07

Vlad писал(а):
...Если они неэкспортируемые, то зачем их юзать вне модуля? Все экспортируемые сущности прописываете в .h-файле, некспортируемые поля прописываете private, все методы кладете в одноименный .cpp. Вот вам прямое отображение обероновского модуля в плюсовый "модуль"...
Поля должны быть скрытыми для всех сущностей вне модуля, но открытыми для всех сущностей внутри модуля.
В С++ Вам этого не отобразить.

Ада -- "да". Ява с ее пакетами, хоть как то "да". С++ -- "нет", Питон (насколько я знаю) -- тоже "нет".

Автор:  Info21 [ Вторник, 14 Июль, 2009 11:10 ]
Заголовок сообщения:  Re: есть ли ООП в Обероне-07

Vlad писал(а):
А. Значит шашечки. Так бы сразу и сказали :)
Ну, понятно. Для плюсников безопасность -- шашечки.

Автор:  Vlad [ Вторник, 14 Июль, 2009 12:01 ]
Заголовок сообщения:  Re: есть ли ООП в Обероне-07

slava писал(а):
Поля должны быть скрытыми для всех сущностей вне модуля, но открытыми для всех сущностей внутри модуля. В С++ Вам этого не отобразить.


Еще раз - вам шашечки или ехать? :) Я говорю - что все конструкции оберона замечательно перекладываются в C++ "один в один" без потери смысла и без напряжения мозга. С точностью до синтаксиса. Конкретные возражения будут?
.h
Код:
class Record1
{
    friend void f1(Record1& r);
public:
    int x;
private:
    int y;
};


.cpp
Код:
void f1(Record1& r)
{
    r.y = 1;
}


Тут что-то не понятно? Но ладно, допустим вам позарез надо иметь доступ к Record1::y из функции f2, причем функция f2 должна быть внутренней функцией модуля (никто извне не может ее вызвать). Тогда можно более общий случай расписать:

.h
Код:
class Record1;

class Module1
{
public:
    static void f1(Record1& r);
private:
    static void f2(Record1& r);
};

class Record1
{
    friend class Module1;
public:
    int x;
private:
    int y;
};


.cpp
Код:

void Module1::f1(Record1& r)
{
    r.y = 1;
    f2(r);   
}

void Module1::f2(Record1& r)
{
    r.y = 3;
}


Хотя я бы такой прием использовал только если надо начисто отключить мозг при переводе оберон -> С++. Иначе можно использовать обычную декомпозицию на функции-члены (писанины меньше), но при этом да, "один в один" не получится.

slava писал(а):
Питон (насколько я знаю) -- тоже "нет".


В питоне с модулями почти все хорошо, особенно если использовать явный импорт.

Автор:  Alexey Veselovsky [ Вторник, 14 Июль, 2009 12:16 ]
Заголовок сообщения:  Re: Проблемы трансляции Оберон на Си++

slava писал(а):
Поля должны быть скрытыми для всех сущностей вне модуля, но открытыми для всех сущностей внутри модуля.


На самом деле можно и без классов.

Вот вам cpp'шник. Попробуйте ка откуда-нибудь ещё получить доступ к переменной var:

Код:
namespace {
    int var = 10;
}


По моему, народ просто довольно плохо знает С++ :roll:

Автор:  slava [ Вторник, 14 Июль, 2009 12:44 ]
Заголовок сообщения:  Re: есть ли ООП в Обероне-07

Vlad писал(а):
...

Так и скажите, что будете френдить всех со всеми.
Имеем N сущностей в одном модуле, прописываем в каждом классе всех N френдов.
Думаю о красоте такого кода спорить не будем.

Автор:  slava [ Вторник, 14 Июль, 2009 12:45 ]
Заголовок сообщения:  Re: Проблемы трансляции Оберон на Си++

Alexey Veselovsky писал(а):
Вот вам cpp'шник. Попробуйте ка откуда-нибудь ещё получить доступ к переменной var:
Вы о чем?

Автор:  Alexey Veselovsky [ Вторник, 14 Июль, 2009 13:27 ]
Заголовок сообщения:  Re: Проблемы трансляции Оберон на Си++

slava писал(а):
Alexey Veselovsky писал(а):
Вот вам cpp'шник. Попробуйте ка откуда-нибудь ещё получить доступ к переменной var:
Вы о чем?


Ну, давайте лучше на примере. Дайте модель на обероне который перевести на c++. Посмотрим что выйдет.

Автор:  Валерий Лаптев [ Вторник, 14 Июль, 2009 14:50 ]
Заголовок сообщения:  Re: Проблемы трансляции Оберон на Си++

Я абсолютно согласен с Владом: с Оберона на С++ перевести достаточно легко. Обратно - значительно сложнее из-за управления памятью.
А механизмов инкапсуляции в С++ больше и с их помощью моделируется какой угодно доступ. И пространства имен, и классы с тремя видами доступа, и файлы (можно в файле сделать локальной как функцию, так и любую переменную. И френдить всех со всеми не требуется. Герб Саттер приводит в своей книжке простой прием, в котором дружественность выборочная - одной функции открыто, другой - закрыто.
А доступ только по чтению, который так часто приводят оберонщики в качестве плюса Оберонам - это просто свойства. Которые в каждой интегрированной С++ среде реализованы. И еще на РСДН могу статью показать "Свойства в С++". А в Додиез своства уже как конструкции языка входят.
С++ значительно более гибок в смысле инкапсуляции. Но эта гибкость - для экспертов, а не для простых прикладных программеров. Как говориться, палка - о двух концах.

Автор:  Alexey Veselovsky [ Вторник, 14 Июль, 2009 16:34 ]
Заголовок сообщения:  Re: Проблемы трансляции Оберон на Си++

Валерий Лаптев писал(а):
А доступ только по чтению, который так часто приводят оберонщики в качестве плюса Оберонам - это просто свойства. Которые в каждой интегрированной С++ среде реализованы. И еще на РСДН могу статью показать "Свойства в С++". А в Додиез своства уже как конструкции языка входят.

Ну, во-первых при чем тут IDE? Эти самые проперти (ака свойства) не фича IDE, а нестандартное расширение языка некоторыми компиляторами. Пользоваться ими -- моветон. Тем более что они легко реализуются через шаблоны, т.е. расширение языка ни чем не обосновано (разве что т.н. "историческими причинами").

А во-вторых, для доступа только по чтению никаких провертей/свойств не нужно. Всё делается намного проще вот пример (замечу, что опять же структура/класс тут не обязательны).

Код:
#include <iostream>

struct A
{
    const int& a;
    A () : mA(10), a(mA) {}
private:
    int mA;
};

int main()
{
    A a;
    int b = a.a; // ok
    std::cout << a.a << std::endl; // ok
    a.a = 10; // error. поле только для чтения!
    return 0;
}

Автор:  Alexey Veselovsky [ Вторник, 14 Июль, 2009 17:23 ]
Заголовок сообщения:  Re: Проблемы трансляции Оберон на Си++

Теперь хм.. Полное решение. Итак, хотим чтобы:
1) Структура/класс/запись имела поля только для чтения, имела поля доступные только внутри модуля и имела поля доступные всем.
2) Хотим иметь доступ ко всем полям структуры внутри модуля.

Хедер (спецификация модуля):
Код:
struct A
{
    int rwField; // полный доступ
    const int& roField; // поле только для чтения
    virtual ~A(){}
protected:
    A(int& ro) : roField(ro), rwField(0) {}
};

A* createA();
void setRo(A& self,int val); // просто для примера. меняет значение поля A::roField.


cpp'шник (ака тело модуля)
Код:
#include "A.h"

namespace {

struct B : A {
    int ro;
    int privateField; // поле доступное только внутри модуля
    B() : A(ro), ro(666) {}
};

}

A* createA() {
    return new B;
}

void setRo(A& self, int val) {
    B* s = dynamic_cast<B*>(&self);
    if (s) s->ro = val;
}


Пример использования:
Код:
#include <iostream>
#include "A.h"

int main()
{
    A* p_a = createA();
    std::cout << p_a->rwField << "\t" << p_a->roField << std::endl;

    p_a->rwField = 16;
    setRo(*p_a,255);

    std::cout << p_a->rwField << "\t" << p_a->roField << std::endl;

    delete p_a;

    return 0;
}

Автор:  slava [ Вторник, 14 Июль, 2009 17:37 ]
Заголовок сообщения:  Re: Проблемы трансляции Оберон на Си++

Это "аналог" чего, вот этого? :shock:
Код:
MODULE A;
   VAR
      rwField*: INTEGER;
      roField-: INTEGER;
      privateField: INTEGER;   

   PROCEDURE setRo*(val: INTEGER);
END A.

Автор:  Alexey Veselovsky [ Вторник, 14 Июль, 2009 17:41 ]
Заголовок сообщения:  Re: Проблемы трансляции Оберон на Си++

slava писал(а):
Это "аналог" чего, вот этого? :shock:
Код:
MODULE A;
   VAR
      rwField*: INTEGER;
      roField-: INTEGER;
      privateField: INTEGER;   

   PROCEDURE setRo*(val: INTEGER);
END A.


Нет. Читайте внимательней.

Страница 1 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/