1.1. Введение в программирование
Процессор компьютера не способен понимать напрямую языки программирования, такие как C++, С#, Java, Kotlin, Python и т.д. Очень ограниченный набор инструкций, которые изначально понимает процессор, называется машинным кодом (или «машинным языком»). То, как эти инструкции организованы, выходит за рамки данного введения, но стоит отметить две вещи.
Во-первых, каждая команда (инструкция) состоит только из определенной последовательности (набора) цифр: 0 и 1 . Эти числа называются битами или двоичным кодом.
Например, одна команда машинного кода архитектуры ×86 выглядит следующим образом:
Во-вторых, каждый набор бит переводится процессором в инструкции для выполнения определенного задания (например, сравнить два числа или переместить число в определенную ячейку памяти). Разные типы процессоров обычно имеют разные наборы инструкций, поэтому инструкции, которые будут работать на процессорах Intel (используются в персональных компьютерах), с большей долей вероятности, не будут работать на процессорах Xenon (используются в игровых приставках Xbox). Раньше, когда компьютеры только начинали массово распространяться, программисты должны были писать программы непосредственно на машинном языке, что было очень неудобно, сложно и занимало намного больше времени, чем сейчас.
Язык ассемблера
Так как программировать на машинном языке — удовольствие специфическое, то программисты изобрели язык ассемблера. В этом языке каждая команда идентифицируется коротким именем (а не набором единиц с нулями), и переменными можно управлять через их имена. Таким образом, писать/читать код стало гораздо легче. Тем не менее, процессор все равно не понимает язык ассемблера напрямую. Его также нужно переводить, с помощью ассемблера, в машинный код. Ассемблер — это транслятор (переводчик), который переводит код, написанный на языке ассемблера, в машинный язык.
Преимуществом Ассемблера является его производительность (точнее скорость выполнения) и он до сих пор используется, когда это имеет решающее значение. Тем не менее, причина подобного преимущества заключается в том, что программирование на этом языке адаптируется к конкретному процессору. Программы, адаптированные под один процессор, не будут работать с другим. Кроме того, чтобы программировать на Ассемблере, по-прежнему нужно знать очень много не очень читабельных инструкций для выполнения даже простого задания.
Например, вот вышеприведенная команда, но уже на языке ассемблера:
Высокоуровневые языки программирования
Для решения проблем читабельности кода и чрезмерной сложности были разработаны высокоуровневые языки программирования. C, C++, Pascal, Java, JavaScript и Perl — это всё языки высокого уровня. Они позволяют писать и выполнять программы, не переживая о совместимости кода с разными архитектурами процессоров. Программы, написанные на языках высокого уровня, также должны быть переведены в машинный код перед выполнением. Есть два варианта:
- компиляция, которая выполняется компилятором;
- интерпретация, которая выполняется интерпретатором.
Компилятор — это программа, которая читает код и создает автономную (способную работать независимо от другого аппаратного или программного обеспечения) исполняемую программу, которую процессор понимает напрямую. При запуске программы весь код компилируется целиком, а затем создается исполняемый файл и уже при повторном запуске программы компиляция не выполняется.
Проще говоря, процесс компиляции и сполнения программ выглядит следующим образом:

На языках C#/Java/Kotlin в данный процесс добавляется еще один компонент в виде виртуальной машины (для C# — CLR, Java/Kotlin — JVM), целью которой является исполнением байт-кода. Таким образом программа может быть выполненена независимо от платформы, в отличии от программ на C++. Достаточно, чтобы на этой платформе была виртуальная машина для соответствуюещго компиялтора языка.

Интерпретатор — это программа, которая напрямую выполняет код, без его предыдущей компиляции в исполняемый файл. Интерпретаторы более гибкие, но менее эффективные, так как процесс интерпретации выполняется повторно при каждом запуске программы.

Любой язык программирования может быть компилируемым или интерпретируемым, однако, такие языки, как C, C++ и Pascal — компилируются, в то время как «скриптовые» языки, такие, как Perl и JavaScript — интерпретируются. Некоторые языки программирования (например, Python) могут как компилироваться, так и интерпретироваться.
Что такое язык программирования

Представьте, что вас на улице спросили, как дойти до ближайшей аптеки. Для того, чтобы объяснить дорогу, вам нужно использовать язык, который понимает человек, и набор конкретных инструкций (ориентиров), которые помогут ему достичь цели.
Язык программирования работает аналогичным образом: он помогает человеку объяснить компьютеру, какие действия ему нужно выполнить.
Как и в случае с естественными языками (испанский, английский, китайский и другие), существуют различные языки программирования: Python, Java и C++. Каждый из них имеет свой набор правил и синтаксис, которые программисты используют для написания кода.
Инструкции компьютеру могут быть как простыми (например сложи число А и число Б), так и очень сложными: например, выполни действия, необходимые для создания видеоигры или мобильного приложения. Код на определенном языке — набор действий, которые приведут к конкретному результату.
Чем язык программирования отличается от алгоритма
Со стороны может показаться, что это совершенно разные вещи, однако они связаны между собой. Алгоритм — набор инструкций и шагов, которые сообщают компьютеру, что именно нужно сделать. А язык программирования — инструмент для написания этих инструкций так, чтобы компьютер смог их понять.
Если провести аналогию с кулинарией, то алгоритм можно сравнить с рецептом торта: он содержит информацию, каким ингредиенты нужно добавить, в каких пропорциях смешать и как долго выпекать получившееся тесто.
Язык программирования в этой аналогии — язык, на котором написан рецепт. Точно так же, как разные люди могут написать один и тот же рецепт на разных языках, программисты могут написать один и тот же алгоритм на разных языках программирования.
Как компьютер понимает языки программирования
Компьютер распознает языки программирования с помощью специальных программ — компилятора или интерпретатора. Они переводят код, который разработчик пишет на языке программирования, в машинный код, который компьютер может понять и выполнить.
Машинный код — это язык самого низкого уровня, который состоит из 1 и 0. Он непосредственно инструктирует процессор компьютера, какие именно операции нужно выполнить и в каком порядке. Это самая фундаментальная форма существования кода и единственный язык, который компьютер может по-настоящему понять без использования интерпретатора или компилятора.
Как только машинный код сгенерирован, компьютер может выполнить задачи, поставленные программистом.
Что такое библиотеки
Библиотеки — это коллекции предварительно написанного кода, который упрощает работу программиста. По сути, библиотека — набор инструментов, который помогает выполнять определенную задачу определенной задачи без необходимости писать код с нуля. Это экономит время и усилия и позволяет разработчикам сосредоточиться на создании уникальных частей своей программы.
Библиотеки содержат широкий спектр возможностей: от инструментов для написания простых функций, выполняющих базовые вычисления, до сложных алгоритмов, решающих запутанные задачи. Существуют библиотеки практически для каждого языка программирования и для самых разных целей: например, для создание пользовательских интерфейсов, обработки данных или подключения к внешним службам по API.
Откуда берутся языки программирования
Языки программирования удобны для человека — они намного ближе к естественному языку (в данном случае, к английскому), чем машинный код. Объявлять переменные, создавать функции и работать с массивами намного удобнее, если каждый их этих элементов синтаксиса обозначен понятными словами. Например, в JavaScript они называются var, function и arr соответственно.
Когда компьютеры только появились, первые программисты писали на машинном коде использую последовательность нулей и единиц. Это требовало глубоких знаний, занимало много времени и сильно ограничивало разработчиков.
Компиляторы и интерпретаторы появились одновременно с языками программирования: они помогают перевести код на языке, понятном человеку, на язык, понятный компьютеру.
Почему языки программирования появляются и исчезают
Языки программирования, как и любая другая технология, могут появляться и исчезать по целому ряду причин.
- Требования пользователей и разработчиков меняются. Например, новый язык программирования может быть создан для решения конкретных проблем или для использования преимуществ новых аппаратных или программных возможностей. По мере развития технологий могут появляться новые языки программирования, отвечающие новым требованиям.
- Языки программирования устаревают. Им на смену приходят новые, которые предлагают лучшую производительность, функции или простоту использования. Например, COBOL, язык программирования, который широко использовался в 1970-х и 1980-х годах, был постепенно вытеснен Java, Python и JavaScript, которые предлагают более современные функции и которые легче изучать и использовать.
Кроме того, некоторые языки программирования могут исчезнуть просто потому, что они непопулярны. Если язык не получил широкого распространения, он не получает необходимой поддержки от сообщества разработчиков и ресурсов, необходимых для его дальнейшего существования и развития.
Языки программирования: что это такое, зачем нужны и какой выбрать новичку
Разбираемся, как устроены языки программирования, почему их так много и чем они отличаются от алгоритмов.



Что такое язык программирования
Язык программирования — это набор формальных правил, по которым пишут программы. Обычный язык нужен для общения людей, а язык программирования — для общения с компьютером. Как и в любом естественном языке, тут есть лексика — слова, функции и операторы, из которых по правилам синтаксиса составляются выражения. Они имеют чёткий, вполне определённый смысл, понятный компьютеру, — семантику.
Вот, например, программа на языке JavaScript:
Здесь слово alert — лексика, один из принятых в языке методов обработки текста. Текст в одинарных кавычках, скобки, точка с запятой — правила синтаксиса. А то, что нужно сделать в итоге, — семантика. Получив эти инструкции, компьютер выведет на экран всплывающее окно с кнопкой и сообщением: «Это программа на JavaScript».

Чем языки программирования отличаются от алгоритмов
Программы нужны для того, чтобы машина сделала что-то полезное. Это невозможно, если нет чёткого порядка действий и правил их выполнения — алгоритма.
Алгоритм работает как маршрут в навигаторе: «Из пункта А едем в пункт Б, поворот через 150 метров». Англичанин понимает его по-английски, китаец —
по-китайски, а мы с вами — по-русски. Языки разные, а порядок действий один и все должны добраться до нужного места.
Любая программа начинается с алгоритма, но на разных языках это может выглядеть по-разному. Например, вот эта — на языке С — проверяет, чтобы делитель не был нулём, а затем делит одно число на другое. Или пишет, что так делать нельзя.
То же самое, но на Python.
В программе на Python нет фигурных скобок и точек с запятой, но алгоритм и результат работы такой же, как у программы на C, да и слова похожи.
Перейти с одного языка программирования на другой легко: если знаешь Java — быстро начнёшь кодить, например, на Python или C#.
Как компьютер понимает разные языки программирования
На самом деле язык программирования — это не язык компьютера. Машина понимает последовательности нулей и единичек: есть напряжение в цепи — единица, нет — ноль. Поэтому любую программу сначала надо перевести в набор таких машинных команд.
Для этого есть два инструмента — компилятор и интерпретатор. Компилятор работает как бюро переводов: вы отдаёте ему весь текст программы, а он превращает его в исполняемый код, набор команд для процессора. Интерпретатор больше похож на переводчика-синхрониста: сказали фразу — синхронист тут же её перевёл, а компьютер выполнил.
Внутри компиляторов и интерпретаторов — сложные наборы правил по превращению языка программирования в машинный код, понятный компьютеру. Это тоже программы. Их пишут создатели нового языка — на каком-то другом, уже существующем. Например, интерпретатор Python написан на C, а сам C — на ассемблере, практически машинном коде.
Что такое библиотеки
Библиотеки — наборы функций, готовых шаблонов, написанных на каком-то из языков программирования. Это удобно и похоже на книги в обычной библиотеке: на них можно ссылаться внутри программ и сразу получать результат без необходимости каждый раз писать много кода.
Например, в Python есть модуль — библиотека yandex_translate, которая переводит тексты на разные языки. Программистам не надо создавать программу-переводчик с нуля, достаточно подключить этот модуль и обратиться к нему из любой точки кода.
Зачем нужны новые языки, если есть много старых
Существует уже несколько тысяч языков программирования, но всё равно продолжают создавать новые. Обычно это делается для решения каких-то конкретных задач, но иногда и для одного-единственного станка с ЧПУ или нового устройства. Так происходит, когда имеющийся язык почему-то стало неудобно использовать.
Так появился, например, гибкий и мощный язык программирования С, который сейчас используют повсеместно. По одной из легенд — языку уже около 50 лет, — программисты из AT& T Керниган и Ритчи захотели перенести любимую игру с главного сервера компании на офисный компьютер. Но там не было операционной системы, а переписать имеющуюся показалось слишком сложно, потому что она была полностью на ассемблере. Тогда они решили создать свой язык программирования, который назвали C (си).
Сколько живут языки программирования
Языки живут, пока люди пользуются написанными на них программами. Поэтому старички, такие как COBOL, Ada или Fortran, всё ещё в деле.
На языках Ada и Fortran написана часть кода операционных систем семейства Unix, а для COBOL, похоже, вовсе наступил ренессанс: из-за кризиса, связанного с пандемией, приходится вносить изменения в старые бизнес-системы и программы для службы соцобеспечения, которые написаны именно на нём. Кроме того, по данным Reuters, 43% банковских систем и 95% банкоматов США так или иначе используют COBOL. Так что Америка ищет программистов-ветеранов.
А вот Алголу повезло меньше. Он практически мёртв, хотя и был когда-то не менее популярен, чем COBOL.
Что лучше учить новичку
Если интересуют красивые эффекты для веба — попробуйте начать с простейшего набора из JavaScript, CSS и HTML. Со временем подтянете PHP и сможете создавать на нём полноценные сайты. Если же вам интереснее программы, сервисы и скрипты — посмотрите в сторону Python, Java или С#. Для новичка может быть сложновато, зато это мощные универсальные языки, которые подходят практически для любых задач. Под мобильную разработку учите Swift для iOS и Java/Kotlin для Android. Но с ними придется попотеть и лучше, чтобы был хоть какой-то опыт в программировании.
Интерпретатор
Интерпретатор (interpreter) — это программа, которая выполняет код, написанный на языке программирования. Она не переводит его в машинные коды целиком, а построчно принимает команды и сразу выполняет их. Можно отдать интерпретатору команду и сразу понять, сработала ли она.

«IT-специалист с нуля» наш лучший курс для старта в IT
Это один из двух способов перевода кода в понятный компьютеру вид. Второй вариант — компиляция, когда код «переводят» в машинные команды целиком. Мы расскажем об их различиях ниже.
Языки программирования, которые работают с интерпретаторами, называются интерпретируемыми. Большинство популярных сейчас языков именно такие. Некоторые из них — популярный вариант для обучения информатике и программированию.
Для чего нужны интерпретаторы
Языки программирования создаются такими, чтобы писать на их было удобно человеку. Они близки к английскому языку, команды на них — человекопонятные. Это в первую очередь касается высокоуровневых ЯП — тех, которые ближе к человеку, чем к «железу».
Компьютер такие языки не понимает. По умолчанию код на них для него — обычный текст, а не команды. Ведь компьютер — вычислительная машина, для которой понятен не текст, а наборы из нулей и единиц. Но писать команды на так называемых машинных кодах — задача очень трудная, почти невозможная. Ведь они очень длинные, особенно если программа сложная, и непонятны человеку.
Поэтому при разработке языка программирования для него всегда создается программа, переводящая код на нем в понятный компьютеру вид. Интерпретатор — один из вариантов, как можно реализовать этот процесс. Программа на интерпретируемом языке без интерпретатора просто не запустится — компьютер ее не поймет.
То есть интерпретатор нужен, чтобы программы на том или ином языке могли запускаться и выполняться.
Попробуйте 9 профессий за 2 месяца и выберите подходящую вам

Как работает интерпретатор
Интерпретатор получает на вход команду, написанную на языке программирования, читает ее и сразу же выполняет. Его работу можно условно разделить на два режима: интерактивный и пакетный.
Интерактивный режим. Это обычно работа в консоли. Его еще называют REPL — Read-eval-print loop, цикл чтения, исполнения и печати. Работает он так. Человек пишет в консоли какую-то команду интерпретатору, и она тут же выполняется, как только он нажимает Enter.
Обычно для этого сначала нужно запустить интерпретатор отдельной командой, но не всегда. Например, если команда на JavaScript пишется в консоли браузера, ничего дополнительно включать не надо — в браузеры по умолчанию встроен интерпретатор JS.
Пакетный режим. Он используется для более крупных задач, таких, которые не получится писать построчно и выполнять сразу же. Человек пишет какой-то код в файле, сохраняет его с нужным расширением и отдает интерпретатору. Тот получает файл, построчно считывает написанный там код и выполняет его.
В пакетном режиме пишется большинство программ: писать их в консоль и сразу же выполнять было бы неудобно. А REPL используют для быстрых подсчетов, отправки запросов и других действий, которым достаточно одной команды.
Разница между интерпретатором и компилятором
Еще один способ «переводить» код в понятный машине вид — компиляция. Программы, которые ею занимаются, называются компиляторами, а языки, которые с ними работают, — компилируемыми. Разница в том, что компилятор ничего не выполняет: он получает на вход файл с кодом, расшифровывает его и переводит в машинные коды целиком. Получается исполняемый файл, который можно запустить внутри той или иной операционной системы.
У интерпретаторов и компиляторов есть ряд различий — теоретических и чисто практических.
- Интерпретатор работает с кодом построчно, а компилятор переводит весь блок кода целиком.
- Интерпретатор исполняет код, как только «прочтет» нужную строку, а компилятор отдает его на выполнение системе — сам он только переводит.
- С компилятором нельзя работать в режиме REPL — только в пакетном.
Интерпретатор можно сравнить с синхронным переводчиком, который сразу же озвучивает перевод. А компилятор — с литературным переводчиком, который переводит тексты, а потом отправляет перевод тем, кто будет с ним работать.

Курс для новичков «IT-специалист
с нуля» – разберемся, какая профессия вам подходит, и поможем вам ее освоить
Известные интерпретируемые языки и их применение
Самые популярные сегодня языки, работающие с интерпретатором, — JavaScript и Python. Первый обрел популярность благодаря тому, что именно он работает в браузере. Поэтому им активно пользуются в вебе, особенно во фронтенде. Python же применяют в машинном обучении, анализе данных, при работе с математикой, аналитикой и автоматизацией, а еще в вебе и во многих других отраслях.
Другие примеры интерпретируемых языков — PHP, который активно применяют в вебе для «серверной» части, универсальный Ruby и Perl — его часто используют для автоматизации, системного администрирования или работы с текстом.
Интерпретируемые языки не зависят от системы, поэтому их в теории можно использовать где угодно. Главное, чтобы на конечном устройстве, где будет запускаться код, был установлен интерпретатор.
А вот там, где нужно максимальное быстродействие или близость к «железу», обычно предпочитают компилируемые языки. В них код исполняется быстрее за счет перевода в машинные коды: система понимает их и быстро выполняет.
У некоторых языков, таких как Basic или Python, есть и компилируемая, и интерпретируемая версии. Они используются для разных целей.
Несколько интерпретаторов у одного языка
Чаще всего бывает так, что у одного языка есть несколько интерпретаторов, или, как говорят, несколько реализаций или движков. Яркий пример — JavaScript: там основных интерпретаторов три, причем одним пользуются браузеры на базе Chromium, другим — Mozilla, а третьим — браузеры Apple.
Разные реализации могут чуть-чуть отличаться в исполнении или в обработке некоторых сложных запросов. У каждого движка свои механизмы оптимизации, свои особенности. Если предполагается, что код будет запускаться из-под разных движков, желательно учесть их все. Например, тот же JavaScript: фронтенд-разработчики, работающие с «браузерной» частью сайта, должны учитывать и тестировать поведение кода в разных браузерах. Но общий принцип работы похож у всех.
Как именно должен работать код, определяет спецификация — большой документ, обычно от разработчиков языка, который подробно описывает все возможные команды и принципы. Создатели интерпретаторов ориентируются именно на этот документ.
Достоинства интерпретируемых языков
Интерактивность. Код выполняется построчно, и это удобно. Если нужно протестировать какой-то простой запрос, можно просто включить интерпретатор и отдать ему команду в консоли — все выполнится тут же без временных затрат на компиляцию и передачу системе. А еще так можно выполнять простые действия, например для автоматизации рутины.
Скорость освоения и написания кода. Благодаря уже упомянутой интерактивности язык проще учить. Во-первых, сразу видно, к какому результату приведет то или иное действие, во-вторых, если появится ошибка, интерпретатор укажет где. Да и код пишется быстрее — по этой же причине.
Удобство отладки. Отлаживать код, написанный на интерпретируемом языке, проще по той же причине: он исполняется сразу. В случае с компилируемыми языками ошибка может возникнуть в одном месте, а заметной для компилятора стать в другом. Это затрудняет отладку. С интерпретируемыми языками в этом смысле проще: интерпретатор начинает «ругаться», как только доходит до ошибочного места.
Более того: если компилируемая программа обнаружит ошибку, она не выполнится совсем. А интерпретируемая — выполнится до места сбоя. Это тоже удобно при поиске ошибок, а еще помогает решить хотя бы часть задачи, прежде чем программа «упадет».
Понятность для человека. Большинство интерпретируемых языков — высокоуровневые, близкие к человеку. Поэтому у них понятный синтаксис, код на них легко читается, а сами языки освоить относительно просто. И уж точно проще, чем писать на низкоуровневых языках или вообще на машинных кодах.
Независимость от платформы. Исполнение берет на себя интерпретатор, а не система. Поэтому язык не зависит от ОС, то есть по умолчанию кроссплатформенный. Это выгодно отличает интерпретируемые языки от компилируемых: в них исполнение напрямую зависит от системы. Ведь разные ОС воспринимают машинные коды по-разному, поэтому программы-компиляторы — свои для каждой системы . И код, скомпилированный для Windows, не запустится в Linux или на Mac.
Механизмы оптимизации. На руку программисту играют и сами интерпретаторы: в них встраивают механизмы, которые оптимизируют код сами. Это значит, что, если код написан не самым оптимальным способом, интерпретатор сгладит недостаток оптимизации за счет встроенных механизмов.
Конечно, это не означает, что нужно забыть о качестве кода. Оно все еще важно. Но такая возможность позволяет сконцентрироваться на том, чтобы код был чистым и понятным для человека, и не жертвовать понятностью ради нескольких миллисекунд.
Недостатки интерпретируемых языков
Низкая скорость программ. Сами программы на интерпретируемых языках работают медленнее, чем на компилируемых, потому что код выполняет не система напрямую. Но разница в скорости сглаживается за счет двух факторов: оптимизация самих интерпретаторов и отсутствие промежуточного шага — компиляции, перевода в машинный код. Хотя в критичных по быстродействию процессах предпочитают использовать компилируемые языки, для большинства задач интерпретируемых вполне достаточно.
Риск ошибки. Выше мы говорили, что отлаживать код на интерпретируемых языках легче. Это так, но у преимущества есть оборотная сторона. Так как программа запускается сразу и выполняется до ошибочного места, какую-то ошибку в редко выполняемых блоках кода легко пропустить. Есть риск, что программа выполнится, а разработчик так и не узнает, что в ней ошибка. Компилируемые языки от этого защищены: если ошибка есть хоть где-то, программа просто не запустится. Проблемы, правда, можно избежать за счет качественного тестирования.
Зависимость от установленного интерпретатора. Интерпретируемые языки не зависят от операционной системы, но зависят от интерпретатора. Чтобы код запустился, нужно не только скачать файл с ним, но и установить интерпретатор. Если тот не установлен, компьютер просто не сможет выполнить программу — нечему будет понимать ее. А вот исполняемый файл, созданный через компилятор, можно запустить где угодно, но только в нужной ОС.
Открытость исходного кода. При компиляции в машинные коды «исходники» скрываются, и никто не может посмотреть, как была реализована та или иная функция. Интерпретируемые языки такого достоинства лишены: код не переводится в исполняемый файл, а выполняется интерпретатором сразу. Поэтому исходники остаются открытыми и их может посмотреть кто угодно. Это минус, если код программы — коммерческая тайна или разработчик просто по какой-то причине хочет его скрыть. Придется пользоваться дополнительными инструментами, чтобы «спрятать» написанное.
Какие языки лучше учить: компилируемые или интерпретируемые
Нет однозначного ответа, что лучше: у обоих типов свои сферы применения, достоинства и недостатки. Поэтому мы рекомендуем ориентироваться на область, в которой вы хотите работать, и на языки, которые в ней принято использовать. Например, в геймдеве и при создании приложений под разные ОС обычно применяют компилируемые языки. В вебе и для автоматизации — интерпретируемые. А еще вы можете попробовать разные варианты и разобраться, какой подход вам ближе.
Узнайте больше о программировании и информационных технологиях на наших курсах. Мы поможем получить новую высокооплачиваемую профессию.
Наш лучший курс для старта в IT. За 2 месяца вы пробуете себя в девяти разных профессиях: мобильной и веб-разработке, тестировании, аналитике и даже Data Science — выберите подходящую и сразу освойте ее.