К какому программному обеспечению относятся трансляторы

Обновлено: 04.07.2024

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

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

Связь между языком, на котором мы думаем/программируем, и задачами и решениями, которые мы можем представлять в своем воображении, очень близка. По этой причине ограничивать свойства языка только целями исключения ошибок программиста в лучшем случае опасно. Как и в случае с естественными языками, есть огромная польза быть, по крайней мере, двуязычным. Язык предоставляет программисту набор концептуальных инструментов, если они не отвечают задаче, то их просто игнорируют. Например, серьезные ограничения концепции указателя заставляют программиста применять вектора и целую арифметику, чтобы реализовать структуры, указатели и т.п. Хорошее проектирование и отсутствие ошибок не может гарантироваться чисто за счет языковых средств.

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

Персональные компьютеры IBM используют машинный язык микропроцессоров семейства 8086, т.к. их аппаратная часть основывается именно на данных микропроцессорах.

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

1) Языки программирования для микроконтроллеров

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

Сами языки программирования в свою очередь делятся на две группы:

1. языки программирования "высокого" уровня

2. языки программирования "низкого" уровня.

К языкам программирования "низкого" уровня относятся языки программирования в которых каждому оператору соответствует не более одной машинной команды. Набор машинных команд каждого конкретного процессора обязательно входит в состав такого языка программирования. Языки программирования низкого уровня в настоящее время называются ассемблерами (старое название автокоды). Для каждого процессора существует своя группа ассемблеров. Ассемблеры для одного и того же процессора различаются между собой дополнительными возможностями, облегчающими программирование.Языки программирования "высокого" уровня позволяют заменять один оператор несколькими машинными командами. Это позволяет увеличивать производительность труда программистов. Кроме того, языки "высокого" уровня позволяют писать программы, которые могут выполняться на различных микропроцессорах. (Естественно, что при этом необходимо использовать программы - трансляторы для соответствующего процессора.) В настоящее время наиболее распространены такие языки программирования высокого уровня как С и PLMО преимуществах и недостатках языков высокого и низкого уровней говорилось достаточно много. Выбор языка программирования зависит от состава аппаратуры, для которой пишется программа, а также от требующегося быстродействия всего программно - аппаратного комплекса в целом.В тех случаях, когда объём ОЗУ и ПЗУ мал (в районе нескольких килобайт) альтернативы ассемблеру нет. Именно эти языки программирования позволяют получать самый короткий и самый быстродействующий код программы (при прочих равных условиях, т.к. испортить можно всё!).Языки программирования высокого уровня позволяют значительно сократить время создания программы, но при этом увеличивается размер программы, поэтому для выбора такого языка программирования для микропроцессорных систем необходимо иметь достаточно большой объём памяти программ (несколько десятков килобайт). Увеличение объёма программы связано с несколькими факторами:

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

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

3. Программист не использует подпрограммы там, где они могли бы сократить объём программы, так как на языке программирования высокого уровня это всего один или несколько операторов.

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

Виды программ – трансляторов

Процесс преобразования операторов исходного языка программирования в машинные коды микропроцессора называется трансляцией исходного текста. В настоящее время ручная трансляция программ практически не используется. Трансляция производится специальными программами-трансляторами. Их классификация приведена на рисунке 1.


Рисунок 1. Классификация программ-трансляторов языков программирования.

Существует два больших класса программ-трансляторов: компиляторы и интерпретаторы. При использовании компиляторов весь исходный текст программы преобразуется в машинные коды, и именно эти коды записываются в память микропроцессора. При использовании интерпретатора в память микропроцессора записывается исходный текст программы, а трансляция производится при считывании из памяти программ очередного оператора. Естественно, что быстродействие интерпретаторов намного ниже по сравнению с компиляторами, т.к. при использовании оператора в цикле он транслируется многократно.Применение интерпретатора может обеспечить выигрыш только в случае его разработки для языка программирования “высокого” уровня. В этом случае может быть сэкономлена внутренняя память программ, а также облегчен процесс отладки программ (при применении языка программирования BASIC) или облегчен перенос программ с одного типа процессора на другой (при применении языка программирования JAVA).При программировании на языке программирования ASSEMBLER применение интерпретатора приводит к проигрышу по всем параметрам, поэтому для языков программирования низкого уровня применяются только программы–компиляторы.Для программирования микроконтроллеров как на языке программирования “низкого” уровня, так и на языке программирования “высокого” уровня используются только компиляторы, поэтому рассмотрим подробнее виды этих трансляторов.

Виды компиляторов

Программы-компиляторы бывают оценочные и профессиональные.

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

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

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

Оценочные компиляторы обычно предлагаются бесплатно фирмами - производителями микроконтроллеров. Только фирма Intel предложила в своё время профессиональный пакет разработки программ - язык программирования PLM-51 в состав которого входит профессиональный язык программирования ASM-51.

Профессиональные компиляторы разрабатываются и продаются отдельными фирмами. Для микроконтроллеров семейства MCS-51 получили известность продукты таких фирм как FRANCLIN, IAR, KEIL.

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

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

Чтобы писать сложные, эффективные и быстрые компиляторы, есть много рецептов. Но здесь речь пойдет не о них. Как написать компилятор просто - вот в чем вопрос! Ведь такой компилятор и короче, и отлаживается легче. Здесь не будет каких-то хитрых алгоритмов, позволяющих достигать чудес эффективности или каких- то особенных способов организации данных. Увы, с этими способами одна проблема: заставить их работать может только чудо. А в этой статье - только практические рекомендации, а работают они надежно!

Среди всех конструкций, воспринимаемых компилятором, есть минимальные, и которые уже не исеет смысла делить на части. Например: идентификатор, число, строка, ключевое слово. Они называются лексемами. Компилятору нет нужды разбираться в их структуре. Кстати, в описании старого, доброго Алгола-60 использовался термин иероглифы, то есть нечто такое, что можно обозначить значком. Но у компьютера всего-то 256 символов - и приходится писать, например, "procedure". А посему идея следующая: отдельная процедура считывает программу из файла, выделяет оттуда лексемы и передает их основной части компилятора. А той до текста программы уже нет никакого дела. Такаяподпрограмма называется сканером.

В языке SIMPLE существуют пять видов лексем (pис.2): ключевые слова, идентификаторы, числа, спецсимволы и нечто в квадратных скобках. По поводу первых четырех типов, кажется, все ясно - см. рисунок. А пятый, последний - это наша хитрость. Дело в том, что компиляция выражений - это вопрос особый, и ему будет посвящена следующая статья. Поэтому, пользуясь тем, что выходной язык у нас Паскаль, мы перекладываем эту задачу на плечи компилятора с Паскаля. А чтобы у нас не возникало проблем - информацию, которые мы просто переписываеми в выходной файл, не разбираясь в его внутренней структуре, заключаем в квадратные скобки.

Посмотрим на текст программы (Пример 1. Сканер). Основная процедура сканера - Scan. Вызывая ее, мы получаем очередную лексему. Мы можем даже считать ее аналогом процедуры ввода - со странного устройства, которое передает внутрь компьютера лексемы. Процедура Scan по первом символу лексемы определяет, что за лексема нас сейчас ждет, и вызывает "специализированную" процедуру, которая только этим типом лексем и занимается. Единственная загвоздка здесь - ключевые слова путаются с именами. Поэтому они считываются вместе, а уж потом одно отделяются от другого.

Обратим внимание на вспомогательные процедуры GetCh и UngetCh. Процедура GetCh заменяет сиволы перевода строки и табуляции на пробелы и пропускает лишние пробелы (так получается, что несколько пробелов подряд эквивалентны одному). Процедура UngetCh используется, если мы погорячились" и считали "лишний" символ. Тогда с помощью этой процедуры можно сказать: "Возьми обратно!" Процедура GetCh выдаст в следующий раз тот же символ.

Когда человек пишет свою программу или разбирается в чужой, ему нужно держать в голове кое-какую информацию. Но машина железная, у нее головы нет. Поэтому необходима структура данных, которая про каждуюпеременную хранила бы определенную информацию. Эта структура называется таблицей имен. Без нее не обходится ни один компилятор. Таблица имен действительно похожа на таблицу. Она состоит из "строк" - ячеек таблицы имен, которые могут содержать инфорацию об одной простой переменной, например, переменной целого типа. (Обычно эти ячейки называют записями таблицы имен, но здесь сознательно используется другой термин, чтобы не было путаницы с языком SIMPLE). Посмотрим на рис.3. Там изображена структура нашей таблицей имен. Проще всего, когда переменная - целого типа. Для нее нужно хранить всего ничего - имя и тип (integer). В реальных, больших компиляторах, впрочем, есть еще кое-что - ее адрес, например. Но мы, слава Богу, компилируем в Паскаль!

С записями будет посложнее. Даже в голове у нас они хранятся не целиком, а как нечто, сложенное из кусочков. А к чему должно быть ближе то, что хранится в таблице имен? Наверное, к тому, что хранится в голове, а не на бумаге.

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

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

Связь между языком, на котором мы думаем/программируем, и задачами и решениями, которые мы можем представлять в своем воображении, очень близка. По этой причине ограничивать свойства языка только целями исключения ошибок программиста в лучшем случае опасно. Как и в случае с естественными языками, есть огромная польза быть, по крайней мере, двуязычным. Язык предоставляет программисту набор концептуальных инструментов, если они не отвечают задаче, то их просто игнорируют. Например, серьезные ограничения концепции указателя заставляют программиста применять вектора и целую арифметику, чтобы реализовать структуры, указатели и т.п. Хорошее проектирование и отсутствие ошибок не может гарантироваться чисто за счет языковых средств.

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

Персональные компьютеры IBM используют машинный язык микропроцессоров семейства 8086, т.к. их аппаратная часть основывается именно на данных микропроцессорах.

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

1) Языки программирования для микроконтроллеров

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

Сами языки программирования в свою очередь делятся на две группы:

1. языки программирования "высокого" уровня

2. языки программирования "низкого" уровня.

К языкам программирования "низкого" уровня относятся языки программирования в которых каждому оператору соответствует не более одной машинной команды. Набор машинных команд каждого конкретного процессора обязательно входит в состав такого языка программирования. Языки программирования низкого уровня в настоящее время называются ассемблерами (старое название автокоды). Для каждого процессора существует своя группа ассемблеров. Ассемблеры для одного и того же процессора различаются между собой дополнительными возможностями, облегчающими программирование.Языки программирования "высокого" уровня позволяют заменять один оператор несколькими машинными командами. Это позволяет увеличивать производительность труда программистов. Кроме того, языки "высокого" уровня позволяют писать программы, которые могут выполняться на различных микропроцессорах. (Естественно, что при этом необходимо использовать программы - трансляторы для соответствующего процессора.) В настоящее время наиболее распространены такие языки программирования высокого уровня как С и PLMО преимуществах и недостатках языков высокого и низкого уровней говорилось достаточно много. Выбор языка программирования зависит от состава аппаратуры, для которой пишется программа, а также от требующегося быстродействия всего программно - аппаратного комплекса в целом.В тех случаях, когда объём ОЗУ и ПЗУ мал (в районе нескольких килобайт) альтернативы ассемблеру нет. Именно эти языки программирования позволяют получать самый короткий и самый быстродействующий код программы (при прочих равных условиях, т.к. испортить можно всё!).Языки программирования высокого уровня позволяют значительно сократить время создания программы, но при этом увеличивается размер программы, поэтому для выбора такого языка программирования для микропроцессорных систем необходимо иметь достаточно большой объём памяти программ (несколько десятков килобайт). Увеличение объёма программы связано с несколькими факторами:

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

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

3. Программист не использует подпрограммы там, где они могли бы сократить объём программы, так как на языке программирования высокого уровня это всего один или несколько операторов.

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

Виды программ – трансляторов

Процесс преобразования операторов исходного языка программирования в машинные коды микропроцессора называется трансляцией исходного текста. В настоящее время ручная трансляция программ практически не используется. Трансляция производится специальными программами-трансляторами. Их классификация приведена на рисунке 1.


Рисунок 1. Классификация программ-трансляторов языков программирования.

Существует два больших класса программ-трансляторов: компиляторы и интерпретаторы. При использовании компиляторов весь исходный текст программы преобразуется в машинные коды, и именно эти коды записываются в память микропроцессора. При использовании интерпретатора в память микропроцессора записывается исходный текст программы, а трансляция производится при считывании из памяти программ очередного оператора. Естественно, что быстродействие интерпретаторов намного ниже по сравнению с компиляторами, т.к. при использовании оператора в цикле он транслируется многократно.Применение интерпретатора может обеспечить выигрыш только в случае его разработки для языка программирования “высокого” уровня. В этом случае может быть сэкономлена внутренняя память программ, а также облегчен процесс отладки программ (при применении языка программирования BASIC) или облегчен перенос программ с одного типа процессора на другой (при применении языка программирования JAVA).При программировании на языке программирования ASSEMBLER применение интерпретатора приводит к проигрышу по всем параметрам, поэтому для языков программирования низкого уровня применяются только программы–компиляторы.Для программирования микроконтроллеров как на языке программирования “низкого” уровня, так и на языке программирования “высокого” уровня используются только компиляторы, поэтому рассмотрим подробнее виды этих трансляторов.

Виды компиляторов

Программы-компиляторы бывают оценочные и профессиональные.

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

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

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

Оценочные компиляторы обычно предлагаются бесплатно фирмами - производителями микроконтроллеров. Только фирма Intel предложила в своё время профессиональный пакет разработки программ - язык программирования PLM-51 в состав которого входит профессиональный язык программирования ASM-51.

Профессиональные компиляторы разрабатываются и продаются отдельными фирмами. Для микроконтроллеров семейства MCS-51 получили известность продукты таких фирм как FRANCLIN, IAR, KEIL.

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

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

Чтобы писать сложные, эффективные и быстрые компиляторы, есть много рецептов. Но здесь речь пойдет не о них. Как написать компилятор просто - вот в чем вопрос! Ведь такой компилятор и короче, и отлаживается легче. Здесь не будет каких-то хитрых алгоритмов, позволяющих достигать чудес эффективности или каких- то особенных способов организации данных. Увы, с этими способами одна проблема: заставить их работать может только чудо. А в этой статье - только практические рекомендации, а работают они надежно!

Среди всех конструкций, воспринимаемых компилятором, есть минимальные, и которые уже не исеет смысла делить на части. Например: идентификатор, число, строка, ключевое слово. Они называются лексемами. Компилятору нет нужды разбираться в их структуре. Кстати, в описании старого, доброго Алгола-60 использовался термин иероглифы, то есть нечто такое, что можно обозначить значком. Но у компьютера всего-то 256 символов - и приходится писать, например, "procedure". А посему идея следующая: отдельная процедура считывает программу из файла, выделяет оттуда лексемы и передает их основной части компилятора. А той до текста программы уже нет никакого дела. Такаяподпрограмма называется сканером.

В языке SIMPLE существуют пять видов лексем (pис.2): ключевые слова, идентификаторы, числа, спецсимволы и нечто в квадратных скобках. По поводу первых четырех типов, кажется, все ясно - см. рисунок. А пятый, последний - это наша хитрость. Дело в том, что компиляция выражений - это вопрос особый, и ему будет посвящена следующая статья. Поэтому, пользуясь тем, что выходной язык у нас Паскаль, мы перекладываем эту задачу на плечи компилятора с Паскаля. А чтобы у нас не возникало проблем - информацию, которые мы просто переписываеми в выходной файл, не разбираясь в его внутренней структуре, заключаем в квадратные скобки.

Посмотрим на текст программы (Пример 1. Сканер). Основная процедура сканера - Scan. Вызывая ее, мы получаем очередную лексему. Мы можем даже считать ее аналогом процедуры ввода - со странного устройства, которое передает внутрь компьютера лексемы. Процедура Scan по первом символу лексемы определяет, что за лексема нас сейчас ждет, и вызывает "специализированную" процедуру, которая только этим типом лексем и занимается. Единственная загвоздка здесь - ключевые слова путаются с именами. Поэтому они считываются вместе, а уж потом одно отделяются от другого.

Обратим внимание на вспомогательные процедуры GetCh и UngetCh. Процедура GetCh заменяет сиволы перевода строки и табуляции на пробелы и пропускает лишние пробелы (так получается, что несколько пробелов подряд эквивалентны одному). Процедура UngetCh используется, если мы погорячились" и считали "лишний" символ. Тогда с помощью этой процедуры можно сказать: "Возьми обратно!" Процедура GetCh выдаст в следующий раз тот же символ.

Когда человек пишет свою программу или разбирается в чужой, ему нужно держать в голове кое-какую информацию. Но машина железная, у нее головы нет. Поэтому необходима структура данных, которая про каждуюпеременную хранила бы определенную информацию. Эта структура называется таблицей имен. Без нее не обходится ни один компилятор. Таблица имен действительно похожа на таблицу. Она состоит из "строк" - ячеек таблицы имен, которые могут содержать инфорацию об одной простой переменной, например, переменной целого типа. (Обычно эти ячейки называют записями таблицы имен, но здесь сознательно используется другой термин, чтобы не было путаницы с языком SIMPLE). Посмотрим на рис.3. Там изображена структура нашей таблицей имен. Проще всего, когда переменная - целого типа. Для нее нужно хранить всего ничего - имя и тип (integer). В реальных, больших компиляторах, впрочем, есть еще кое-что - ее адрес, например. Но мы, слава Богу, компилируем в Паскаль!

С записями будет посложнее. Даже в голове у нас они хранятся не целиком, а как нечто, сложенное из кусочков. А к чему должно быть ближе то, что хранится в таблице имен? Наверное, к тому, что хранится в голове, а не на бумаге.

Трансля́тор — программа или техническое средство, выполняющее трансляцию программы [1] [2] .

Трансля́ция програ́ммы — преобразование программы, представленной на одном из языков программирования, в программу на другом языке. Транслятор обычно выполняет также диагностику ошибок, формирует словари идентификаторов, выдаёт для печати текст программы и т. д. [1]

Язык, на котором представлена входная программа, называется исходным языком, а сама программа — исходным ом. Выходной язык называется целевым языком.

В общем случае понятие трансляции относится не только к языкам программирования, но и к другим языкам — как формальным компьютерным (вроде языков разметки типа HTML), так и естественным (русскому, английскому и т. п.) [3] [4] .

Существует несколько видов трансляторов [2] .

  • Диалоговый транслятор — транслятор, обеспечивающий использование языка программирования в режиме разделения времени.
  • Синтаксически-ориентированный (синтаксически-управляемый) транслятор — транслятор, получающий на вход описание синтаксиса и семантики языка, текст на описанном языке и выполняющий трансляцию в соответствии с заданным описанием.
  • Однопроходной транслятор — транслятор, преобразующий исходный при его однократном последовательном чтении (за один проход).
  • Многопроходной транслятор — транслятор, преобразующий исходный после его нескольких чтений (за несколько проходов).
  • Оптимизирующий транслятор — транслятор, выполняющий оптимизацию создаваемого а. См. оптимизирующий компилятор.
  • Тестовый транслятор — транслятор, получающий на вход исходный и выдающий на выходе изменённый исходный . Запускается перед основным транслятором для добавления в исходныйотладочныхпроцедур. Например, транслятор с языкаассемблера может выполнять замену макрокоманд на .
  • Обратный транслятор — транслятор, выполняющий преобразование машинного а в текст на каком-либо языке программирования. См. дизассемблер, декомпилятор.

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

  • устройство — процессор (трансляция называется компиляцией);
  • программа — интерпретатор (трансляция называется интерпретацией).
    ;
    • в исполняемый
      • в машинный
      • в байт-

      Компиляция

      Язык процессора (устройства, машины) называется машинным языком, машинным ом. на машинном языке исполняется процессором. Обычно, машинный язык — язык низкого уровня, но существуют процессоры, использующие языки высокого уровня (например, iAPX-432 [5] ). Однако, такие процессоры не получили распространения в силу своей сложности и дороговизны.

      Компилятор — это вид транслятора, преобразующий исходный с какого-либо языка программирования на машинный язык [6] .

      Процесс компиляции, как правило, состоит из нескольких этапов:

        ; ; ;
      • создание на основе результатов анализов промежуточного а; промежуточного а;
      • создание объектного а, в данном случае машинного.

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

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

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

      Интерпретация — процесс чтения и выполнения исходного а. Реализуется программой — интерпретатором.

      Интерпретатор может работать двумя способами:

      1. читать и исполнять его сразу (чистая интерпретация[6] );
      2. читать , создавать в памяти промежуточное представление а (байт- или p-), выполнять промежуточное представление а (смешанная реализация[6] ).

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

      Этапы работы интерпретатора:

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

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

      Чистая интерпретация применяется, обычно, для языков с простой структурой, например, языков сценариев, языков APL и Лисп.

      Достоинства интерпретаторов по сравнению с компиляторами:

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

      Недостатки интерпретаторов по сравнению с компиляторами:

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

      Сравнение чистого интерпретатора и интерпретатора, создающего байт-:

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

      Динамическая компиляция

      Достоинства динамической компиляции по сравнению с компиляцией:

      • скорость работы динамически компилируемых программ близка к скорости работы компилируемых программ;
      • отсутствие необходимости перекомпиляции программы при переносе на другую платформу.

      Недостатки динамической компиляции по сравнению с компиляцией и чистой интерпретацией:

      • бо́льшая сложность реализации;
      • бо́льшие требования к ресурсам.

      Динамическая компиляция хорошо подходит для веб-приложений.

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

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

      Software – это программная оболочка вычислительных устройств: компьютеров, игровых консолей, смартфонов и прочей электроники. В её состав входят операционные системы, приложения, драйверы, службы, руководства со справочной информацией к ним. В публикации рассмотрим одну из разновидностей software – системное программное обеспечение (СПО): что такое, состав, разновидности, особенности. Приведём примеры такого программного обеспечения (ПО), разберёмся с назначением.

      Виды программного обеспечения компьютеров

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

      Виды программного обеспечения компьютеров

      ПО состоит из следующих уровней (начиная из самого низкого).

      • Базовый. Являются составляющей основного оборудования (материнская плата, видеокарта, процессор). Записывается в специальные микросхемы – постоянно запоминающие устройства – путём прошивки на финальном этапе производственного процесса. Если нужно изменять содержимое памяти, применяются перепрограммируемые запоминающие устройства, подлежащие перепрошивке или обновлению микрокода. Пример – микропрограмма BIOS/UEFI.
      • Системный. Отвечает за взаимодействие прикладных приложений с базовыми и самим аппаратным комплексом.
      • Служебный. Организовывает работу всех трёх уровней ПО. К служебным приложениям относятся утилиты, выполняющие настройку, автоматизацию управления ПК.
      • Прикладной. Комплекс для решения задач пользователя. При разработке применяется прикладное программирование – это процесс создания, тестирования и отладки ПО для конечного пользователя.

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

      Системное программное обеспечение (ПО): что это

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

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

      Состав

      • Операционные системы (ОС) – сложный программный комплекс для организации доступа пользователя к аппаратуре, управления железом. Выступает посредником между устройствами, микроархитектурой ПК и прикладным ПО.
      • Драйверы оборудования – библиотеки, организовывающие доступ к устройствам, управление ими, взаимодействие оборудования с приложениями и операционной системой.
      • Загрузчики – микропрограмма, загружающая исполняемый код в оперативную память.
      • Трансляторы – превращают исходный код в исполняемый. Иногда относятся к инструментальному ПО.
      • Сервисные утилиты, командные оболочки – служебное ПО, рассчитанное на обслуживание компьютера, оптимизацию, повышение безопасности и надёжности его работы.
      • Системные службы (сервисы) – автоматически выполняемые ОС приложения со специализированными функциями.
      • Операционные оболочки (shell) – среда для взаимодействия пользователя с ОС, упрощения отправки ей управляющих команд посредством командной строки (CLI) либо графического интернета (GUI).

      Иногда к системному ПО причисляют промежуточное – обычно обеспечивает единый программный интерфейс.

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

      Функции СПО

      • Управление аппаратурой на всех этапах работы компьютера.
      • Предоставление доступа пользовательским приложениям к аппаратным ресурсам.
      • Гарантия защиты, конфиденциальности и надёжности хранения информации.
      • Организация доступа ко внешним ресурсам – локальным и глобальным сетям, периферийным устройствам.
      • Предоставление платформы для разработки ПО.
      • Проведение диагностики и тестирования комплектующих.
      • Распределение доступа к памяти и процессорному времени.

      Каждую функцию можно разделить на множество мелких.

      Примеры системного программного обеспечения

      • Операционные системы: Windows 10, Linux Ubuntu, Mac OS.
      • Операционные оболочки: текстовые – командная строка, PowerShell, Терминал; графические – Total Commander, Проводник.
      • Загрузчики – Grub, SysLinux – используется в ОС семейства Linux, Windows Boot Manager и NTLDR – применяется для запуска Windows.
      • Сервисные утилиты – многие входят в состав операционных систем, например, средство для дефрагментации и тестирования дисков, диагностики памяти.
      • Системные сервисы – службы управления сетями, аудио, обеспечения безопасности.

      Расскажите, в чем заключена суть программного принципа работы вычислительного устройства – компьютера, смартфона. Назовите основные функции и классификацию СПО.

      Читайте также: