LINUX.ORG.RU

Модули... модули? Какие модули?!

 ,


0

5

Привет, ЛОР!

Решил я тут взять C++ для одного своего маленького проекта. Давно ничего сложнее багфиксов в старый код не писал на этом языке по причине его особой не нужности, но тут подумал: «Почему бы и нет?» Естественно, хочу C++ со всеми последними вкусностями, в частности нормальными модулями.

Скажи, ЛОР, как эти модули вообще использовать? Если в рамках моего проекта всё примерно понятно, то использование модулей из сторонних библиотек вызывает много вопросов. Стандартная библиотека, как я понимаю, в модули до сих пор не обёрнута?

Компиляция вот этого примера падает с кучей странных ошибок:

import <iostream>;
import <string>;

std::string s = "Hello World";

int main(void)
{
  std::cout << s << std::endl;
}
$ g++ -std=c++2b -fmodules-ts mod.cc -o mod
In module imported at mod.cc:1:1:
/nix/store/z9jxhrbxm5lxrjpia9xcqjgk990ffr2j-gcc-11.1.0/include/c++/11.1.0/iostream: error: failed to read compiled module: No such file or directory
/nix/store/z9jxhrbxm5lxrjpia9xcqjgk990ffr2j-gcc-11.1.0/include/c++/11.1.0/iostream: note: compiled module file is ‘gcm.cache/./nix/store/z9jxhrbxm5lxrjpia9xcqjgk990ffr2j-gcc-11.1.0/include/c++/11.1.0/iostream.gcm’
/nix/store/z9jxhrbxm5lxrjpia9xcqjgk990ffr2j-gcc-11.1.0/include/c++/11.1.0/iostream: note: imports must be built before being imported
/nix/store/z9jxhrbxm5lxrjpia9xcqjgk990ffr2j-gcc-11.1.0/include/c++/11.1.0/iostream: fatal error: returning to the gate for a mechanical issue
compilation terminated.
$ 
$ clang++ -std=c++2b -fmodules-ts mod.cc -o mod
mod.cc:1:8: error: header file <iostream> (aka '/nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/iostream') cannot be imported because it is not known to be a header unit
import <iostream>;
       ^
mod.cc:2:8: error: header file <string> (aka '/nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/string') cannot be imported because it is not known to be a header unit
import <string>;
       ^
mod.cc:4:1: error: use of undeclared identifier 'std'
std::string s = "Hello World";
^
mod.cc:8:3: error: use of undeclared identifier 'std'
  std::cout << s << std::endl;
  ^
mod.cc:8:21: error: use of undeclared identifier 'std'
  std::cout << s << std::endl;
                    ^
5 errors generated.

GCC и Clang почти последние: 11.1 и 12.0.1. Выходит, модули не работают? Что делать, ЛОР? Отложить C++ до лучших времён?

★★★★★

Последнее исправление: hateyoufeel (всего исправлений: 2)
Ответ на: комментарий от kvpfs

Ну а проблема в чём? У тебя нет возможности задать порядок инициализации глобальных объектов?

Я реально запасся попкорном. Да будет fight!

bugfixer ★★★★★
()
Ответ на: комментарий от alysnix

Какая тупая, бездарная обезьяна. Нарисуй и скомпилируй. Ты уже блеешь и валяешься в дерьме долго, но так и не показал эту компиляцию.

Я понимаю, что бы бездарная обезьяна, которая ничего не знает о С++, но всё же. Пыхти, убожество.

anonymous
()
Ответ на: комментарий от anonymous

SQLite это примитивная херня, но в любом случае в этой вселенной оно на си.

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

первые плюсовые компиляторы вообще генерили сишный код. и что?

alysnix ★★★
()
Ответ на: комментарий от anonymous

Очередная бездарная собака обгадилась. Данное бездарное отребье сообщает, что говнолайт по сложность это проект уровня хрома/гцц/линукс-ядра. Т.е. оно даже считать не научилось, не говоря о чём-то большем.

anonymous
()
Ответ на: комментарий от alysnix

Если A можно с потерей информации выразить через B, то A == B. Ты это утверждаешь?

Siborgium ★★★★★
()
Ответ на: комментарий от alysnix

то есть отбери у них александреску и шаблоны,

Александреску забирайте (хотя и умный мужик, повёрнутый правда трошки), а от шаблонов «руки прочь!»

bugfixer ★★★★★
()
Ответ на: комментарий от anonymous

Данное бездарное отребье сообщает, что говнолайт по сложность это проект уровня хрома/гцц/линукс-ядра.

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

вы уж там договоритесь между собой - темплейты это принципиально важно для разработки или нет.

alysnix ★★★
()
Ответ на: комментарий от alysnix

да все на си в этом мире.

Ты не знаешь что такое си, бездарная обезьяна.

любой плюсовый код однозначно переводится в сишный автоматически.

Нет, переводишь в сишный код вектор. boost-spirit и прочее подобное.

Просто пытаешься выразить auto(auto, auto).

ну вот нет ничего в плюсах, что было бы невыразимо в сишном коде.

Ещё раз, бездарная собака, ты ничего не заешь о си. Зачем ты, мусорная падаль, вообще о чём-то блеешь?

Ты хочешь со мною посоревноваться в выразимости на си?

первые плюсовые компиляторы вообще генерили сишный код. и что?

Это не были плюсовые компиляторы, тупая ты обезьяна. Тогда в принципе никакого С++ не существовало.

anonymous
()
Ответ на: комментарий от bugfixer

Александреску забирайте (хотя и умный мужик, повёрнутый правда трошки), а от шаблонов «руки прочь!»

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

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

alysnix ★★★
()
Ответ на: комментарий от alysnix

Темплейты это

  1. Принципиально для разработки на С++ (не на С с классами);
  2. Принципиально для поддержки С++.

Ты не можешь заявлять, что С++ можно скомпилировать раздельно в TU, если в скомпилированных отдельно TU нет шаблонов. Ты можешь скомпилировать раздельно только малое подмножество С++, которое вернее называть «С с классами».

Для альтернативно одаренных: инстанциация шаблона шаблоном не является.

Siborgium ★★★★★
()
Ответ на: комментарий от hateyoufeel

Лямбды с захватом окружения

Они не часто и нужны, как и классы, template, …
Диалог скорее о том, что нововведения C++ ни чего сильно не упрощают, а зачастую наоборот.
Не утверждаю, что они вовсе не нужны, но и не панацея …

anonymous
()
Ответ на: комментарий от hateyoufeel

Лямбды с захватом окружения.

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

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

alysnix ★★★
()
Ответ на: комментарий от hateyoufeel

ну вот нет ничего в плюсах, что было бы невыразимо в сишном коде.

Лямбды с захватом окружения

При всём моём, как бы так сказать, скептичном отношении к когнетивным способностям конкретно этого персонажа - а сейчас он прав. И в том числе это реализуется.

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

При всём моём, как бы так сказать, скептичном отношении к когнетивным способностям конкретно этого персонажа - а сейчас он прав. И в том числе это реализуется.

Я понимаю, что это можно «эмулировать» в рамках C с такими-то костылями. Но это будет уже не фича языка, а просто груда говнокода.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от Siborgium

Для альтернативно одаренных: инстанциация шаблона шаблоном не является.

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

ему и было обьяснено, что шаблон только после актуализации можно линковать. поскольку только тогда он преобразуется в обычный класс с методами. а до этого, он просто текст.

чукча мне скоро предложит линковать комментарии. он тронутый точно.

alysnix ★★★
()
Ответ на: комментарий от alysnix

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

Если ты про анонимуса, то «линковать» шаблон тут никто не хочет. Анонимус пишет, что шаблоны в этих translation unit никак не проявляются, а TU не являются модулями в рамках языка.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel

Если ты про анонимуса,

Царя же …

anonymous
()
Ответ на: комментарий от alysnix

Какая же ты тупая, обезьяна.

а до этого, он просто текст.

Т.е. простая функция не является просто текстом? Это особенный текст? Или не текст? Если не текст, то как это работает? А если особенный текст - почему?

anonymous
()
Ответ на: комментарий от alysnix

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

Вот именно. Теперь следим за руками:

  1. Шаблоны – неотъемлемая часть С++.

  1. С++ можно компилировать раздельно. Получаемые TU затем собираются вместе линковкой.

  2. Шаблоны слинковать нельзя, потому что в TU шаблонов нет, а есть только их инстанциации.

Тезисы 1 и 2 – твои. Не находишь противоречий?

Siborgium ★★★★★
()
Ответ на: комментарий от alysnix

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

Понятно. Простых путей не ищем. Ну, флаг что называется.

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

Очевидно, что это бездарная обезьяна врёт.

anonymous
()
Ответ на: комментарий от anonymous

Т.е. простая функция не является просто текстом? Это особенный текст? Или не текст? Если не текст, то как это работает? А если особенный текст - почему?

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

но если ты шаблон актуализируешь - то обьектник будет уже непустым.

а если ты напишешь в пустом файле обычную функцию - то обьектник тоже будет не пустым.

тебе вообще без разницы - пустой обьектник или нет?

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

alysnix ★★★
()
Ответ на: комментарий от Siborgium

Приведите, кстати, деструктор вашего вектора – очень интересно посмотреть на ваши познания в С++.

а мне неинтересно приводить код своего вектора, поскольку вы можете написать его сами. и уровень ваших познаний в с++ меня не интересует.

alysnix ★★★
()
Ответ на: комментарий от Siborgium

Получается, слив?

получается - нет. поскольку ни за какую задачу написания вектора и выкладывания его сюда я не брался.

если вас в квартиру не пускают - значит вас просто не желают в ней видеть. а не слив.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Я понимаю, что это можно «эмулировать» в рамках C с такими-то костылями. Но это будет уже не фича языка, а просто груда говнокода.

Всё оно в конечном итоге в asm разворачивается. И гнаться нужно именно за чистоту оного. А тут уж как - каждый как умеет.

bugfixer ★★★★★
()
Ответ на: комментарий от alysnix

Да сколько можно уже, Г-споди.

Ты утверждаешь, что С++ можно раздельно компилировать в TU.

Есть сущность, существующая в рамках языка – шаблон. Есть TU, в которые попадают исключительно инстанциации шаблонов, шаблонами не являющиеся. Ergo, TU не могут содержать в себе по крайней мере одну сущность языка, а значит, С++ компилировать раздельно невозможно.

Siborgium ★★★★★
()

Модули… модули? Какие модули?!

Проблема в том, что из тачки для перевоза мусора трудно сделать мерседес, который будет пригоден и для перевозки мусора …

anonymous
()
Ответ на: комментарий от bugfixer

Всё оно в конечном итоге в asm разворачивается. И гнаться нужно именно за чистоту оного. А тут уж как - каждый как умеет.

Всё это – тлен.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от Siborgium

Ergo, TU не могут содержать в себе по крайней мере одну сущность языка, а значит, С++ компилировать раздельно невозможно.

сам понял что сказал, логик?

декларацию макры тоже нельзя «скомпилировать». и прагму нельзя скомпилировать раздельно. и блеат, строковую константу нельзя скомпилировать раздельно… если какую-то синтаксическую языковую дурь нельзя оформить как отдельный обьектник, поскольку эта дурь не является кодом или завершенным кодом способным скомпилироваться, это не значит, что язык не раздельно компилируемый.

в классическом модульном языке единицей компиляции является МОДУЛЬ. а не шаблон(если он там есть), макра(если она там есть), или строковая константа.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

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

Вот именно. Поэтому TU – это не модули в контексте языка C++.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Вот именно. Поэтому TU – это не модули в контексте языка C++.

в истинно модульном языке, еще раз повторю, единицей компиляции, то есть синтаксической конструкцией, которая способна без ошибок компилироваться является МОДУЛЬ и ничто другое. ни класс, ни функция, сами по себе не могут быть скомпилированы, поскольку должны находиться ВНУТРИ модуля.

потому всхлипы, что раз шаблон типа не «компилируется»(хотя компилятор плюсов и не ругнется если в сорсе будет ТОЛЬКО шаблон) - это бред. во первых оно и компилируется.. в пустой обьектник, во вторых… ничто отсюда не следует.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

в истинно модульном языке

Что такое «истинно модульный язык»?

то есть синтаксической конструкцией, которая способна без ошибок компилироваться является МОДУЛЬ и ничто другое. ни класс, ни функция, сами по себе не могут быть скомпилированы, поскольку должны находиться ВНУТРИ модуля.

Схерали? В том же хацкелле можно компилировать функции в отдельные объектные файлы. Включается одним флагом компилятора (-split-objs). Не вижу ни одной причины, почему каждая функция не может являться единицей компиляции.

Другой вопрос, что ты сейчас жопу с пальцем сравниваешь. Модули и единицы компиляции – это довольно ортогональные понятия. Модули на уровне языка позволяют делать гораздо больше штук, чем просто компилировать раздельно кусочки кода. В том же OCaml модули могут иметь параметры.

Просто так сложилось в среде C и C++, что модулей нет, а потому их пытаются через линкер эмулировать.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от alysnix

в истинно модульном языке, еще раз повторю, единицей компиляции, то есть синтаксической конструкцией, которая

В 73-м стандарте все так и будет …

anonymous
()
Ответ на: комментарий от anonymous

Правнуки наших детей все это увидят …

ИМХО проблема в том, что технологии разработки проектов застыли в бетоне лет пятьдесят назад …

anonymous
()
Ответ на: комментарий от anonymous

ИМХО проблема в том, что технологии разработки проектов застыли в бетоне лет пятьдесят назад …

А ныне

Беготня вокруг памятника ...
anonymous
()
Ответ на: комментарий от hateyoufeel

Что такое «истинно модульный язык»?

modula-2.

хаскель лучше засунуть в одно место, я функциональщину не обсуждаю вообще.

модули это про компонетно-ориентированное программирование, а не про хаскель.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

modula-2.

А что в нём «истинно модульного»?

хаскель лучше засунуть в одно место, я функциональщину не обсуждаю вообще.

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

Только я всё равно не понимаю, почему минимальной единицей трансляции является именно модуль, а не функция, особенно когда я показал тебе пример обратного.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 2)
Ответ на: комментарий от alysnix

Программа представляет собой набор модулей — самостоятельных единиц компиляции, которые могут компилироваться раздельно. При этом программный модуль может (но не обязан) быть разделён на две части: модуль определений и модуль реализации. Модуль определений — это внешний интерфейс модуля, то есть набор экспортируемых им имён констант, переменных, типов, заголовков процедур и функций, которые доступны внешним модулям. Модуль реализации содержит программный код, в частности, конкретизацию описаний всего, что перечислено в модуле определений. Например, некоторый тип «запись» может быть объявлен в модуле определений с указанием лишь его имени, а в модуле реализации — с полной структурой. В этом случае внешние модули могут создавать значения данного типа, вызывать процедуры и функции, работающие с ним, выполнять присваивание переменных, но не имеют прямого доступа к структуре значений, поскольку эта структура не описана в модуле определений. Если для этого же типа описать в модуле определений структуру, то она станет доступна. Помимо модулей глобального уровня в Модуле-2 допускается создавать локальные модули.

Это? Тут нет ничего особенного вообще. Это же есть в других языках.

Так вот

Только я всё равно не понимаю, почему минимальной единицей трансляции является именно модуль, а не функция, особенно когда я показал тебе пример обратного.

Отвечай давай.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от anonymous

ИМХО проблема в том, что технологии разработки проектов застыли в бетоне лет пятьдесят назад … А ныне Беготня вокруг памятника …

И это 99% пРОгаМмИСтоВ

нравится

Нам новые технологии не нужны

Зарплату давай ...
anonymous
()
Ответ на: комментарий от anonymous

ИМХО проблема в том, что технологии разработки проектов застыли в бетоне лет пятьдесят назад …

Реальная проблема в том что подавляющее число людей гордо называющих себя программистами не могут преодолеть gap между «как» и «зачем/почему». И все ломают копья C++ vs Java or whatever. Смысл от этого не меняется. Язык (любой) в отрыве от прикладной задачи смысла не имеет.

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

И все ломают копья C++ vs Java or whatever.

Это да

Бегают с флагами и транспарантами вокруг памятника ...
anonymous
()
Ответ на: комментарий от hateyoufeel

Только я всё равно не понимаю, почему минимальной единицей трансляции является именно модуль, а не функция, особенно когда я показал тебе пример обратного.

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

просто функция не может быть (в общем случае) единицей компиляции, уже потому, что в общем случае не может быть скомпилирована без окружения в котором она находится.

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

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

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

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.