Вот, вроде, язык C — это самое компактное и логичное что может быть. Явно не хватает там классов для ООП, вроде логично что сделали C с классами. Но и без того уже писали да и продолжают писать на C в ООП-стиле, когда добавили классы — то как бы появился синтаксический сахар ну и плюс этот ваш RAII. ОК, все логично.
Далее. Вроде бы так же логично чтобы не писать однотипные алгоритмы для разных типов — добавить компил-таймовые шаблоны. Вроде ОК, логично.
Но вот когда на этих шаблонах и SFINAE начали какую-то сложную логику выстраивать — это уже, имхо, Wrong Way. Как-то все получается неудобоваримо, переусложненно и похоже на изврат, как будто нашли какой-то хак, позволяющий делать то что изначально не задумано.
Если уж так хочется компил-тайма — то почему бы не сделать его полноценным? Пусть не давать доступ к системным функциям, т.е. не давать возможности создавать файлы — но дать возможность статических переменных внутри функции, дать возможность простого и стандартизированного доступа к списку членов структуры/класса. Чтобы прекратить этот изврат в конце концов.
Здравствуйте, Shmj, Вы писали:
S>Вот, вроде, язык C — это самое компактное и логичное что может быть. Явно не хватает там классов для ООП, вроде логично что сделали C с классами. Но и без того уже писали да и продолжают писать на C в ООП-стиле, когда добавили классы — то как бы появился синтаксический сахар ну и плюс этот ваш RAII. ОК, все логично.
К гомам слово логично не применимо. Оно применимо к единичным сапиенсам (1 сапиенс на 100000 гомов).
Сапиенсы сделали С. Подумали и добавили классы и ООП. Подумали и добавили шаблоны.
Дальше набежали гомы и засрали всё это своим безумием. Но, прими это как объективную реальность — у гомов по-другому быть не может.
Здравствуйте, Vzhyk2, Вы писали:
V>набежали гомы и засрали всё это своим безумием.
Все так, но сапиенсы после классов и шаблонов так и не родили ничего радикального нового, что можно было бы без извращений применять в любом классе задач. Из универсального родили в основном мелочи вроде constexpr/consteval, всякие лямбды/сопрограммы довольно специфичны к задачам, а почти все остальное без извращений не работает.
ЕМ>Все так, но сапиенсы после классов и шаблонов так и не родили ничего радикального нового, что можно было бы без извращений применять в любом классе задач.
"Девушка, вы вышли бы замуж заради кала?..."
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Все так, но сапиенсы после классов и шаблонов
Так они и классы с шаблонами не рожали. Классы взяли из Simula, шаблоны из Ada и, емнип, ML. Исключения и перегрузку операторов тоже откуда-то стянули, вроде бы из Ada.
Здравствуйте, so5team, Вы писали:
S>Так они и классы с шаблонами не рожали. Классы взяли из Simula, шаблоны из Ada и, емнип, ML. Исключения и перегрузку операторов тоже откуда-то стянули, вроде бы из Ada.
Ну да, все эти идеи так или иначе высказывались и применялись достаточно давно. Речь о том, что какие-то из них оформили применительно к конкретному языку.
Здравствуйте, Shmj, Вы писали:
S>Если уж так хочется компил-тайма — то почему бы не сделать его полноценным? Пусть не давать доступ к системным функциям, т.е. не давать возможности создавать файлы — но дать возможность статических переменных внутри функции, дать возможность простого и стандартизированного доступа к списку членов структуры/класса. Чтобы прекратить этот изврат в конце концов.
Я думаю, дело не в полноценности-неполноценности. Эта-то проблема давно решается с помощью древней, как UNIX System 7, парадигмы автоматической генерации кода во время сборки с помощью специально написанных для этой цели программ или скриптов.
Проблема C++ в том, что там два языка в одном, построенных на очень разных парадигмах. Сам по себе C++ — имперический язык, в стили Си. А вот система евонных темплейтов — ленивый, функциональный, строгий язык. Тьюринг-полный, с организацией циклов с помощью рекурсии и с хранением значений с помощью typedef. Такой покалеченный Haskell. И люто неудобный.
Здравствуйте, Pzz, Вы писали:
Pzz>Такой покалеченный Haskell. И люто неудобный.
Говорят, что одевать брюки через голову люто неудобно. Виноваты ли в этом брюки?
А вообще забавно наблюдать, как о проблемах языка рассуждают персонажи, разбирающиеся в предмете разговора как свинья в апельсинах. Типа в каждый является экспертом в политике, футболе, медицине и C++.
Здравствуйте, so5team, Вы писали:
S>А вообще забавно наблюдать, как о проблемах языка рассуждают персонажи, разбирающиеся в предмете разговора как свинья в апельсинах. Типа в каждый является экспертом в политике, футболе, медицине и C++.
Покажи мне эксперта в С++ и я шутя завалю его на собеседовании.
Современный С++ — это уродство, особенно классно в нем смотрятся UB, которым уже лет по 30 и никто не исправляет.
Здравствуйте, Vzhyk2, Вы писали:
S>>А вообще забавно наблюдать, как о проблемах языка рассуждают персонажи, разбирающиеся в предмете разговора как свинья в апельсинах. Типа в каждый является экспертом в политике, футболе, медицине и C++. V>Покажи мне эксперта в С++ и я шутя завалю его на собеседовании.
Э... Это значит, что теперь любой дятел, который C++ в глаза не видел, может всерьез рассуждать о C++?
V>Современный С++ — это уродство, особенно классно в нем смотрятся UB, которым уже лет по 30 и никто не исправляет.
Уродство, уродство, узбагойтесь уже, это даже не оспаривается. Парадокс в том, что пользоваться современным C++ удобнее, чем тем, который был 25 лет назад.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Все так, но сапиенсы после классов и шаблонов так и не родили ничего радикального нового, что можно было бы без извращений применять в любом классе задач. Из универсального родили в основном мелочи вроде constexpr/consteval, всякие лямбды/сопрограммы довольно специфичны к задачам, а почти все остальное без извращений не работает.
Вот лямбды, на мой взгляд — самое удобное. Теперь пишу на С с лямбдами.
Полиморфизм — почти сразу ушел в топку.
Какое-то время изгалялся с шаблонами для передачи контекста. Но тоже надоел весь этот оверхед.
А лямбды — где не супер-критично время исполнения (а оно в большинстве мест некритично), позволяют всякие удобства с коллбэками.
Например, вместо извратов с итераторами, можно вызывать коллбэк для всех элементов контейнера.
А с вложенными коллбэками можно еще более интересные штуки делать.
Пользователю совершенно не надо париться внутренней структурой Database, он просто вызывает коллбэки в любом порядке для всех записей.
Понятно, что тоже самое можно организовать стандартными средствами С, объявляя кучу глобальных функций — но это неудобно и некрасиво.
Лямбды удобны именно возможностью вставки кода в параметры.
Здравствуйте, so5team, Вы писали:
S>А вообще забавно наблюдать, как о проблемах языка рассуждают персонажи, разбирающиеся в предмете разговора как свинья в апельсинах. Типа в каждый является экспертом в политике, футболе, медицине и C++.
Мне примерно 7 мес. работы с C++, не считая былых разовых проектов в молодости — хватило чтобы просечь эту фишку.
Обычно на усвоение нового ЯП — типа после C# на Java или на Dart — уходит месяца 2. C С++ даже 7 месяцев мало и именно по причине т.н. компил-таймовой логики. Остальное не особо отличается от привычных мне языков, на которых пишу без малого 20 лет, ничем другим не занимаюсь.
Здравствуйте, so5team, Вы писали:
V>>Покажи мне эксперта в С++ и я шутя завалю его на собеседовании. S>Э... Это значит, что теперь любой дятел, который C++ в глаза не видел, может всерьез рассуждать о C++?
Попробуйте без перехода на личности. Вполне возможно что ваш уровень хуже чем тех, кого вы считаете дятлами.
Здравствуйте, graniar, Вы писали:
G>Вот лямбды, на мой взгляд — самое удобное. Теперь пишу на С с лямбдами. G>Полиморфизм — почти сразу ушел в топку. G>Какое-то время изгалялся с шаблонами для передачи контекста. Но тоже надоел весь этот оверхед.
Тут дело вот в чем. Если вы выбираете C++, то вам нужно не только писать но и читать. В том числе логику на основе SFINAE.
Здравствуйте, Shmj, Вы писали:
S>Тут дело вот в чем. Если вы выбираете C++, то вам нужно не только писать но и читать. В том числе логику на основе SFINAE.
Чукча не читатель. Чукча — писатель.
Мне даже гуглить пришлось, что за SFINAE такое Хотя в нулевых знал стандарт вдоль и поперек.
Да и никогда я не был командным игроком, старался выбить себе зону ответственности и взаимодействовать с чужим кодом только посредством задокументированного интерфейса.
И вообще, живой только потому, что не попадался сопровождавшим мой код.
Первого Января 1998 года Bjarne Stroustrup давал интервью журналу 'Computer'. Вообще-то редакторы предполагали, что он расскажет о семи годах объектно-ориентированного программирования с применением языка, который он и разработал.
К окончанию беседы выяснилось, что интервьюер извлек больше информации, чем предполагал, и, естественно, редакторы решили урезать содержание 'для пользы индустрии', но, как обычно получается в таких случаях, произошла утечка информации.
Вот полный и нередактированный протокол интервью — это не похоже на обычные запланированные вопросы/ответы.
Вам наверняка покажется это интересным.
Интервьюер — далее И., Stroustrup — далее C..
И. Прошло несколько лет с тех пор, как Вы изменили мир разработки программного обеспечения. Что Вы теперь чувствуете, оглядываясь назад?
C. Вообще-то я думал об этих днях как раз перед тем как Вы приехали. Помните — все писали свои версии 'C', и проблема была в том, что все это делали чертовски замечательно. Университеты тоже чертовски замечательно преподавали этот язык. Это привело к понижению компетенции. Под 'компетенцией' в данном случае я подразумеваю феноменальность. Вот что породило проблему.
И. Проблему?
C. Да, проблему. Помните когда все писали на Cobol?
И. Конечно, я тоже это делал.
C. Ну вот, в начале эти ребята были как боги. Им платили кучу денег и относились как к королям.
И. Да уж, вот это были времена...
С. Именно. Ну и что же случилось? IBM прямо заболела этим и вложила миллионы в подготовку программистов, пока их не стало до ужаса много.
И. Вот так и я вылетел из этой сферы. Втечение года зарплата упала настолько, что даже журналистом можно было зарабатывать больше...
С. Точно. То же самое случилось и с программистами, писавшими на 'C'.
И. Понятно, ну и что же Вы все-таки хотите этим всем сказать?
C. Однажды я сидел у себя в оффисе, и мне пришла в голову небольшая идейка, как хоть немного восстановить баланс. Я подумал: интересно, что произойдет, если будет язык программирования такой запутанный и такой сложный для изучения, что никто бы уже не сможет заполнить рынок толпой программистов, пишуших на этом нем? У меня уже были тогда кое-какие мысли по этому поводу. Вот, знаете наверно, X10 и X windows. Это тогда была такая графическая система, которая работала на Sun 3/60. У нее были все ингредиенты, которые мне были нужны — комплексный синтаксис, сложные для понимания мрачные функции, псевдо объектно-ориентированная структура. Даже сейчас никто не пишет напрямую под X-windows. Motif — единственный путь, если вы хотите сохранить рассудок.
И. Шутите?
C. Ничуть. Есть еще одна проблема. Unix был написан на 'C' — это значило то, что любой программист, пишущий на 'C', мог очень легко стать системным программистом. Помните сколько обычно зарабатывали большинство системных программистов?
И. Да, я же ведь тоже этим занимался.
С. Так вот, этот новый язык должен был отделять себя от Unix путем скрывания всех системных вызовов, которые так здорово связывают 'C' и Unix. Тогда ребята, знающие только DOS, тоже смогли бы прилично зарабатывать.
И. Не верится в то, что Вы это сказали...
С. Это уже происходит достаточно долго, но вроде сейчас большинство людей уже уяснили для себя, что C++ — это пустая трата времени, но должен сказать, что осознание этого происходило дольше чем я ожидал.
И. Ну расскажите поточнее, как же Вы все-таки сделали это?
C. Это была просто шутка, я никогда не думал, что люди воспримут эту книгу всерьез. Любой человек, даже с половиной мозга, может понять что объектно-ориентированное программирование интуитивно, нелогично и неэффективно.
И. Что?
С. И относительно 'повторно-используемого кода' — Вы когда-нибудь слышали, чтобы хоть одна компания 'повторно-использовала' что-либо?
И. Ну, вообще-то не слышал, но...
С. Вот так-то. Некоторые, кстати, пытались. Была такая компания из Орегона — Mentor Graphics, в которой просто заболели тем, что пытались переписать все что можно на C++ в '90 или '91 году. Я на самом деле им сочувствовал, но думаю, что люди по крайней мере, научились чему-то на их ошибках.
И. Очевидно у них ничего не вышло?
С. Вообще ничего. Но было бы сложно объяснить держателям акций компании ущерб в 30 миллионов долларов и вот, надо отдать им должное , они все-таки заставили это работать в итоге.
И. Так все-таки у них получилось? Это доказывает что 'объектное-ориентирование' работает.
C. Почти. Запускаемый файл получился такой огромный, что загружался 5 минут на рабочей станции HP со 128Mb оперативной памяти. Я думал, что это станет камнем преткновения, но это никого особенно не заботило. Sun и HP были очень рады продавать до ненормальности мощные ящики с огромными ресурсами для выполнения на них тривиальных программ. Знаете, когда мы в AT&T; откомпилировали нашим первым компилятором C++ программку 'Hello World', я не мог поверить своим глазам: запускаемый файл получился размером 2.1Mb.
И. Да уж... Но компиляторы с тех пор прошли долгий путь.
C. Вы так думаете? Попробуйте тот же пример 'Hello World' с последней версией g++ — вы получите примерно пол-мегабайта. А кроме этого есть еще множество примеров со всего мира. У British Telecom чуть было не возникли большие проблемы, но к своему счастью они вовремя догадались свернуть проект и начать все заново. И им больше повезло, чем Australian Telecom. А теперь я слышал, что Siemens cоздает какого-то динозавра и все больше и больше волнуется по поводу размера того, что у них получается. Не правда ли забавно смотреть на это всеобщее заблуждение?
И. Да, но C++ -то, в общем, вполне нормальный язык.
С. Вы в это так верите? Попробовали ли вы когда-нибудь сесть и поработать над проектом на C++ ? Во первых, я расставил достаточно ловушек, чтобы просто так работали только тривиальные проекты. Под конец проекта получается что одни и те же операторы в разных модулях означают совершенно разные вещи. А теперь попробуйте соединить все эти модули в единое целое, особенно если у вас их штук 100. Боже, я иногда не могу удержаться от смеха, когда слышу о проблемах разных компаний, которые не могут сделать так, чтобы их модули общались между собой.
И. Я должен сказать, что совершенно сбит с толку всем что Вы сказали. Вы сказали что сделали это для того, чтоб повысилась оплата труда программистов. Но это же бессмыслица.
С. Не совсем так. У каждого есть его выбор. Я не предполагал, что все это так выйдет из-под контроля. Но все-равно, практически все у меня получилось. C++ cейчас уже умирает, а труд програмистов продолжает нормально оплачиваться — особенно тех, кто имеет дело со всей этой чепухой — вы же понимаете, что невозможно использовать эффективно большой программный модуль на C++ , если не вы сами его написали.
И. Как это?
С. Не понятно что-ли? Помните typedef ?
И. Конечно.
С. А теперь вспомните сколько времени приходится копаться в заголовках для того, например, чтобы просто найти, что какое-нибудь там 'RoofRaised' — число с двойной точностью. Представьте теперь сколько времени уйдет на нахождение всех определений типов в большом проекте.
И. Значит, Вы утверждаете, что Вам все, что Вы хотели удалось...
C. Ну, вспомните сколько занимает реализация проекта среднего размера на 'C'. Это около 6 месяцев. Не достаточно долго чтобы парень с женой и детьми мог заработать себе на нормальное существование. Попробуйте тот же проект реализовать на C++ , и что получится? Вам понадобится 1-2 года. Не правда ли, это замечательно? Кроме этого: в университетах уже так давно не преподают 'C', что теперь стало мало людей программирующих на 'C', особенно таких, которые знают все о программировании под Unix. Как вы думаете : сколько парней смогут сообразить что делать с 'malloc' , после того как втечение многих лет они пользовались 'new' и никогда не заботились о проверке кода возврата? Большинство программистов на C++ вообще не выбрасывают этот код возврата. Что произошло со старой доброй '-1' ? По крайней мере было сразу понятно, что у тебя где-то ошибка без всяких там 'throw', 'try' и 'catch'...
И. И все же, наследование экономит кучу времени?
С. Нет, я же говорил... Замечали, в чем разница между стадиями планирования проектов на 'C' и C++ ? Для проекта на C++ эта стадия в три раза дольше. Время уходит на то, чтоб убедиться что все что надо наследуется, а все что не надо — нет. И все-равно без ошибок не обходится. Кто слышал когда-нибудь об утечке памяти в программе на 'C' ? Теперь нахождение этих утечек — целый труд. Большинство компаний сдаются, так и выпускают продукт, зная что утечка памяти существует.
И. Но есть различные программные инструменты...
С. Большинство из которых написаны на C++.
И. Если мы опубликуем все это, то Вас просто могут линчевать, понимаете ?
C. Сомневаюсь. Как я сказал C++ уже уходит в прошлое. Ни одна компания без предварительного тестирования теперь не начнет проект на C++, а если будет тестирование, то они поймут, что это путь к неудаче. Если не поймут — то так им и надо. Знаете, я пытался убедить Dennis'a Ritchie переписать Unix на C++.
И. О Боже. И что же он сказал?
C. К счастью у него присутствует хорошее чувство юмора. Я думаю и он, и Brian понимали что я тогда делал. Он ответил, что может мне помочь написать версию DOS на C++, если я захочу.
И. Ну и как? Вы захотели?
С. Я написал DOS на C++. Могу дать вам demo. Она у меня работает на Sparc 20 в другой комнате. Просто летает на четырех процессорах и занимает всего то 70 мегабайт на диске.
И. На что же это похоже на PC ?
С. Вы, очевидно, шутите. Видели же вы Windows'95 ? Я о них думаю как о своем величайшем успехе.
И. Знаете, эта идея насчет Unix++ заставила меня задуматься. Ведь где-то может сидеть парень, которому придет в голову сделать это...
С. Но не после того, как он прочитает это интервью.
И. Я сожалею, но врядли мы сможем опубликовать даже часть этого интервью.
С. Но это же история века. Я просто хотел чтоб мои приятели-программисты помнили меня за то, что я для них сделал. Знаете как сейчас оплачивается программирование на C++ ?
И. Последнее, что я слышал — настоящие профессионалы зарабатывают $70-80 в час.
С. Понимаете теперь? И я уверен, что он заслуживает этих денег. Отслеживание всех этих ловушек, которые я встроил в C++ — не легкая работа. И, как я говорил раньше, каждый программист на C++ чувствует себя связанным тем обстоятельством что он должен использовать каждый элемент языка в каждом проекте. Вообще это и меня часто раздражает, даже тогда, когда это служит моим целям. Но сейчас, когда прошло столько времени, мне уже начинает нравиться этот язык...
И. Имеете ввиду, что раньше Вам C++ не нравился?
С. Ненавидел его. Он даже выглядит неуклюже, вы не согласны? Но когда стали там выходить разные книги... вот, тогда-то я и увидел полную картину.
И. Погодите, а как насчет ссылок? Вы подтверждаете что улучшили указатели 'C' ?
С. Хмм. Я и сам не знаю. Вообще я думал, что да. Потом я как-то говорил с парнем, который писал на C++ с самого начала. Он говорил, что не мог запомнить были ли ссылки на его переменные или нет, поэтому он всегда использовал указатели.
И. Обычно на этой стадии я говорю 'большое спасибо за интервью', но сейчас это как-то не к месту.
С. Пообещайте мне, что опубликуете это.
И. Я извещу Вас, но мне кажется, что я знаю, что скажет мой редактор по этому поводу.
С. А все-равно, кто этому поверит? Кстати, не могли бы вы мне прислать копию этой записи?
И. Это я могу.
Примечание переводчика :
Я не программирую на C++. Я не являюсь знатоком русской словестности. Посему прошу извинения за возможные ошибки в переводе.
специальный перевод для Hacknet Review выполнил Mike Bluesman, март 1998
Здравствуйте, graniar, Вы писали:
G>Мне даже гуглить пришлось, что за SFINAE такое Хотя в нулевых знал стандарт вдоль и поперек. G>И вообще, живой только потому, что не попадался сопровождавшим мой код.
Если вы не знаете про SFINAE — то есть надежда что ваш код в разы более чист и легок в сопровождении, чем средний код по больнице.