В 21 веке программы стали настолько привычной частью нашей жизни, что порой мы даже не обращаем на них внимания. Вспомните браузер, через который вы просматриваете любимые сайты, или антивирус, защищающий ваше устройство. Все эти инструменты являются результатом работы программистов – людей, занимающихся программированием, то есть созданием программ. Любая программа представляет собой последовательность команд, которые должен выполнить компьютер для решения поставленной задачи. При этом такие команды записываются на специальных языках – языках программирования.

Подобно тому, как люди общаются на разных языках, например, русском или английском, программисты используют разные языки для «разговора» с компьютером. Каждый язык программирования обладает своими особенностями, сильными сторонами и областями применения. Выбор подходящего инструмента зависит от решаемой задачи, предпочтений разработчика и особенностей проекта. Например, для разработки мобильного приложения на Android обычно выбирают язык Kotlin, а на iOS – Swift.

Некоторые языки со временем становятся более популярными, другие – менее. Так, один из самых известных рейтингов, индекс TIOBE определяет популярность языков программирования на основе анализа поисковых запросов, связанных с ними в поисковых системах. Хотя этот рейтинг не является абсолютным показателем, Python уже несколько лет подряд уверенно занимает лидирующие позиции в этом рейтинге, обгоняя таких «ветеранов» как C++, Java и C#.

Языки программирования как иностранные языки

Представьте, что вам нужно сказать фразу «Привет, мир!» на разных иностранных языках. На английском вы скажете: «Hello world!», на французском: «Bonjour le monde!», а на китайском: «世界你好!».

Каждый язык уникален и имеет свои правила построения слов и предложений. Подобная ситуация наблюдается и в мире языков программирования: несмотря на одинаковую суть задачи, её реализация на каждом языке выглядит совершенно иначе.

Давайте взглянем на простой пример – вывод на экран фразы «Привет, мир!». Вот как это делается на языке JavaScript:

console.log("Привет, мир!");

А вот тот же самый результат на Python:

print("Привет, мир!")

Хотя обе программы решают одну и ту же задачу, синтаксически они существенно различаются.

Функция print() в Python

Python, как и любой другой язык, предлагает множество готовых команд, которые называются функциями. Эти функции позволяют нам выполнять различные действия, например, выводить текст на экран или производить математические расчеты.

Функции в Python записываются строчными буквами и сопровождаются парой круглых скобок. Внутри этих скобок указываются параметры – данные, которые мы передаем функции для её работы (если они необходимы).

Для вывода текста на экран в Python используется функция print(). Хотя сами языки программирования отличаются друг от друга, ключевые слова и понятия в них основаны на английском языке. Например, слово «print» переводится как «печатать».

Также языки программирования имеют строгие правила записи команд – синтаксис. Любая, даже незначительная ошибка в написании может привести к тому, что программа не будет работать. Так, после слова print должны идти круглые скобки, а выводимый текст (строка) заключён в двойные (") или одинарные (') кавычки.

Компьютер и двоичный код

Возникает закономерный вопрос: «Неужели компьютер понимает английский язык?». Конечно же, нет. Языки программирования созданы для удобства нас, программистов. На самом деле компьютер «говорит» на своем собственном языке – машинном коде, который представляет собой последовательность нулей и единиц.

Для центрального процессора компьютера 0 и 1 – это всего лишь электрические сигналы: отсутствие тока и его наличие, как выключатель света в положении «выкл.» и «вкл.». Любая информация, будь то буква, число или команда, должна быть представлена в виде такой последовательности нулей и единиц.

Например, фраза «Привет, мир!» для компьютера может быть закодирована следующим образом:

11010000 10011111 11010001 10000000 11010000 10111000 11010000 10110010 11010000 10110101 11010001 10000010 00101100 00100000 11010000 10111100 11010000 10111000 11010001 10000000 00100001 

Однако данный набор нулей и единиц – это лишь закодированный текст (данные), а компьютер должен еще и знать, что ему с этими данными делать. Для этого используется машинный код, который представляет собой набор инструкций (команд), понятных непосредственно центральному процессору. Эти команды также представлены в виде последовательности нулей и единиц, и они указывают процессору, какие конкретные операции нужно выполнить: сложить числа, переместить данные из одной ячейки памяти в другую или сравнить значения.

Низкоуровневые и высокоуровневые языки программирования

В зависимости от того, насколько язык программирования близок к машинному коду, их разделяют на низкоуровневые и высокоуровневые.

Низкоуровневые языки, такие как ассемблер, предоставляют прямой доступ к ресурсам компьютера – процессору и оперативной памяти. Они используются для обеспечения максимальной скорости исполнения программы и полного контроля над оборудованием, например, в написании драйверов устройств, операционных систем и программ для микроконтроллеров.

Однако ассемблер довольно сложен в изучении и использовании, а его команды зависят от конкретной архитектуры процессора. Каждая команда соответствует одной операции процессора, что делает программу максимально эффективной, но усложняет разработку.

И если в Python для вывода на экран сообщения «Привет, мир!» мы можем обойтись командой print("Привет, мир!"), то на ассемблере такая же программа будет выглядеть сложнее:

section .data
    hello:     db 'Привет, мир!',10 
    helloLen:  equ $-hello         
section .text
    global _start
 
_start:
    mov eax,4           
    mov ebx,1          
    mov ecx,hello       
    mov edx,helloLen    
 
    int 80h              
    mov eax,1           
    mov ebx,0           
    int 80h;

Высокоуровневые языки, такие как Python, JavaScript, PHP и многие другие, делают процесс программирования значительно проще и быстрее. Они скрывают множество низкоуровневых деталей, позволяя программистам сосредоточиться на логике решения задачи, а не на особенностях работы процессора. Функции print() в Python или console.log() в JavaScript – яркие примеры удобства высокоуровневого языка по сравнению с отдельными командами на ассемблере.

Компилируемые и интерпретируемые языки программирования

Для того, чтобы компьютер понимал, что ему нужно сделать, исходный код любой программы должен быть переведён в машинный код. Для этого предназначен процесс трансляции. Трансляция программ, написанных на высокоуровневых языках, осуществляется двумя способами: с помощью компилятора или интерпретатора.

Представьте, что вы должны приготовить торт, рецепт которого написан на незнакомом вам языке. В таком случае вы выступаете в роли компьютера, а рецепт – это исходный код программы.

Компиляция похожа на заказ полного перевода рецепта в бюро переводов. Вы отдаете весь текст рецепта, ждете, пока его полностью переведут на понятный вам язык, и только после этого начинаете готовить.

Компилируемые языки, такие как C, C++, Java или C#, сначала полностью переводятся в машинный код с помощью специальной программы – компилятора. Результатом работы компилятора является исполняемый файл (бинарный код), который можно запустить на компьютере. Компиляция обычно обеспечивает более высокую скорость работы программы и больший контроль над ресурсами компьютера, но требует времени на предварительную сборку программы и часто привязывает программу к определенной операционной системе.

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

Интерпретируемые языки, такие как Python, JavaScript или PHP, выполняются построчно с помощью специальной программы – интерпретатора. Интерпретатор читает, анализирует и тут же выполняет каждую строку кода. Такой подход упрощает процесс разработки и отладки, так как вы можете сразу видеть результат выполнения каждой команды, но может немного замедлить работу программы по сравнению с скомпилированным кодом.

Python является интерпретируемым языком, что делает его отличным выбором для начинающих, так как вы можете быстро писать и запускать код, сразу видя результат своих действий.

Итоги

  • Программирование – это процесс создания программ.
  • Программа – это последовательность команд, которые должен выполнить компьютер или другое устройство.
  • Язык программирования – это язык, предназначенный для записи программ.
  • Синтаксис языка программирования – это правила записи команд в этом языке.
  • По степени близости к машинному коду языки делятся на низкоуровневые (ассемблер), дающие прямой контроль над оборудованием, и высокоуровневые (Python), позволяющие абстрагироваться от деталей работы процессора.
  • Трансляция кода в машинный код происходит путём компиляции (C++), при которой весь код заранее переводится в исполняемый файл, или интерпретации (Python, JavaScript), обеспечивающей построчное выполнение кода.

Задания для самопроверки

1. Что такое язык программирования?

Язык, предназначенный для записи программ.

2. Что делает команда print("Привет, мир!") в Python?

Выводит на экран строку "Привет, мир!".

3. В виде последовательности каких чисел компьютер представляет данные?

0 и 1.

4. По какому принципу языки программирования разделяются на высокоуровневые и низкоуровневые?

По степени их близости к машинному коду.

5. Чем отличаются компилируемые языки программирования от интерпретируемых?

Программу, написанную на компилируемом языке, нельзя запустить без предварительного перевода всего кода программы в машинный код (компиляции), в то время как код программы, написанной на интерпретируемом языке, выполняется построчно специальной программой (интерпретатором) и её запуск не требует предварительной подготовки.