Языковые трансляторы и IDE
| English | Русский |
|---|---|
| compiler/kəmˈpaɪlə/ | компилятор |
| source code/sɔːs kəʊd/ | исходный код |
| translator/trænˈsleɪtə/ | переводчик |
| machine code/məˈʃiːn kəʊd/ | машинный код |
| assembler/əˈsemblə/ | ассемблер |
| assembly language/əˈsemblɪ ˈlæŋɡwɪdʒ/ | язык ассемблера |
| object code/ˈɒbdʒekt kəʊd/ | объектный код |
| executable/ɪɡˈzekjʊtəbl/ | исполняемый файл |
| interpreter/ɪnˈtɜːprɪtə/ | интерпретатор |
| bytecode/ˈbaɪtkəʊd/ | байт-код |
| portable/ˈpɔːtəbl/ | переносимый |
| virtual machine/ˈvɜːtʃuːəl məˈʃiːn/ | виртуальная машина |
| just-in-time compilation/dʒʌst ɪn taɪm ˌkɒmpɪˈleɪʃn/ | компиляция «при необходимости» (JIT) |
| integrated development environment/ˈɪntɪɡreɪtɪd dɪˈveləpmənt enˈvaɪrənmənt/ | среды разработки (IDE) |
| context-sensitive prompts/ˈkɒntekst ˈsensɪtɪv prɒmpts/ | контекстно-зависимые подсказки |
| auto-complete/ˈɔːtəʊ kəmˈpliːt/ | автодополнение |
| dynamic syntax checks/daɪˈnæmɪk ˈsɪntæks tʃeks/ | динамическая проверка синтаксиса |
| prettyprint/ˈpretɪprɪnt/ | красивый вывод (prettyprint) |
| breakpoints/ˈbreɪkpɔɪnts/ | точки останова |
| single stepping/ˈsɪŋɡl ˈstepɪŋ/ | построчное выполнение |
| report window/rɪˈpɔːt ˈwɪndəʊ/ | окно отчета |
Никто не верил, что компьютер сможет написать собственную программу
- В 1952 году Грейс Хоппер создала первый компилятор — программу, преобразующую записи программиста в машинные инструкции. Позже она говорила: «Никто не верил в это. У меня был работающий компилятор, и никто не хотел его трогать. Они говорили мне, что компьютеры могут выполнять только арифметические операции».
- Каждый язык, который вы использовали с тех пор, основан на этой идее: вы пишете исходный код для людей, а переводчик производит машинный код, который выполняет процессор.
- Существует три вида переводчиков и один знаменитый гибрид, и экзамен требует от вас указать, какой использовать и почему.
- Этот урок посвящен переводчикам, компромиссам между компиляцией и интерпретацией, сочетанию обоих подходов в Java и инструментам IDE, окружающим их.
Исходный код, машинный код и ассемблер
- Процессор выполняет только машинный код. Переводчик преобразует программу, написанную для людей, в машинный код.
- Ассемблер переводит ассемблерный язык в машинный код: каждая мнемоническая инструкция,
LDD,ADD,JMP, превращается ровно в одну машинную инструкцию, а метки и символьные адреса заменяются реальными адресами. - Ассемблер используется там, где программисту необходимо прямое управление аппаратным обеспечением: драйвера устройств, встраиваемые системы, самые внутренние циклы игр.
Соотнесите каждый транслятор с тем, что он делает.
Ассемблер: ассемблер→машинный код; компилятор: всё сразу в исполняемый файл; интерпретатор: построчно во время выполнения.
Компилятор
- Компилятор переводит всю высокоуровневую программу в машинный код, объектный код, до запуска. Он создает исполняемый файл и выводит все синтаксические ошибки списком в конце процесса перевода.
- Он не выполняет программу. Как только код очищен от ошибок, исполняемый файл запускается без установленного компилятора столько раз, сколько вам нужно.
- Быстро работает во время выполнения, так как ничего не переводится в процессе; но полученный машинный код привязан к одному процессору и операционной системе.
Путь компилятора: от исходного кода к работающей программе
Разберитесь, как работает компилятор — переводит всю программу целиком перед запуском. Сопоставьте с интерпретатором, который переводит и выполняет строку за строкой.
Компилятор отличается от интерпретатора тем, что:
Компилятор переводит всё сразу в исполняемый файл, который работает без компилятора. Интерпретатор выполняет построчно.
Расставьте этапы пути компилятора по порядку: от написания кода до его запуска.
Компилятор переводит всю программу один раз в исполняемый файл; затем этот файл запускается без компилятора.
Интерпретатор
- Интерпретатор переводит одно выражение высокоуровневой программы за раз и выполняет его немедленно, прежде чем перейти к следующему.
- Исполняемый файл не создается. Он останавливается на первой встреченной ошибке, сообщает о ней с указанием строки, чтобы вы могли исправить её и запустить программу снова.
- Исходный код и интерпретатор должны присутствовать каждый раз при запуске программы, и каждый запуск требует повторного перевода, поэтому выполнение происходит медленнее; но тот же исходный код можно запустить там, где есть интерпретатор.

Перевести один раз и распространять, или переводить по мере выполнения
Когда интерпретатор сообщает об ошибке?
Интерпретатор выполняет построчно, поэтому он сообщает об ошибке в тот момент, когда достигает этой строки — удобно при разработке.
Интерпретатор не создает автономный исполняемый файл, поэтому для запуска программы сам интерпретатор должен быть установлен.
Интерпретатор переводит и выполняет построчно каждый раз — нет отдельного исполняемого файла для распространения, в отличие от компилятора.
Преимущества и недостатки, согласно критериям оценки
| компилятор | интерпретатор | |
|---|---|---|
| скорость выполнения | быстрая, уже машинный код | медленнее, переводится при каждом запуске |
| что нужно пользователю | только исполняемый файл; исходный код остается в тайне | исходный код и интерпретатор |
| поиск ошибок | все перечислены сразу после перевода | каждая сообщается на своей строке по ходу разработки |
| изменение кода | перекомпилировать всю программу | отредактировать и запустить снова немедленно |
| переносимость | одна платформа; нужна перекомпиляция для каждой | работает везде, где есть интерпретатор |
Вам следует выбрать компилятор, если:
Скомпилированные исполняемые файлы быстры и автономны. Интерпретаторы подходят для быстрой разработки и портативных скриптов.
Какие пункты способствуют использованию интерпретатора во время разработки программы? Выберите все подходящие варианты.
Быстрые циклы редактирования-запуска и ошибки на своих строках — сильные стороны интерпретатора. Скорость выполнения — сильная сторона компилятора.
Разобранный пример: интерпретатор при написании, компилятор при завершении
- Разработчик использует интерпретатор во время написания программы и компилятор, когда она закончена. Объясните, как используется каждый из них. [4]
- В процессе разработки интерпретатор выполняет частично написанную программу немедленно, не дожидаясь полной компиляции. При обнаружении ошибки он указывает строку, поэтому разработчик исправляет её и запускает программу снова немедленно: быстрый цикл редактирования-запуска, облегчающий отладку.
- Когда программа завершена, компилятор переводит всю программу в исполняемый файл, который работает быстрее, не требует переводчика на компьютере пользователя и сохраняет исходный код в секрете.
- Два балла за каждый инструмент: что он делает и почему это подходит для данного этапа.
Java: частично компилируется, частично интерпретируется
- Исходный код Java компилируется в байт-код, компактную переносимую промежуточную форму, которая не является машинным кодом ни для одного реального процессора.
- Затем виртуальная машина, JVM, интерпретирует байт-код на любой машине, где она работает, или использует компиляцию «на лету» (just-in-time), превращая наиболее загруженные части в нативный код во время выполнения программы.
- Этап компиляции выявляет синтаксические ошибки на ранней стадии; этап интерпретации позволяет файлу байт-кода работать везде, где существует JVM. Java в консольном режиме, текстовая программа, запускаемая из командной строки, является примером в программе курса.

Написать один раз, запускать везде: один файл байт-кода, одна JVM на каждую платформу
Java компилируется в байт-код, который выполняется в JVM. Главное преимущество этого подхода:
Байт-код независим от платформы; любую его версию может выполнить любая JVM (при этом JIT обеспечивает скорость, близкую к нативной, для часто используемого кода).
Компилятор Java производит независимые от платформы ____, которые затем интерпретирует виртуальная машина.
Байт-код — промежуточная форма: компилируется один раз, затем выполняется JVM на любой платформе. Именно это делает Java частично скомпилированным и частично интерпретируемым языком.
Разобранный пример: зачем компилировать в байт-код, а затем интерпретировать?
- Объясните, почему Java компилируется в байт-код, а не напрямую в машинный код.
- Компилятор производит машинный код для одного процессора и операционной системы, поэтому программа, скомпилированная на одной машине, не будет работать на другой.
- Компилятор Java целится в виртуальную машину, поэтому байт-код одинаков повсюду. Каждая платформа предоставляет свою собственную JVM для его интерпретации.
- Цена — скорость: интерпретация байт-кода медленнее, чем выполнение нативного кода, поэтому JVM добавляет компиляцию «на лету» для горячих участков кода.
IDE и четыре группы её функций
- Интегрированная среда разработки (IDE) — это одно приложение для написания, перевода, запуска и отладки программы. Программа курса объединяет её функции в четыре группы.
- Для программирования: контекстные подсказки предлагают идентификаторы, ключевые слова или параметры, подходящие в данный момент; автодополнение дописывает имя.
- Для первичного обнаружения ошибок: динамическая проверка синтаксиса подчеркивает ошибку по мере набора текста, еще до компиляции. Для отображения: prettyprint показывает ключевые слова, идентификаторы, строки и комментарии разными цветами с согласованным отступом; разворачивание и сворачивание скрывает тело блока, оставляя видимым каркас программы.
- Для отладки: точки останова приостанавливают программу на отмеченной строке; пошаговое выполнение выполняет одну строку за раз; окно показывает значения переменных и выражений; окно отчетов перечисляет ошибки, предупреждения и вывод.

Программирование, обнаружение ошибок, отображение, отладка
Какая функция является частью отладчика IDE?
Отладчик позволяет устанавливать точки останова, пошагово проходить по коду и просматривать значения переменных.
Соотнесите каждую функцию IDE с группой учебной программы.
Написание кода, начальное обнаружение ошибок, представление, отладка: четыре группы, названные в учебной программе, по одной функции в каждой здесь.
Разобранный пример: поиск ошибки в Calculate()
- Функция
Calculate()возвращает неожиданный результат. Опишите, как функции отладки IDE помогают найти причину. [4] - Установите точку останова на первой строке
Calculate(), чтобы программа приостановилась там, вместо того чтобы выполнять весь код. - Выполняйте пошагово функцию по одной строке за раз. После каждого шага прочитайте значения переменных и любых выражений, которые вы просили IDE отслеживать, и сравните их с ожидаемыми результатами.
- Первая строка, после которой значение становится неверным, указывает на место логической ошибки. Окно отчетов покажет любые сообщения об ошибках времени выполнения и вывод по ходу выполнения.

Пауза, шаг, инспекция
Расставьте шаги поиска логической ошибки с помощью отладчика по порядку.
Пауза, пошаговое выполнение, просмотр, сравнение, локализация. Каждый шаг — это одна из функций отладки, упомянутых в учебной программе.
Потерянные баллы
- Компилятор не запускает программу. Он переводит весь код целиком и создает исполняемый файл.
- Интерпретатор останавливается на первой ошибке; компилятор перечисляет их все. Не перепутайте эти понятия.
- «Быстрее» требует уточнения «во время выполнения», а «портативность» означает, что «тот же исходный код работает везде, где есть интерпретатор».
- Распределите функции IDE по четырем группам из программы: точка останова — это отладка, prettyprint (красивый вывод) — представление кода, контекстно-зависимая подсказка — процесс программирования. Байт-код не является машинным кодом.
Вы поняли
- Ассемблер: одна инструкция ассемблера соответствует одной инструкции машинного кода · Компилятор: вся программа целиком до запуска, создаёт исполняемый файл, перечисляет все ошибки · Интерпретатор: обрабатывает по одному оператору за раз, выполняет немедленно, останавливается на первой ошибке, не создаёт исполняемого файла
- Компилятор используется для скорости, распространения и сохранения конфиденциальности исходного кода; интерпретатор — для быстрого цикла редактирования-запуска, портативности и обучения начинающих.
- Java компилируется в портативный байт-код, который JVM интерпретирует или компилирует на лету (JIT): частично скомпилированный, частично интерпретируемый.
- Функции IDE по четырем группам: программирование (контекстные подсказки), первичное обнаружение ошибок (динамические проверки синтаксиса), представление кода (prettyprint, сворачивание и развертывание блоков), отладка (точки останова, пошаговое выполнение, переменные, окно отчетов).