Если вы только приступаете к процессу изучения программирования, первый вопрос, который обычно возникает: а какой язык программирования выбрать? Всего языков – тысячи, популярных (и прибыльные в плане работы) – как минимум десятки. В основном новичкам советуют изучить JavaScript или Python, но советчики обычно перечисляют субъективные и непонятные новичку плюсы того или иного языка. Ниже мы в деталях (и человеческим языком) разберем плюсы и минусы JavaScript и покажем, почему его имеет смысл сделать своим первым языком программирования.
Увы, для начала нам придется нагрузить вас теорией по языкам программирования – без базовой теории вы не будете понимать плюсы, минусы и применения JavaScript.
Итак, начнем с низкоуровневых и высокоуровневых языков программирования. Язык программирования сам по себе – это прокладка между процессором и программистом, с помощью ЯП программист может сказать процессору, что нужно сделать такие вот математические вычисления. Но говорить нужно на каком-то языке, и чем ближе этот язык к нашему, человеческому языку – тем проще нам давать указания. Самые низкоуровневые языки – это языки ассемблера, они представляют собой набор прямых инструкций процессору: возьми из памяти столько-то байт, переложи их в регистры процессора, дождиcь выполнения сложения, вынь готовый результат из специального регистра процессора, положи его вон в тот участок оперативной памяти. Естественно, это: а) неудобно, поскольку вам нужно оперировать с шестнадцатеричными адресами; б) долго, потому что вам нужно руками прописывать каждую операцию; в) небезопасно, поскольку очень легко ошибиться и все сломать. Но низкоуровневые языки программирования очень и очень нужны, без них работа с процессором невозможна в принципе.
Поскольку работать с ассемблерами неудобно, программисты придумали высокоуровневые языки – языки программирования, синтаксис которых намного больше похож на человеческую речь. Если вы хоть чуть-чуть знаете английский, то строка кода
if (x > 5): print(x);
должна быть вполне понятной. Одним из первых высокоуровневых языков был C (хотя если смотреть правде в глаза, его лучше назвать «среднеуровневым», читабельность у него так себе), после него появились C++, Java, Python, JavaScript, Golang и другие. Единственный минус, который есть у высокоуровневых языков – работают медленнее ассемблеров, потому что код с высокоуровневого языка должен быть переведен компилятором или интерпретатором на машинный язык.JavaScript – строго высокоуровневый язык программирования.
Когда вы пишете что-либо, от «Hello world!» в консоль до серверных приложений, вам нужно как-то перевести ваш код на языке высокого уровня в машинные инструкции. Сами вы это, естественно, делать не будете, потому что в том и смысл высокоуровневых ЯП. Следовательно, эту работу нужно отдать сторонней программе – интерпретатору или компилятору.
Сразу отметим, что если вы встретили мнение, что «вот Java/C++/Go – компилируемый, поэтому он быстрее интерпретируемого JavaScript/Python», то можете не учитывать мнение этого человека в дальнейшем. Все языки сейчас пользуются одновременно компилятором и интерпретатором, просто в разных соотношениях.
Но давайте все же разберемся, что это значит. Интерпретация и компиляция – это два разных подхода к переводу кода высокоуровневого языка на низкоуровневый язык процессора. При интерпретации перевод начинается с того момента, когда запускается программа: интерпретатор запускается сразу же после того, как вы дали инструкцию «Запустить» операционной системе, и строчку за строчкой переводит ваш код, тут же исполняя его.
Компиляция – это когда вы даете операционной системе команду «Запустить», она запускает компилятор, компилятор читает всю вашу программу, переводит ее в машинный код и сохраняет этот код в специальном файле, после чего программа запускается уже из файла.
В чем разница? Компилятор тратит больше времени на запуск программы (при любом изменении нужна перекомпиляция), но тратит меньше ресурсов системы во время выполнения программы; интерпретатор запускается мгновенно, но тратит больше ресурсов на исполнение. Как мы уже отмечали выше, сейчас различия существенно сгладились, потому что компиляторы научились кэшировать, а интерпретаторы научились прекомпилировать.
JavaScript – интерпретируемый язык.
Тут все очень просто. В языках программирования есть переменные – условные контейнеры, в которых можно хранить то или иное значение. Так вот, если в контейнер можно положить любое значение (число, строку, объект или еще что-нибудь) – значит, у языка нет строгой типизации (= есть динамическая). Если вам для создания переменной нужно сказать, что «в переменной x можно хранить только строки», и после этого вы в x можете класть только строку – значит, язык имеет строгую типизацию.
JavaScript – язык с динамической типизацией.
Лет 50 назад существовали только процедурные языки – это когда вы описываете четкий набор действий, некоторые из них выносите в процедуры (чтобы использовать несколько раз), и компьютер все это последовательно выполняет. Потом появилась идея объектно-ориентированного языка – суть здесь в том, что мы вводим понятие объекта и класса: описываем сущности классами, создаем экземпляры объектов, даем им поведение, реализовываем инкапсуляцию/наследование/полиморфизм (если вы только начинаете учиться – не вдумывайтесь, это сложно и вам это пока не нужно). Так вот, парадигма ООП стала крайне популярной, и множество языков либо уже стартовали со встроенным ООП (Java), либо постепенно приобретали ООП в процессе своего развития. JavaScript – как раз из последних, к нему ООП прикручивали постепенно. При этом нужно заметить, что ООП в JavaScript применять не обязательно, даже для сложного сценария JavaScript можно пользоваться исключительно «процедурной» частью языка.
JavaScript – и объектно-ориентированный, и процедурный язык программирования.
Теперь, по этим 4 основным критериям, мы можем объяснить вам, какой язык считать легким. Легкий ЯП должен быть:
Потому что JS подходит по всем параметрам: это интерпретируемый язык высокого уровня с динамической типизацией и поддержкой ООП. За такой набор параметров приходится платить свою цену, но об этом – ниже.
Вообще, в текущих реалиях у вас есть 2 альтернативных варианта: Python и C#.
JavaScript | Python | C# | |
Насколько сложно выучить | Относительно просто. Единственный момент – у JS есть некоторые странности поведения, доставшиеся ей в наследство со старых времен | Легко, если вы учите Python 3. Артефактов древности нет, единственная проблема – привыкнуть к отступам | Средняя сложность. Язык требует компиляции, имеет строгую типизацию и не самый дружелюбный синтаксис. Но на C# написано много серьезных приложений, и его все еще легче выучить, чем Java или C++ |
Насколько сложно настроить среду разработки | Можно писать код прямо в браузере | Придется немного повозиться с установкой интерпретатора, но все можно сделать по гайдам за 20 минут | Лучше сразу качать Visual Studio и попутно в ней разбираться |
Строгая типизация? | Нет | Нет | Да |
Где применяется | В основном – браузеры и серверы (Node.js) | Практически везде – есть библиотеки под любые задачи | Сложные серверные приложения, десктопные и мобильные программы, игровой движок Unity |
Но есть хорошая новость: если вы знаете один высокоуровневый язык программирования, то вы знаете все высокоуровневые языки. Они слабо отличаются по синтаксису, к другой типизации можно быстро привыкнуть. Единственное серьезное отличие – набор библиотек/фреймворков у каждого языка свой, но если вы выучите ядро JavaScript, на освоение ядра Python у вас уйдет не больше месяца.
Согласно индексу TIOBE, популярные языки на июль 2022 года:
Язык | Легко выучить? | |
1 | Python | Да |
2 | C | Нет, очень трудный язык (хотя платят за его знание очень хорошо) |
3 | Java | Не особо, Java сильно завязан на ООП и фреймворки |
4 | C++ | Нет, он немного легче, чем С, но все еще очень трудный |
5 | C# | Средняя сложность, но может подойти целеустремленному новичку с большим объемом свободного времени |
6 | Visual Basic | Удивительно, что он до сих пор существует. Даже не думайте его учить |
7 | JavaScript | Да |
8 | Ассемблеры | Даже не пытайтесь |
9 | SQL | Не совсем язык программирования, но вам придется его выучить – SQL нужен, чтобы работать с базами данных, а БД есть везде |
10 | Swift | Примерно такой же сложный, как C#, но с ограниченной зоной применения |
В общем-то, одно из главных преимуществ для новичков. Вы можете на лету протестировать любую инструкцию.
Хоть для изучения JavaScript и не нужны сторонние библиотеки, когда вы до них дорастете – вас приятно удивит разнообразие уже готовых библиотек и фреймворков.
Если у вас есть навыки – остаться без работы будет очень сложно, потому что HTML страницы есть везде, следовательно JS-разработчики тоже нужны везде.
Практически все инструменты разработчика для написания кода поддерживают JS – рекомендуем ставить Visual Studio, когда начнете заниматься более-менее крупными проектами.
Основы JS можно выучить за 2-3 недели, даже если у вас нет опыта программирования.
Основные недостатки:
Любые курсы по языку программирования JavaScript справятся с описанием языка лучше нас, поэтому мы дадим один простой, но рабочий пример – чтобы вы увидели, как все это работает. Код:
var myImage = document.querySelector('img');
myImage.onclick = function() {
var mySrc = myImage.getAttribute('src');
if(mySrc === 'images/ firefox-icon.png') {
myImage.setAttribute ('src','images/firefox2.png');
} else {
myImage.setAttribute ('src','images/firefox-icon.png');
}
}
Этот простой скрипт позволяет переключить изображение на странице на другое, когда на него нажали левой кнопкой мыши. Начинается все с получения ссылки на изображение – все ссылки на объекты страницы можно получить через глобальный объект с названием «document». Мы сохраняем ссылку (или указатель, если вам так более удобно) в переменную myImage. Далее мы вешаем действие на триггер .onclick – то есть наш код произойдет, когда на объект кликнут (в JS многое завязано на триггерах). Мы берем атрибут src (адрес картинки), сохраняем его в переменную для удобства, после чего проверяем: если название картинки – firefox-icon.png, то мы меняем его на firefox2.png, в противном случае меняем firefox2.png на firefox-icon.png. Все, готово.
Технически JS можно использовать для чего угодно – хоть для создания приложений на компьютер. Но исторически сложилось так, что JS используется для того, чтобы: создавать сложные скрипты на страницах (фронтэнд); писать скрипты на стороне сервера с помощью фреймворка Node.js (бэкэнд). Во фронтэнде JS используется везде и всегда, в бэкэнде JS используется намного более редко – его «пододвигают», Python, PHP и C#.
Это – абсолютно разные языки, никак друг с другом не связанные. Изначально появился язык Java, и он быстро стал очень популярным, поэтому разработчики JavaScript решили запрыгнуть на хайп-трэйн и создать у программистов ложную ассоциацию о том, что JavaScript имеет отношение к Java. Ассоциация возникла, и теперь разработчики JS пытаются всячески от нее избавиться (как говорится, бойтесь своих желаний).
На самом деле все довольно просто. Краткое замечание по типам данных: “2” – это строка, в которой хранится цифра 2, просто 2 – это число. Так вот, число 2 + число 2 = число 4, тут вопросов нет. Строка “2” + строка “2” = строка “22”, две строки объединяются, если между ними поставить +. Число 2 + число 2 – число 2 = 2, все по математике. Перед объяснением последнего результата нам нужно рассказать про приведения типов. Когда JS получает задание сложить строку и число, язык переводит число в строку, после чего складывает две строки. Операции выполняются слева направо, то есть сначала JS видит (строка “2” + строка “2”) и складывает 2 строки – в результате получается “22”. После этого JS пытается выполнить (строка “22” – строка “2”), но нет никакого порядка вычитания одной строки из другой, поэтому JS решает: «окей, я попытаюсь перевести обе строки в числа, если получится – отниму, если не получится и в одной из строк есть не-цифры – выдам ошибку». Перевести строки в числа получается, и JS радостно выдает решение 22 – 2 = 20.
Нажмите F12, в открывшемся меню найдите вкладку «Консоль» сверху, перейдите на вкладку. Все, можете писать код. Учтите, он нигде не сохраняется – ваш скрипт исчезнет после того, как вы закроете вкладку.
Тезисно: