Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
macro4wf
45 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 7
#1

Дедушка, а что это за костыль у тебя? - C++

28.01.2014, 23:41. Просмотров 1545. Ответов 22
Метки нет (Все метки)

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

http://habrahabr.ru/company/yandex/blog/206234/
А что это за костыли такие?Прошу помощи олдфагов.Можно будет составить список хотя бы 10 самых самых и привести примеры исходного кода.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2014, 23:41     Дедушка, а что это за костыль у тебя?
Посмотрите здесь:

Visual C++ afx_msg: что это и зачем это?
** - что это? C++
C++ Что это за метод?И что он делает?
Объясните что именно делает "x%d, y%d: " или что это в даном коде C++
Объясните подробно данный код программы. Знаю что это фильтр а пошагово что к чему не понимаю C++ Builder
C++ Необходимо протестировать костыль
Boost C++ Boost::asio клиет-сервер - есть ощущение, что где-то что-то блокируется, не знаю как это дебажить
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
28.01.2014, 23:45     Дедушка, а что это за костыль у тебя? #2
Ну например отсутствие встроенного типа string. string конечно же есть в STL и он настолько хорош, что сейчас, хотя многие уже просят, string в сам язык пока что не ввели. Хотя во многих других языках того же уровня string есть. Разница не принципиальна, но особенность всё таки интересная.
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.01.2014, 23:59     Дедушка, а что это за костыль у тебя? #3
гуглите undefined behavior, все что найдете все ваше и это только "законные" костыли...а сколько ещё формальных...платформозависимых...Си-совместимых и т.д. и т.д.
alex_x_x
29.01.2014, 00:09
  #4

Не по теме:

НеСказочник,
STL - это часть языка
1) в с/с++ подход - все, что может быть реализовано на уровне библиотеки, написанной на самом языке - пишется так.
И такой подход не только в цпп (вон в CL - определение функции defun - может быть написано на самом же CL, хоть есть и built-in версия)
2) кроме того stl физически не выделяется из языка - это исторический артефакт времен, когда STL был отдельной от языка библиотекой, разрабатываемой cgi и hp

НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
29.01.2014, 00:14     Дедушка, а что это за костыль у тебя? #5

Не по теме:

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



Добавлено через 45 секунд

Не по теме:

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

Kuzia domovenok
29.01.2014, 00:45
  #6

Не по теме:

Очередная тема для флуда? Делаем ставки, как скоро её убьёт модер?

alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2014, 02:13     Дедушка, а что это за костыль у тебя? #7
Цитата Сообщение от НеСказочник Посмотреть сообщение
string конечно же есть в STL
Разве?
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2014, 02:20     Дедушка, а что это за костыль у тебя? #8
...
Миниатюры
Дедушка, а что это за костыль у тебя?  
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.01.2014, 04:01     Дедушка, а что это за костыль у тебя? #9
...
Миниатюры
Дедушка, а что это за костыль у тебя?  
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
29.01.2014, 12:07     Дедушка, а что это за костыль у тебя? #10
Цитата Сообщение от alsav22 Посмотреть сообщение
...
Сейчас, если что, не С++98, а С++11 есть. Хотя да, я сейчас уточнил и string входит в список стандартных классов, а STL - это стандартные шаблоны. Так что да, формально, string в STL не входит. Но к словам могли бы и не придираться.
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
29.01.2014, 18:29     Дедушка, а что это за костыль у тебя? #11
Цитата Сообщение от НеСказочник Посмотреть сообщение
Но к словам могли бы и не придираться.
Человек сделал абсолютно правильное замечание, какие придирки? И офтопить не нужно.
alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
01.02.2014, 16:36     Дедушка, а что это за костыль у тебя? #12

Не по теме:

Цитата Сообщение от НеСказочник Посмотреть сообщение
Почитайте определение языка программирования. STL - не часть языка хотя бы по тому, что его можно полностью заменить другой библиотекой.
радикальные языковеды называют языком только то, что определено ее формальной грамматикой? Если да - то вопросов нет.
В реальной жизни грамматики приводят для описания основ, а все остальное стандартизуют.

Я опять же привожу пример CL, в котором определение функции (defun) не является встроенным средством компилятора/интерпретатора, а может быть реализовано как макрос. Это вопрос реализации, но в стандарте defun приводится как способ (один из though) определения функции (не вдаваясь в вопросы связывания итд)



Главный костыль в цпп - это конечно же ц. Из-за совместимости с ним многие вещи пострадали
Такие проблемы
C++
1
T t;
vs
C++
1
T t();
вытекают из способов декларации в ц.

Модель наследования переусложнена и из-за совместимости с предыдущими стандартами видимо никогда не придет к простым и логичным моделям как в Java например

Добавлено через 41 минуту
еще у с/с++ и унаследовавших языков (как и многих предшественников типа фортрана) очень вольная грамматика относительно выражений.
изза этого многие символы недоступны в идентификаторах (например file-name, valid? итд)
не то чтобы надо скатываться к строгости питона, но легко можно было бы жить без этого (сделав более строгими выражения. Все равно ж люди обычно пишут "a - b", а не "a-b")
Dmitriy_M
1334 / 1215 / 110
Регистрация: 20.03.2009
Сообщений: 4,338
Записей в блоге: 11
03.02.2014, 11:04     Дедушка, а что это за костыль у тебя? #13
Цитата Сообщение от alex_x_x Посмотреть сообщение
Модель наследования переусложнена и из-за совместимости с предыдущими стандартами видимо никогда не придет к простым и логичным моделям как в Java например
Что не так с наследованием?
alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
04.02.2014, 02:21     Дедушка, а что это за костыль у тебя? #14
Dmitriy_M, ну в цпп наследование реализовано очень низкоуровнево (например при наследование методы могут быть как virtual, так и не virtual)
Это с одной стороны теоретически предполагает некоторую гибкость (местами порождая темные паттерны), с другой стороны должно служить целям перформанса (экономия хождения по vtable'у). На самом деле мы получаем :
--> неожиданный полиморфизм - невиртуальные методы в разных контекстах ведут себя по-разному
--> невиртуальные методы могут перегружаться (создавая новые контексты)
--> с одной стороны есть public/private/protected наследования, с другой стороны в субклассах можно использовать свои модификаторы доступа, нарушая таки модель наследования
--> в ряде случаев виртуальные методы не могут быть вызваны из конструктора
--> reflection'a с таким подходом не будет никогда
--> ...
я джаву знаю достаточно посредственно, но насколько я вижу этих проблем там нет (за счет отказа от невиртуальных методов, перегрузки, волной трактовки доступа итд)

самые суровые грабли начинаются при множественном наследовании (от которого в явном виде отказались в жабе)
ну это вообще отдельный разговор - несколько виртуальных таблиц, ромбовидное наследование, виртуальное наследование...
Kuzia domovenok
1887 / 1742 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
04.02.2014, 02:37     Дедушка, а что это за костыль у тебя? #15
alex_x_x, если ты в своём коде перегружаешь только виртуальные методы базового класса, это только твои проблемы! То что одни не используют, другие пользуют постоянно!
alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
04.02.2014, 02:59     Дедушка, а что это за костыль у тебя? #16
Kuzia domovenok, мои проблемы - это набор переусложнений, сделанных для неочевидной оптимизации
есть языки где этого нет и эти сложности не нужны

ооп - это достаточно высокоуровневая вещь
там где нужно считать байты как правило ооп не нужно
а так сказать "паттернов" чисто с++ого ооп'a не так уж много
Kuzia domovenok
1887 / 1742 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
04.02.2014, 04:16     Дедушка, а что это за костыль у тебя? #17
alex_x_x, "где нужно считать байты ооп не нужно", - вот это открытие! Да от такого авторитета!

Позволь спросить, а "считать байты", это какая операция в С++? и в каких "якобы тру ооп языках" её нет? Только конкретно!

И, например, при написании игрового 3d движка, что не нужно, по-твоему: ооп или c++ ?
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
04.02.2014, 04:45     Дедушка, а что это за костыль у тебя? #18
Цитата Сообщение от alex_x_x Посмотреть сообщение
Kuzia domovenok, мои проблемы - это набор переусложнений, сделанных для неочевидной оптимизации
есть языки где этого нет и эти сложности не нужны
ооп - это достаточно высокоуровневая вещь
там где нужно считать байты как правило ооп не нужно
а так сказать "паттернов" чисто с++ого ооп'a не так уж много
В С++ великолепно реализовано ООП. Великолепно для написания под железо. Если Выпишите только какие-нибудь мелкие скрипты, вроде плагинов для браузера, то вам и не нужно думать не об оптимизации, не о железе. А если у вас крупный проект, вроде Среды программирования, 3D движка, вычислительной системы или много ещё чего-то подобного, то вам не обойтись без низкоуровневых оптимизаций. Даже несмотря на то, что большую часть таких оптимизаций компилятор уже сейчас выполняет лучше человека, Вам всё равно нужно контролировать его работу: где-то правильно построить цикл, что бы он мог векторизоваться, а где-то метод, что бы он мог стать inline, а ещё может понадобиться выравнивать данные по кэш-линейкам и т.п. Для всего этого нужен язык с очень тонким контролем структуры данных и конечного кода. С++ не идеал и в нём действительно много артефактов, но это не переусложнения и от них не нужно отказываться. Просто нужно сделать их более логичными и закономерными. Хотя где-то придётся отказаться от исторических традиций, но это необходимо. И подобные попытки уже были, например , язык D
alex_x_x
бжни
2443 / 1648 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
04.02.2014, 05:23     Дедушка, а что это за костыль у тебя? #19
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
alex_x_x, "где нужно считать байты ооп не нужно", - вот это открытие! Да от такого авторитета!
с учетом этого перехождения на личности дальше должна идти умная мысль видимо
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Позволь спросить, а "считать байты", это какая операция в С++?
очевидно настолько критичная к первомансу, что нужно экономить на дереференсе vtable'a
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
и в каких "якобы тру ооп языках" её нет? Только конкретно!
в которых не замарачиваются экономией на виртуальных методах, те почти во всех
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
И, например, при написании игрового 3d движка, что не нужно, по-твоему: ооп или c++ ?
движки на с++ это я смотрю последний оплот цпп, как и последний аргумент
очевидно, что если написать его на си, то не нужно будет ни то, ни другое

Цитата Сообщение от НеСказочник Посмотреть сообщение
Великолепно для написания под железо.
что-то я редко вижу что-то написанное на с++, сильно приближенное к железу. Это уже из области написания драйверов на с#
Цитата Сообщение от НеСказочник Посмотреть сообщение
А если у вас крупный проект, вроде Среды программирования, 3D движка, вычислительной системы или много ещё чего-то подобного, то вам не обойтись без низкоуровневых оптимизаций. Даже несмотря на то, что большую часть таких оптимизаций компилятор уже сейчас выполняет лучше человека, Вам всё равно нужно контролировать его работу: где-то правильно построить цикл, что бы он мог векторизоваться, а где-то метод, что бы он мог стать inline, а ещё может понадобиться выравнивать данные по кэш-линейкам и т.п. Для всего этого нужен язык с очень тонким контролем структуры данных и конечного кода.
и почему это не написать на си? подобные оптимизации всегда точечные и уж явно с ооп не связаны
Цитата Сообщение от НеСказочник Посмотреть сообщение
Для всего этого нужен язык с очень тонким контролем структуры данных и конечного кода. С++ не идеал и в нём действительно много артефактов, но это не переусложнения и от них не нужно отказываться. Просто нужно сделать их более логичными и закономерными.
не получится быть везде хорошим. c++ пытается совмещать низкоуровневость с выкоровневостью - получается что-то между.
Цитата Сообщение от НеСказочник Посмотреть сообщение
Хотя где-то придётся отказаться от исторических традиций, но это необходимо
ну от них-то никто не отказывается
Цитата Сообщение от НеСказочник Посмотреть сообщение
И подобные попытки уже были, например , язык D
ну не выстрелил, но objective c например в перспективе и цпп обойдет

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

цппный way - чтобы был выбор - отстреливать ноги, или чуть потерять перфоманса, но быть осторожней
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2014, 05:41     Дедушка, а что это за костыль у тебя?
Еще ссылки по теме:

C++ Убрать костыль typedef
Подскажите что делать. Знаю что надо перегрузить оператор но никак не могу понять как это сделать Visual C++
C++ Необходимо протестировать костыль. Конвертирование Glib::ustring в sf::String
Memo->Lines[1] - что за тип? костыль? C++ Builder C++ Builder
C++ Как понять нормальный у тебя код или нет?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
04.02.2014, 05:41     Дедушка, а что это за костыль у тебя? #20
Цитата Сообщение от alex_x_x Посмотреть сообщение
что-то я редко вижу что-то написанное на с++, сильно приближенное к железу
Я имел ввиду, что Вы можете написать что-то более менее высокоуровневое, что потом может быть не только удачно откомпилировано под самые разные платформы, но и будет более-менее оптимально работать на них.


Цитата Сообщение от alex_x_x Посмотреть сообщение
отстреливать ноги
С++ однозначно нужна глобальная перестройка, но и превращать его в что-то питоноподобное тоже не стоит. ООП, конечно, можно и на ассемблере организовать, но согласитесь, что высокоуровневый язык, позволяющий контролировать код почти как на ассемблере, всё же нужен. Я компиляторщик и, возможно, рассуждаю слишком строго, но простые и очевидные скрипты - это только одна из движущих сил IT индустрии, а основание, на котором она стоит - тяжеловесные проекты с огромным количеством ресурсоёмких вычислений. Так что "неосторожное кастрирование" C++ может подорвать основу IT. Хотя Вы правы, что переделка ему всё же нужна.
Yandex
Объявления
04.02.2014, 05:41     Дедушка, а что это за костыль у тебя?
Ответ Создать тему
Опции темы

Текущее время: 06:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru