LINUX.ORG.RU

Современно современный C++

 ,


1

4

Под современным C++ обычно подразумевают C++11. Вышедшие после него C++14 и C++17 обычно называют минорными обновлениями стандарта. И вот, с появлением C++20, а недавно и C++23 появился современно современный C++. Тавтология по аналогии с long long.

Так вот, читаю сейчас совсем свежую книгу Beginning C++23 From Beginner to Pro, седьмое издание, авторы Ivor Horton и Peter Van Weert. Книга учит программированию на C++23 и довольно неклассическим образом. Вот самая первая программа из неё:

// Ex1_01.cpp - A complete C++ program
import std;          // This line makes the entire Standard Library available,
                     // including the std::println() functionality used below

int main()
{
  int answer {42};   // Defines the variable answer with value 42
  std::println("The answer to life, the universe, and everything is {}.", answer);
  return 0;
}

Классического Hello World нет, но его написание предлагается в качестве домашнего задания и тут же намекают каков должен быть код:

exercise 1-1. Create, compile, link, and execute a program that will display the text «Hello World» on your screen.

exercise 1-2. Create and execute a program that outputs your name on one line and your age on the next line. define a variable to hold your age first.

exercise 1-3. the following program produces several compiler errors. Find and correct these errors so the program compiles cleanly.

#import std
Int main
{
  std:printn("Holla Mundo!")
)

Так же в первых главах авторы написали:

As of C++23, the preferred mechanism for outputting text to the computer’s screen is through functions such as std::println() and std::print(). We will use these in nearly every example in this book.

Короче C++23 начинает напоминать Java. Но эту тему я открыл не поэтому. Мне вот стало интересно, а как воспримут обучившегося по такой книге джуна или мидла матёрые си плюс плюснутые дядьки из реальных проектов? Вот придёт такой свежеобученный программист в реальный проект и начнёт проталкивать C++ модули везде и всюду. Что скажут старшие товарищи? Побьют или они уже и сами перешли на модули и пишут свой код так, как описано в этой книге?

Не поймите меня неправильно, в книге рассказывают и о классических стримах ввода/вывода, но даже там говорят, что std::print() и std::println() предпочтительнее:

Streams

Input and output in C++ are, as a rule, performed using streams. To output data, you write it to an output stream, and to input data, you read it from an input stream. A stream is an abstract representation of a source of data or a data sink. When your program executes, each stream is tied to a specific device that is the source of data in the case of an input stream and the destination for data in the case of an output stream. The advantage of having an abstract representation of a source or sink for data is that the programming is then the same regardless of the device the stream represents. You can read a disk file in essentially the same way as you read from the keyboard.

std::print() and std::println() are little more than thin layers on top of streams. In essence, the std::println() statement in the main() function of Ex1_01 is analogous to either one of these statements:

std::cout << std::format("The answer to life, the universe, and everything is {}.", answer) << std::endl;
std::cout << "The answer to life, the universe, and everything is " << answer << std::endl;

The standard output and input streams in C++ are called std::cout and std::cin, respectively, and by default, they correspond to your computer’s screen and keyboard. You’ll be reading input from std::cin in Chapter 2 and later chapters.

std::format() is similar to std::print(), except that instead of streaming directly to the standard output stream, std::format() returns the formatted character sequence encapsulated in a std::string object (see Chapter 7). This is why std::print() is effectively analogous to streaming the result of std::format() to std::cout, as we did in the first line of our example.

<<, finally, is the stream insertion operator that transfers data to a stream. In Chapter 2, you’ll meet the stream extraction operator, >>, which similarly reads data from a stream. Whatever appears to the right of each << is transferred to std::cout. You can insert as many strings or other values in one statement as you want (we’ll clarify how this works exactly in Chapter 13). Inserting std::endl to std::cout causes a new line to be written to the stream and the output buffer to be flushed. Flushing the output buffer ensures that the output appears immediately.

Compared to working directly with std::cout, working with std::print() and std::println() is generally both more elegant and efficient (see the next chapter for more convincing evidence). This is why we won’t use output streams that often anymore as of this edition of the book. But because output streams remain an important concept in C++ in general, we’ll briefly return to working with streams at the end of the next chapter to introduce the basic principles.

Разумеется, большинство настоящих проектов на C++ заняты вовсе не вводом/выводом в консоль. Но переход на модули наверняка меняет устоявшиеся привычки в программировании на C++ ещё во множестве других мест. Мне интересно, как это будет воспринято синьёрами помидорами? Помню как я сам начинал программировать на Java в 2006 году. Во время обучения я использовал Java 6, в которой был новый синтаксис цикла for. На собеседовании у меня был лайв кодинг и когда я начал писать такой цикл и написал двоеточие интервьюирующий меня груплид воскликнул: «это же не Pascal!» В тогдашнем проекте той конторы использовали Java 5, в которой for-each только появился.



Последнее исправление: zg (всего исправлений: 1)

Ответ на: комментарий от zg

Доказано лишь появление некоторых аминокислот в первичном бульоне с молниями.

в реакции Белоусова-Жаботинского с ВЧ токами и искусственными молниями ЕМНИП, воспроизвели производство аминокислот.

а это не бог весть какой сложный эволюционный алгоритм.

уравнения Тьюринга морфогенеза тоже не очень сложные.

но там да, хаотическая динамика получается.

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

man структуры Тюринга (паттерны С++ Тьюринга), уравнения Тьюринга, «химические основы морфогенеза» вики , ОСВС

А что, в C++ что int, что struct { int val; } - одно и то же в ассемблере?

эти структуры – кого надо структуры.

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

попросят обосновать применение модулей с цифрами и фактами.

Это ради посмеяться? Ну да - нужно же как-то развлекаться… Я с трудом себе представляю чтобы кто-то в здравом уме согласился на перевод чего-то серьёзного на технологии и практики непроверенные временем.

Еще посоветуют не читать книги, в которых пишут «return 0» в конце main

Глупость какая: если стандарт что-то позволяет то это вовсе не означает что так и нужно делать, ровно как и биться головой об стенку несмотря на то что уголовно это ненаказуемо. Пример из жизни - main() может захотеться переопределять, например в целях аудита (крикнуть в центральное место что, какую сборку и с какими параметрами дёрнули). И удачи править все апликухи (коих могут быть сотни и тысячи), а всё из-за чего: сэкономили, блин, один explicit return…

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

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

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

Значит и природа устроена вовсе не по тем законам, которые мы пытаемся моделировать формулами с иррациональными и трансцендентными числами. Наши модели несомненно близки к реальности, но могут оказаться в чём-то на столько принципиально неверными, что мы просто остановимся в своём развитии и дальше срачей на ЛОРе или перекомпиляции Генты от обезьян не уйдём.

значит, нужны более другие модели.

моделируй p-адическими числами, например. какие проблемы.

А. Ю. Хренников. Моделирование процессов мышления в р-адических системах координат пруфлинк

man диски Ципфа, man навязчивые состояния/привычки/привязанности/влюблённость – в общем, читай книжку. там интересно.

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

что мы просто остановимся в своём развитии и дальше срачей на ЛОРе или перекомпиляции Генты от обезьян не уйдём.

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

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

cтр. 277 (276/296), глава 9.4. Мышление с возрастающей чёткостью ассоциаций (в самом конце)

Теорема 4.1. Путь f: O -> O мономинальное отображение f_n и пусть n делится на p. Тогда для каждой идеи J, состоящей из конечного числа ассоциаций, существует ВЧ-аттрактор (ВЧ=«возрастающая чёткость», см. стр 276 начало главы 9.4)

далее он довольно строго это всё доказывает.

стр. 280, выводы:

Заметим, что теорема 4.1 интересна только с математической точки зрения. Мозг системы тау не знает точно I-состояний {d^(j)_1,…,d^(j)_s(j)} которые составляют основу идеи-аттрактора H. Реальная работа мозга может быть основана на следующем I-процессе. Система тау не обязана (и не может) работать с бесконечной точностью. Точность (чёткость) l, которая соответствует аппаратному обеспечению мозга или конкретному классу задач, должна быть зафиксирована. Давайте рассмотрим случай одной идеи-ассоциации J={U_1/p^q(a)}. Мозг выдаёт итерации по модулю p^l элемента а: a, a^n, …, a^n^k, …. Как только найдутся первые k и s, удовлетворяющие условию (9.8), мозг строит приближение по модулю p^l ВЧ-аттрактора H: H[l] = {U_1/p^l(a^n^k), …. , U_1/p^l(a^n^(k+j)) }. Идея H[l] рассматривается как эпсилон-решение задачи J.

ВЫВОДЫ А. Ю. Хренникова:

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

твои выводы:

Значит и природа устроена вовсе не по тем законам, которые мы пытаемся моделировать формулами с иррациональными и трансцендентными числами. Наши модели несомненно близки к реальности, но могут оказаться в чём-то на столько принципиально неверными, что мы просто остановимся в своём развитии и дальше срачей на ЛОРе или перекомпиляции Генты от обезьян не уйдём.

утверждаешь, что разница есть?

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

А иначе откуда: «Земля же была безвидна и пуста, и тьма над бездною, и Дух Божий носился над водою»?

или вот:

Информация как инвариант смысла

В чем «приоритет духа над материей»

Символичность информации в эйдетической сущности

Телеология информации

о, да.

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

читал. и проверять не буду. потому что под линухом все работает

С чего ты взял, что это линукс специфичная фича?

а ставить винду с mingw чтобы проверить чьи-то утверждения…

Значит всё таки не читал, потому что если бы прочитал, то и без винды с mingw узнал бы, что там это не работает.

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

undefined reference to `std::__open_terminal(_iobuf*)’

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

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

короче это скорей не баг gcc, а mingw. а если этот баг есть и под линуксом (без этих ваших mingw)то это сильно странно.тут отсутствует обьектник. его надо искать.

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

А что, в C++ что int, что struct { int val; } - одно и то же в ассемблере?

А с чего им быть разными? В памяти это одно и тоже с одинаковым размером, выравниванием и т.п. Отличается только синтаксис языка, и м.б. какие-то мелкие нюансы, которые я придумать не могу. Но по сути для языка это одно и тоже.

Вот когда там появляются виртуальные методы и полиморфизм, тогда начинаются отличия и могут появиться потери в производительности (не обязаны). А без этого я не знаю, в чём там может быть разница.

Ivan_qrt ★★★★★
()
#import std
Int main
{
  std:printn("Holla Mundo!")
)

Прямо красиво выглядит. Я ненавижу семиколонодрочеров, особенно тех кто в js их пихает. Сложности в том чтобы написать парсер языка C++ без точек с запятой нет. std:split, std:match с регулярками и нормальный язык будет вместо совсем уже распиаренного говнораста. Я на C++ вот не пишу, но даже мне тошнит от растовского синтаксиса

class TextBlock {
public:
  template <typename Self>
  auto& operator[](this Self&& self, size_t position) {
    // ...
    return self.text[position];
  }
  // ...
};

Питон рулит, епта, чо

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

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

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

Нельзя на лоре - форуме высоких профессионалов, путать папу свина и свинку пэпу!

Сорян, я в беконе не сильно разбираюсь, я его просто ем. Рулька, кстати, тоже топ.

Вот если бы свинку Пепе/Пэпу/… звали Рулькой, я бы это запомнил))

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

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

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

Если у тебя от моих слов горит очко…

Я скромно замечу, что это ты клоунов расставляешь на мои сообщения, но не наоборот. XDDDDD

ты ничего умнее придумать не можешь

А зачем напрягаться, если у тебя и от такого простого подхода пердак полыхнул))

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

кто кодит на 11 и дальше, скорее всего воспримут нормально.

от проекта зависит. Если у Заказчика компилятор древний по каким то причинам то заставят переписывать;-)

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

Тут под сообщениями встречается кнопочка [Показать ответы]. Ты на неё нажимай иногда, прежде чем возмущаться и встревать в разговор.

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

У Вас и без пикетов уже общелоровская известность.

Так что, как то свое утверждение о превосходстве примитивов на структурами юзера обосновывать будете? Или фиксируем Ваш очередной 100501й слив?

Вы таки прям в сливном ударе сегодня, не останавливайтесь!

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

Это не ответ. Я Вам задал простой вопрос, а Вы опять крестцом виляете.

По той кнопочке показан Ваш ответ демонстиирующий Ваше полное непонимание того как вообще работают классы в плюсах. Но пока что в этом треде не прозвучало никакого обоснования Вашего утверждения о превосходстве примитивов.

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

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 2)