Языки программирования
Мы предполагаем, что раз вы задаетесь вопросом о различии в ЯП – значит, вы знаете о них довольно мало. А раз так, то сначала нужно устроить небольшой ликбез.
Язык программирования – это язык, на котором программист говорит компьютеру о том, что нужно что-то сделать. На первых порах зарождения программирования эту формулировка действовала буквально: программисты на перфокартах дырявили нужные области, по которым компьютер понимал, что нужно взять вот такое вот значение из какой-то области памяти, сложить его со значением из другой области памяти и на ленте бумаги напечатать результат этого сложения.
Языки бывают разными, и на то есть 3 причины: историческая; коммерческая; практическая. Историческая причина разделения языков: «я художник, я так вижу». Все языки программирования, которые существуют сейчас, возникли по той причине, что где-то кого-то когда-то не устраивало качество существующих языков. Линус Торвальдс, разработчик операционной системы Linux, взял язык C в основу операционной системы потому, что его не устраивали другие языки программирования. А разработчики языка C создали его потому, что их не устраивал существовавший на тот момент язык B. Коммерческая причина разделения языков – в том, что крупные компании заинтересованы в развитии «своих» ЯП. Apple решила, что ее программисты должны быть особенными, и вместо устоявшейся на тот момент Java заставила «своих» программистов работать на Swift; Google поощряет разработку на Go и так далее. Практическая причина разделения языков состоит в том, что некоторые языки «заточены» под ту или иную работу: C/C++/Rust незаменимы для разработки операционных систем и высоконагруженных приложений, PHP/Ruby/Python отлично справляются с серверной частью web-разработки, Java вообще старается покрыть все сферы программирования.
Если есть разделение языков, то было бы неплохо ввести какую-нибудь их классификацию. И здесь начинаются большие проблемы, потому что ЯП – тема довольно обширная, и классификаций может быть несколько. Основные:
- По уровню. Даже когда вы пишете print(“Hello world!”) в Python, на самом деле вы даете процессору команды вроде «Перемести из ячейки памяти номер 10394857 в регистр процессора A11 находящееся там значение, а затем…», просто компилятор «переводит» текст с «человеческого» на язык процессора. Вопрос – в том, насколько похожим на человеческий является язык, который компилятор будет переводить. Чем язык дальше от машинного (и ближе к человеческому), тем больше усилий надо, чтобы перевести текст (и тем медленнее работает программа). По этому критерию языки делят на высокоуровневые и низкоуровневые. Высокоуровневые – это когда код программы похож на обычный человеческий язык (Python, Java, Swift, JavaScript, PHP и так далее). Низкоуровневые – это когда код написан еще не на машинном языке, но и человеческим это уже назвать непросто (C, C++, Rust). Есть еще языки ассемблера – это когда вы пишете инструкции непосредственно для процессора.
- По парадигме. Парадигма – это набор устоявшихся практик. 3 основные парадигмы: императивная, объектно-ориентированная, функциональная. Императивная – это когда вы последовательно перечисляете команды, которые нужно сделать; объектно-ориентированная – это когда вы пакуете данные + действия в объект и позволяете объектам взаимодействовать друг с другом; функциональная – это когда вы описываете вообще все действия функциями, в том числе и математическими. Раньше эта классификация была модной, сейчас же любой популярный язык программирования в той или иной степени располагает инструментами всех основных парадигм. Например, в Java можно писать императивы (команды), создавать объекты и применять лямбда-функции из функционального программирования.
- По типизации. Любимая классификация новичков. Если в языке нужно объявлять типы переменных – строгая типизация, не нужно – нестрогая типизация. На практике вопросы типизации начинают играть роль только при очень высоких нагрузках на приложение.
- По сферам применения. Одни языки устоялись для web, другие – для игры, третьи – для бэкенда.
Языки для web-разработки
Web-разработка – понятие очень широкое, потому что оно включает в себя сайты, приложения и серверы. Кроме того, для сайтов и приложений есть разделение на фронтенд (внешний вид сайта/приложения) и бэкенд (внутренняя логика работы).
Если вы собираетесь создавать внешнюю оболочку для сайтов, ваш однозначный выбор – JavaScript. Это – единственный язык, который нативно поддерживается всеми браузерами. В нагрузку вам желательно знать HTML и CSS – языки, которые рассказывают браузеру, где должны располагаться блоки и как они должны выглядеть.
Если вы хотите создавать внутреннюю логику сайтов, то выбор у вас более большой:
- JavaScript. Бэкенд реализовывается через фреймворк Node.js. Изучение JS открывает для вас путь к фулл-стэк разработчику – это когда разработчик может написать и фронтенд, и бэкенд.
- PHP. Не самый красивый и простой, но крайне популярный язык для серверной части сайта.
- Python. Еще уступает PHP и JS, но постепенно захватывает нишу.
- Go. То же, что и Python, но востребован меньше.
- Ruby. Язык для больших и сложных сайтов. Не советуем начинать с него, потому что язык – тяжелый.
Языки для разработки игр
Здесь есть 4 варианта:
- С#.
- C++.
- Java.
- Swift.
C# – выбор тех, кто хочет создавать игры на Unity. C++ нужен тем, кто хочет создавать игры на Unreal Engine. Java – для игр на Android, Swift – для игр на iOS. Во всех случаях язык – это не главное (по крайней мере, на первых порах). Игры разрабатываются не с нуля, а на определенном движке – в 99% случаев это Unity или UE.
Языки системного программирования
Системное программирование сейчас имеет 2 значения: разработка системных (не-прикладных) приложений и создание системного окружения разработки (CI/CD, Infrastructure as a Code и другие DevOps-практики). В первом случае вам нужны низкоуровневые языки программирования: C, C++, Rust. Во втором случае вам нужны языки для создания скриптов: Bash, Windows PowerShell, Python, Go. Лидируют здесь Python и Bash.
Языки системного администрирования
Сисадминам обязательно нужно знать языки командных строк: Bash (Linux), Microsoft PowerShell (Windows Server). Поскольку большинство сисадминов «перекатывается» в DevOps, вам желательно знать скриптовый язык: Python, Go. Технически скрипты можно писать и на Bash/PowerShell, но написание сложных скриптов превратится в пытку. Дополнительно системным администраторам желательно знать YAML, в обязательном порядке нужно знать SQL.
Языки для тестирования
Тестирование обычно проводится на том языке, на котором написано приложение. Для автоматизированного тестирования часто применяются Python и Java, хотя любой более-менее крупный язык имеет свои собственные фреймворки для автоматизированного тестирования.
Языки, которые не нужно учить
В различных подборках можно встретить откровенно устаревшие или очень узкоспецифичные языки, которые на самом деле учить не стоит. К таким языкам можно отнести:
- Pascal/Delphi. Еще лет 20 назад эти языки были популярны для обучения (Pascal) и разработки (Delphi). На данный момент они безнадежно устарели.
- F#. Язык – живой, но слишком специфичный.
- С. Да, этот язык встречался в нашей подборке, но вам не нужно с него начинать, если вы раньше с программированием не сталкивались – он настолько сложен, что отобьет у вас всякое желание программировать. Если все же хотите выучить низкоуровневый язык программирования – начните с Rust.
- Visual Basic. Этот язык одной ногой уже в могиле, и – вполне заслуженно.
- R. Язык, завязанный на статистике и математическом анализе. Если не собираетесь становиться аналитиком/big data scientist, то не начинайте с него – к языку прилагается большая математическая база, которую нужно изучить.
- Ассемблер. Даже не пытайтесь. Самая простая программа, вывод Hello World, на ассемблере занимает 30 строк – и программа будет работать только на одном конкретном семействе процессоров.