Перевод в программировании

 

 

Программирование (programming)

  • проектирование, написание, отладка, тестирование, документирование и поддержка ПО.

  • языковая деятельность, основанная на использовании различных языков и межязыковом переводе.

 

 

 

Трансляция

 

Трансляция (translation) — преобразование программы, представленной на одном из компьютерных языков программирования, в функционально эквивалентную программу на другом языке.

Исходный язык  (исходный код) - язык, на котором представлена входная программа.

Целевой язык (объектный код) - выходной язык представления программы.

Цель трансляции — преобразовать текст с одного языка на другой, который понятен адресату текста (техническому устройству (процессору) или программе-интерпретатору).

Понятие трансляции применимо и к другим компьютерным  языкам (разметки, форматов данных, протоколов, описания аппаратуры, поисковых запросов).

Транслятор (translation) — программа или техническое средство, выполняющее трансляцию программы.

 

 

 

Типы трансляторов

 

  • Адресный. Функциональное устройство, преобразующее виртуальный адрес (англ. Virtual address) в реальный адрес.

  • Диалоговый. Обеспечивает использование языка программирования в режиме разделения времени.

  • Обратный. Детранслятор. Популярны декомпиляторы для Flash.

  • Многопроходной. Формирует объектный модуль за несколько просмотров исходной программы.

  • Однопроходной. Формирует объектный модуль за один последовательный просмотр исходной программы.

  • Оптимизирующий. Выполняет оптимизацию кода в создаваемом объектном модуле.

  • Синтаксически-ориентированный. Получает на вход описание синтаксиса и семантики языка и текст на описанном языке, который и транслируется в соответствии с заданным описанием.

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

  • Интерпретирующий (пошаговый). Последовательно выполняет независимую компиляцию каждого отдельного оператора (команды) исходной программы.

 

 

 

 

Методы трансляции

 

название пояснение аналог

1

компиляция

(compilation)

полное преобразование программы в машинный код, принимаемый и исполняемый непосредственно процессором

письменный информативный перевод

2

интерпретация

(interpretation)

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

деятельность переводчика-синхрониста, который озвучивает (не переводит только, но исполняет) речь собеседника на другом языке.

 

 

 

Виртуальная машина

 

Виртуальная машина - абстрактный компьютер, работа которого реализуется (эмулируется) на реальной машине с помощью программных и/или аппаратных средств.

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

Виртуальная машина может эмулировать работу процессора, отдельных компонент аппаратного обеспечения, целого реального компьютера (включая BIOS, оперативную память, жёсткий диск и другие периферийные устройства). В последнем случае в ВМ, как и на реальный компьютер, можно устанавливать операционные системы (например, Windows можно запускать в виртуальной машине под Linux или наоборот).

На одном компьютере может функционировать несколько виртуальных машин (это может использоваться для имитации нескольких серверов на одном реальном сервере с целью оптимизации использования ресурсов сервера).

Виртуальные машины используются для:

  • защиты информации и ограничения возможностей программ (см.: песочница);

  • исследования производительности ПО или новой компьютерной архитектуры;

  • эмуляции различных архитектур (например, эмулятор игровой приставки);

  • оптимизации использования ресурсов мощных компьютеров;

  • вредоносного кода для управления инфицированной системой: вирус PMBS, обнаруженный в 1993 году, а также руткит SubVirt, созданный в 2006 году в Microsoft Research, создавали виртуальную систему, которой ограничивался пользователь и все защитные программы .

  • моделирования информационных систем с клиент-серверной архитектурой на одном компьютере (эмуляция компьютерной сети с помощью нескольких виртуальных машин).

  • тестирования и отладки системного программного обеспечения;

 

 

 

Компиляция и компиляторы

Компиляция - полное преобразование программы в машинный код, принимаемый и исполняемый непосредственно процессором

Компиляция зависит от сервисов операционной системы и сторонних библиотек, с которыми необходимо связать машинный код с помошью редактора связей или компоновщика.

Компилятор (англ. compile — собирать вместе, составлять) может включать в себя компоновщик.

Для каждой целевой аппаратной платформы (IBM, Apple, Sun и т. д.) и каждой операционной системы требуется свой компилятор.

Кросс-компиляторы позволяют на одной машине и в среде одной ОС генерировать код, предназначенный для выполнения на другой целевой машине и/или в среде другой ОС.

kmp рекомендует:

 

 

 

IdeOne

 

IdeOne (https://ideone.com)  — онлайн-сервис, предоставляющий компилятор и отладочный инструмент, чтобы прямо в браузере выполнять код на более чем 60 языках программирования и их конкретных версиях.

Сервис позволяет:

  • воспользоваться готовыми образцами кода (samples)

  • настроить лимит времени,

  • указать данные для стандартного потока ввода,

  • добавить к коду описание,

  • поделиться им с друзьями или коллегами,

  • сделать форк исходников.

Доступна вставка сохраненного кода на сайт через специальный виджет.

Для экзотов есть возможность компиляции кода на языке Brainfuck

 

 

 

Этапы компиляции

  • лексический анализ (lexical analysis, последовательность символов исходного файла преобразуется в последовательность лексем),

  • синтаксический анализ (syntactic analysis, последовательность лексем преобразуется в древо разбора),

  • семантический анализ (semantic analysis, древо разбора обрабатывается с целью установления его семантики: привязка идентификаторов к их опеределниям, типам данным, проверка совместимости типов данных, определение результирующих типов данных выражений и т. д),

  • генерация промежуточного кода (из промежуточного представления порождается код на целевом языке)

  • оптимизация промежуточного кода (удаляются избыточные команды и упрощается реализуемый алгоритм).

  • генерация результирующего машинного кода (выполняется компоновка программы кода на целевом языке).

 

 

 

Интерпретация

Интерпретация (interpretation) - программное моделирование виртуальной машины, которая последовательно выполняет команды на языках высокого уровня.

Интерпретатор (interpreter) - программа или среда программирования, в которой можно произвести трансляцию исходного текста разрабатываемой программы и её исполнение без получения соответствующего машинного кода.

Интерпретатор (interpreter) - языковый процессор, который построчно анализирует исходную программу и одновременно выполняет предписанные действия (в отличие от компилятора, транслирующего всю программу без её выполнения)., а не формирует на машинном языке скомпилированную программу, которая выполняется впоследствии.

 

Visual Basic for Applications (VBA, Visual Basic для приложений) является интерпретируемым языком. Мы записывали с помощью VBA макросы.

 

Практически все языки программирования низкого уровня (ассемблер, Си, Модула-2) - компилируемые, а высокоуровневые языки (Python, SQL) - интерпретируемые.

 

 

 

Особенности интерпретации и компиляции

 

Особенности интерпретации:

  • большая переносимость интерпретируемых программ — программа будет работать на любой платформе, на которой есть соответствующий интерпретатор,

  • упрощение отладки исходных кодов программ, в том числе в диалоговом режиме.

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

  • Интерпретируемая программа не может выполняться отдельно без программы-интерпретатора,

  • интерпретируемая программа выполняется медленнее (отсутствует оптимизация кода, требуется промежуточный анализ исходного кода).

Особенности компиляции:

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

  • не требуется наличие компилятора на целевой машине, для которой компилируется программа.

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

 

 

 

Компилирующие интерпретаторы

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

В смешанных реализациях языков (Пример: Perl, Java, PHP, Python,) интерпретатор перед исполнением программы транслирует её на промежуточный язык (байт-код), который интерпретируется (исполняется) виртуальной машиной и может переноситься на различные компьютерные архитектуры без перекомпиляции. Для языка Java это JVM (язык виртуальной машины Java)

Динамическая компиляция - интерпретация, при которой исходный (или промежуточный) код компилируется в машинный код непосредственно во время исполнения. Эффективен для веб-приложений. Поддерживается в Java, Microsoft .NET, Perl, Python. Для языков программирования на платформе .NET Framework (C#, Managed C++, Visual Basic .NET и другие) — это MSIL (Microsoft Intermediate Language).

Интерпретатор компилирующего типа — это система из компилятора, переводящего исходный код программы в промежуточное представление (байт-код)  и собственно интерпретатора, который выполняет полученный промежуточный код (так называемая виртуальная машина).

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

 

 

 

Интерпретация в аппаратном обеспечении

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

 

 

 

Виртуальная машина

 

Виртуальная машина - абстрактный компьютер, работа которого реализуется (эмулируется) на реальной машине с помощью программных и/или аппаратных средств.

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

Виртуальная машина может эмулировать работу процессора, отдельных компонент аппаратного обеспечения, целого реального компьютера (включая BIOS, оперативную память, жёсткий диск и другие периферийные устройства). В последнем случае в ВМ, как и на реальный компьютер, можно устанавливать операционные системы (например, Windows можно запускать в виртуальной машине под Linux или наоборот).

На одном компьютере может функционировать несколько виртуальных машин (это может использоваться для имитации нескольких серверов на одном реальном сервере с целью оптимизации использования ресурсов сервера).

Виртуальные машины используются для:

  • защиты информации и ограничения возможностей программ (см.: песочница);

  • исследования производительности ПО или новой компьютерной архитектуры;

  • эмуляции различных архитектур (например, эмулятор игровой приставки);

  • оптимизации использования ресурсов мощных компьютеров;

  • вредоносного кода для управления инфицированной системой: вирус PMBS, обнаруженный в 1993 году, а также руткит SubVirt, созданный в 2006 году в Microsoft Research, создавали виртуальную систему, которой ограничивался пользователь и все защитные программы .

  • моделирования информационных систем с клиент-серверной архитектурой на одном компьютере (эмуляция компьютерной сети с помощью нескольких виртуальных машин).

  • тестирования и отладки системного программного обеспечения;

 

 

 

 

Конвертирование в ИТ

 

Конвертирование (conversion) - автоматическое преобразование:

  • типов данных (data type) в языках программирования.

  • содержимого файла из одного формата хранения данных в другой (file conversion)

  • текста из одной кодовой таблицы в другую (перекодировка, transcoding)

  • метаданных (разметки)

  • способов представления (например, инфографика)

  • языков (например, Wiki или MarkDown в HTML)

Общепринятая в вычислительной технике концепция файла — неструктурированная последовательность байтов.

Формат — структура файла, определяющая способ хранения и отображения его содержимого на экране или при печати.

Компьютерные программы, сохраняющие в файлах структурированные данные, должны преобразовывать их в последовательность байтов  (в ООП - «сериализация»; для текста - «парсинг») и наоборот.

Алгоритм этого преобразования, а также соглашения о том, как различные фрагменты информации располагаются внутри файла, и составляют его «формат».

Различные форматы файлов могут различаться степенью детализации, один формат может быть «надстройкой» над другим или использовать элементы других форматов (Текстовый формат накладывает самые общие ограничения на структуру данных. Формат HTML устанавливает дополнительные правила, но любой HTML-файл является и текстовым файлом).

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

 

 

 

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

 

Программный архитектор Университета Иннополис, кандидат физико-математических наук Евгений Зуев:

22.04.2015

 

Говоря простыми словами, компилятор — это программа, которая преобразует текст пользовательской программы в некоторое представление, пригодное для выполнения ее на компьютере.

В этом смысле компиляторы возникли вместе с первыми языками программирования в конце 50-х годов.

Компилятор с фортрана вместе с языком фортран появился в 1958 году. Таким образом, история, связанная с языками программирования и компиляторами, насчитывает уже больше шестидесяти лет. Несмотря на это, трудно сказать, что это направление в программировании, в Computer Science, является устоявшимся, застывшим. Скорее, наоборот, с течением времени, с появлением новых задач, которые решают компьютеры, появляется потребность в создании новых языков программирования и, соответственно, в разработке компиляторов для этих языков.

Традиционно компиляторы в науке, которую называют Computer Science, или информатикой, являются одним из краеугольных камней наряду с операционными системами и базами данных. Таким образом, компиляторы — это в некотором смысле базис информатики.

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

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

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

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

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

Для преодоления этого семантического разрыва и предназначен компилятор.

Попросту говоря, компилятор — это некая программа, переводящая программу, написанную программистом, в машинный код или в тот вид, который понимает, который может выполнить компьютер.

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

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

И это очень интересно.

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

Многие программисты хорошо знают о языке С++. Сейчас это один из наиболее популярных и распространенных языков программирования.

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

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

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

Задача разработки компилятора с любого сколько-нибудь нетривиального языка представляет собой одновременно научную и инженерную задачу. Не могу сказать, чего здесь больше.

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

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

Такой конгломерат, возможно, и придает этой сфере знаний особое обаяние.

Какое-то время назад казалось, что с созданием нескольких суперъязыков проблема создания компиляторов уходит на второй план. Однако развитие информатики, расширение сфер применения компьютеров ставит перед компьютером новые задачи. Эти новые задачи решаются с помощью новых языков программирования. Не говоря уже о том, что каждый профессор считает своим долгом придумать новый язык программирования, с помощью которого он преподавал бы своим студентам. Ну и в чисто прикладных областях возникают задачи, которые требуют новых изобразительных средств, новых языков программирования. Поэтому задача разработки компиляторов для этих новых языков программирования всегда актуальна.

В последнее время наметилась явная тенденция, когда каждая сколько-нибудь крупная фирма, имеющая отношение к компьютерам и программному обеспечению, выпускает собственный язык программирования. Эта тенденция характерна для очень многих современных фирм, имеющих отношение к компьютерам и программному обеспечению. Google, Facebook, не говоря уже о Microsoft и Oracle, имеют собственные языки программирования, которые они продвигают в широкие массы программистов.

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

В некотором смысле структура если не всех, то многих компиляторов очень похожа.

Несмотря на это, предпринимавшиеся лет, наверное, 40 назад попытки создания универсального языка и, соответственно, универсального компилятора закончились неудачей по довольно простой причине: проблем, которые решает программное обеспечение, очень много. Они по природе своей различны. Одно дело — написать, например, программу, которая управляет самолетом, и совсем другое дело — написать бухгалтерскую программу. Это разные области знания.

Соответственно, для их решения нужны разные инструменты.

А язык и компилятор — это инструмент для решения определенных задач.

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

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

 

 

 

Sapienti sat