Обзор языков программирования

В наши дни невозможно представить жизнь без использования компьютеров и смартфонов. Большинство повседневных дел выполняется с помощью приложений и онлайн покупок. Вызвать такси, узнать о скидках в различных супермаркетах, примерить виртуальный гардероб, воспользоваться картой и многое другое делается при помощи мобильных приложений. А чтобы создать такое приложение, нужно быть программистом. Поэтому многие взрослые и даже подростки задумываются о том, чтобы овладеть основами кодинга и получить новую высокооплачиваемую и востребованную профессию.
Программирование – это владение компьютерным языком. Программист дает команды на языке компьютера, выстраивая их в определенную последовательность – алгоритмы. Но не существует какого-то одного общего для всех языка программирования. С каждым днем их количество увеличивается. Как же разобраться во всем этом разнообразии и какие языки вообще существуют? Попробуем ответить на эти вопросы в нашей статье.
В первую очередь при выборе языка стоит определиться с той сферой, где вы планируете его использовать. Самые распространенные на сегодняшний день области применения компьютерных языков – это веб-разработки, мобильные приложения и компьютерные игры. Но это не значит, что стоит не обращать внимание на другие сферы. Специалисты узких специальной тоже бывают очень востребованы. Поэтому мы рассмотрим различные языки в рамках тех областей, где они используются.

Фронтенд
Фронтенд – это все, что браузер может читать, выводить и запускать на экран. Сюда можно отнести HTML, CSS и JavaScript. По сути HTML и CSS не являются языками программирования. Они отвечают лишь за то, как будет выглядеть сайт. HTML говорит браузеру, каково содержание страницы, а CSS – как отражать элементы на этой странице. JavaScript – главный язык фронтенда. На сегодняшний день это один из самых популярных языков программирования. Он отвечает за интерактивность и динамически меняющуюся информацию на страницах сайта.
Изучить эти языки можно на курсе Polycent «Сайтостроение и веб-дизайн».
Бэкенд
Бэкенд или веб-разработка – это все, что работает на сервере, а не в вашем браузере. Для этого используют различные языки программирования. Java (не путать с JavaScript) используют миллионы разработчиков по всему миру. Это высокоуровневый объектно-ориентированный язык программирования. Используется в сетевой архитектуре, встраиваемых устройствах и других вычислительных приложениях. Популярный сегодня Python уступает Java в скорости выполнения, но выигрывает в объеме кода. Может использоваться для задач по автоматизации и анализу данных. Имеет понятный синтаксис и понятен для новичков в программировании. Популярный и легкий в освоении PHP используют для таких соцсетей, как Facebook, «ВКонтакте», а также Википедия. Это скриптовый язык – с открытым исходным кодом. Он создавался специально для веб-разработок, а его синтаксис прост в изучении.
Познакомиться с языком Python можно на курсе Polycent «Программирование Python».

Мобильные разработки
На сегодняшний день мобильные приложения различаются по языкам программирования для смартфонов на основе Android и iOS. Android приложения пишут на Java и иногда на совместимых с ним JavaScript и HTML. Разработка приложений на Java отличается от веб-разработки на этом языке, но все же тем, кто им владеет, не придется начинать с нуля.
Мобильные устройства Apple используют оперативную систему iOS. Для их приложений используют два языка – Swift и Objective-C. Objective-C был первым языком для разработки iOS приложений. Это одна из версий языка C. Язык Swift появился только в 2014 году. Он прост для освоения, если вы новичок в программировании. Но применять свои знания вы сможете только для разработки iOS и macOS. Недавно в Swift появилась «детская» версия языка – Swift Playgrounds, рассчитанная на обучение программированию малышей. Познакомиться с языком Swift можно на курсе Polycent «iOS APP Creator».
Разработка игр
Игры сейчас чаще всего программируются на языке C# или создаются на популярном и удобном в использовании движке Unity. C# является расширенной версией языка C с важным дополнением в виде объектно-ориентированных возможностей. Unity – это инструмент для разработки двухмерных и трехмерных игр и приложений, которые могут работать более чем с 20 различными операционными системами. Познакомиться с этим языком можно на курсах Polycent «Программирование C#».
Научные вычисления
Для научных вычислений чаще всего используют языки C++ и Java . C++ также является одним из самых популярных в мире языков. При помощи программного кода этого языка можно делать различные арифметические операции. Его можно использовать для моделирования и расчётов.

Другие компьютерные языки
Список языков для программирования постоянно растет. Постараемся перечислить оставшиеся популярные языки.
C . Это самый влиятельный и самый полезный язык за всю историю программирования. Многие компиляторы и интерпретаторы для других языков написаны на языке C.
Logo . Это один из первых языков, разработанных для обучения программированию. До сих пор он известен. При помощи компьютерных команд дети программировать движения черепашки.
Scala . Это «улучшенная» версия Java. Этот язык подойдет начинающим программистам и уже практикующим Java разработчикам, которые хотят повысить эффективность своей работы.
Scratch . Язык программирования, созданный для обучения детей в игровой форме. Блоки выстраиваются в программе как разноцветные кубики LEGO.
XML . Это структурированный язык для разметки, предназначенный для чтения не только компьютером, но и человеком.
Ruby . Это динамический язык программирования с открытым кодом. Он обладает простым синтаксисом. Часто используется для веб-программирования.
Julia . Это относительно новый язык программирования. Он прост как Python, но менее популярен, потому что у него специфическая сфера применения – математическая обработка данных. Он совместим с языком C.
Hack . Это язык, разработанный специально для Facebook. Язык похож на PHP, обладает статической типизацией, отсутствием компиляций, что повышает безопасность и скорость работы.
Pixie . Этот язык еще находится в стадии разработки. Разработчики проводят аналоги с языком Lisp, который подходит для общего использования и для сценариев командной строки. Синтаксис позаимствован у функциональных языков, в частности – Clojure.
Ring . Это мультипарадигмальный язык с динамической типизацией для императивного, процедурного, объектно-ориентированного, функционального и метапрограммирования в связке с C/C ++ и отдельно.
Самые необычные языки программирования
INTERCALL . Это один из старейших языков программирования, созданный студентами в качестве пародии на существующие языки. Несмотря на это, он позволяет делать такие же вычисления, как и любой другой язык. Из необычного, например, знак равенства «=» называется «половина решётки». А некоторые команды звучат как «уйди», «забудь» и «пожалуйста, воздержитесь от вычислений».
Whitespace . Переводится как «пробел». Язык, созданный 1 апреля 2003 года, поначалу воспринимался как шутка. В нем используются только непечатные символы – пробел, табуляция, символ перевода строки. Благодаря этому текст программы Whitespace можно скрыть в исходниках другой программы.
Chef . Как можно догадаться из названия, написания программ на этом языке похоже на приготовление блюд по рецептам. Переменные названы в честь продуктов питания. Операции звучат как «смешивание», «размешать» и тд.
Примечание: Разнообразим обычные уроки программирования для детей играми, проектами и работой в команде. Это увеличивает интерес и мотивацию ребёнка к обучению. Scratch программирование, проводимое в нашем центре, подходит для школьников возрастом от 9 до 11 лет.
Ответы: Основы алгоритмизации и программирования. Синергия
Ответы представлены на ИТОГОВЫЙ ТЕСТ
Результат — 100 баллов
Перед покупкой сверьте список вопросов и убедитесь, что вам нужны ответы именно на эти вопросы!
С вопросами вы можете ознакомиться ДО покупки.
Для быстрого поиска вопроса используйте Ctrl+F.
- оперативной памяти
- процессора
- шины
- внешнего устройства
- регистре флагов
- плавающих регистрах
- общих регистрах
- double
- float
- char
- 9
- 7
- 16
- 15
- сложение
- умножение
- отрицание
- двойным амперсандом &&
- двойной вертикальной чертой ||
- восклицательным знаком «!»
- double
- сhar
- wchar
- double
- int
- bool
- float
- char
- не может быть изменена в процессе
- может быть изменена в процессе
- может быть изменена в конце
- занимает два байта
- занимает один байт
- имеет переменную длину
- старшие биты целого числа располагаются в байте со старшим адресом
- байты внутри машинного слова нумеруются слева направо
- байты внутри машинного слова нумеруются справа налево
- старшие биты целого числа располагаются в байте с младшим адресом
- /* …. */
- //
- ::
- один байт
- переменная длина
- два байта
- исполняемые
- неисполняемые
- составные
- /* …. */
- // (двойная косая черта)
- ::
- объектно-ориентированными языками
- языками логического программирования
- процедурными языками
- аппликативными языками
- нулевого
- первого
- второго
- LISP
- Prolog
- Java
- FORTRAN
- C++, COBOL, Java
- Perl, PHP, Java, C++
- Postscript, TeX
- C++, FORTRAN, Java
- LISP, Prolog
- Perl, PHP, Java, C++
- HTML, XML
- Postscript, TeX
- внешнее устройство
- процессор
- шина
- относительная адресация
- индексная адресация с масштабированием
- абсолютная адресация
- косвенная адресация
- относительная адресация
- индексная адресация с масштабированием
- абсолютная адресация
- косвенная адресация
- инструкциями
- указателями
- логарифмами
- массивами
- сами числа
- фактические адреса ячеек памяти
- и сами числа, и фактические адреса ячеек памяти
- ключевые слова, идентификаторы, символы операций, комментарии, пробелы и разделители
- только ключевые слова и комментарии
- только идентификаторы, символы операций
- только комментарии
- константа
- лексема
- мантисса
- транслятор
- переменной
- константой
- мантиссой
- вещественные числа
- биты, которые устанавливаются в единицу или ноль
- целые числа или адреса
- множество
- последовательность
- список
- массив переменных
- только регистры
- только элементы
- регистры или элементы
- Basic
- C
- Forman
- Pascal
- Assembler
- процедурные языки
- аппликативные языки
- объектно-ориентированные языки
- языки логического программирования
- 16
- 7
- 20
- 9
- х= = 0
- 0! = 0
- 3> = 0
- Fortran
- Assembler
- Pascal
- С
- язык программирования
- компилятор
- ассемблер
- компилятор
- синтаксис языка
- мантисса
- семантика языка
- синтаксис языка
- транслятор
- семантика языка
- синтаксического
- лексического
- семантического
- делении маленького числа на очень большое
- умножении больших чисел
- умножении двух очень маленьких по абсолютной величине чисел
- начале 1960-х годов
- конце 1960-х годов
- середине 1970-х годов
- начале 1980-х годов
- ложным
- порядке по их помещению
- обратном порядке по их помещению в стек
- порядке их выполнения
- C
- C#
- C++
- Cobol
- 1965 г.
- 1966 г.
- 1976 г.
- 1977 г.
- процедурным
- аппликативным
- объектно-ориентированным
- издательская деятельность
- удаленная обработка информации
- обработка информации
- системное программирование
- Мантисса
- Компилятор
- Константа
- Компилятор
- Кодировщик
- Язык программирования
- Система программирования
- процедурным языкам
- аппликативным языкам
- языкам логического программирования
- объектно-ориентированным языкам
Функциональные языки программирования
Функциональные языки программирования — это языки, в которых процессы представлены как функции в математическом понимании этого слова. То есть функция в них определяется не как подпрограмма, а как соответствие между множествами.

«IT-специалист с нуля» наш лучший курс для старта в IT
Такой подход к программированию называют функциональным. Название не значит, что код основан на функциях: это справедливо почти для любого языка. Функциональность определяется именно подходом: весь код описывается как правила работы с информацией, и они могут исполняться в любом порядке.
Функциональный подход — противоположность императивному, в котором программист задает программе четкий порядок действий по шагам. Тут все сложнее: программа сама решает, как и в каком порядке исполнять действия, а программист описывает правила взаимодействия и связи между компонентами.
Кто и где пользуется функциональным программированием
Сейчас программисты чаще всего работают с ООП — объектно-ориентированным программированием. Функциональный подход используют реже: он сложнее и применим не ко всем задачам. Но сейчас его популярность растет, и тому есть причины: чистота кода, надежность программ, высокие возможности для оптимизации.
Благодаря своим особенностям функциональное программирование распространено при работе с важными данными или при решении задач, где нужны сложные вычисления. Есть фреймворки, с которыми проще работать в функциональном стиле, а есть такие, в которых сочетаются оба подхода. Как пример — React и Redux для JavaScript.
Сейчас программисты придерживаются такого подхода: полностью писать какой-то проект в функциональном стиле не стоит, но его нужно держать в голове и использовать при решении конкретных задач. Эта идея актуальна для большинства направлений разработки.
Профессия / 8 месяцев
IT-специалист с нуля
Попробуйте 9 профессий за 2 месяца и выберите подходящую вам

Какие языки программирования функциональные
Условно можно выделить две группы. Первая — языки, жестко ориентированные на функциональное программирование. Вторая — так называемые мультипарадигменные языки, то есть такие, на которых можно писать по-разному. В том числе в функциональном стиле.
К функциональным языкам относятся Haskell, F#, OCaml, ELM, серия языков Lisp, а также Erlang и его потомок Elixir. Иногда сюда же относят Scala и Nemerle, хотя эти языки дают возможность программировать и в функциональном, и в императивном стилях. Они старые и сейчас применяются не так часто, как большинство современных.
Еще к этой группе относится несколько узкоспециализированных языков: язык вычислительной платформы Wolfram, языки J и K для финансового анализа, язык R для статистических целей. На функциональном языке APL базируется язык научной математической среды MATLAB. Также сюда можно отнести языки, которые используются при работе с электронными таблицами, а еще, частично, SQL — язык запросов для работы с базами данных.
К мультипарадигменным языкам, на которых можно писать в функциональном стиле, относятся уже упомянутые Scala и Nemerle, а также Go, JavaScript и некоторые его фреймворки. В меньшей степени сюда же можно отнести Python, Ruby, PHP и C++, а также Java: они больше ориентированы на ООП, но в них есть и функциональные элементы.
Разница между функциональным и императивным подходом
Чтобы лучше понять, как это работает, воспользуемся аналогией.
- Императивная парадигма похожа на правила умножения в столбик. Последовательность действий, их порядок и тип четко определены. Мы выполняем команды, которые кто-то придумал до нас, как по инструкции.
- Функциональная парадигма — это, скорее, правила орфографии и пунктуации. Нет четкой последовательности, как именно их применять. Правила нельзя представить как строгую инструкцию. Вместо этого мы сами решаем, какое правило в какой ситуации будет актуально. И последовательность, в которой мы это делаем, не имеет значения.

Курс для новичков «IT-специалист
с нуля» – разберемся, какая профессия вам подходит, и поможем вам ее освоить
В чем разница с ООП
Объектно-ориентированное программирование отличается от функциональной парадигмы. В нем все представлено в виде объектов, в функциональном — в виде функций. ООП смешивает данные и поведение, функциональный подход — разделяет. Различаются особенности работы с информацией, структура программ и многое другое.
ООП в целом относится скорее к императивному типу программирования: код — это набор команд, рассказывающих компьютеру, что делать. Но «чистым» императивным программированием его назвать сложно — скорее, дополненным и измененным.
Сложность изучения функциональных языков
О функциональном программировании можно услышать, что оно сложно в освоении. Но тут есть парадокс, о котором говорят некоторые программисты: новичку понять его принципы может быть легче, чем разработчику с опытом программирования в ООП. Это связано с тем, что разработчики в императивных стилях уже привыкли к определенному типу логики, а перестроиться на что-то принципиально новое сложнее, чем изучать с нуля.
Сейчас считается, что хороший разработчик должен разбираться в обеих парадигмах и знать, когда лучше применять одну, а когда — другую.
Особенности функционального подхода
Функциональное программирование определяется несколькими важными правилами. Это основы, которые нужно знать, чтобы представлять, как в принципе работает парадигма.
Отсутствие жесткой последовательности. Об этом мы уже говорили. Разработчик задает правила, а компилятор кода сам решает, в какой последовательности их выполнять. Жесткий порядок действий программист не задает. Его выбирает сама программа.
«Чистые» функции. Чистые функции — это такие, которые удовлетворяют двум условиям:
- при одинаковых входных данных функция всегда вернет одинаковый результат. То есть, функция, возвращающая сумму a и b, может быть чистой, а функция, возвращающая случайное число, — нет;
- когда функция выполняется, не возникают побочные эффекты — так называют действия, которые влияют на что-то за ее пределами. Например, изменение переменной, чтение данных или вывод в консоль — это побочные эффекты.
В функциональном программировании все функции должны быть чистыми. Кажется, будто это сложно и ограничивает разработчика, но на самом деле при грамотном подходе такое даже расширяет возможности. Ведь чистые функции можно запускать, не боясь, что они что-то изменят или нарушат.
Неизменные переменные. В функциональном программировании нет переменных в привычном виде. В нем все объявленные переменные неизменны — то есть фактически это константы. Если с какой-то переменной нужно провести вычисления, она не изменяется: создается новая переменная, и результат вычислений записывается в нее. А исходная остается прежней — ее значение не меняется.
«Первоклассные» функции высшего порядка. Все функции в функциональном программировании должны быть первого класса и высшего порядка. Сейчас объясним, что это значит.
- Функция первого класса — это такая, которую можно представить как переменную. То есть, ее можно передавать как аргумент другим функциям, возвращать как результат работы других функций, сохранять в переменную или структуру данных.
- Функция высшего порядка — такая, которая принимает в качестве аргументов функции или возвращает их в качестве результата.
Возможность работы с такими функциями есть не только в функциональном программировании. Более того, такое требование есть не только в нем. Но для него такой подход обязателен — вместе с другими особенностями.
Относительная прозрачность. Еще одно требование к функциям в функциональном программировании — относительная прозрачность. Это понятие может быть сложным для понимания, но мы постараемся его объяснить. Относительная прозрачность означает, что выражение, которое возвращает функция, можно заменить значением — и от этого ничего не изменится. То есть, если функция, например, складывает два числа 3 и 5, то она вернет сумму 3 + 5. Теоретически вместо этой функции в выражение можно подставить число 8, и от этого программа не изменится — она будет работать так же.
Это не означает, что функция должна выдавать одинаковый результат во всех случаях — только при одинаковых входных данных. Про это также говорит часть определения чистой функции.
Рекурсия вместо циклов. В классическом функциональном программировании циклы реализованы как рекурсия. Стоит понимать разницу:
- цикл — несколько выполнений одной и той же части кода подряд;
- рекурсия — явление, когда функция вызывает сама себя, но с другими аргументами.
Очень многие алгоритмы в функциональном подходе построены на рекурсии — функциях, вызывающих себя. Так реализованы многие действия, где что-то нужно выполнить несколько раз.
Лямбда-исчисление. Это особая математическая система, которая используется в функциональных языках программирования. Ее название также иногда пишут как λ-исчисление. Мы не будем углубляться в сложные математические понятия и выделим только несколько особенностей, важных для понимания функционального программирования:
- в λ-исчислении есть две основных операции — аппликация и абстракция. Первое — это, по сути, вызов функции к заданному значению. Второе — построение функции по имеющимся выражениям;
- все функции могут быть анонимными и складываться только из списка аргументов. Анонимные функции — это такие, у которых нет уникального имени, а объявляются они в месте выполнения;
- при вызове функции с несколькими аргументами происходит ее каррирование — преобразование в несколько функций, в каждой из которых один аргумент. То есть, функция вида f(a, b, c) превратится в набор функций f(a)(b)(c). Результатом f(a) будет функция, которая тут же применится к аргументу b. И так далее. Это рекурсия — та, о которой мы говорили выше.

Курс для новичков «IT-специалист
с нуля» – разберемся, какая профессия вам подходит, и поможем вам ее освоить
Преимущества функциональных языков
Чистота кода. Код, написанный на функциональном языке, выглядит чистым и понятным. Сюда же можно отнести локальную читаемость — можно разобраться, как работает та или иная функция, без строгой привязки к остальному коду. Код более чистый еще и за счет отсутствия четкой последовательности: чтобы понять происходящее в нем, не обязательно знать порядок выполнения разных действий.
Надежность. Благодаря тому, что функции чистые и не изменяют окружение вокруг себя, функциональный код более надежен. Если в одной конкретной функции что-то сломается, это не повлечет за собой проблемы с другими компонентами. Не нужно отслеживать побочные эффекты — согласно определению чистой функции их быть просто не должно. Правда, на практике это не всегда возможно, но эту деталь мы подробнее обсудим ниже.
Оптимизация. Когда компилятор обрабатывает функциональную программу, он сам решает, в каком порядке вызывать функции. За счет этого программы легче оптимизировать: такой подход открывает широкие возможности для автоматической оптимизации на уровне компилятора. Оптимизация означает, что код будет быстрее или производительнее.
Удобное тестирование. Благодаря все тем же чистым функциям этот стиль программирования удобнее отлаживать и тестировать. Особенно это заметно при модульном тестировании — таком, где каждый компонент проверяется по отдельности. Ведь если мы проверяем функцию, которая не изменяет ничего снаружи — значит, нам не нужно дополнительно думать о тестировании возможных побочных эффектов.
Распараллеливание вычислений. За счет отсутствия жесткой последовательности функциональное программирование отлично подходит для параллельных вычислений — одновременного выполнения нескольких действий. С императивным подходом их сложнее организовать, кроме того, нужно учитывать побочные эффекты. А функциональное программирование гарантирует, что вызов одной функции не повлияет на вызов другой — поэтому снижается риск ошибок и конфликтов при параллельных вычислениях.
Гибкая работа с функциями. Благодаря гибкой и сложной работе с функциями некоторые действия можно выполнять быстрее и удобнее, чем с императивным подходом. Это мощный инструмент, особенно для решения специфических задач: математических, научных, связанных с точными вычислениями или подобными сферами. Популярность подхода при решении таких задач видно и на практике: языки для математических, научных, экономических или статистических расчетов — по большей части функциональные.
Недостатки функциональных языков
Использование большого объема памяти. Этот минус вытекает из тех же особенностей, что и преимущества. Многие действия построены на рекурсии, а при изменении любого значения создается новая переменная — поэтому программа начинает требовать больше памяти, чем императивная с классическими циклами и изменяемыми значениями. Это значит, что для эффективной работы в языке должен быть мощный сборщик мусора или удобные инструменты для ручной работы с памятью. За ней нужно следить, иначе есть риск серьезного снижения производительности.
Непредсказуемый порядок действий. Эта особенность функционального программирования — плюс и минус одновременно. О плюсах мы уже говорили выше. Минус в том, что для некоторых важных задач порядок действий важен по определению. Например, ввод и вывод. Если данные будут вводиться или выводиться хаотично, в непредсказуемом порядке, это ухудшит работу программы. Поэтому часто функциональное программирование комбинируют с императивным — для большей гибкости и производительности кода в целом.
Неуниверсальность чистых функций. Одними чистыми функциями не получится решить многие задачи. Некоторые важные действия по определению сложно или невозможно реализовать через чистые функции. Поэтому программистам приходится прибегать к дополнительным ухищрениям и усложнять код, чтобы избежать этого минуса. Также некоторые функции на практике оказываются не совсем чистыми — тут опять же приходится обходить ограничения и придумывать новые способы.
Как начать программировать в функциональном стиле
Сначала вам понадобится познакомиться с основами парадигмы и с теорией. Можно скомбинировать это с началом изучения функциональных языков, чтобы сразу «пощупать» подход на практике. Но помните, что многие решения сначала могут показаться вам неочевидными — к особым принципам нужно привыкнуть. Тем не менее, функциональное программирование – мощный и интересный инструмент, и изучить его вполне реально даже новичку.
IT-специалист с нуля
Наш лучший курс для старта в IT. За 2 месяца вы пробуете себя в девяти разных профессиях: мобильной и веб-разработке, тестировании, аналитике и даже Data Science — выберите подходящую и сразу освойте ее.
Cat, Mouse и Brainfuck: сколько языков программирования существует в мире
Мы задались вопросом, сколько языков программирования есть в мире и чем они отличаются друг от друга. Даем развернутый ответ.



Наталья Березовская
Автор в сфере IT, digital, экономики и финансов. Ведёт некоммерческий проект для начинающих писателей «ЛитЦех».
Язык программирования — это система семантических, лексических и синтаксических правил, придуманная человеком для написания программ, которые выполняет компьютер.
С начала существования первых вычислительных машин человечество придумало более 8 тысяч языков программирования. Почему так много? Они создавались в разных странах и разными компаниями для решения отличающихся задач. Некоторые разработчики пишут собственные формальные языки и интерпретаторы ради эксперимента или практики. Поэтому сколько языков программирования в мире, точно сказать невозможно: новые могут появляться в ту самую секунду, когда вы читаете этот текст.

В информатике есть множество классификаций. Они могут быть основаны на технических свойствах, ярко выраженных особенностях или субъективном взгляде составителя. Единого мнения нет, но мы все же рассмотрим, какие существуют виды языков программирования и как они связаны между собой.
Низкоуровневые и высокоуровневые
Исходя из парадигмы программирования, условно их можно разделить на поколения. К первым двум поколениям относятся низкоуровневые языки: машинный код и ассемблеры. Они ориентированы на особенности конкретного аппаратного обеспечения и, в принципе, даже не соотносятся с какой-либо парадигмой.

Усложнение программ привело к тому, что люди уже не могли эффективно писать их на устаревшем языке ассемблера. В 1970-е годы разработчики создали первый высокоуровневый язык, многим известный Fortran, который используется и сейчас — в основном в научных разработках и вычислениях. В третьем и четвертом поколениях оформилось структурное программирование и появились функциональные языки: это, например, C, Pascal, Lisp, Scala, Erlang, F#, Haskell и другие.
Сегодня говорят уже о сверхвысокоуровневых языках, для которых характерен еще больший градус абстракции, чем в предыдущих. К этой группе относят Python, Ruby, Haskell, Perl.
Интерпретируемые и компилируемые
Это разделение основано на способе реализации — компиляция или интерпретация. Первый означает, что исходный код преобразуется в машинный через компилятор. Полученный результат (исполняемый модуль) уже может быть запущен как отдельная программа. Среди языков этой группы наиболее известны Ada, C, Java, Pascal, Basic, Visual Basic, Cobol, Swift, Go, Haskell, C#, Kotlin, .NET, Python и Erlang.

Интерпретация — это выполнение кода непосредственно и построчно, то есть команда за командой. В этом случае программа не может быть запущена без интерпретатора. К языкам такого типа относятся PHP, JavaScript, Python, Lava, MATLAB, Perl и другие.

Преимущество и главное отличие интерпретатора от компилятора в том, что разработчик может изменить код программы на сервере, и это сразу будет применено при запросе к нему. Программисту компилируемого языка нужно после внесения изменений перекомпилировать код и отправить полученный файл на сервер.
Со статической и динамической типизацией
Еще один вариант классификации — по мощности и строгости типов того или иного языка. Динамическая типизация означает, что переменная получает свой тип не при ее объявлении, а в момент присвоения ей значения. Динамически типизированные языки — это PHP, JavaScript, Ruby, Python, Objective-C, Lisp, Perl, Erlang, Visual Basic, Smalltalk.
Статическая типизация — противоположный прием: переменная получает свой тип при ее объявлении, и он не может быть изменен позже. Примеры статически типизированных языков: Java, Pascal, C++, C#, Ada.
Эзотерические языки
Их еще называют игрушечными — это языки, которые разработали «for fun», но вместе с тем они исследуют возможности программирования, пародируя существующие «серьезные» технологии и становясь их абсурдной реализацией.
Некоторые из них созданы на основе литературного синтаксиса, например, шекспировских пьес, кулинарных рецептов, японских стихотворений хайку. И даже на основе вымышленной инопланетной логики клингонов из сериала «Star Trek» — язык Var’Aq.
Один из широко известных эзотерических языков — Brainfuck («вынос мозга»), созданный в 1993 году Урбаном Мюллером. В нем всего восемь команд, и каждая записывается одним символом. Несмотря на свой минимализм, Brainfuck обладает тьюринг-полнотой — то есть на нем определенно можно реализовать любую вычислимую функцию. Следуя его концепции, многие разработчики написали свой игрушечный язык наподобие Brainfuck.

Специальные языки
Их создавали для решения каких-то очень узких специфических задач. Например, язык Mouse был разработан для управления цифровыми и аналоговыми устройствами в электронной музыкальной студии. Его элементы состоят из единичных символов, и в нем всего 26 переменных, ограниченных буквами латинского алфавита от A до Z. Вот пример небольшой программы на нем:

Еще одна известная пара — Visual Basic for Applications (VBA) и Microsoft Excel. А в случаях, когда оба они являются визуальными, встраиваемые языки называют плагинами или фильтрами. Так, можно очень условно сказать, что для визуального метаязыка Adobe Photoshop существует множество встраиваемых мини-языков — плагинов.
Актуальные языки
Несмотря на огромное их количество, в разработке сегодня используется не так много. Языки программирования со временем устаревают, так как технологии развиваются и становятся все более совершенными и быстрыми. Это нормальный процесс, который наметился еще в шестидесятых-семидесятых годах прошлого столетия.
Существует множество рейтингов и площадок в интернете, составляющих топы актуальных языков. Например, индекс TIOBE анализирует количество поисковых запросов и выдает динамику популярности того или иного языка по месяцам:

После 20-й позиции можно видеть менее востребованные технологии или те, которые используют в очень узких сферах:

Однако рейтинги и топы в интернете могут иметь статистические погрешности. Индексы TIOBE и PYPL ориентируются только на поисковые запросы: первый — на их количество, а второй — на то, как часто люди гуглят тот или иной язык. На самом деле узнать, сколько разработчиков в мире используют Python, R или Ruby, непросто — для этого придется провести очень масштабное и сложное исследование. Если вы знаете, как это сделать, напишите в комментариях.
Мы предложили бы ориентироваться на ежегодный отчет GitHub, где указывается 15 наиболее популярных на этой платформе языков. Пусть выборка включает в себя только проекты с открытым исходным кодом и не охватывает 100% профессиональной области, она все же более близка к истине. По этим данным рейтинг за 2017 год:


Здесь тоже лидируют JavaScript и относящиеся к frontend языки разметки HTML и CSS.
Какой язык выбрать для освоения?
Мы частично рассмотрели, какие языки программирования существуют сегодня. Какой же выбрать из всего этого многообразия? Жизнь диктует свои простые условия: технология всегда выбирается под решение конкретной задачи. Мир IT огромен, и потому в нем столько языков. Новичок может выбрать актуальный в той сфере, которая ему близка и интересна.
Например, для анализа данных применяются Python и R, «короли» веб-разработки — PHP и JavaScript, работа в банковских системах и госструктурах не обойдется без Java, ААА-игры создаются на C++ и C# и так далее.
Наиболее перспективные сферы разработки программного обеспечения:
- искусственный интеллект;
- «интернет вещей» и встраиваемые системы;
- Data Science;
- мобильные приложения;
- блокчейн.
Выбирайте то, что вам близко, и ориентируйтесь на актуальные данные по востребованности, профессиональные рейтинги и тенденции.
Заключение
Неважно, сколько языков знает программист, — главное, чтобы он владел ими на профессиональном уровне, а также понимал основы разработки, умел пользоваться современными инструментами и фреймворками. Сегодня также востребованы fullstack-специалисты, которые разбираются сразу во всем.
Читайте также:
- Чем Rust отличается от «плюсов»: откровение ветерана С++
- Нетоксичный чат для джунов: прокачать скиллы, найти ментора и первую работу
- Все любят язык Go: почему он стал популярным и сколько зарабатывают разработчики