Гайд по языкам программирования — ч.1: типы и парадигмы
⚡ 13 февраля 2024
Рекрутеру жизненно необходимо разбираться в языках программирования, чтобы нанимать технических специалистов. Мы решили сделать большой гайд, в котором расскажем всё-всё про них. Но, поскольку тема довольно объёмная, разделили материал на несколько частей. В этой статье мы расскажем, **что из себя представляют языки разработки и на какие типы они делятся**. Почему бы не рассказать сразу про то, на каких языках могут писать программисты? Всё просто — нужны базовые знания IT-терминологии, чтобы понимать языки на достаточно глубоком уровне и быть с айтишниками на одной волне. **Краткое содержание:** <div style="display: flex; flex-direction: column; font-size: 20px; gap: 8px;"> <a href="#1">Языки программирования</a> <a href="#2">Типы языков программирования:</a> <div style="display: flex; flex-direction: column; font-size: 18px; margin-left: 20px;"> <a href="#2">Низкоуровневые и высокоуровневые</a> <a href="#3">Компилируемые и интерпретируемые</a> <a href="#4">Различия в типизации</a> <a href="#5">Универсальные и специальные</a> <a href="#6">Визуальные и эзотерические</a> </div> <a href="#7">Императивные и декларативные парадигмы</a> </div> <h2 id="1">Языки программирования — что это?</h2> **Язык программирования** — это набор правил и символов, которые нужны для написания кода. А **код** представляет собой команды, которые разработчик отправляет компьютеру, чтобы он выполнил необходимые действия. Заданная последовательность таких действий называется алгоритмом. Если слова служат средством общения между людьми, то язык программирования создаёт мост между разработчиком и машиной. ![](https://backend.refni.ru/api/storage/blog-posts-preview-imgs/attachments/156.webp) **Каждый язык содержит:** - Алфавит — символы, используемые для передачи команд. - Синтаксис — правила написания команд. - Семантику — смысловое значение команд. При этом одни языки предназначены для **бэкенда** (англ. back-end) — внутренней и скрытой от глаз части сайта или приложения, которая отвечает за взаимодействие пользователя с данными. А другие для **фронтенда** (англ. front-end) — внешней оболочки, которую видит пользователь и через которую взаимодействует с ресурсом. <h2 id="2">Типы языков программирования</h2> <h3>Низкоуровневые и высокоуровневые</h3> **Низкоуровневые** «общаются» с процессором компьютера и указывают ему, что нужно делать: вывести изображение на экран, открыть документ, запустить программу и так далее. Они не содержат готовых команд, поэтому программисты описывают каждое действие. *Примеры: Assembler, C, C++, Ada, Pascal, Fortran* **Плюсы:** - Можно управлять производительностью софта. - Код легко переносить на другие платформы. **Минусы:** - Сложный синтаксис и структура. **Высокоуровневые** созданы, чтобы упростить работу программиста. Они не зависят от процессора и других частей техники, состоят из блоков и включают инструменты для составления сложных конструкций. *Примеры: Python, Java, C#, JavaScript, PHP* **Плюсы:** - Обладают понятным синтаксисом. - Позволяют быстрее разрабатывать и модифицировать приложения. **Минусы:** - Низкая производительность в сравнении с низкоуровневыми. У каждого языка свои уникальные методы обработки данных и инструкции, поэтому их классификация по уровням относительна. <h3 id="3">Компилируемые и интерпретируемые</h3> Компиляторы и интерпретаторы необходимы, чтобы переводить код на машинный язык, понятный компьютеру. В основном они нужны для высокоуровневых языков, которые содержат готовые команды. **Компилятор** работает гораздо шустрее — он переводит исходный код всей программы за раз и преобразует его. *Примеры: C, C++, Pascal, Haskell, Rust и Go* **Плюсы:** - Высокая производительность. - Ошибки можно обнаружить в процессе компиляции. - Эффективное использование памяти и процессора. **Минусы:** - Нужно заново компилировать код, при внесении изменений или переносе на другие платформы. **Интерпретаторы** переводят каждую строку кода по очереди, что в разы замедляет процесс перевода. *Примеры: PHP, Ruby, Python и JavaScript* **Плюсы:** - Быстрый запуск и тестирование. - Простой перенос между платформами. **Минусы:** - Низкая эффективность. - Риск ошибок на этапе выполнения. Некоторые языки могут быть «обработаны» обоими способами. <h3 id="4">Различия в типизации</h3> Каждый язык программирования содержит переменные — область физической или виртуальной памяти, в которой хранятся данные. Каждой переменной присваивается тип, который обозначает, какая именно информация в ней записана и что с ней можно делать. Так вот, **типизация** — это то, каким образом компьютер распознаёт типы переменных при написании кода. ![](https://backend.refni.ru/api/storage/blog-posts-preview-imgs/attachments/159.webp) **Типизация бывает:** **Слабой** *(JavaScript, PHP)* и **сильной** *(Java, C++)* — чем сильнее типизация, тем более строгих правил придётся придерживаться разработчику в процессе кодинга. **Статической** *(Java, C, C++)* и **динамической** *(JavaScript, Python)* — в первом случае ошибки в типах будут обнаруживаться до запуска программы, а во втором во время её выполнения. **Явной** *(C#, Swift)* и **неявной** *(Python, Ruby)* — если типизация неявная, то тип определяется только в момент записи информации в переменную. <h3 id="5">Универсальные и специальные</h3> **Универсальные** обладают широким функционалом и могут быть задействованы в разных задачах и проектах, включая игры и софт для бизнеса. *Примеры: Java, Python, JavaScript, C++* **Плюсы:** - Подходят для осуществления различных идей. - Имеют множество библиотек и фреймворков для ускорения разработки. **Минусы:** - Проблемы с масштабируемостью, эффективностью и оптимизацией в крупных проектах. **Специальные** предназначены для конкретных областей. Среди них Swift и Objective-C, которые созданы для разработки мобильных приложений под iOS и macOS. *Примеры: Swift, SQL, Matlab, LaTeX* **Плюсы:** - Хорошо подходят для выполнения задач в конкретных областях. **Минусы:** - Ограниченное применение. <h3 id="6">Визуальные</h3> Они напоминают конструктор из деталей. Допустим, в LabVIEW можно сделать приложение из готовых блоков, которые обозначают то или иное действие. *Примеры: Scratch, Blockly, Simulink, App Inventor* **Плюсы:** - Подойдут новичкам, так как интуитивно понятны и легко визуализируются. **Минусы:** - Ограничены в функциональности и не подходят для сложных проектов. ### Эзотерические Специалисты применяют их скорее для развлечения и экспериментов. К примеру, для обучения информатике, демонстрации идей, конкурсов с нестандартными задачами. *Примеры: INTERCAL, False, Brainfuck, Piet* **Плюсы:** - Предоставляют новые подходы в разработке. **Минусы:** - Не встретишь в реальных проектах из-за своей сложности и нестандартности. <h2 id="7">Императивные и декларативные парадигмы</h2> Языки программирования также могут делиться на классы в зависимости от подхода к решению задач и правил «письма» на языке — парадигм. Две основные парадигмы, императивная и декларативная, включают в себя другие. ### Императивная парадигма ![](https://backend.refni.ru/api/storage/blog-posts-preview-imgs/attachments/158.webp) Код пишется в виде пошаговых инструкций для выполнения машиной. Он не требует компиляции и понимается компьютером напрямую. Этой парадигме присуще использование низкоуровневых языков, но позже к ним добавились C++ и Java. В рамках императивной парадигмы есть несколько подходов к программированию: **Процедурное программирование** *Примеры: C, Pascal, COBOL, Fortran, BASIC, ALGOL, PL/I и Ada* Здесь центральное место занимает **функция** (процедура) — сформированная последовательность действий. Её можно сравнить с рецептом. У него есть своё название, например «Спагетти Болоньезе». Мы приходим в ресторан и заказываем блюдо, а не ингредиенты по отдельности. Так и разработчик, когда пишет на процедурном языке — просто прописывает готовые конструкции в определённой последовательности. **Плюсы:** - Функции (процедуры) могут быть повторно использованы. **Минусы:** - Сложно поддерживать изменения в коде при росте проекта. - Меньшая модульность и гибкость по сравнению с объектно-ориентированным программированием. - Требуется время на отладку и поиск ошибок. **Объектно-ориентированное программирование (ООП)** *Примеры: Java, Python, C++, C#, Ruby, JavaScript и PHP* Это подход, основанный на концепции объектов и классов. Чтобы лучше понять, как он «работает», рассмотрим пример с уже упомянутым «Спагетти Болоньезе». Чтобы разработать приложение для итальянского ресторана, программисту нужно создать объекты — пасту и пиццу. Однако для технического средства блюда пока не имеют никаких различий. Для этого разработчик прописывает классы — шаблоны, которые описывают свойства и поведение наших объектов. Оба блюда изготавливаются из теста, поэтому они будут относиться к одному классу «тесто». Но пицца круглая, а паста выполнена в форме трубочек, а значит эти свойства будут относиться уже к разным классам. Это не говоря уже о том, что и пицца, и паста могут быть самых разных форм, а значит и классов. Вдобавок, у пиццы и пасты могут быть различные методы, которые определяют их поведение. Скажем, у пиццы может быть метод «запекаться в печи», а у пасты «вариться в кастрюле». Таким образом, все операции при написании кода — взаимодействие между объектами и классами, основываясь на методы их поведения. **Плюсы:** - Имеет понятную структуру. - Упрощается работа с большими проектами. **Минусы:** - Некоторые операции могут занимать много времени из-за дополнительных этапов, в отличие от процедурного метода. **Структурное программирование** *Примеры: Python, Java, C, C++, C#, JavaScript, Go* Структурная разработка стоит на трёх китах — правилах, придерживаясь которых создаётся программа: - **Последовательность**. Если возвращаться к спагетти, то в рецепте у нас шаги идут последовательно. Так и здесь — компоненты идут по порядку. - **Ветвление**. В какой-то момент приготовления нашего блюда надо проверить, а посолили ли его — да или нет? Операция используется, когда мы хотим, чтобы последующая работа приложения зависела от выполнения или невыполнения установленного условия. - **Цикл**. Предположим, по рецепту пасту стоит варить 10 минут. И пока это время не пройдёт — дальше готовить не нужно. Тогда разработчик может добавить правило «цикла», чтобы программа проверяла время и возвращалась на шаг ожидания до тех пор пока не пройдёт 10 минут. Считается, что с этими тремя конструкциями можно сделать даже самый сложный софт. **Плюсы:** - Чёткая структура. - Удобство поддержки и сопровождения кода, простота отладки. **Минусы:** - Сложность обработки определенных типов задач. ### Декларативная парадигма ![](https://backend.refni.ru/api/storage/blog-posts-preview-imgs/attachments/157.webp) *Примеры: Haskell, Scala, Clojure, Erlang, F#, OCaml и Lisp* В декларативной парадигме разработчик сразу описывает результат, который он ожидает от машины, а она ищет способ его получить. Если же обозначить результат слишком размыто, то компьютер может начать делать не то, что нужно. Представьте, что вы хотите классическое «Спагетти Болоньезе», а вам приносят какой-нибудь необычный вариант блюда. **Функциональное программирование** К современной декларативной парадигме прежде всего относится функциональное программирование. Человек описывает компоненты, связи и правила их взаимодействия, а программа сама решает, как и в каком порядке выполнять действия, чтобы достичь результата. Важно, что функциональная разработка считается «чистой» — специалист с большей вероятностью получит то блюдо, которое он заказывал. **Плюсы:** - Облегчает процесс тестирования кода благодаря предсказуемости. - Функции не влияют на другие части программы. **Минусы:** - Может быть неэффективным при работе с большими объемами данных. #### Заключение Вот и всё — мы перечислили типы языков разработки, которые вы можете чаще всего встречать в своей работе. Обязательно следите за нашими новостями в [Телеграм](https://t.me/refni_ru): совсем скоро мы выпустим вторую часть нашего гайда, где расскажем про популярные языки программирования.