C++'s lack of a module system
От: Максим Рогожин Россия  
Дата: 16.05.18 18:58
Оценка:
Привет!

Объясните, пожалуйста, в чем выражается эта нехватка модульной системы в C++? Все классы в отдельных единицах трансляции обычно находятся. Чего не хватает?

В книжке Герба Саттера про Pimpl idiom написано, что:

it does help compensate for C++'s lack of a module system.

Отредактировано 17.05.2018 4:24 Максим Рогожин . Предыдущая версия . Еще …
Отредактировано 16.05.2018 19:02 Максим Рогожин . Предыдущая версия .
Re: C++'s lack of a module system
От: reversecode google
Дата: 16.05.18 19:36
Оценка:
самому прочитать слабо ?
ну давай гуглом переведу
перевод
Re: C++'s lack of a module system
От: kov_serg Россия  
Дата: 17.05.18 07:35
Оценка:
Здравствуйте, Максим Рогожин, Вы писали:

МР>Объясните, пожалуйста, в чем выражается эта нехватка модульной системы в C++?

Временем компиляции выражается. И плясками с бубнами при подключении сторонних библиотек.
Re: C++'s lack of a module system
От: AlexGin Беларусь  
Дата: 17.05.18 07:50
Оценка: 2 (1)
Здравствуйте, Максим Рогожин, Вы писали:

МР>Привет!


МР>Объясните, пожалуйста, в чем выражается эта нехватка модульной системы в C++? Все классы в отдельных единицах трансляции обычно находятся. Чего не хватает?


Выскажу своими словами мой взгляд на проблему:

Когда у тебя C++ ный проект разростается и перестаёт быть малениким, ты задумываешся о том, что хорошо бы его разделить на некоторые части, при этом очень важно, чтобы данные части были максимально независимы (даже на случай повторного применения). При этом, желательно чтобы эти части имели некоторый законченный вид и могли бы передаваться между разработчиками.
И тут — тебя ждут пляски с бубнами

Для сравнения — если у тебя проект на C#, то этот самый момент является достаточно простым и безболезнынным (скорее даже тривиальным).

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

При этом, важно понимать, что сегодня — твой проект маленький и ты вполне обходишься применением (например) СУБД MySQL.

Завтра,по мере развития проекта и увеличения базы данных, встанет ворпос о переходе — например на ORACLE или MS SQL Server.

Очень важно — сделать так, чтобы изменения при переходе на более мощную СУБД коснулись ТОЛЬКО кодов работы с базой Данных!
То есть, изменения в кодах работы с данными, реализующими концепцию CRUD — https://en.wikipedia.org/wiki/Create,_read,_update_and_delete для применяемой тобой СУБД, а не всего твоего проекта. Другими словами — важна независимость подсистемы БД от всего остального проекта.
Важна также и возможность абстрагирования от подсистемы БД на уровне бизнес-логики и GUI твоей программы.
Именно это обеспечивает такое понятие как "модульность".
Отредактировано 17.05.2018 8:08 AlexGin . Предыдущая версия . Еще …
Отредактировано 17.05.2018 8:06 AlexGin . Предыдущая версия .
Отредактировано 17.05.2018 7:59 AlexGin . Предыдущая версия .
Re: C++'s lack of a module system
От: RedApe Беларусь  
Дата: 17.05.18 08:08
Оценка: 2 (1)
Здравствуйте, Максим Рогожин, Вы писали:

МР>Привет!


МР>Объясните, пожалуйста, в чем выражается эта нехватка модульной системы в C++? Все классы в отдельных единицах трансляции обычно находятся. Чего не хватает?


Можно ответить максимально просто

Без модулей при любом самом маленьком изменении заголовка класса требуется перекомпиляция всех единиц трансляции, которые используют этот заголовок. С модулями чаще всего это будет не нужно.
--
RedApe
Re[2]: C++'s lack of a module system
От: Максим Рогожин Россия  
Дата: 17.05.18 15:58
Оценка: +1
Здравствуйте, AlexGin, Вы писали:

AG>Когда у тебя C++ ный проект разростается и перестаёт быть малениким, ты задумываешся о том, что хорошо бы его разделить на некоторые части, при этом очень важно, чтобы данные части были максимально независимы (даже на случай повторного применения). При этом, желательно чтобы эти части имели некоторый законченный вид и могли бы передаваться между разработчиками.


Так это же обычная библиотека (классов, функций) ?!

AG>Именно это обеспечивает такое понятие как "модульность".


Чем оно отличается от понятия библиотеки?
Re[2]: C++'s lack of a module system
От: Максим Рогожин Россия  
Дата: 17.05.18 16:01
Оценка:
Здравствуйте, RedApe, Вы писали:

RA>Без модулей при любом самом маленьком изменении заголовка класса требуется перекомпиляция всех единиц трансляции, которые используют этот заголовок. С модулями чаще всего это будет не нужно.


Как такое может быть? Если изменился заголовок, то значит изменились и все единицы трансляции, которые используют этот заголовок.
Re[3]: C++'s lack of a module system
От: AlexGin Беларусь  
Дата: 17.05.18 16:27
Оценка:
Здравствуйте, Максим Рогожин, Вы писали:

МР>Здравствуйте, AlexGin, Вы писали:


AG>>Когда у тебя C++ ный проект разростается и перестаёт быть малениким, ты задумываешся о том, что хорошо бы его разделить на некоторые части, при этом очень важно, чтобы данные части были максимально независимы (даже на случай повторного применения). При этом, желательно чтобы эти части имели некоторый законченный вид и могли бы передаваться между разработчиками.


МР>Так это же обычная библиотека (классов, функций) ?!

+100500
Да, обычная. Но стандартного (с точки зрения языка C++) метода применнинея библиотекам — нет.

То есть — это может быть только один заголовочник (*.h либо *.hpp файл).
Это может быть *.lib (статическая библиотека) с *.h файлом (файлами).
Пример: boost — там в основном заголовочники,
но есть и статические либы и есть возможность даже динамического использования некоторых либ-ов:
https://www.boost.org/doc/libs/1_62_0/boost/dll/shared_library.hpp

Также это может быть *.dll файл (как собственно DLL, так и в виде COM-компонента, исполненного в виде dll).
Что стандартно?

AG>>Именно это обеспечивает такое понятие как "модульность".


МР>Чем оно отличается от понятия библиотеки?


Так определи понятие "библиотека" для C++
Что ты сам понимаешь под этим термином в контексте C++?
Re[2]: C++'s lack of a module system
От: VladFein США  
Дата: 17.05.18 16:30
Оценка:
Здравствуйте, reversecode, Вы писали:


R>самому прочитать слабо ?

R>ну давай гуглом переведу
R>

А может не надо?

C++'s lack of a module system. — недостаток C ++ в модульной системе.

Re[3]: C++'s lack of a module system
От: reversecode google
Дата: 17.05.18 16:38
Оценка: +3
VF>А может не надо?

ему надо, он же вырвал слова из контекста, где про impl было все разжевано

VF>

VF> C++'s lack of a module system. — недостаток C ++ в модульной системе.


и ? вот вырванный из контекста перевод точно ни о чем не говорит
Re[2]: C++'s lack of a module system
От: Максим Рогожин Россия  
Дата: 17.05.18 17:04
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Для сравнения — если у тебя проект на C#, то этот самый момент является достаточно простым и безболезнынным (скорее даже тривиальным).


А можете сказать за счет чего в C# этот момент является простым? В C# есть какой-то механизм, который отсутствует в C++? Почему этот механизм не добавят в C++?
Re[4]: C++'s lack of a module system
От: Максим Рогожин Россия  
Дата: 17.05.18 17:09
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Да, обычная. Но стандартного (с точки зрения языка C++) метода применнинея библиотекам — нет.


Т.е. C++'s lack of a module system — это про то, что в стандарте C++ нет понятия библиотека? Правильно?
Re[5]: C++'s lack of a module system
От: Слава  
Дата: 17.05.18 17:38
Оценка:
Здравствуйте, Максим Рогожин, Вы писали:

AG>>Да, обычная. Но стандартного (с точки зрения языка C++) метода применнинея библиотекам — нет.

МР>Т.е. C++'s lack of a module system — это про то, что в стандарте C++ нет понятия библиотека? Правильно?

Договориться они не могут. По уму, действие макросов не должно выходить за пределы модуля. Но то по уму, а вот эмбеддщики считают иначе.
Re[4]: C++'s lack of a module system
От: VladFein США  
Дата: 17.05.18 17:42
Оценка:
Здравствуйте, reversecode, Вы писали:

VF>>А может не надо?


R>ему надо, он же вырвал слова из контекста, где про impl было все разжевано


VF>>

VF>> C++'s lack of a module system. — недостаток C ++ в модульной системе.


R>и ? вот вырванный из контекста перевод точно ни о чем не говорит


О, я имел в виду — не надо такого перевода!
Re[3]: C++'s lack of a module system
От: AlexGin Беларусь  
Дата: 18.05.18 07:58
Оценка:
Здравствуйте, Максим Рогожин, Вы писали:

МР>Здравствуйте, AlexGin, Вы писали:


AG>Для сравнения — если у тебя проект на C#, то этот самый момент является достаточно простым и безболезнынным (скорее даже тривиальным).


МР>А можете сказать за счет чего в C# этот момент является простым? В C# есть какой-то механизм, который отсутствует в C++? Почему этот механизм не добавят в C++?


Так как C++ появился ранее, чем C# (примерно на два десятилетия), то рефлексии, свойственной языкам .NET платформы:
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/reflection в C++ (для варианта "из коробки") не предусматривалось

ИМХО именно это, является препятствием (предположу, что всё-таки в преспективе преодолимым) для простого введения такого понятия как "модульность" в состав языка.

Также введению и поддержке модульности для C# и платформы .NET сопсобствует тот факт, что это продукция фактически одного производителя: M$.
Эта продукция закрывает относительно узкие нишевые решения (настольный PC, реже — сервер).

В мире C++ нет единого производителя.
Есть различные компании, производящие: компиляторы, линкеры, отладчики, системы сборки, IDE и библиотеки классов для C++. Тот факт, что C++ это универсальный язык (настольные PC, сервера, мобильные устройства, приборы промышленной автоматики, медицинское оборудование, системы военного назначения и т.д.) также добавляет сложности по аспекту модульности.

Учитывая всё сказанное, принятие единого стандарта на модульность выглядит достаточно непростым решением.
Re[3]: C++'s lack of a module system
От: RedApe Беларусь  
Дата: 18.05.18 11:04
Оценка: +2
Здравствуйте, Максим Рогожин, Вы писали:

МР>Здравствуйте, RedApe, Вы писали:


RA>>Без модулей при любом самом маленьком изменении заголовка класса требуется перекомпиляция всех единиц трансляции, которые используют этот заголовок. С модулями чаще всего это будет не нужно.


МР>Как такое может быть? Если изменился заголовок, то значит изменились и все единицы трансляции, которые используют этот заголовок.


В существующей системе не может, а в модулях можно сделать, чтобы добавление комментария не вызывала потока перекомпиляции.
--
RedApe
Re[2]: C++'s lack of a module system
От: Максим Рогожин Россия  
Дата: 19.05.18 07:14
Оценка:
Интересную статью нашел:

A Module System for C++

Можете объяснить откуда берется много исполняемого кода в modern C++ headers?

with modern C++, header files contain lot of (executable) codes.

Re[3]: C++'s lack of a module system
От: alex_mah Россия www.elsy.ru
Дата: 19.05.18 08:52
Оценка:
Здравствуйте, Максим Рогожин, Вы писали:

МР>Интересную статью нашел:


МР>A Module System for C++


МР>Можете объяснить откуда берется много исполняемого кода в modern C++ headers?


МР>

МР>with modern C++, header files contain lot of (executable) codes.


Шаблоны, я так понимаю
Re[4]: C++'s lack of a module system
От: Максим Рогожин Россия  
Дата: 19.05.18 10:26
Оценка:
Здравствуйте, alex_mah, Вы писали:

_>Шаблоны, я так понимаю


Шаблоны и раньше были. Тут про modern C++ говорится.

Кстати, интересно, а как шаблоны в модулях определять? В модуле будет храниться просто заголовочный файл с определением шаблона и этот заголовочный файл будет включаться в те единицы трансляции где инстанциируется шаблон? Т.е. как обычно, с помощью препроцессора? Это уже не соответствует идее модулей.
Re[4]: C++'s lack of a module system
От: Dair Россия https://dair.spb.ru
Дата: 20.05.18 05:14
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Да, обычная. Но стандартного (с точки зрения языка C++) метода применнинея библиотекам — нет.


А что, нужен? А зачем? Вообще давно придумали статические и динамические библиотеки, они, конечно, вне стандарта C++, но зачем это втаскивать в него, когда это вещи, зависящие от операционной система?

AG>То есть — это может быть только один заголовочник (*.h либо *.hpp файл).

AG>Это может быть *.lib (статическая библиотека) с *.h файлом (файлами).

А вот какая разница? Как удобно разработчику — так и сделано.
(Я считаю, что h/hpp-only оно может быть в чисто темплейтном случае, а если есть нетемплейтный код, его надо выносить в код)

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

AG>Также это может быть *.dll файл (как собственно DLL, так и в виде COM-компонента, исполненного в виде dll).

AG>Что стандартно?
Стандартно отсутствие стандарта. Как хочешь — так и делай, решай сам, у тебя голова на плечах.


AG>Так определи понятие "библиотека" для C++

AG>Что ты сам понимаешь под этим термином в контексте C++?

У меня рекурсивное определение: библиотека — это группа методов с схожим общим назначением и явно выраженной односторонней зависимостью от других библиотек.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.