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; } По моему, народ просто довольно плохо знает С++ |
Автор: | 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: Проблемы трансляции Оберон на Си++ |
Это "аналог" чего, вот этого? Код: MODULE A;
VAR rwField*: INTEGER; roField-: INTEGER; privateField: INTEGER; PROCEDURE setRo*(val: INTEGER); END A. |
Автор: | Alexey Veselovsky [ Вторник, 14 Июль, 2009 17:41 ] |
Заголовок сообщения: | Re: Проблемы трансляции Оберон на Си++ |
slava писал(а): Это "аналог" чего, вот этого? Код: 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/ |