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# по книжке Шилдта. Читал "Идеальный кол" (автора уже не помню). Потом купил(!) себе книжку Шилдта про С++. Мне понравился язык. Тем более что мне казалось, что именно он и есть общепринятый стандарт. Наиболее удобный язык для программиста.

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

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

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

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

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

fixed ;)

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

Он, наверное, просто не видит аналогии между finally и деструктором локального объекта или как всегда троллит :)

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

> Он, наверное, просто не видит аналогии между finally и деструктором локального объекта

Эта аналогия есть только в части destruction. В части construction нет ничего общего. А RAII без части construction -- это и не RAII вовсе.

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

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

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

>Он, наверное, просто не видит аналогии между finally и деструктором локального объекта или как всегда троллит :)

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

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

Хотя объект можно захватить в одной функции, а отдать - в том же деструкторе... Тогда IDisposable и using :)

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

>Не силен в терминологии, но мне кажется, что RAII

Тебе неправильно кажется. RAII = Resource Acquisition Is Initialization (выделение ресурса -- это инициализация). Суть подхода заключается в том, что процедура выделения любого ресурса связывается с инициализацией какой-либо сущности в программе, а освобождение ресурса -- с уничтожением сущности.

try..catch..finally -- это компенсация отсутствия гарантированного уничтожения объекта: нужен код, который будет выполнен в любом случае вне зависимости от возникновения исключений.

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

Точнее нет, все-таки RAII -- это IDisposable. using -- это попытка управления временем жизни объекта.

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

>>Что это? Это стоит читать или чисто на поржать с названия?

>Не знаю, ссылка попалась, книжка 2008г

Еже один список догматов для плюсовых фанбоев. Делайте то... Не делайте это... и прочий cargo-cult для саммонинга банок с тушенкой. С этой книжкой обычно покупается Элджер, Саттер, Мейерс и Co.

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

>С таким же успехом можно забыть написать деструктор.

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

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

> С таким же успехом можно забыть написать деструктор.

Деструктор надо не забыть написать один раз, блок finally -- по количеству использований.

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

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

> using впервые в какой версии C# появился?

наверное, в самой первой. а что?

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

> Груду легаси-кода сам переписывай на любом языке.

Думаю, я доживу до момента, когда на форумах будут говорить -- груду легаси-кода на вашем у*бищном Haskell-е переписывайте на любом языке сами :)

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

>Думаю, я доживу до момента, когда на форумах будут говорить -- груду легаси-кода на вашем у*бищном Haskell-е переписывайте на любом языке сами :)

Я думаю, что это будет прекрасно.

Видишь ли, если появится язык, который будет по всем параметрам лучше хаскеля, то я ж только буду рад в отличии от вас ++фагов, для которых кресты - объект поклонения.

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

> Думаю, я доживу до момента, когда на форумах будут говорить -- груду легаси-кода на вашем у*бищном Haskell-е переписывайте на любом языке сами :)

Я буду просто счастлив. 8))

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

> Я буду просто счастлив. 8))

Стоит опасаться появления в мейнстриме языков и сред для графического программирования... ;)

- Идите вы нахер со своей мышиной вознёй, в пень ваши картинки! Нормальная программа пишется ASCII-символами с клавиатуры.
- Ути-пути, зашоренный старпёр-хаскеллист разбушевался...

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

> Видишь ли, если появится язык, который будет по всем параметрам лучше хаскеля,

Как дети малые. Что значит "если"? Он обязательно появится.

> то я ж только буду рад

А вот это будет сильно зависеть от того, насколько твое финансовое благополучие определяется легаси-кодом. Может статься так, что либо нужно будет продолжать писать на Haskell-е и объяснять восторженной молодежи, что ты вовсе не Haskell-фаг, что язык не самый плохой, что туча кода в индустрии на нем написана... Либо начать набивать себе шишки с новым языком на новом месте.

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

> Может статься так, что либо нужно будет продолжать писать на Haskell-е и объяснять восторженной молодежи, что ты вовсе не Haskell-фаг, что язык не самый плохой, что туча кода в индустрии на нем написана... Либо начать набивать себе шишки с новым языком на новом месте.

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

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

> А в каких еще языках это сделано

Из мейнстрима есть using в C# (не помню, с 1.0 или с 2.0?), и with в Python 2.6.

> Утекание памяти и сегфолты -- это миф

Ну конечно же, конечно. И гонки -- тоже миф.

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

> >Можно легко забыть вписать вызов Close в блок finally.

> С таким же успехом можно забыть написать деструктор.

Нет, первое надо лелать o(n) раз, а второе --- o(1).

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

>> Видишь ли, если появится язык, который будет по всем параметрам лучше хаскеля,

>Как дети малые. Что значит "если"? Он обязательно появится.

Взрослые люди знают, что 5>=5, 3<=3, а "если 2>5, то Юпитер - спутник Земли" - верные утверждения.

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

> Взрослые люди знают, что 5>=5, 3<=3, а "если 2>5, то Юпитер - спутник Земли" - верные утверждения.

Если ты пытаешься показать, что плюсофилы в данной теме сплошь неадекваты, то советую пристальнее посмотреть и на плюсофобов. Некоторые мечтают запретить C++ законодательным путем, как системную проблему индустрии.

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

> Если развивающие хаскель академики не догадались сбацать libhascell.so - ССЗБ.

Развивающие Хаскелл академики не дрочат на размер хелловордов.

А если серьёзно, то shared libraries для Хаскелла под Линукс недавно сделали. Сейчас делают под винду. Спонсирует работы в этом направлении Industrial Haskell Group.

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

> Ты может не читал тред, но там выше хацкилевское поделие падало с невнятным бормотанием о том, что не нашло подходящего шаблона, если не передать два параметра командной строки.

А что, плюсовая программа будет внятно бормотать, если ты попытаешься из char *argv[] прочесть параметр, которого нет?

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

Угу, оно очень внятно проборчет "Segmentation fault (core dumped)"

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

Я об этом:

>> Видишь ли, если появится язык, который будет по всем параметрам лучше хаскеля,

>Как дети малые. Что значит "если"? Он обязательно появится.

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

Я не понял, ты что, не веришь в то, что со временем будет придуман язык, более мощный и удобный, чем Haskell?

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

>Видишь ли, если появится язык, который будет по всем параметрам лучше хаскеля,

Вообще-то vsl что-то такое обещал выдать. Что позволит выпилить кодеров из процесса программирования и пополнить ими очереди за бесплатным супом. Что-то у него никак не выходит каменный цветок

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

>Я не понял, ты что, не веришь в то, что со временем будет придуман язык, более мощный и удобный, чем Haskell?

То есть логика - не твой конёк?

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

>>Я не понял, ты что, не веришь в то, что со временем будет придуман язык, более мощный и удобный, чем Haskell?

>То есть логика - не твой конёк?

Потрудись ответить на прямой вопрос.

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

>Я не понял, ты что, не веришь в то, что со временем будет придуман язык, более мощный и удобный, чем Haskell?

Воопщемто он уже придуман, называется Fortress. "По духу он близок к Haskell, Scala и т. п. Что отличает его от этих языков:

* Синтаксис, который нравится математикам (даже Haskell оставлен позади)
* Встроенная в язык модель распараллеливания

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

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

Погоди, так ты предыдущее сообщение серьёзно написал, а не тонко пошутил?

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

>Я не понял, ты что, не веришь в то, что со временем будет придуман язык, более мощный и удобный, чем Haskell?

Верю.

Просто, когда я пишу "если А, то Б" то это не значит, что А не правда, равно как и наоборот.

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

>Нет, первое надо лелать o(n) раз, а второе --- o(1).

Ну какбе есть два варианта

void someFunction() { struct Guard { handle_t _h; Guard (h) :_h(h) {} ~Guard() { Release(_h); } } g(Acquire()); ... Пишем тут ... }

И

void someFunction() { handle_t h = null; try { h = Acquire(); ... Пишем тут .... } finally { if (h != null) Release(h); } }

Второй вариант конечно нагляднее.

Есть еще конечно фанбойский вариант написать отдельную обертку в util/* и получить антипаттерн "Orphanage", поскольку их никто никогда не структурирует. А не структурируют, потому что программисты работают параллельно и необходимость синхронизироваться с коллегами и искать уже существующую обертку это досадная подножка сбивающая с ритма. По быстрому навалял - и в утиль/*. А потом на этапе интеграции мы получим обертки оберток, метаобертки, впердоливатели в метаобертки и прочую плюсовую благодать.

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

>> Утекание памяти и сегфолты -- это миф

>Ну конечно же, конечно. И гонки -- тоже миф.

Утекания памяти и других ресурсов и сегфолты в плюсах ликвидируются тупой внимательностью и выполнением простых правил.

Для борьбы с гонками уже думать надо, иногда сильно.

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

> Плюсофобы в своём репертуаре. Как будто школота в треде.

Вопрос резонный --- если будет (внезапно и по необходимости) использован API без RIAA, сколько будет обёрток к нему в конце проекта?

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

>А что, плюсовая программа будет внятно бормотать, если ты попытаешься из char *argv[] прочесть параметр, которого нет?

Почему-то плюсовые программы этим не страдали, а в быдлохацкиле постеснялись вставить проверки и ясные диагностические сообщения. Наверно язычок не позволяет этого сделать достаточно элегантно...

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

>Вопрос резонный --- если будет (внезапно и по необходимости) использован API без RIAA, сколько будет обёрток к нему в конце проекта?

0 или 1

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