LINUX.ORG.RU

Как читать и понимать С/C++ код?

 ,


0

6

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

https://www.youtube.com/watch?v=5P5TmcGj9Mk

И после его посмотра у меня возник один вопрос. Вопрос не праздный, потому что я сейчас хочу выкинуть на свалку мои единоличные двадцатилетние бодания с языком C++. Я хочу отказаться от плюсов и забыть их как страшный сон. Матерые плюсисты мне говорят: ты тупой, ты не наш, ты позоришь светлое имя языка C++. Если ты за такое время не смог осилить язык, зачем ты мучаешься? В твоей тупости виноват только ты и твои родители, но не язык. Ты неспособен обучаться, смирись с этим и иди работать таксистом (я уже почти готов).

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

unsigned short *(*(**bazz[][7])())[];

Скажите мне, великие сплюсовики, вы действительно можете представить себе в голове структуру этого выражения, как она размещается в памяти, и что на что указывает? Или, когда ее разбираете, просто произносите слова? Мне это очень интересно, а узнать не у кого, и эту тонкость автор ролика опускает, вскользь говоря что пример академический. Когда меня такое спрашивают на собеседованиях, я честно пытаюсь представить в голове всю структуру, и чувствую, что торможу на третьем уровне «который...», после чего мое понимание заканчивается. Я могу оттараторить с грехом пополам парсинг "по спирали", но у меня понимания структуры не будет, это какой-то непредставляемый монстр. Неужели представление есть у автора ролика?

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

«Да я вот у человека и интересуюсь, зачем на нём пишут.»

Как этого можно не понимать? В Go ты имеешь сразу готовую компиляцию в нативный код. Пусть там будет GC - плевать, все что ты напишешь будет работать быстро, если какого-нибудь сверхпроизводительного матана не потребуется. И память не потечет, и адовой смены парадигмы как у rust не требуется.

Язык сейчас маленький, понятный, удобный. Начинающий программер (о ужас!) даже может заглянуть в код больших Go-шных библиотек, и понять что там написано. Это вообще неслыханно! В Go к себе, любимому, проект привязать очень сложно: остается только путь говнокодинга, что сразу видно. А привязка через сложность уже не прокатывает. От этого у многих бомбит.

Очень здравое суждение, на мой взгляд. Поддерживаю.

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

unsigned short *(*(**bazz[][7])())[];

Расшифровывается так:

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

#include <stdio.h>

unsigned short *(*(**bazz[][7])())[];

unsigned short us_a;

unsigned short *(a_us_a[]) = {&us_a};

unsigned short *(*f())[];

unsigned short *(*(*pf)())[] = f;



int main()
{
    bazz[0][0] = &pf;
    printf("Hello\n");
    return 0;
}

unsigned short *(*f())[]
{
    return &a_us_a;
}

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

Расшифровывается так:

Уверен, что дальше приведённого примера этот кубик-рубик не пойдёт.

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

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

solom
()

Да, спасибо топикстартеру за хорошее видео и его автора. Только посмотрел, потом ещё штук несколько - годный контент!

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

Какой ещё парадигмы? Rust - это человеческие плюсы с ФП.

Во-первых, с ФП, а во-вторых со встроенной парадигмой владения ресурсом by design.

Xintrea ★★★★★
() автор топика

потому что я сейчас хочу выкинуть на свалку мои единоличные двадцатилетние бодания с языком C++. Я хочу отказаться от плюсов и забыть их как страшный сон.

Ура!

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

со встроенной парадигмой владения ресурсом

Она и в C++ такая же. Просто в Rust компилятор думает за человека.

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

Видел уже. Полный УГ. Поддержка текста на уровне DOS. Виджетов сложнее кнопок нет. Но гоферы неразборчивые, и так сожрут.

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

Легко. На Go щас пишут весь прикладной софт

предлагаешь на основе этого утверждения мне самому догадаться и найти где «C++ местами говно ещё то» ?

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

Предлагаю

Простите, не заметил, вы уже привели примеры «прикладного софта на C++», который полным ходом переписывают на Go?

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

Где он говорил про го? У тебя голоса.

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

Его не переписывают, а пишут с нуля. Простите, вас на гитхабе забанили? Всё в открытом доступе, на гитхабе сейчас расцвет Go, на крестах уже полгода ничего «не выстреливает», не популярен он уже, си плюс плюс этот.

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

Его не переписывают, а пишут с нуля.

Ok, пусть будет так.

Расскажите словами, что сейчас на Go пишут такого прикладного, что раньше писали на C++. Выделю специально для вас: ПРИКЛАДНОГО.

не популярен он уже, си плюс плюс этот

Он уже лет 15, минимум, не популярен. Но вас почему-то все равно беспокоит, хоть вы про него ничего не знаете.

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

Предлагаю хотя бы бегло изучить конкуренты C++ такие как Objective-C, Swift, Rust.

Objective-C - это боль. Как он может быть конкурентом C++?

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

Почему -сразу - боль? Он как раз был создан для того, чтобы сильно облегчить программисту задачу. С++ он много чего умеет. но 60 процентов его возможностей посвящено борьбе с особенностями самого языка. Да, синтаксис непривычный поначалу. Но потом инфиксная запись функций оказывается очень даже удобной.

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

Невозможно понять, как вы умудрились приравнять это все к прикладному (ПРИКЛАДНОМУ, Карл!) софту. Но может вы хоть в чем-то окажитесь последовательным и покажете, что в свое время подобные вещи писались на C++? Например, укажете на аналог https://github.com/ovh/cds на плюсах?

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

CMake и врапперы написаны на плюсах. Знаю парочку американских компаний, которые только на этих врапперах держат свой бизнес, например, AppVeyor Systems.

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

CMake и врапперы написаны на плюсах.

1C на плюсах написан. Значит ли это, что львиная доля автоматизации бизнеса в СНГ написана на плюсах?

Впрочем, в вашем случае это вопрос риторический.

eao197 ★★★★★
()

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

Тут имеет место эффект, проиллюстрированный в этой весёлой гифке.

proud_anon ★★★★★
()

Прочитал первую страницу. Странно почему не вспомнили однострочники на perl.

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

Почему -сразу - боль?

Нелепое, несистемное нагромождение рандомных символов?

С++ он много чего умеет. но 60 процентов его возможностей посвящено борьбе с особенностями самого языка.

Это какие, например?

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

Судя по коду ты что-то понимаешь, если не спастил, конечно.

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

Ну в целом понятно почему контент для тебя годный.

unsigned short *(*(**bazz[][7])())[];

Идентификатор bazz является двумерным массивом указателей на указатели на функцию
указатели

Такого понятия нет, но сошлюсь на описку.

которая на принимая параметров

Неверно.

возвращает указатель на массив указателей на значение типа unsigned short.

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

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

Предлагаю

не я сказал, что «C++ местами говно ещё то», потому доказать это придется тебе

x905 ★★★★★
()

Как читать и понимать С/C++ код?

while(!ПонялКод()) ЧитаешьКод();

:-)

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

удобно

Я вот после осиливания интерфейса к Guile посмотрел на чей-то сишный кусочек кода для питона и мне стало страшно. По-настоящему страшно.

anonymous
()

Забей. Плюсы - это дерьмо. Застарелое, страшное дерьмо. Но мы его жрём потому, что его много [библиотеки], оно везде [исторически], и оно есть на любой вкус [от кучек кода до вылизанных поделок].

Хочешь жрать чуть меньшее дерьмо - пиши на Rust. Но его мало [библиотеки], и он весьма специфичный на вкус [пальцеломательный синтаксис].

Либо Kotlin, либо что-то ещё.

Ты ж софт пишешь - т.е. решаешь проблемы. Какая тебе разница, насколько у тебя плохой инструмент? Он же решает твою проблему.

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

они намного лучше 1с?

Честно, немного видел SAP изнутри и снаружи. И совершенно не понимаю как люди с ним живут. Это закостенелое, убогое, кривое, нелогичное, несопровождаемое поделие, единственная заслуга которого в том, что исторически в SAP первыми реализовали более-менее развернутую абстракцию «бизнес-процесс», вокруг которой все и крутится.

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

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

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea
Процедура ОбработкаВнешнегоСобытия(Кто,Что,Зачем)
    Если Кто="LRC_Modem" Тогда
        Если Что="LRC_Modem" Тогда
            Сообщить(Зачем);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры
beaver
()
Ответ на: комментарий от Xintrea

Прекрасно читается!

Я сблеванул и вам принёс покушать. Читается оно ещё хуже, чем паскаль. И, почему-то, на родном и могучем ЯП выглядит ещё более отвратительно, чем на латинице, как по мне. А так то - жить, конечно, можно.

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

Кушайте свою блевоту сами.

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

Единственная претензия у меня к языку 1С - это обязательная зеркальность имени открытия и закрытия блока. Но я думаю, что рано или поздно они переделают синтаксический анализатор на что-то стандартное типа «КонецБлока», или вообще сделают обязательные отступы как в Python.

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

Если перейдут на стиль Python, то вообще идеал:

Процедура ОбработкаВнешнегоСобытия(Кто,Что,Зачем)
    Если Кто="LRC_Modem" Тогда
        Если Что="LRC_Modem" Тогда
            Сообщить(Зачем);

Практически псевдокод на русском. Все понятно даже без знакомства с языком.

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

А учитывая, что в 1С сделали уже компонентную среду разработки, можно для компиляции прикрутить и транслятор нового синтаксиса в стандартный. И получится как TypeScript для JavaScript. Просто прелестно.

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

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

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

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

А учитывая, что в 1С сделали уже компонентную среду разработки, можно для компиляции прикрутить и транслятор нового синтаксиса в стандартный. И получится как TypeScript для JavaScript. Просто прелестно.

Ну когда тебе Чебурнет подключат, займись этим. Всё равно больше нечем будет.

beaver
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.