С++ как база для изучения других языков? При том, что С++ учит всяким специфическим хакам, нафиг не нужным в других языках? Не говоря уже о тяжелом наследстве С, ручном управлении памятью, указателях, ссылках, кривом ООП'е, кривой системе типов, шаблонах и прочем, что в других языках только мешать будет. Гораздо проще выучить другой язык, чем переучиваться с С++.
Я как раз осилил плюсы слишком хорошо. Много лет работал в крупных проектах на С/С++, был ментором по ним, тестировал кандидатов. Ушел на python больше 5 лет назад и ни разу не жалею. Пруф с oDesk'а:
Ну учитывая что Haskell программист по уровню гораздо круче среднего, и сам язык очень мощный то небольшой проект проще в одиночку потянуть, а крупных проектов можно по пальцам пересчитать.
Зачем вообще писать на высокоуровневых языках? Хаскель позволяет работать на высоком уровне абстракции, используя мощные инструменты, которых нет в других языках. Делает множество высокоуровневых оптимизаций, выявляет многие семантические ошибки, позволяет писать в декларативном комбинаторном стиле, близко к самой задаче. Еще позволяет контролировать побочные эффекты и дает гарантии функциональной чистоты, что позволяет рассуждать о коде. Имеет мощную систему типизации с выводом типов, при этом она не навязчивая. Позволяет легко работать с параметрическим и специальным полиморфизмом. Имеет множество удобного синтаксического сахара типа list comprehensions и pattern matching. Ленивые вычисления тоже крутая штука. Это все лишь маленькая часть возможностей. Есть области, где Хаскель действительно превосходит другие языки, это например лингвистика, парсеры, реализации всяческих DSL. Вообще Хаскель имеет смысл применять для сложных задач, для простых достаточно и python'а.
Как раз нет, ты просто не умеешь его читать. Это не хаки, а нормальные и логичные возможности языка. Такое впечатление создается от увлечения синтаксическим сахаром. Плюс там нет порядка вычисления и строчки надо читать с конца.
Сразу скажу, что хаскель знаю лишь на уровне "когда-то игрался". Ну, в нативный код по-разному можно скомпилироваться. В Хаскеле, насколько помню, все вычисления ленивы (если их не форсировать ну и за пределами монад). Простейшая реализация этого - для каждой переменной сгенерить функцию, которая вызовется в момент, когда переменная понадобится. И кажется, что так и сделано, учитывая, что код в духе fori: a[i+1] = a[i] + i , написанный в простейшей форме, падает со стек оверфлоу.
Ну да ладно, к чему нужны мои догадки, когда можно обратиться к фактам. Например, я написал такой код:
randomlist :: Int -> StdGen -> [Int] randomlist n = take n . unfoldr (Just . random)
main = do __seed <- newStdGen __randomlist 1000000 seed ____|> sort ____|> sum ____|> show ____|> putStrLn ==============
Конкретно сортировка в нем работает 2 секунды (чуть меньше 4 - код без этой строки). На плюсах, чтобы достичь такого времени, мне нужно взять в 20 раз больше элементов.
Я понимаю, что некорректно сравнивать списки и массивы, но тем не менее. Я помню также, что пробовал играться с массивами, и они также не впечатлили скоростью. Также я попробовал топовый пример отсюда: http://stackoverflow.com/questions/9964875/sorting-integers-... Он отработал за 8 секунд суммарно на массиве размера 10^6. Впрочем, если Вы сможете сказать, как получилось вот это http://stackoverflow.com/questions/9964875/sorting-integers-...#comment12729268_9965246 на массиве размера 2^22, мб мне всё станет ясно.
Ленивость вы не совсем правильно понимаете, как и оптимизации которые происходят при этом.
Насчет сортировки - ясное дело что недеструктивная сортировка списка будет медленнее, чем сортировка массива in-place, причем сортировка на С, не контролирует выход за пределы массива при каждом обращении, как это делают большинство других языков. Но такую сортировку (in-place без контроля границ), можно написать и на хаскелле, но она не будет чисто функциональной (будет в монаде). И у нее будет скорость сравнимая с С. Вот она как раз там и написана, в том комменте. Там как раз массив и unsafeRead. Но чисто функциональная сортировка может быть лучше, если сортировать списки сложных элементов, не все из которых понадобятся в дальнейшем, так как она в этом случае отбросит ненужные ветки, реализуя автоматом метод ветвей и границ. Например можно функцию нахождения минимума определить как minimum = head . sort и она выполнит минимально необходимое количество операций (в сущности поиск по дереву). В этом и плюс ленивости.
"Ленивость вы не совсем правильно понимаете, как и оптимизации которые происходят при этом." Я в другом комменте исправился. Все равно неверно?
"Вот она как раз там и написана, в том комменте. " Как я писал, у меня она отработала за 8 секунд на 10^6. Что в десятки раз медленней сей. Чувак пишет, что она работает за 7.5 секунд на 2^22, и это противоречие меня напрягает.
К тому же я подозреваю, что если мы захотим попользовать написанную там сортировку в чистом коде, нам не дадут это сделать. Так?
В большинстве случаев там вообще не будет никаких объектов в heap'е, эти ветки выкинутся еще на стадии компиляции, плюс там еще много всего типа идеальный потребитель, идеальный производитель, и уничтожение промежуточных структур данных. И кроме этого полно оптимизаций.
У меня например 40.74s для 2^22 (64bit), но у меня довольно медленный ноут и макось. Надо на одинаковом железе смотреть, и профайлером померить. Я думаю генерация рандомов довольно тормозная.
Попользовать сортировку эту в чистом коде можно, так как она в монаде ST, через runST, что там и сделано.
пишете сортировки вручную? тогда мы идем к ВАМ! нативный сорт по предоставляемому ключу есть пожалуй в любом современном ЯП а уж он там внутри в зависимости от размера сортируемого массива сам решит какую реализацию сортировки использовать
Это можно сказать worst way, так как C++ учит плохим практикам и вещам не нужным в других языках, от которых потом приходится отучаться. И сам язык для обучения не особо подходит. А то полезное, что ты мог вынести изучая С++, ты можешь изучить напрямую изучая python.
Хм, я вот начинающий программист (мне 14 лет) Начал я еще лет в 8 с html, потом начал php (знаюзнаю, но у меня не было никакого наставника чтобы показал мне что то хорошее), сейчас я прочитал одну толстенную книгу по консольному c++ и немного попрактиковался. Пока что цель - писать что то оконное, ибо на плюсах я умею писать только консоль. Для винды, на остальные ос пофигу. Вот в данный момент начал читать литературу по directx 11, так как я понял это лучший способ работы с графикой под виндой. А вообще, какие советы дадите?
Тебе денег зарабатывать или игры писать? Если игры писать то возьми лучше готовый движок и пиши скрипты (скорее всего там будет lua). А если зарабатывать то геймдев не особо прибыльная сфера. Если просто оконные приложения, то тут куча вариантов начиная с WinAPI и MFC, и заканчивая Windows Forms под .NET, или чего-то кросcплатформенного типа Qt. Самый простой способ забахать оконное приложение это RAD типа Delphi или C++ Builder.
И хотелось бы вообще побольше узнать о работе в программировании. Ибо насколько я знаю, это сейчас очень востребовано, но что и где (например про геймдев я не знал), в какие области идти, что учить и т.д. для работы в n лет (после универа ясеньпень) я не знаю =(
В универе больше всего, если хороший, учат понимать как все работает, к примеру, я на первом курсе сейчас у нас была основа математики, программирование, а так же Логика(гейты, их работа, булеан и тд и тп)+Ассемблер. Так что ты прав, но не полностью.
Зайди на любой фрилансерский сайт и посмотри каких больше заказов. Это даст тебе представление на что есть спрос. Сейчас это наверно веб и мобильные платформы.
В компании надо поработать я считаю, хотя бы 2-3 года. Потом тебе будет видно оставаться в компании или уходить во фриланс. Я про фриланс сказал как индикатор спроса. А после универа без опыта скорее всего возьмут только в аутсорсинговый body shop, другие компании не рискуют брать людей без опыта.
на фрилансе индикатор спроса непрофильных компаний и кучи нищебродов неспособных содержать свой IT отдел в полной комплектации. нахрена на них смотреть? вот цены за голову на hh каком-нибудь - вполне себе индикатор.
Вот я например работал на Metaweb через фриланс, его потом купил Google. И они совсем не нищеброды и штат свой большой, но для некоторых задач нанимали еще и фрилансеров.
"On March 14, 2006, Metaweb received $15 million in funding. Investors included: Benchmark Capital, Millennium Technology Ventures, and Omidyar Network. Kevin Harvey of Benchmark Capital is a member of Metaweb's board of directors. On January 15, 2008, Metaweb announced a $42.5 million Series B round led by Goldman Sachs and Benchmark Capital."
И это не единственный пример. Прошлый проект например несколько лет длился и тоже там было все нормально с финансированием (крупные корпоративные клиенты уровня General Electric) и это чисто IT проект. Если вы думаете, что фрилансеров нанимают от бедности, то это не так.
Океей, спасибо вам большое. А из языков что посоветуете? Что сейчас из них востребовано? Насколько я знаю, js сейчас очень популярен, хотя я так и не понял почему >.<
Ну линукс у меня только на ноуте (убунта, ничего сложного), мака вообще нет... Так что под винду, собсна, мне и сойдет писать. Геймдевом не хочу заниматься серьезно, хочу просто посмотреть пока что насколько это сложно (directx), что он может и т.д. И насчет универсальности, в чем она заключается?
Для 2d игр тоже есть готовые движки, попробуй сначала на готовом, а потом, когда поймешь, чего тебе не хватает можешь попробовать это добавить туда. Всяко лучше, чем городить велосипед.
Довольно хороший старт. Я бы даже сказал очень хороший, завидую тебе. Попробуй Qt - это IDE для С++, в которой можно писать оконные приложения. Придется почитать некоторые вещи, но я думаю ты справишься. Да и полезная это вещь. С DirectX мне кажется ты немного не туда ушел. Если хочешь делать игры - https://en.wikipedia.org/wiki/List_of_game_engines вот список игровых движков. Нарочно кинул английскую вики, потому что там все лучше расписано. Посмотрите в сторону Cocos2D - говорят довольно хороший движок.
Спасибо тебе добрый человек =) Буду изучать qt вместо directx, и движки тоже посмотрю =) Вот еще один вопрос, тут холивары всякие, какой язык лучше и т.д. Какой сейчас язык вообще имеет смысл учить для получения денег, так сказать?
Я бы наверное Python изучал, либо продолжал С++. Python довольно легкий в изучении, востребованный на рынке и функциональный. Еще чисто под Windows хорош C#. И даже не знаю, что вам лучше посоветовать.
Хм, а что на питоне пишется? Просто c++ я знаю только базу, писал только консольные приложения, начинал java, но забил потом... С++ же еще под андроид вроде как. Так что я сам даже не знаю, пхах =)
https://ru.wikipedia.org/wiki/Проект:Информационные_технолог... Вот вам некоторый список. А вообще что хотите, то и пишите, думаю проблем у вас вряд ли возникнет с недостатком каких-то технологий. Про мультиплатформенность это отдельная тема, в которой язык играет не всегда главную роль. Например C# - это в основном язык под Windows, однако Xamarin и Unity3D дают ему хорошую мультиплатформенность. Но в целом у Python с этим все замечательно.
http://dou.ua/lenta/articles/1st-job-2014/?from=doufp вот можешь посмотреть тут востребованность языков
учу джаву и питон, чем очень доволен. освоить достаточно легко и быстро, главное - практики по-больше)
0
DELETED
Как же с таким богатым опытом ты не слышал об умных указателях? Что за "специфические хаки", без которых плюсы - не плюсы? А кривой ООП это потому что С++ не чистый ООП язык? Ну как то не очень тянет на аргумент.
Если бы умные указатели все проблемы с памятью решали, то и разговора бы не было. Но умные указатели не замена gc, но даже если gc прикрутить к С++ (либы есть соответствующие), это тоже не решит всех проблем. Слишком много возможностей выстрелить себе в ногу дает язык. Всякие таблицы виртуальных функций, арифметика указателей, mangling в С++ стиле, размеры типов, зависящие от платформы, несколько видов кастов, всякие штуки оставленные для совместимости с С, отсутствие нормальной системы модулей, инстанцирование шаблонов, недружественные ошибки компилятора. Куча всего, что программистам на других языках может только в страшном сне присниться. Про ООП там тоже много всего можно сказать. И дело совсем не в чистом ООП. ООП сама по себе парадигма проблемная. А такой ООП как в С++, можно и на С сделать (и делают, тот же COM). Потом чтобы самые вопиющие проблемы порешать прикрутили шаблоны со своим инородным синтаксисом, которые еще проблем добавили. Опять же проблемы с множественным наследованием, ромбовидным наследованием, чисто виртуальные деструкторы, которые при этом должны иметь тело и прочие неочевидные вещи. Вообщем граблей там хватает и для опытных программистов.
Да... Вот вам, счастливчикам, начавшим с С++, хорошо говорить. А кто-то с паскаля начинал, а потом Делфи) Сейчас устаканился на С# и Java, мне норм. По крайней мере для решения тех задач, что мне требуются.
Потому что после C++ ты будешь понимать как работают другие языки, а не тупо использовать что-то, что работает хз как Потому что после C++ реализация ООП в других языках кажется куцой и немощной Потому что ручное управление памятью - это надёжно, а для остального есть прямые руки и smart pointers Потому что шаблоны на два порядка мощнее любого другого механизма обобщения кода и те же generic рядом не стояли
Привет, что посоветуете в качестве первого языка, чтобы в дальнейшем найти хорошую работу? Python или JavaScript? Ещё, не могли бы сказать, как относятся к самоучкам при трудоустройстве на данный момент?
Писать надо не на языке, а с использованием языка Просто поняв как программировать, легко переключаться с языка на язык Что за стереотип - "выучишь один язык, который мне почему-то не нравится, тебе будет трудно перейти на другие языки, которые мне почему-то нравятся"