0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В этом гайде разберемся, что такое интерпретатор, для чего он нужен и как работает. Этот материал поможет понять, как компьютер выполняет программы.</p>
1
<p>В этом гайде разберемся, что такое интерпретатор, для чего он нужен и как работает. Этот материал поможет понять, как компьютер выполняет программы.</p>
2
<h2>Содержание</h2>
2
<h2>Содержание</h2>
3
<ul><li><a>Зачем нужен интерпретатор</a></li>
3
<ul><li><a>Зачем нужен интерпретатор</a></li>
4
<li><a>Экскурс в историю</a></li>
4
<li><a>Экскурс в историю</a></li>
5
<li><a>Пример интерпретатора Python</a></li>
5
<li><a>Пример интерпретатора Python</a></li>
6
<li><a>Пример интерпретатора JavaScript</a></li>
6
<li><a>Пример интерпретатора JavaScript</a></li>
7
<li><a>Выполнение программы</a></li>
7
<li><a>Выполнение программы</a></li>
8
<li><a>Устройство интерпретатора</a></li>
8
<li><a>Устройство интерпретатора</a></li>
9
<li><a>Достоинства и недостатки</a></li>
9
<li><a>Достоинства и недостатки</a></li>
10
<li><a>Выводы и рекомендации</a></li>
10
<li><a>Выводы и рекомендации</a></li>
11
</ul><h2>Зачем нужен интерпретатор</h2>
11
</ul><h2>Зачем нужен интерпретатор</h2>
12
<p>В переводе с английского языка компьютер -<em>вычислитель</em>. Мы привыкли пользоваться компьютером для подготовки документов, чтения новостей и просмотра фильмов. В повседневной жизни производить вычисления приходится крайне редко, поэтому такое определение может показаться странным.</p>
12
<p>В переводе с английского языка компьютер -<em>вычислитель</em>. Мы привыкли пользоваться компьютером для подготовки документов, чтения новостей и просмотра фильмов. В повседневной жизни производить вычисления приходится крайне редко, поэтому такое определение может показаться странным.</p>
13
<p>Вместе с тем, это название очень точно отражает природу компьютера. Мы этого не видим, но на самом деле компьютер умеет работать только с числами: документы, и новости, и фильмы выглядят для компьютера как наборы чисел. То же самое касается программ, которые он выполняет.</p>
13
<p>Вместе с тем, это название очень точно отражает природу компьютера. Мы этого не видим, но на самом деле компьютер умеет работать только с числами: документы, и новости, и фильмы выглядят для компьютера как наборы чисел. То же самое касается программ, которые он выполняет.</p>
14
<p>Каждая команда имеет свой числовой - машинный - код: благодаря ему компьютер без труда понимает, что нужно делать. Человеку трудно писать программы в машинных кодах, однако на заре компьютерной эры программисты писали именно так. Вот так выглядели их программы:</p>
14
<p>Каждая команда имеет свой числовой - машинный - код: благодаря ему компьютер без труда понимает, что нужно делать. Человеку трудно писать программы в машинных кодах, однако на заре компьютерной эры программисты писали именно так. Вот так выглядели их программы:</p>
15
<p>102 184 0 0 102 185 100 0 102 1 200 102 73 102 131 249 0 117 245</p>
15
<p>102 184 0 0 102 185 100 0 102 1 200 102 73 102 131 249 0 117 245</p>
16
<p>{/*<a>https://defuse.ca/online-x86-assembler.htm</a></p>
16
<p>{/*<a>https://defuse.ca/online-x86-assembler.htm</a></p>
17
<p>0: 66 b8 00 00 mov ax,0x0 4: 66 b9 64 00 mov cx,100 00000008 : 8: 66 01 c8 add ax,cx b: 66 49 dec cx d: 66 83 f9 00 cmp cx,0 11: 75 f5 */}</p>
17
<p>0: 66 b8 00 00 mov ax,0x0 4: 66 b9 64 00 mov cx,100 00000008 : 8: 66 01 c8 add ax,cx b: 66 49 dec cx d: 66 83 f9 00 cmp cx,0 11: 75 f5 */}</p>
18
<p>Пытаясь облегчить себе работу, программисты придумали языки программирования: они понятнее человеку, поэтому писать программы на них проще. На этом этапе возникла проблема: если компьютер понимает команды только в виде чисел, как он будет выполнять команды, написанные на языке программирования?</p>
18
<p>Пытаясь облегчить себе работу, программисты придумали языки программирования: они понятнее человеку, поэтому писать программы на них проще. На этом этапе возникла проблема: если компьютер понимает команды только в виде чисел, как он будет выполнять команды, написанные на языке программирования?</p>
19
<p>Есть два вида программ, которые помогают решить эту проблему -<em>интерпретаторы</em>и<em>компиляторы</em>. Про компилятор<a>можно почитать здесь</a>, в этом тексте мы остановимся только на интерпретаторах.</p>
19
<p>Есть два вида программ, которые помогают решить эту проблему -<em>интерпретаторы</em>и<em>компиляторы</em>. Про компилятор<a>можно почитать здесь</a>, в этом тексте мы остановимся только на интерпретаторах.</p>
20
<p>Вкратце,<em>интерпретатор</em>- это программа, которая выполняет команды, написанные на каком-то языке программирования. Например, интерпретатор Python понимает команды языка Python, а интерпретатор JavaScript - команды языка JavaScript.</p>
20
<p>Вкратце,<em>интерпретатор</em>- это программа, которая выполняет команды, написанные на каком-то языке программирования. Например, интерпретатор Python понимает команды языка Python, а интерпретатор JavaScript - команды языка JavaScript.</p>
21
<h2>Экскурс в историю</h2>
21
<h2>Экскурс в историю</h2>
22
<p>Lisp оказался удачным изобретением. За прошедшие годы люди изобрели множество языков, которые оказались никому не нужны. Этого нельзя сказать о Lisp, который развивается до сих пор. Уточню, что разработкой интерпретаторов Lisp занимались разные команды, поэтому у них получались разные версии языка. Такие версии языка называют<em>диалектами</em>. Кроме Emacs Lisp, вы могли слышать о<a>ClojureScript</a>- диалекте LISP, который иногда используют вместо JavaScript при разработке фронтенда</p>
22
<p>Lisp оказался удачным изобретением. За прошедшие годы люди изобрели множество языков, которые оказались никому не нужны. Этого нельзя сказать о Lisp, который развивается до сих пор. Уточню, что разработкой интерпретаторов Lisp занимались разные команды, поэтому у них получались разные версии языка. Такие версии языка называют<em>диалектами</em>. Кроме Emacs Lisp, вы могли слышать о<a>ClojureScript</a>- диалекте LISP, который иногда используют вместо JavaScript при разработке фронтенда</p>
23
<p>Рассмотрим пример программы на Lisp для понимания разницы между машинным кодом и "почти человеческим языком":</p>
23
<p>Рассмотрим пример программы на Lisp для понимания разницы между машинным кодом и "почти человеческим языком":</p>
24
<p>Необязательно знать Lisp, чтобы увидеть, что в программе есть структура, и понять отдельные ее части. Доступность для понимания - выгодное преимущество языков программирования перед машинным кодом.</p>
24
<p>Необязательно знать Lisp, чтобы увидеть, что в программе есть структура, и понять отдельные ее части. Доступность для понимания - выгодное преимущество языков программирования перед машинным кодом.</p>
25
<p>Есть интерпретаторы для таких популярных языков программирования, как Python и JavaScript. Они хорошо подходят и для работы, и для изучения программирования. Важную роль в этом играет то, что для них существует интерпретаторы, и чуть позже мы узнаем, почему это так.</p>
25
<p>Есть интерпретаторы для таких популярных языков программирования, как Python и JavaScript. Они хорошо подходят и для работы, и для изучения программирования. Важную роль в этом играет то, что для них существует интерпретаторы, и чуть позже мы узнаем, почему это так.</p>
26
<h2>Пример интерпретатора Python</h2>
26
<h2>Пример интерпретатора Python</h2>
27
<p>Разберем в деталях работу интерпретатора - для этого напишем несложную программу, которая будет вычислять суммы чисел от 1 до 100:</p>
27
<p>Разберем в деталях работу интерпретатора - для этого напишем несложную программу, которая будет вычислять суммы чисел от 1 до 100:</p>
28
<p>Запустим интерпретатор<em>python</em>и построчно введем программу.</p>
28
<p>Запустим интерпретатор<em>python</em>и построчно введем программу.</p>
29
<p>Мы видим, что начале каждой строки интерпретатор выводит подсказку >>>. Когда мы вводим команду for, состоящую из двух строк, подсказка меняется на троеточие ....</p>
29
<p>Мы видим, что начале каждой строки интерпретатор выводит подсказку >>>. Когда мы вводим команду for, состоящую из двух строк, подсказка меняется на троеточие ....</p>
30
<p>Выполняя команду print(sum), интерпретатор печатает результат - число 5050. Если мы допустим ошибку, интерпретатор подскажет нам, где она находится.</p>
30
<p>Выполняя команду print(sum), интерпретатор печатает результат - число 5050. Если мы допустим ошибку, интерпретатор подскажет нам, где она находится.</p>
31
<p>В примере выше мы забыли поставить двоеточие после инструкции for, о чем интерпретатор и сообщает.</p>
31
<p>В примере выше мы забыли поставить двоеточие после инструкции for, о чем интерпретатор и сообщает.</p>
32
<p>Немедленный отклик интерпретатора очень важен при изучении языка. Новички, видя сообщениях об ошибках и пробуя разные варианты, быстро осваивают незнакомый синтаксис. Именно поэтому Python и JavaScript часто используют для обучения.</p>
32
<p>Немедленный отклик интерпретатора очень важен при изучении языка. Новички, видя сообщениях об ошибках и пробуя разные варианты, быстро осваивают незнакомый синтаксис. Именно поэтому Python и JavaScript часто используют для обучения.</p>
33
<p>Опытные программисты также ценят такой -<em>интерактивный</em>- способ разработки, потому что он помогает быстро проверять свои идеи.</p>
33
<p>Опытные программисты также ценят такой -<em>интерактивный</em>- способ разработки, потому что он помогает быстро проверять свои идеи.</p>
34
<p>Кроме того, интерпретируемые языки часто используют для разработки прототипов больших программ. В интерактивном режиме он постоянно выполняет одни и те же действия: читает команду программиста, выполняет ее и печатает результат. Такой режим называют<em>Циклом Чтения-Выполнения-Печати</em>, или, по-английски<em>Read-Evaluate-Print Loop</em>. Обычно это название сокращают до аббревиатуры REPL.</p>
34
<p>Кроме того, интерпретируемые языки часто используют для разработки прототипов больших программ. В интерактивном режиме он постоянно выполняет одни и те же действия: читает команду программиста, выполняет ее и печатает результат. Такой режим называют<em>Циклом Чтения-Выполнения-Печати</em>, или, по-английски<em>Read-Evaluate-Print Loop</em>. Обычно это название сокращают до аббревиатуры REPL.</p>
35
<h2>Пример интерпретатора JavaScript</h2>
35
<h2>Пример интерпретатора JavaScript</h2>
36
<p>Интерпретатор JavaScript встроен прямо в браузер. Посмотрим, как он работает, на примере браузера Chrome.</p>
36
<p>Интерпретатор JavaScript встроен прямо в браузер. Посмотрим, как он работает, на примере браузера Chrome.</p>
37
<p>В правом верхнем углу есть три вертикальные точки, которые вызывают меню браузера. Нажмите и выберите пункт меню<em>Дополнительные инструменты</em>, а затем<em>Инструменты разработчика</em>.</p>
37
<p>В правом верхнем углу есть три вертикальные точки, которые вызывают меню браузера. Нажмите и выберите пункт меню<em>Дополнительные инструменты</em>, а затем<em>Инструменты разработчика</em>.</p>
38
<p>Вы увидите новое окно, заполненное вкладками. Все эти инструменты полезны и их стоит освоить. Но сейчас нам нужна одна вкладка -<em>Console</em>. В консоли мы можем набирать команды языка JavaScript и сразу видеть отклик интерпретатора.</p>
38
<p>Вы увидите новое окно, заполненное вкладками. Все эти инструменты полезны и их стоит освоить. Но сейчас нам нужна одна вкладка -<em>Console</em>. В консоли мы можем набирать команды языка JavaScript и сразу видеть отклик интерпретатора.</p>
39
<p>Интерпретатор сохранит переменные a и b со значениями 1 и 2, затем вычислит значение 3 * (a + b) и напечатает результат 9.</p>
39
<p>Интерпретатор сохранит переменные a и b со значениями 1 и 2, затем вычислит значение 3 * (a + b) и напечатает результат 9.</p>
40
<h2>Выполнение программы</h2>
40
<h2>Выполнение программы</h2>
41
<p>Цикл REPL помогает разрабатывать программу, но вводить каждую команду по отдельности не удобно: куда быстрее ввести их один раз, а затем запустить готовую программу. Для этого создадим текстовый файл<em>sum.py</em>и запишем там команды:</p>
41
<p>Цикл REPL помогает разрабатывать программу, но вводить каждую команду по отдельности не удобно: куда быстрее ввести их один раз, а затем запустить готовую программу. Для этого создадим текстовый файл<em>sum.py</em>и запишем там команды:</p>
42
<p>Чтобы выполнить программу, достаточно запустить интерпретатор Python, указав имя файла в параметрах:</p>
42
<p>Чтобы выполнить программу, достаточно запустить интерпретатор Python, указав имя файла в параметрах:</p>
43
<p>> python sum.py 5050</p>
43
<p>> python sum.py 5050</p>
44
<p>Интерпретатор выполняет команды одну за одной и в конце завершает свою работу. Такой режим работы интерпретатора называют<em>пакетным</em>.</p>
44
<p>Интерпретатор выполняет команды одну за одной и в конце завершает свою работу. Такой режим работы интерпретатора называют<em>пакетным</em>.</p>
45
<p>Таким образом, интерпретатор может работать в двух режимах. Интерактивный режим (REPL) помогает нам проверять идеи и придумывать решение задач. Пакетный режим выполняет готовую программу.</p>
45
<p>Таким образом, интерпретатор может работать в двух режимах. Интерактивный режим (REPL) помогает нам проверять идеи и придумывать решение задач. Пакетный режим выполняет готовую программу.</p>
46
<h2>Устройство интерпретатора</h2>
46
<h2>Устройство интерпретатора</h2>
47
<p>Есть много способов написать интерпретатор. Не будем рассматривать все возможные варианты, а остановимся на устройстве интерпретаторов в целом. Обычный язык программирования содержит несколько десятков команд.</p>
47
<p>Есть много способов написать интерпретатор. Не будем рассматривать все возможные варианты, а остановимся на устройстве интерпретаторов в целом. Обычный язык программирования содержит несколько десятков команд.</p>
48
<p>В программе на Python, которую мы обсуждали выше есть операторы присваивания, цикл for и вызов функции print. Все это - команды, которые понимает интерпретатор Python. Для каждой команды в интерпретаторе есть блок кода, который умеет такую команду исполнять.</p>
48
<p>В программе на Python, которую мы обсуждали выше есть операторы присваивания, цикл for и вызов функции print. Все это - команды, которые понимает интерпретатор Python. Для каждой команды в интерпретаторе есть блок кода, который умеет такую команду исполнять.</p>
49
<p>Вторая важная составляющая интерпретатора - анализатор текста. Когда программист вводит текст, анализатор разбирает его на составные части и понимает, о какой команде идет речь. После этого он передает управление блоку, отвечающему за выполнение этой команды.</p>
49
<p>Вторая важная составляющая интерпретатора - анализатор текста. Когда программист вводит текст, анализатор разбирает его на составные части и понимает, о какой команде идет речь. После этого он передает управление блоку, отвечающему за выполнение этой команды.</p>
50
<p>Так - в цикле - интерпретатор и работает. Анализирует введенную команду, затем выполняет, снова анализирует и снова выполняет. Анализ текста это, конечно, не тривиальная задача, но и не слишком трудная, так что интерпретаторы на самом деле не такие сложные программы.</p>
50
<p>Так - в цикле - интерпретатор и работает. Анализирует введенную команду, затем выполняет, снова анализирует и снова выполняет. Анализ текста это, конечно, не тривиальная задача, но и не слишком трудная, так что интерпретаторы на самом деле не такие сложные программы.</p>
51
<h2>Достоинства и недостатки</h2>
51
<h2>Достоинства и недостатки</h2>
52
<p>Достоинства интерпретаторов:</p>
52
<p>Достоинства интерпретаторов:</p>
53
<ul><li><p><strong>Простота изучения.</strong>REPL помогает проверять, как работают незнакомые конструкции и быстро осваивать синтаксис языка.</p>
53
<ul><li><p><strong>Простота изучения.</strong>REPL помогает проверять, как работают незнакомые конструкции и быстро осваивать синтаксис языка.</p>
54
</li>
54
</li>
55
<li><p><strong>Простота программирования.</strong>Как и компилятор, интерпретатор избавляет от необходимости писать программы в машинных кодах.</p>
55
<li><p><strong>Простота программирования.</strong>Как и компилятор, интерпретатор избавляет от необходимости писать программы в машинных кодах.</p>
56
</li>
56
</li>
57
<li><p><strong>Кроссплатформенность.</strong>Интерпретаторы разработаны для разных платформ - Mac, Windows, Linux, поэтому написанная нами программа будет работать на всех платформах.</p>
57
<li><p><strong>Кроссплатформенность.</strong>Интерпретаторы разработаны для разных платформ - Mac, Windows, Linux, поэтому написанная нами программа будет работать на всех платформах.</p>
58
</li>
58
</li>
59
<li><p><strong>Улучшение программы за счет интерпретатора.</strong>Скорость программ зависит не только от качества кода, но и от того, насколько быстро работает интерпретатор. Например, программисты Google постоянно улучшают интерпретатор JavaScript, который работает в браузере Chrome. Если мы написали программу на JavaScript, с каждой новой версией Chrome она работает быстрее, даже если мы ничего в ней не меняем.</p>
59
<li><p><strong>Улучшение программы за счет интерпретатора.</strong>Скорость программ зависит не только от качества кода, но и от того, насколько быстро работает интерпретатор. Например, программисты Google постоянно улучшают интерпретатор JavaScript, который работает в браузере Chrome. Если мы написали программу на JavaScript, с каждой новой версией Chrome она работает быстрее, даже если мы ничего в ней не меняем.</p>
60
</li>
60
</li>
61
</ul><p>Недостатки интерпретаторов:</p>
61
</ul><p>Недостатки интерпретаторов:</p>
62
<ul><li><p><strong>Низкая скорость.</strong>Интерпретируемые программы работают медленнее, чем программы в машинных кодах. Это происходит потому, что интерпретатор должен сначала проанализировать текст команды, и лишь потом выполнить ее. Программа в машинных кодах сразу понятна компьютеру.</p>
62
<ul><li><p><strong>Низкая скорость.</strong>Интерпретируемые программы работают медленнее, чем программы в машинных кодах. Это происходит потому, что интерпретатор должен сначала проанализировать текст команды, и лишь потом выполнить ее. Программа в машинных кодах сразу понятна компьютеру.</p>
63
</li>
63
</li>
64
<li><p><strong>Зависимость от интерпретатора.</strong>Интерпретируемой программе нужен интерпретатор. В Windows программы в машинных кодах имеют расширение<em>.exe</em>. Такую программу, скажем, архиватор 7-zip можно просто запустить. А для того, чтобы выполнить программу на языке Python, нужен интерпретатор<em>python</em>.</p>
64
<li><p><strong>Зависимость от интерпретатора.</strong>Интерпретируемой программе нужен интерпретатор. В Windows программы в машинных кодах имеют расширение<em>.exe</em>. Такую программу, скажем, архиватор 7-zip можно просто запустить. А для того, чтобы выполнить программу на языке Python, нужен интерпретатор<em>python</em>.</p>
65
</li>
65
</li>
66
<li><p><strong>Доступность исходного кода.</strong>Исходный код на интерпретируемом языке доступен пользователю программы. Пользователь может подсмотреть в программе то, что ее автор хотел бы скрыть, например, способ шифрования пароля или уникальный алгоритм.</p>
66
<li><p><strong>Доступность исходного кода.</strong>Исходный код на интерпретируемом языке доступен пользователю программы. Пользователь может подсмотреть в программе то, что ее автор хотел бы скрыть, например, способ шифрования пароля или уникальный алгоритм.</p>
67
</li>
67
</li>
68
<li><p><strong>Позднее обнаружение ошибок.</strong>Интерпретаторы выполняют программы по одной команде. Если в синтаксисе команды допущена ошибка, интерпретатор не сможет об этом узнать, пока не приступит к ее анализу. В больших программах есть куски, которые выполняются реже других и, возможно, там есть ошибки, про которые программист не знает. Чтобы избежать ошибок, которые увидит пользователь программы, приходится тестировать её гораздо тщательней.</p>
68
<li><p><strong>Позднее обнаружение ошибок.</strong>Интерпретаторы выполняют программы по одной команде. Если в синтаксисе команды допущена ошибка, интерпретатор не сможет об этом узнать, пока не приступит к ее анализу. В больших программах есть куски, которые выполняются реже других и, возможно, там есть ошибки, про которые программист не знает. Чтобы избежать ошибок, которые увидит пользователь программы, приходится тестировать её гораздо тщательней.</p>
69
</li>
69
</li>
70
</ul><h2>Выводы и рекомендации</h2>
70
</ul><h2>Выводы и рекомендации</h2>
71
<p>Интерпретатор языка программирования - это программа, выполняющая команды, написанные на этом языке. Мы, например, говорим<em>интерпретатор Python</em>или<em>интерпретатор JavaScript</em>.</p>
71
<p>Интерпретатор языка программирования - это программа, выполняющая команды, написанные на этом языке. Мы, например, говорим<em>интерпретатор Python</em>или<em>интерпретатор JavaScript</em>.</p>
72
<p>Интерактивный режим (REPL) помогает программистам изучать синтаксис языка и проверять свои идеи.</p>
72
<p>Интерактивный режим (REPL) помогает программистам изучать синтаксис языка и проверять свои идеи.</p>
73
<p>Интерпретатор состоит из анализатора текста и исполнителей отдельных команд языка, таких как цикл for, проверка if, вызов функции print, и других.</p>
73
<p>Интерпретатор состоит из анализатора текста и исполнителей отдельных команд языка, таких как цикл for, проверка if, вызов функции print, и других.</p>
74
<p>К достоинствам интерпретируемых языков относят простоту изучения. Именно поэтому программирование начинают изучать с таких языков, как Python и JavaScript.</p>
74
<p>К достоинствам интерпретируемых языков относят простоту изучения. Именно поэтому программирование начинают изучать с таких языков, как Python и JavaScript.</p>