HTML Diff
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>Мы видим, что начале каждой строки интерпретатор выводит подсказку &gt;&gt;&gt;. Когда мы вводим команду for, состоящую из двух строк, подсказка меняется на троеточие ....</p>
29 <p>Мы видим, что начале каждой строки интерпретатор выводит подсказку &gt;&gt;&gt;. Когда мы вводим команду 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>&gt; python sum.py 5050</p>
43 <p>&gt; 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>