Язык, Для чего, С чем.
Сперва мини история =)
С недавнего времени занялся изучение программированием, так как это будет в будущем моей профессией. Ну как вы знаете в учебных заведениях нифига не учат и берут только деньги, и студенты ( скажем большая часть ) говорю это, так как я сам на данный момент студент - сидят и играют всякие игры, просто тупое убивание времени. Я этого не понимал, но в скорее я осознал что я "дурак" что тоже сидел, играл игры и т.д. не занимаясь ничём полезным, не думал про будущее.
Скажем так : всё что происходит с человеком - виноват он сам.
Вот я "забыл" на эти игры, начал учится по своей буд. специальности. Сидел на форумах, искал в поисковых системах разную информацию, читал книги.
Я много раз замечал, что на форумах создают темы где спрашивают с чего начать, и почти на всех форумах одинаковые ответы, например ( учи С++ / С# или там Delphi а еще : учи то что тебе нравится ) ну а я подумал, как можно что то изучать, если не знаешь для чего и под что его можно использовать.
Вопрос :
Вот тут я хотел задать вопрос или даже несколько : какой язык и для чего используют, какие направления есть ( там для написание программ, для создание сайта и т.д. ) хотел бы узнать КЛАССИФИКАЦИЮ, НАПРАВЛЕНИЙ чтоб определиться какой язык выбрать ...
Заранее прошу прощение :
- русский у меня хромает - понемногу изучаю.
- если неверно сформулирован вопрос ( от него зависит ответ который я хочу получить, но надеюсь вы поймете что я хочу =) )
- если подобная тема была создана ( типа мне было лень искать, если я даже нашел, ответа того что я хотел - не увидел )
буду очень благодарен, если кто то уделит мне 5-10 мин. своего времени
для написание ответа.
П.С.
- в ходе написания ответа прошу не переходит на личное, типа "купи букварь" и т.д.
- если не знаешь ответ - проходи мимо, глупости не пиши.
http://ru.wikipedia.org/wiki/Сравнение_языков_программирования
Но это для тех, кто и так понимает. Для начинающего лучше какая-то схема, картинка, а не набор устрашающих таблиц. Но я пока такого не нашёл.
Мне б по сути вопроса. Очень много не надо, главное чтоб было верно и я понял.
http://ru.wikipedia.org/wiki/Сравнение_языков_программирования
Но это для тех, кто и так понимает. Для начинающего лучше какая-то схема, картинка, а не набор устрашающих таблиц. Но я пока такого не нашёл.
спасибо за ссылку. я это уже видел, но мне пока этого не понять. мне кажется ты не понял сути моего вопроса, или я тебя не понимаю ...
Проблема вот в чём. Начинающие пытаются классифицировать языки программирования так: этот - для "программ", этот - для сайтов, этот для ещё чего-то. На самом деле так классифицировать можно среды разработки, фреймворки и т.п. Серьёзные языки программирования так разделять бессмысленно, ибо они обычно не привязаны к конкретным задачам. Их классифицируют так, как в приведённой мною статье.
Например, Python можно использовать и для написания "программ", и для сайтов, и для одноразовых скриптов... Как его тут разделить? Есть более специализированные языки, типа bash, но их трудно назвать полноценными языками программирования.
Классификаций языков много, но наиболее употребительных две:
1) Все компьютерные языки делятся на две большие категории: языки общего назначения и предметно-ориентированные языки. На языках из первой категории возможно решить практически любые задачи (для них справедливо утверждение полноты по Тьюрингу), например это Pascal, C/C++/C#, Java; языки из второй созданы для какой либо специфической задачи или предметной области, яркий пример - SQL.
2) Также языки можно разделить на алгоритмические - на которых можно записывать алгоритмы, и на описательные (декларативные), предназначенные для сообщения компьютеру неких данных и их отношений. Как правило, языки общего назначения подходят также и для задач "описания".
Границы этих классификаций не являются строгими, многие языки могут переходить под разные категории в рамках одной классификации. Например алгоритмический язык JavaScript в вебпрограммировании используется как язык описания данных в формате JSON. На алгоритмическом языке Nemerle возможно создавать узкоспециализированные мини-языки (LINQ, XML-литералы, описания парсеров) и т.д.
Так как изучить другой язык после него очень сложно в виду ограниченности PHP. Проверено на своем опыте. После PHP сел на Яву и долго не мог разобраться вообще в различных принципах программирования и "понятиях".
Имхо лучше начать с тяжелого языка программирования - потом намного легче будет разобраться в прочих языках. Тем более обычно программисту приходится иногда писать на разных языках.
1. системное,
2. прикладное,
3. веб,
4. администрирование.
Системное программирование - это написание драйверов, ядра операционных систем и тому подобного.
Прикладное - написание программ, работающих на клиентских компьютерах: офисные пакеты, всевозможные редакторы, игры и прочее.
Веб-программирование - создание сайтов и всего с ними связанного.
Администрирование - кому-то покажется странным, что я отношу его сюда, но это тоже справедливо, т. к. администратору тоже нужно уметь программировать - писать скрипты.
Конечно, все эти виды тесно связаны друг с другом, и строгого разделения нет. Но всё же существенные различия имеются.
Например, системному программисту нужно знать архитектуру компьютера, устройство железа, что веб-программеру как-то побоку.
Веберу вынужденно приходится осваивать особенности и глюки разных браузеров.
Прикладник, пишущий программы с гуем, мыкается сделать их кросплатформенными, чтобы их внешний вид был привычен пользователям конкретной оси.
botasa, определитесь, что вам ближе всего по духу, в какой области хотите работать. После этого можно будет советовать что-то более конкретное.
Напоследок, посоветую учить язык, который знать нужно каждому программисту - английский. Ныне это язык информационных технологий де-факто.
1) Все компьютерные языки делятся на две большие категории: языки общего назначения и предметно-ориентированные языки. На языках из первой категории возможно решить практически любые задачи (для них справедливо утверждение полноты по Тьюрингу), например это Pascal, C/C++/C#, Java; языки из второй созданы для какой либо специфической задачи или предметной области, яркий пример - SQL.
2) Также языки можно разделить на алгоритмические - на которых можно записывать алгоритмы, и на описательные (декларативные), предназначенные для сообщения компьютеру неких данных и их отношений. Как правило, языки общего назначения подходят также и для задач "описания".
Границы этих классификаций не являются строгими, многие языки могут переходить под разные категории в рамках одной классификации. Например алгоритмический язык JavaScript в вебпрограммировании используется как язык описания данных в формате JSON. На алгоритмическом языке Nemerle возможно создавать узкоспециализированные мини-языки (LINQ, XML-литералы, описания парсеров) и т.д.
спасибо за ответ !
Так как изучить другой язык после него очень сложно в виду ограниченности PHP. Проверено на своем опыте. После PHP сел на Яву и долго не мог разобраться вообще в различных принципах программирования и "понятиях".
Имхо лучше начать с тяжелого языка программирования - потом намного легче будет разобраться в прочих языках. Тем более обычно программисту приходится иногда писать на разных языках.
если честно, я этого не понимаю ... как можно читать книгу не изучив алфавиту и грамматики ...
Рекомендую прочитать книгу "Языки программирования: разработка и реализация" (Т.Пратт, М.Зелковиц). В ней рассматривается целый ряд классичских языков с обзорами и сравнениями.
1. системное,
2. прикладное,
3. веб,
4. администрирование.
Системное программирование - это написание драйверов, ядра операционных систем и тому подобного.
Прикладное - написание программ, работающих на клиентских компьютерах: офисные пакеты, всевозможные редакторы, игры и прочее.
Веб-программирование - создание сайтов и всего с ними связанного.
Администрирование - кому-то покажется странным, что я отношу его сюда, но это тоже справедливо, т. к. администратору тоже нужно уметь программировать - писать скрипты.
Конечно, все эти виды тесно связаны друг с другом, и строгого разделения нет. Но всё же существенные различия имеются.
Например, системному программисту нужно знать архитектуру компьютера, устройство железа, что веб-программеру как-то побоку.
Веберу вынужденно приходится осваивать особенности и глюки разных браузеров.
Прикладник, пишущий программы с гуем, мыкается сделать их кросплатформенными, чтобы их внешний вид был привычен пользователям конкретной оси.
botasa, определитесь, что вам ближе всего по духу, в какой области хотите работать. После этого можно будет советовать что-то более конкретное.
Напоследок, посоветую учить язык, который знать нужно каждому программисту - английский. Ныне это язык информационных технологий де-факто.
среди всех ответов я ждал именно такого ! с английским я не могу поспорить ... где только не слышал и не видел, везде вымогают знание АНГ.
Вот я не могу определиться в какой области хотел работать, так как я не знал какие ОБЛАСТИ есть !!! но по вашему описанию, так как я понял - мне больше по душе ( прикладное и веб ) что вы можете сказать про то что я выбрал ? ( по подробнее ) языки и т.д. или если можете киньте ссылки в ЛС где можно почитать ... буду рад если вы ответите !!!
В целом, топикстартер должен теперь попробовать несколько разных языков, с разными парадигмами. А потом выбрать то, что больше по душе. Мне, например, не нравятся языки с динамической типизацией.
Ты много на Java написал лично? Мне, например, нравилось читать примеры на Java в книгах про ООП. Но на практике меня опечалила работа с консолью, например. Уж слишком многословно.
А со статической? В Си, например, такой код скомпилируется и может запуститься:
a += 10;
printf("%s", a);
Казалось бы, недостаток языка. Однако, есть куча примеров (у того же Кернигана), где подобные штуки в Си используют для полиморфизма.
Теперь на Python:
a = a + 1
Выдает ошибку: TypeError: cannot concatenate 'str' and 'int' objects. Вот тебе и типизация.
Это не к холивару "статическия типизация vs динамическая", а для уточнения про строгую типизацию. Истинные сторонники статической типизации должны говорить "мне нравится строгая статическая типизация" :)
Я писал. А хардкейз написал чуть более чем до на / под дотнете (Включаю шарп), так что риквестирую его в тредъ).
На самом деле да, примеры в очень многих книгах (том же фаулере) даются на Java. Ибо простой, распространенный и "дефолтный" для многих областей язык. В этом плане полезно знать что-то из С# / Java / С++.
Истинные сторонники статической типизации должны говорить "мне нравится строгая статическая типизация" :)
"Истинные сторонники" следует тут заменять на "упертые фанатики".
Строгая статическая типизация "как есть" на практике практически нигде не используется. Используется либо нестрогая статическая, либо динамическая (строгая / нестрогая).
И? Что ты посоветуешь новичку в качестве универсального языка для любых целей? :)
Ну и молодец. Я в него всегда верил.
Да. Я о том же.
Строгая статическая типизация "как есть" на практике практически нигде не используется. Используется либо нестрогая статическая, либо динамическая (строгая / нестрогая).
Тут надо любителей языка Ада в тему, вероятно :)
Хотя, наверное, есть ещё и оттенки нестрогости.
Стать более прагматичным и понять, во что больше имеет смысл инвестировать, ибо скорость усвоения знаний конечна и ограничена. Я бы посоветовал таки да, либо Java либо С#. Вообще это зависит еще и от места жительства.
Например, живи я в Москве / Питере, вполне возможно я бы стал С++ - ником. Писал бы игры... Когда то я хотел пойти в геймдев. Вообще и сейчас хочу. Но отдалился я от этого слишком.
[/QUOTE]
Мало. Фактически юзал только J2ME - игры для мобильников пробовал делать. Да, профи себя не считаю. В мире Java я нуб.
Это расплата за универсальность. Консоль - лишь маленький кусочек мира Java и .NET. Поэтому логичным кажется сделать отдельный класс консоли, через который работать с ней. А не набор глобальных функций, которые в большинстве приложений останутся невостребованными.
Дык я и не упоминал Си.
А в Python есть нечто наподобие IntelliSense? ;) Чтобы среда разработки прямо по ходу набора кода услужливо подсказывала и автодополняла. Со статической типизацией это реализуется в разы проще.
Согласен. Холивара на эту тему не хочу.
Уточняю: мне нравится строгая статическая типизация (Zorkus, не придирайся).
Я вообще почему назвал Java и .NET: обе платформы хороши как для веб-программирования, так и для прикладного. В то время как C/C++ сложно представить в качестве языков для веба (хотя это и возможно).
Дальше: опираясь на знания Java/.NET можно плавно перейти на функциональное или динамическое программирование, продолжая использовать всё богатство освоенных фреймворков этих платформ.
Java это не язык программирования "консоли", и, во всяком случае, Java программы редко с консолью работают. Но, я думаю, найти сторонние библиотеки, упрощающие стандартный ввод-вывод вообще не проблема.
a += 10;
printf("%s", a);
Казалось бы, недостаток языка. Однако, есть куча примеров (у того же Кернигана), где подобные штуки в Си используют для полиморфизма.
Си - это пример слабой статической типизации. Кстати, в Nemerle похожий пример с printf-ом расскажет об ошибке (на этапе компиляции!):
printf("%s", a);
Это потому что Nemerle - язык со строгой статической типизацией (проверкой типов занимается макрос).
+1. Я именно так и говорю. Но язык должен быть с выводом типов, иначе наприсание программ превращается в бесконечное специфицирование типов.
В хороших IDE есть. Но, естественно, не срабатывает там, где невозможно предсказать тип. Если не учитывать эту особенность, то ещё неизвестно, где реализовать проще. А особенность эта будет, например, и в шаблонах C++ проявляться. Плата за гибкость, да.
Фраза несколько бредовая. Стандартная библиотека в этих платформах на ФП не расчитана - сплошное мутабельное состояние. Вон, на F# посмотри, - какую они прокладку к дотнету положили и шизофрению с вызовом функций-методов организовали. ;) C динамикой тоже непонятно, она в сущности не нужна ни в Java ни в .NET. ;)
Плавали-знаем. Снести бошку автоподстановке в динамических языках - как два байта переслать.
Тут надос смотреть на свою личную "заточеность". С чего легче начать - с сложного (т.с. углубитьтся к истокам) или с простого (понять общий, т.с., смысл).
Если берем от сложного к простому - советую посмотреть в сторону Asm и C. Постепенно, шаг за шагом, приходит понимание, что, зачем, почему и, самое главное, КАК это все работает. И тогда аступит момент озарения, когда будете смотреть как на говно на афторов постов "блин, написал х++ - не работает, потанцевал с бубном и написал ++х - уррряяяяя!".
Только не берите С++ по началу, сломаете себе моск.
Области применения: драйверописание, игроделание (движки) ну и еще УКи, знакомые с сабжами, допишут.
Если от простого к сложному - УКи выше советовали С# и Java. Просты и понятны в изучении. Понимание процесса приходит после каждой строчки кода. Лучшие, ИМХО, языки для изучения ООП (предвидя буйство букв отмечу - из тех, с которыми лично я знаком). Именно поэтому я и советовал не браться за С++.
Применение: Enterprise, во всех его проявлениях. В принципе, при грамотном подходе, можно разом превратить в фарш стаю "зайцев".
Ну и третий путь - С++. Труден, тернист (сужу по себе:)). Но если одолеете - честь, хвала, и, возможно, бабло и ништяки. А можно остаться и "умным но бедным" бородатым афтором кучы рулезных фич, за которые не платят.
И самое главное, нужно всегда помнить - дорогу осилит идущий. И второе: ЯП - всего лишь инструмент.
Несерьёзный подход к изучению языков программирования. Попытаюсь углубить.
Начнём с понимания физического смысла p-n перехода. После этого можно ознакомиться с принципом работы диодов. Часть людей, понявших этот принцип способны понять, как работает биполярный транзистор (не советую вникать в униполярный - сломаете моск).
После понимания работы транзисторов можно перейти к освоению работы простых логических микросхем: И, ИЛИ, инвертора и т.д. Особое внимание уделите микросхемам с открытым коллектором.
Далее можно переходить к триггерам. Полагаю, что принцип обратной связи проще понять на них, чем на операционных усилителях. Тут вам надо определиться, что вам понятнее, цифровая или аналоговая техника.
От триггеров можно перейти к сумматорам, таймерам, шифраторам, дешифраторам, и т.п. И наконец, вы сможете понять в общих чертах устройство микроконтроллера. А тут и до ассемблера с сями недалеко.
Можно пойти с другой стороны и начать изучать ТАУ (теория автоматического управления). Тут вы разберётесь, что такое обратная связь, устойчивость, запас устойчивости, управление. Тут вы научитесь создавать хитрые функциональные схемы.
От ТАУ один шаг к использованию UML, к ООА и ООД.
Только как это все относится к программированию? И зачем знать устройство микроконтроллера, при программировании веб-сервиса?
Как функциональные схемы помогают в ООП?
Резюмируя в целом. Означенные области лишь помогают развить интеллект, но никак не помогают при собственно программировании.
Это был юмор. Я старался довести до идиотизма то, что насоветовал уважаемый Iktomy.
Тут могу посоветовать пристально присмотреться к схемам UML. Многие из них напоминают функциональные схемы ТАУ, так же показывают взаимодействие объектов в системе.
Тут могу посоветовать пристально присмотреться к схемам UML. Многие из них напоминают функциональные схемы ТАУ, так же показывают взаимодействие объектов в системе.
Я не спорю, в UML входят несколько категорий диаграмм (например, структурные и функциональные), но знание UML нисколько не требуется для написания качественных программ. UML в индустрии используется для документирования или специфицирования (что реже) программных продуктов.
На самом деле в его словах есть доля истины: языки ассемблера достаточно близки к машине Тьюринга - формальной модели исполнения программ. Но чтобы изучать ассемблер, нужно понимать "откуда растут ноги" - из математики, а не так что сразу с "места в карьер". Именно поэтому я рекомендовал книгу "Языки программирования: разработка и реализация", в ней авторы прослеживают эволюцию абстракций (поколений) машинных языков.
Моё мнение: без диаграмм типа UML объектно-ориентированный анализ производить неудобно. Именно потому их используют на этапе проектирования.
Ошибка некоторых начинающих в том, что они пытаются нарисовать сразу красивые диаграммы на этапе проектирования. Это требует ненужных затрат времени, из-за которых начинающие и отказываются от использования UML при анализе. А требуется лишь понять, где лишние связи, кому лучше агрегировать, а кому быть агрегированным и т.д. Для этого достаточно наброска на салфетке, которая завтра отправится в урну.
Ошибка начинающих в том, что они забывают об SRP (Single Responsibility Principle), это им и мешает нарисовать сразу красивые диаграммы.
Как правило, нормальные программисты не рисуют прямоугольники, а сразу пишут классы с методами-заглушками и комментариями с псевдокодом.
Конечно есть. Стал бы я так подробно комментировать то, что не имеет смысла?
Ты усложняешь. Ну, булеву алгебру может надо знать, но это пустяки. Сложнее понять косвенную адресацию, но где в ней хитрая математика?
Ты сам её читал? Или как в случае с "Психбольницей в руках пациентов"? Шучу.
Если читал, то и расскажи, где от "простого к сложному", где от "сложного к простому". Не ты ли говорил, что си прост как валенок?
Сейчас, наверное, это звучит уже смешно, но понимание системы это действительно давало. Ну и небольшой прирост производительности для моего тогдашнего AMD K6-2 500 Mhz.
Дада, сейчас есть Gentoo, я в курсах:)
Дык вот, к чему я клоню, УК Когром. Что бы ответить на вопрос "почему?", довольно таки часто нужно сперва ответить на вопрос "как?".
Я, когда в ПТУ на программиста учился, в том числе изучал и физический смысл p-n перехода, и тригеры и много чего другого. Этим, собственно, академический подход и отличается.
А быдлокодить на PHP ради батона с маслом и варенй колбасой - тут институт совершенно не нужен. Он даже мешает. Отслужил себе в армии (что бы потом голову военкомат не дурил), и ваяй себе демблельские альбомы в сети.:)
Да я с тобой согласен во многом. Осталось только понять, где "от простого к сложному", а где "от сложного к простому". Вот ты про C++ пишешь, что он сложен. А как может быть не сложен язык, который является мутантом-гибридом? И можно ли его понять, не зная его предков? И кто из предков был "простым", а кто "сложным"?
скажем так всё что связано с ASM я даже знать не хочу ... он мне настолько не понравился что словами не передать, изучал его в техникуме на младших курсах ужас ... сравнять С++ и Delphi которое я изучал это цветочки против этого ASM ( ну он мне не нравиться и всё )
на данный момент я вроде нормально изучил HTML CSS - правда это не языки программирования на сколько я понимаю, сейчас учу JavaScript потом когда изучу нормально его перейду на PHP ( за PHP я почему то не увидел ни одного поста ) а там уже С++ пойдет и Java ...
На сколько я понимаю главное не количество, а качество но на всё это надо времени много. Кроме этого у меня учёба, дипломная и еще куча проблем но останавливаться изучать я не собираюсь !!!
увидел пост где кто-то отписал ( в зависимости от места жительства ) ну я очень очень хочу пойти сюда http://ipk.polynet.lviv.ua/ipdo/bak_progr.htm ) но как с деньгами сложится ( .... ) время покажет ...
если я что то не так написал или не так подумал - прошу исправить ... буду рад выслушать другие мнения ...
На простых примитивах можно строить сложные штуки. Казалось бы, булева алгебра проста, а ты пробовал разобраться с логикой первого порядка? ;) Правильно выбранный базис дает могучие средства абстрагирования.
Это же самое касается Си. Язык не "прост как валенок" - изучить его дело сложное из-за адресной арифметики (которая нормальным людям нафиг не нужна), - он примитивен: в нем нет средств абстрагирования мощнее текстовых подстановок, адресная арифметика (вкупе со сравнительно лаконичными синтаксисом) в нем по сути единственная фишка, из-за которой он жив и успешно применяется до сих пор.
Я ее читал (и периодически возвращаюсь к отдельным главам), и "Психбольницу" я тоже читал. Но суть не в этом. Суть в том, что для обучения программированию нужно как ни странно программировать, не важно на чем, и в то же время читать правильную литературу - матчасть.
Я исходил из критериев скорости написания extended-хеловорда. Согласитесь, на C# это быстрее, чем на С.
Про С++ - его слабость в его силе. Он универсален - отсюда все проблемы. Это лично мое видение. Хотя я далеко не одинок:)
Я бы сказал, иначе: он претендует на универсальность (путем постоянного расширения стандарта).