LINUX.ORG.RU

[C++?] Серьезный вопрос.


3

2

Просьба ответит серьезно, желательно с аргументами за или против.

Предистория:
Когда то давным давно (я тогда еще только закончил 9-ый класс) я увидел в газете объявление о наборе в летнюю группу по изучению классического программирования. В тот момент я был с компьютером на ты и "очень" хорошо в них разбирался (переустанавливал Windows каждый месяц, хаял Microsoft просто потому, что после моих настроек W приходилось постоянно переустанавливать). Группа по классическому программированию так и не набралась, но набралось 1 человек на Visual Basik for Applications. Я соглсился быть вторым и начались занятия.
Все, что мне там объясняли я схватывал быстро. Меня пригласили продолжить обучение в сентябре на курсе "моделирование".
Там уже был Pascal, который я тогда совсем не знал. Сам курс был очень разношорстный: мы изучали и использование мыши через прерывание, готовились к различным олимпиадам. Параллельно я изучил Pascal.
Потом был Delphi. К концу 10-го класса я уже неплохо владел приемами программирования и вовсю клепал бесполезные программулины. Потом поступил в универ на программиста. Там тоже был Delphi, и я особо не напрягаясь писал все лабы (к моменту поступления я уже был знаком с логикой указателей, самописные стеки и графы, etc).
На 2-ом курсе в гостях у знакомого я разобщался с человеком, который уже насколько лет работал в нерезиновой программистом. Он мне и открыл глаза на мир: "Delphi здох. Его уже похоронили и забыли. Сейчас необходимо знание C++, C#. Необходимо занание паттернов проектирование". Вобщем много чего он мне наговорил. Книжек умных насоветовал, подкинул MSVS 2008, кучу электронных книжек. Я изучил C# по книжке Шилдта. Читал "Идеальный кол" (автора уже не помню). Потом купил(!) себе книжку Шилдта про С++. Мне понравился язык. Тем более что мне казалось, что именно он и есть общепринятый стандарт. Наиболее удобный язык для программиста.

А недавно в соседней теме за упоминание это С++ меня чуть было не съели со всем чем можно. Так-то.

Собственно вопрос: Так стоит ли изучать дальше С++ (а я уже достаточно углубился в книжку Страуструпа, подробно изучая все подводные течения)? Какой язык стоит изучать? Какие из них более востребованны?

Спасибо всем, кто осилил это многобукаф.

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

>имхо тут не место матчингу

ну напиши без матчинга, проблем-то. никто не навязывает

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

> исключительно потому, что ты тщательно этого добивался своими просьбами :) ты удивительно последователен в желании убедить себя в том, что C++ - это хорошо

ерунда.

изначальная строчка "main = print . fact . read . head =<< getArgs" -- такое же гавно, как и программа, падающая в сегфолт при отсутствии первого аргумента.

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

>чем Qt *замещает* исключения

своей моделью событий - сигналами/слотами

>*замещает* шаблоны в QObject-ах?

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

>Они придумали свой механизм, которого нет в плюсах для этого?

да. они добавили в С++ события и дополнительный препроцессор, несовместимый с остальным C++ (для буквоедов - не полностью совместимый)

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

>ерунда.

>такое же гавно

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

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

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

ну там мы выяснили, что шаблоны в QObject-ах не *замещаются* ничем

насчет исключений ты стоишь на том, что они *замещаются* сигналами-слотами, что для меня звучит довольно странно, так что желательно ссылку

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

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

> про небезопасные (неполные) функции (включая head) написано в том же RWH. с аргументацией, почему они присутствуют в Prelude. опять же, никто не мешает писать с использованием исключительно полных функций

опять придется повторить урок для деского сада

функции имеют права кидать исключение (с++), быть неполными (хаскель)

но прикладная программа не имеет права при неподаче первого аргумента ком. строки сообщать ошибку в виде "не могу вычислить голову, так как список пуст" (как там оно у хаскеля?).

если же она так делает -- она говно.

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

функции имеют права кидать исключение (с++), быть неполными (хаскель)

в C++ функции тоже имеют право быть неполными. следствием, как правило, бывает неопределённое поведение

но прикладная программа не имеет права при неподаче первого аргумента ком. строки сообщать ошибку в виде «не могу вычислить голову, так как список пуст» (как там оно у хаскеля?).

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

чтобы не быть голословным - вот, например:

-- библиотечная фунция
singletonHead :: String -> String -> [a] -> a
singletonHead _  _  [n] = n
singletonHead eS _  []  = error eS
singletonHead _  eS _   = error eS

-- специализация из модуля
sHead = singletonHead "No arguments provided" "Wrong number of arguments"

main = print . facs . read . sHead =<< getArgs

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

also, ты не хочешь объяснить, например, использование довеска в виде boost (объёмом, кажется, ~30Mb) к твоей программе на С++? :)

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

Кстати!

В TAPL приводится один вариант разделения языков на опасные и безопасные: безопасные языки это те, результат выполнения программы на которых можно предсказать по стандарту (ну и дальше типичный наезд на С, что с использованием указателей можно написать такую программу, результат которой будет зависеть от выравнивания байтов и компилятора).

А в стандарте хаскеля говорится *точно*, что должна печатать на консоль head [] ? Если не говорится, то тогда разные реализации хаскеля могут печатать разное, и хаскель надо признать опасным языком, как и С.

www_linux_org_ru ★★★★★
()

Тут проскакивали бредовые высказывания о выразительности крестов. Объясните мне, пожалуйста, чем

// valid
std::string s = "multiline\n"
                "with newlines\n"
                "govnostring";
// invalid
std::string s = "multi
line
govnostring";
выразительнее
(setf s "multiline
with newlines
pretty string")
и почему multilines string выкинули из расширениий gcc?

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

>exit(); В плюсопрограмме? Нет пути.

В нормальном проекте безусловно throw, а в main-е (или где-то там) ловить. Но здесь речь шла об одно-двух-строчниках.

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

> Но здесь речь шла об одно-двух-строчниках.

В одно-двух-строчниках все сосут, кроме перла -- вот уж где выразительность так выразительность. 8))

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

>В одно-двух-строчниках все сосут, кроме перла -- вот уж где выразительность так выразительность. 8))

давай сравним расчёт выпуклой оболочки на Perl и на J? ;) я думаю, ты изменишь своё мнение

ну и заодно:

http://www.rebol.com/oneliners.html

на аналоги этому я бы посмотрел с удовольствием :)

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

> >Не-не-не, без примеров не катит. Чем Qt расширяет обработку ошибок и обобщенное программирование?

> в том-то и дело, что не расширяет, а замещает. Qt не поощряет использование исключений (исключительные ситуации должны обрабатываться сигналами/слотами), Qt не поощряет использование шаблонов в QObject-ах (MOC с ними не очень дружит).

Это не расширение, и не замещение. Исключения запрещены очень во многих C++ных библиотеках (точно в ACE, вроде бы в FOX, wxWidgets, FLTK, MFC). Во многом из-за требований совместимости с левыми компиляторами с кривой поддержкой исключений.

То, что Qt не поощряет шаблонов, так это не есть хорошо вообще. В ACE, например, шаблоны используются и весьма по делу (туда бы еще исключения вместо кодов возврата и errno...).

Так что слова о расширении списываем на неточную формулировку, лады?

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

Там смайлик не просто так. Я про перловый ascii-art, поглядев на который иногда хочется ТАК выразиться... Не смотря на то, что сам это рисовал полгода назад. 8))

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

>> в том-то и дело, что не расширяет, а замещает.

>абсурд вообще-то говорил "обходит", что явно мимо кассы

Перестань вилять. Динамический O(1) полиморфизм через виртуальные функции не годится для гуйни, так как там постоянно будут добавляться новые типы нотификаций прямо в корень AbstractWindow. Годится только O(log N) полиморфизм через посылку сообщений, который в терминах С++ реализовать нельзя без того чтобы не зарыться в макросах. Олсо, публика обычно пишущая гуйню пошлет эти макросы нахѣр и правильно сделает. Поэтому Trolltech написал препроцессор, который конечно подглючивает из-за нерегулярной грамматики С++. Такие дела.

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

>Динамический O(1) полиморфизм через виртуальные функции не годится для гуйни, так как там постоянно будут добавляться новые типы нотификаций прямо в корень AbstractWindow.

Э, что? "Постоянно" - это в рантайме или при разработке? Если второе, то проблемы нет, если первое, то "новые типы нотификаций" просто не могут возникнуть без участия разработчика.

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

>MFC

В винде проблемы с исключениями нет. Там даже при разыменовании нуллпоинтера кидается SEH-исключение. А исключения C++ это SEH с плюсовым аттачем. Но там есть занятная хренотень поскольку MFC кидает исключения по указателю а не по ссылке в результате чего его надо удалять из кучи по факту ловли.

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

>>Динамический O(1) полиморфизм через виртуальные функции не годится для гуйни, так как там постоянно будут добавляться новые типы нотификаций прямо в корень AbstractWindow.

>Э, что? "Постоянно" - это в рантайме или при разработке? Если второе, то проблемы нет, если первое, то "новые типы нотификаций" просто не могут возникнуть без участия разработчика.

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

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

>Ни одной гуевой библиотеки с применением плюсовых виртуальных функций не существует в природе

Qt не существует? o_O

legolegs ★★★★★
()

>Qt не существует? o_O

Ответьте ему кто-нибудь зачем нужен сигнал/слот.

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

> Перестань вилять.

речь шла об интерпретации твоей точки зрения jtootf, так что в моем вилянии виноват ты (тем, что сразу не написал свою позицию) :-)

> Динамический O(1) полиморфизм через виртуальные функции не годится для гуйни, так как там постоянно будут добавляться новые типы нотификаций прямо в корень AbstractWindow. Годится только O(log N) полиморфизм через посылку сообщений, который в терминах С++ реализовать нельзя без того чтобы не зарыться в макросах.

Сомневаюсь. Есть бустовские ЕМНИП типобезопасные сигналы-слоты.

И даже навскидку мне кажется будет O(1). Откуда ты взял O(log N)? Ссылку?

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

>Так что слова о расширении списываем на неточную формулировку, лады?

ок :)

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

>head :: [a] -> a
>head (x:_) = x

>head [] = error "Prelude.head: empty list"


стандарт языка хаскель специфицирует строку "Prelude.head: empty list" или другая реализация хаскеля может писать "Prelude.head: can not head empty list" например?

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

>видел я на J -- это cryptic, а не выразительно

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

http://dr-klm.livejournal.com/42312.html

учти, что по ссылке журнал не программиста, а физика,- успешно использующего J для расчётов (там по тегу j посмотреть много чего можно)

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

>стандарт языка хаскель специфицирует строку "Prelude.head: empty list" или другая реализация хаскеля может писать "Prelude.head: can not head empty list" например?

*сверился со стандартом* специфицирует

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

> *сверился со стандартом* специфицирует

/me в шоке

ссылку на п. стандарта

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

>>Динамический O(1) полиморфизм через виртуальные функции не годится для гуйни, так как там постоянно будут добавляться новые типы нотификаций прямо в корень AbstractWindow.

>Э, что? "Постоянно" - это в рантайме или при разработке?

Как говорит мой один знакомый индус: "Код внезапно мутировал..."

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

а еще лучше скопипастить сюда тот самый абзац

http://www.haskell.org/onlinereport/standard-prelude.html#$vhead

head             :: [a] -> a
head (x:_)       =  x
head []          =  error "Prelude.head: empty list"

«абзаца» там нет, Report у Haskell куда менее расплывчатый, чем стандарт у C++

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

>И даже навскидку мне кажется будет O(1). Откуда ты взял O(log N)? Ссылку?

У каждого оконного сообщения есть свой уникальный id и чтобы отыскать его хандлер надо сделать лукап. Если мне не наврали про moc, то там в качестве id выступают стринги и поиск идет по сбалансированному дереву, итого получаем log(N). В винде мы имеем switch по integer-у в каждом оконном классе снизу вверх, итого тоже ~log(N) если учесть что MSVC++ балансирует switch-и.

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

> "абзаца" там нет, Report у Haskell куда менее расплывчатый, чем стандарт у C++

ну-ну

особенно в свете того, что

Declarations for special types such as Integer, or () are included in the Prelude for completeness even though the declaration may be incomplete or syntactically invalid. An ellipsis "..." is often used in places where the remainder of a definition cannot be given in Haskell.

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

читая стандарт C#, я подумывал над тем, что определения например приведения типов в виде кода были бы короче и яснее -- но именно __точные__ определения, без всякого incomplete, syntactically invalid, "..."

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

> У каждого оконного сообщения есть свой уникальный id и чтобы отыскать его хандлер надо сделать лукап. Если мне не наврали про moc, то там в качестве id выступают стринги и поиск идет по сбалансированному дереву, итого получаем log(N). В винде мы имеем switch по integer-у в каждом оконном классе снизу вверх, итого тоже ~log(N) если учесть что MSVC++ балансирует switch-и.

ммм... т.е. дерево неизвесно на этапе компиляции? (если известно, то там О(1), например можно вкатать совершенный хэш)

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

>>Э, что? "Постоянно" - это в рантайме или при разработке?

>Как говорит мой один знакомый индус: "Код внезапно мутировал..."

Да, в BeOS видимо индусы заставляли в каждом классе делать 30-40 процентов пустых виртуальных функций прозапас.

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

>я-то воспринимал хаскель как серьезный язык

не смеши. ты? воспринимал? хаскель? :)

>is often used in places where the remainder of a definition cannot be given in Haskell

а в стандарте C++ много даётся на самом C++?

also, это ведь не стандарт, это report. и касательно специальных типов (абзац, который ты привёл) я надеюсь на включение numeric prelude в качестве основного определения алгебраических конструкций

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

> also, это ведь не стандарт, это report. и касательно специальных типов (абзац, который ты привёл) я надеюсь на включение numeric prelude в качестве основного определения алгебраических конструкций

а я спрашивал (повторяю) про стандарт, и специфицирует ли он там текст "Prelude.head: empty list"

> не смеши. ты? воспринимал? хаскель? :)

не понял, что тут смешного.

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

>> У каждого оконного сообщения есть свой уникальный id и чтобы отыскать его хандлер надо сделать лукап. Если мне не наврали про moc, то там в качестве id выступают стринги и поиск идет по сбалансированному дереву, итого получаем log(N). В винде мы имеем switch по integer-у в каждом оконном классе снизу вверх, итого тоже ~log(N) если учесть что MSVC++ балансирует switch-и.

>ммм... т.е. дерево неизвесно на этапе компиляции?

Смотря что понимать под "этапом компиляции". В момент компиляции оконного класса A ничего нельзя сделать с его предком Б, так как он находится в другом .cxx файле.

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

>а я спрашивал (повторяю) про стандарт

ничем более помочь не могу. стандарта ISO на Haskell нет

>не понял, что тут смешного

ты на протяжении ~1000 комментариев занимаешь позицию "не читал, но осуждаю"

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

для тех задач, на которые он расчитан,- крайне выразительно.
http://dr-klm.livejournal.com/42312.html

в итоге у них вышли такие варианты программы:

вариант первый
s =: ({. , }. /: 12"_ o. }. - {.) @ /:~
l =: 11"_ o. [: (* +)/ }. - {.
rr =: (1"_ , (0"_ > 3: l\ ]) , 1"_) # ]
hull =: [: rr^:_ s

вариант второй
p=:{~(i.>./)@:(11&o.)
c=:1 :'2&(u/\)'
a=:12&o.
hull3=:[:(#~1:,~1:,<:c@:a@:(-~c))^:_]/:[:a(-p)

вариант третий, признанный наилучшим:
s =: ] /: 12 o. (- ] {~ (i.>./)@:(11&o.))
g =: 0: > 11 o. (-_1&|.) * +@:(-~1&|.)
hull4 =: [: (#~ 1 (0 _1)} g)^:_ s

// это я так, чтобы Ъ полюбовались.

если принять, что выразительность кода - это количество символов в программе, то это очень выразительный язык. но фак мой мозг! как это читать??!

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

а еще один большой минус - отсутствие открытой реализации.

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

> для тех задач, на которые он расчитан

а еще, подразумевается, что это язык общего назначения, он не рассчитан на конкретные задачи.

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

>по трезвом размышлении и прочтении документации, в этом, конечно, разобраться можно. но, я уверен (да, это не обьективная величина), у опытного программиста уйдет гораздо меньше времени, чтобы понять аналогичную программу на любом Хаскелле, Окамле или Лиспе, даже не зная языка, чем на J, зная язык

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

>а еще один большой минус - отсутствие открытой реализации.

ну я не агитирую его использовать :)

>фак мой мозг! как это читать??!

есть замечательная книга "J for C programmers" - там очень доходчиво это объясняется

jtootf ★★★★★
()
Ответ на: комментарий от val-amart

>а еще, подразумевается, что это язык общего назначения

fail. это array processing language, у него есть вполне конкретная сфера применения

jtootf ★★★★★
()
Ответ на: комментарий от val-amart

> s =: ({. , }. /: 12"_ o. }. - {.) @ /:~
> l =: 11"_ o. [: (* +)/ }. - {.

> rr =: (1"_ , (0"_ > 3: l\ ]) , 1"_) # ]

> hull =: [: rr^:_ s


Занятно. Перл-гольфисты нервно курят в сторонке :) А вот REBOL мне очень понравился, опять чую работа станет из-за этих ваших флеймов :(

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

> fail. это array processing language, у него есть вполне конкретная сфера применения

fail. смотрим оффсайт:

[quote]
J is a modern, high-level, general-purpose, high-performance programming language.
J systems have:
* standard libraries, utilities, and packages
* a form designer for your application forms
* an event-driven graphical user interface to your application
* integrated 2d and 3d graphics
[/quote]

> для программиста на J разобраться в программе на J будет проще, чем для сишника разобраться с сишным кодом.


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

> у J очень логичная структура программ


этого не отрицаю

>> фак мой мозг! как это читать??!

> есть замечательная книга "J for C programmers" - там очень доходчиво это объясняется


это сарказм ;)

// я не имею ничего лично против J, просто указываю на его очвидные недостатки

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

>смотрим оффсайт

ну мало ли чего на оффсайте напишут :) J прямой потомок APL, а это как бы накладывает отпечаток

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