Трансляторы примеры программ. Что такое компилятор, интерпретатор, транслятор

13 июля 2009 г. 11:38

Игорь Николаевич Киселев, заместитель начальника отдела обеспечения сохранности, государственного учета и автоматизированных архивных технологий Росархива.

Доклад был представлен на заседании Совета по архивному делу при Федеральном архивном агентстве по теме "Информационные технологии в архивном деле: актуальные проблемы и пути их решения" 4 июня 2008 года.

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

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

Никакая информатизация невозможна без технической инфраструктуры. Согласно отчетным данным, оснащенность отрасли компьютерами последних поколений заметно увеличилась. В федеральных архивах имеется 845 таких компьютеров, в государственных архивах регионов - 5 068, в муниципальных архивах - 3 652 компьютера. Много это или мало? Ответ может дать отчетный показатель, недавно введенный Росархивом, согласно которому по состоянию на 01.01.2008 г. на один современный компьютер приходится от полутора до трех штатных сотрудников архива, то есть оснащенность техникой остается недостаточной.

Наблюдается значительный рост локальных вычислительных сетей: в федеральных архивах развернуты 10 ЛВС, 187 - в госархивах субъектов Российской Федерации. В муниципальных архивах имеется 25 сетей, однако очевидно, что потребность этих архивов в ЛВС невелика.

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

● разработка и предоставление архивным учреждениям отрасли унифицированного общеотраслевого программного обеспечения;

● ведение общеотраслевых БД и представление в сети Интернет объединенных архивных информационных ресурсов;

● содействие льготному приобретению стандартного программного обеспечения.

Приведем иллюстрацию к последнему пункту. Как известно, благодаря усилиям Росархива федеральные архивы, госархивы субъектов РФ и муниципальные архивы включены в Программу академического лицензирования компании Microsoft. В прошлом году только федеральные архивы закупили 439 лицензий и лицензионных продуктов этой компании на общую сумму 672,6 тыс. рублей. При рыночной стоимости этих лицензий и продуктов в 2974,2 тыс. руб. реальная экономия составила 2301,6 тыс. руб. или 77%.

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

С самого начала процесса автоматизации архивной работы в центре внимания Росархива находилось построение автоматизированной системы централизованного государственного учета архивных документов. Основных причин для этого было две. Первая: в первой половине 90-х годов в ряде региональных государственных архивов появились разные компьютерные программы по учету со своим форматами данных. Было совершенно ясно, что если не ввести этот процесс в единое русло, то мы никогда не построим общую систему, поскольку главное условие ее существования - унифицированные структура и форматы описания архивных документов. Вторая причина состоит в том, что именно в процессе государственного учета накапливается информация, необходимая для всех остальных направлений архивной деятельности - прежде всего НСА, а также обеспечения сохранности, комплектования и использования. Так возник программный комплекс (ПК) «Архивный фонд», выполняющий функции базового программного обеспечения в системе госучета.

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

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

● полный охват архивов всех уровней и органов управления архивным делом;

● учет всех видов документации;

● полный учет архивных документов на уровнях фонд - опись - единица хранения;

● автоматизированное формирование архивных учетных документов.

По состоянию на 01.01.2008 г. в системе работают все 14 федеральных архивов с фондовой организацией документов. Число региональных государственных архивов, включенных в систему, достигло 211, т.е. 91% (оставшиеся 19 госархивов, как предполагается, войдут в систему в течение одного - двух лет); количество участвующих в работе системы муниципальных архивов составило 1246 (51,9%), эти архивы демонстрируют стабильно высокие темпы прироста, что позволяет прогнозировать их полное вхождение в систему в ближайшие годы; ПК «Фондовый каталог» ведут 53 субъекта РФ. Система в целом включает 1452 архива в 82 субъектах Федерации.

Традиционно основным показателем с точки зрения полноты государственного учета является количество описаний фондов, введенных в систему. По федеральным архивам этот показатель на 01.01.2008 г. составил 55,4 тыс. фондов, или 81,6% от паспортных данных. Государственные архивы субъектов РФ ввели в систему 398,3 тыс. описаний фондов (84,3% от паспорта). Вклад муниципальных архивов составил 166,3 тыс. описаний (48,5%). В целом введено 620,0 тыс. описаний, или 70,2% от всех фондов, хранящихся в государственных и муниципальных архивах страны.

Увеличение информационного потенциала системы госучета предусматривает ввод в БД «Архивный фонд» сведений об описях (как частей фонда). В целом по отрасли в архивах введены данные о 913,2 тыс. описей, что составляет 58% от их количества по паспорту. Наилучших результатов здесь достигли государственные архивы регионов - 67,1% или 627,8 тыс. описаний. Ниже средних по отрасли показатели у федеральных (45,3%) и муниципальных архивов (44,3%). Значимость информации об описях заключается прежде всего в том, что она является необходимым элементом для точного подсчета объемных показателей госучета в архиве; во-вторых, эту ступень нельзя миновать при вводе информации о единицах хранения. Наиболее же важное обстоятельство - именно на этом уровне фиксируется с достаточной определенностью наличие в архивных документах сведений по личному составу, относящихся к конкретному фондообразователю.

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

В заполнении БД «Архивный фонд» есть свои лидеры - регионы, в которых государственные и муниципальные архивы ввели основную информацию обо всех фондах и описях: Удмуртская Республика, Алтайский край, Краснодарский край, Калининградская, Нижегородская, Свердловская, Тюменская и Челябинская области, Ямало-Ненецкий автономный округ. В 17 субъектах РФ 100% таких данных введены только госархивами. Наконец, в 4-х регионах только муниципальные архивы ввели все основные сведения на уровнях фонда и описи. Пять федеральных архивов (ГА РФ, РГАДА, РГАЛИ, РГАНТД, РГАСПИ) ввели основную информацию по всем фондам; РГАНИ, филиал РГАНТД и РГВИА ввели более 96% описаний фондов; процент введенной информации об описях в перечисленных федеральных архивах - от 85 до 100.

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

Процесс накопления информации в электронном формате об архивных документах подошел к моменту, когда на повестку дня выдвигается задача массового ввода в систему сведений на уровне единицы хранения (единицы учета). Эта работа в ряде архивов ведется. Государственные архивы регионов ввели в БД «Архивный фонд» 1 417,5 тыс. заголовков дел, муниципальные архивы - 1 291,9 тыс. заголовков. Эти цифры превышают общее количество записей на уровне фонда, однако они составляют соответственно лишь 1,0 и 2,3 процента от объема хранящихся дел. По федеральным же архивам в системе содержатся только 0,2% заголовков дел.

Задача ввода этих данных в архивах решается двумя путями. Архивы с небольшими объемами документов самостоятельно осуществляют ручной ввод. В других случаях используется так называемая массовая (или поточная) оцифровка описей - выбранная на конкурсной основе фирма вводит структурированные описания дел в стандартном формате (например, в формате MS Access) в базу данных, из которой информация легко может быть конвертирована в БД «Архивный фонд». Так, в ГА РФ и РГАЭ создан массив объемом около 2,5 млн. описаний единиц хранения, который может быть использован как самостоятельный информационный ресурс, а также как сведения для включения в БД «Архивный фонд».

Сформулированная выше цель по охвату автоматизированным учетом всех видов документации будет полностью достигнута в рамках 4-й версии ПК «Архивный фонд», разработка которой в настоящее время завершается. В новой версии программы добавляется возможность учета кино-, фоно-, видеодокументов, а также документов на электронных носителях. Можно будет распечатывать опись и, заверив ее надлежащим образом, получать полноценный традиционный документ госучета. Более полной автоматизации учета архивных документов будет способствовать и функция пересчета объемных показателей при движении документов. В программе будут также автоматически создаваться паспорт архива и практически все учетные формы, являющиеся приложениями к новым «Правилам организации хранения, комплектования, учета и использования документов Архивного фонда Российской Федерации...».

Новая версия ПК «Архивный фонд» реализуется на современной программной платформе со своими внутренними форматами представления данных, что влечет за собой необходимость соответствующей модернизации ПО «Фондовый каталог» и «Центральный фондовый каталог». Разработка этих программ запланирована на 2009 год. Предполагается ежегодная передача из БД «Архивный фонд» в эти базы данных не только информации на уровне фонда, как это происходило в «карточной» системе централизованного госучета, но и сведений на уровнях описи и единицы хранения. Передача такого состава информации об архивных документах диктуется не столько потребностями госучета, сколько необходимостью формирования межархивного НСА регионального и отраслевого масштаба.

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

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

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

В действующей версии ПК «Архивный фонд» архивист имеет возможность создавать электронный аналог описи, автоматически формировать структурированные тексты путеводителей по фондам архива с необходимыми видами указателей к путеводителю, краткие справочники, различного рода тематические перечни фондов и дел, вести любого вида каталоги. В 4-й версии программы можно будет также создать реестр описей как отдельный справочник. «Фондовый каталог» позволяет автоматически формировать тексты межархивных справочников, вести каталоги. Главное в указанных в этих программах заключается не столько в подготовке печатных изданий, сколько в их способности непосредственно выполнять функции электронного НСА.

Все более значительную роль информационные интернет-технологии играют в сфере использования архивных документов. Если говорить о внутриархивном сегменте использования, то, как представляется, на общеотраслевом уровне логично разработать и предоставить архивам типовое решение по автоматизации работы читального зала. Росархив приступил к этой работе. Близка к завершению разработка действующей модели ПО под условным названием «Контроль и учет движения дел и документов в архиве», в функции которого входит учет пользователей читального зала, автоматизированное формирование требований (с помощью электронных описей), передача требований по локальной сети в хранилище и т.д.. Системой фиксируется, где фактически находится дело в каждый момент времени, формируются статистические отчеты по использованию архивных документов, выполняются некоторые другие функции. Ясно, что система должна сопрягаться с информацией, накопленной в БД «Архивный фонд». ПО ориентировано на крупные архивы, в дальнейшем будет решаться вопрос о подготовке его упрощенного варианта для муниципальных архивов.

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

● Определены конкретные методики построения и функции специализированных архивных технологий.

● Определены составы и структуры формируемых информационных массивов баз данных.

● Внедрено или находится в процессе разработки общеотраслевое программное обеспечение по основным направлениям архивной деятельности.

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

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

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

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

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

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

Основные цели присутствия архивов в Интернете в самой сжатой форме выглядят следующим образом:

● предоставление общей справочной информации об архивных документах и архивах;

● постоянное информирование об архивной деятельности;

● содействие поиску архивных документов и получению архивных услуг;

● взаимное информирование архивистов и обсуждение профессиональных архивных вопросов;

● популяризация архивного дела, формирование позитивного имиджа архивов у граждан и общества.

За последние годы на архивных сайтах размещен огромный и разнообразный материал, в целом соответствующий сформулированным целям, растет интерактивное взаимодействие архивов с пользователями сайтов. В этой статье нет возможности для детального анализа всех достоинств, недостатков, особенностей архивных сайтов по каждому из перечисленных направлений. Однако для обсуждения этой проблематики недавно появилась своя площадка - научно-практический семинар-совещание «Российские архивные сайты: опыт, проблемы, перспективы развития» (май 2007 г., Чебоксары; май 2008 г., Московская область).

В соответствии с рекомендациями первого из этих семинаров проведен мониторинг сайтов федеральных архивов, органов управления архивным делом и государственных архивов субъектов РФ (экспертную оценку по 53-м критериям осуществляла Е.В.Боброва, контент-девелопер портала «Архивы России»). Первые пять мест заняли сайты ГА Пермской области, Главархив Москвы, Архивная службы Республики Татарстан, ГАС Удмуртской Республики, РГАНТД и «Архивы Карелии» (поделили пятое место). В итоговой таблице (будет опубликована на портале «Архивы России» вместе с методикой мониторинга) обращает на себя внимание огромный разброс в качественном уровне архивных сайтов - первые пять позиций занимают сайты, получившие от 89 до 115 баллов, в то время как 28 сайтов (из 66) набрали менее 30 баллов.

Процесс архивного сайтостроения только разворачивается, причем в трудных кадровых и финансовых условиях. В настоящее время представительство отрасли в сети выглядит так: отраслевой портал «Архивы России »; 6 сайтов федеральных архивов; всего лишь 34 сайта органов управления архивным делом и 26 сайтов региональных государственных архивов. Здесь учтены только самостоятельные сайты, количество кратких страничек на сайтах вышестоящих и сторонних организаций как минимум удвоило бы приведенные цифры. Однако все эти странички никак нельзя признать сколько-нибудь полноценным архивным представительством в Сети, они содержат лишь краткую справочную информацию, дополненную иногда текстом Положения об архиве или органе управления, в редких случаях также общим перечнем архивных услуг.

Можно ожидать, что в ближайшее время число архивных сайтов существенно возрастет. Стимулом должна послужить одобренная Распоряжением Правительства РФ от 6 мая 2008 г. № 632-р «Концепция формирования в Российской Федерации электронного правительства до 2010 г.». В документе под термином «электронным правительство» подразумевается «новая форма организации деятельности органов государственной власти, обеспечивающая за счет широкого применения информационно-коммуникационных технологий качественно новый уровень оперативности и удобства получения организациями и гражданами государственных услуг и информации о результатах деятельности государственных органов». Среди приоритетов Концепции - создание всеми органами власти самостоятельных сайтов и обеспечение через них доступ к ведомственным информационным системам. Применительно к архивной отрасли речь пойдет, несомненно, о широком открытом доступе к научно-справочному аппарату.

В этом направлении архивы ведут постоянную работу. На портале «Архивы России» размещены 115 справочников, на других архивных сайтах представлены еще 196 справочников различных типов и видов. Эти цифры, конечно, впечатляют, доступность НСА для пользователя расширяется - по сравнению с традиционными формами представления справочников. Однако в современных условиях этого результата уже недостаточно. Проблема в том, что архивные справочники размещены на 42-х сайтах, то есть пользователь должен разыскать каждый сайт, на нем - НСА, и затем начать поиск документов. В то же время современные интернет-технологии позволяют создать единый ресурс (физически находящийся на одном или на нескольких связанных сайтах) в унифицированном формате, с едиными правилами представления и поиска информации. Прототипом такого ресурса является база данных «Путеводители по российским архивам », размещенная на портале «Архивы России». Она содержит структурированную информацию 60 путеводителей по федеральным и региональным архивам общим объемом в 103 тыс. описаний фондов. Еще одним чрезвычайно важным и перспективным технологическим свойством этого ресурса является то, что информационное наполнение этой базы данных доступно для поисковых машин Интернета. Отсюда и высокая востребованность ресурса пользователями - в среднем 1400 посещений в сутки.

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

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

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

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

Такая программа как транслятор представляет собой лингвистическое представление вычислений I ->P ->P (i). Интерпретатор представляет собой программу, на вход которой подается программа P с некоторыми входными данными X.Выполняет он P на X: I(P, x)=P(x).Существует единственный транслятор, который способен выполнять все возможные программы (которые можно представить в формальной системе). Это является очень значительным и глубоким открытием Тьюринга. Процессор представляет собой интерпретатор программ на машинном языке. Писать интерпретаторы для языков высокого уровня, как правило, слишком дорого, поэтому их транслируют в ту форму, которую легче интерпретировать. Некоторые виды трансляторов обладают очень странными именами. Программа транслирует программы на ассемблере в машинный язык. Компилятор позволяет транслировать с языка высокого уровня на язык более низкого уровня. Транслятор представляет собой программу, которая в качестве входных данных принимает программу на некотором языке S и после обработки выдает программу на языке T.Таким образом, они обе имеют ту же семантику: P->X->Q. Таким образом, для любого xP(x)=Q(x). Если транслировать всю программу в нечто интерпретируемое, то это называется компиляцией перед исполнением или компиляцией AOT. Компиляторы AOT могут использоваться последовательно. Последний из них очень часто является ассемблером. Так, рассмотрим пример: Исходный код ->Компилятор (транслятор) -> Ассемблерный код -> Ассемблер (транслятор) -> Машинный код -> ЦПУ (интерпретатор). Динамическая или оперативная компиляция осуществляется в том случае, если часть программы транслируется, когда исполняются другие скомпилированные ранее части. Трансляторы JIT запоминают то, что они уже выполнили ранее, чтобы снова и снова не повторять исходный код. Они даже способны выполнять адаптивную компиляцию и перекомпиляцию, которая основана на поведении среды выполнения программы. Многие языки дают возможность выполнять код во время трансляции, а также компилировать новый код во время выполнения программы.

Трансляция: этапы

Процесс трансляции состоит из этапов синтеза и анализа. Схематично этот процесс выглядит примерно следующим образом: Исходный код -> Анализатор -> Концептуальное представление -> Синтезатор (генератор) -> Целевой код. Обусловлено это следующими причинами:

— любой другой способ просто не подходит;

— перевод по словам просто не работает.

Можно использовать следующее инженерное решение: если необходимо написать трансляторы для M исходных языков и N целевых, потребуется написать только M+N простых программ (полукомпиляторов), а не MxN полных (комплексных) трансляторов. На практике, тем не менее, концептуальное представление довольно редко бывает выразительным и мощным, чтобы охватить все существующие целевые и исходные языки. Хотя некоторые пользователи смогли приблизиться к этому. Реальные компиляторы проходят через множество различных этапов. При создании собственного компилятора не нужно будет заново проводить всю тяжелую работу, которую программисты уже проделали при создании генераторов и представлений. Свой язык можно транслировать непосредственно в JavaScript или C и использовать для этой цели существующие компиляторы языка C и JavaScript движки для того, чтобы сделать все остальное. Можно также использовать существующие промежуточные представления и виртуальные машины.

Запись транслятора

Транслятор может представлять собой техническое средство или программу, в которой используются три языка: исходный, целевой, базисный. Записать их можно в форме T, расположив слева исходный, справа целевой и ниже базисный. Всего существует три вида компиляторов.

  1. Транслятор – это самокомпилятор, если исходный язык у него соответствует базисному.
  2. Саморезидентным называется компилятор, у которого целевой язык равняется базисному.
  3. Если целевой и базисный языки различные, то транслятор – это кросс-компилятор.

Почему важно различать эти виды компиляторов? Даже если вы никогда не создадите по-настоящему качественный компилятор, неплохо будет узнать о технологии его создания, поскольку все используемые для этой цели концепции применяются повсеместно в языках запросов к базам данных, при форматировании текстов, в расширенных компьютерных архитектурах, графических интерфейсах, обобщенных задачах оптимизации, машинных переводах, контроллерах и в виртуальных машинах. Также, если необходимо написать препроцессоры, загрузчики, сборщики, отладчики или профилировщики, необходимо пройти через все те же этапы, что и при написании компилятора. Можно также узнать о том, каким образом лучше писать программы, поскольку разработка транслятора для языка программирования означает лучшее понимание всех его неясностей и тонкостей. Благодаря изучению общих принципов трансляции вы можете стать хорошим дизайнером языка. Но действительно ли это важно? Насколько крут язык, если он не может быть эффективно реализован?

Масштабная технология

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

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

Какие проблемы могут возникать с исходным языком? Легко ли его скомпилировать? Имеется ли для этого препроцессор? Каким образом обрабатываются типы? Какая группировка проходов компилятора используется – одно- или многоходовая? Также особого внимания заслуживает желаемая степень оптимизации. Быстрая и нечистая трансляция программы практически без оптимизации может быть нормальной. Чрезмерная оптимизация может тормозить компилятор, однако, во время выполнения лучший код может того стоить.

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

Необходимый набор инструментов

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

Что касается вида целевого кода для генерации, тут необходимо выбирать из чистого, дополненного или виртуального машинного кода. Можно также написать входную часть, которая создает популярные промежуточные представления, такие как LLVM, JVM, RTL. Можно также сделать трансляцию из исходного в исходный код на Java Script или C. Если говорить о формате целевого кода, тут здесь можно выбрать переносимый машинный код, машинный код образа памяти, язык ассемблера.

Перенацеливание

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

Компоненты компилятора

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

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

— синтаксический анализатор (парсер) строит из них абстрактное синтаксическое дерево;

— семантический анализатор раскладывает семантическую информацию и проверяет на предмет наличия ошибок узлы дерева;

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

— генератор промежуточного кода строит граф потока (кортежи группируются в основные блоки);

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

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

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

— используются подсистемы обнаружения ошибок и менеджер таблиц символов;

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

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

— отсутствующие в алфавите символы;

— превышение количества знаков в строке или слове;

— не закрытый строковый литерал или знак;

— конец файла в комментарии.

Синтаксический анализ или парсинг применяется для преобразования последовательности токенов в абстрактное синтаксическое дерево. При этом каждый узел дерева сохраняется как объект с именованными полями. Многие из них сами являются узлами дерева. Циклы на этом этапе отсутствуют. При создании парсера нужно в первую очередь обращать внимание на уровень сложности грамматики (LRили LL) и выяснить, имеются ли какие-то правила снятия неоднозначности. Действительно некоторые языки требуют проведения семантического анализа. Ошибки, которые встречаются на данном этапе, называются синтаксическими.

Семантический анализ

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

— множественные объявления переменной в пределах области ее действия;

— нарушение правил доступности;

— наличие ссылок на необъявленное имя;

— чересчур большое или, наоборот, недостаточное число аргументов при вызове метода;

— несоответствие типов.

Генерация

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

Языки программирования могут быть разделены на компилируемые и интерпретируемые.

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

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

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

Разделение на компилируемые и интерпретируемые языки является несколько условным. Так, для любого традиционно компилируемого языка, как, например, Паскаль, можно написать интерпретатор. Кроме того, большинство современных "чистых" интерпретаторов не исполняют конструкции языка непосредственно, а компилируют их в некоторое высокоуровневое промежуточное представление (например, с разыменованием переменных и раскрытием макросов).

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

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

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

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

Некоторые языки, например, Java и C#, находятся между компилируемыми и интерпретируемыми. А именно, программа компилируется не в машинный язык, а в машинно-независимый код низкого уровня, байт-код. Далее байт-код выполняется виртуальной машиной. Для выполнения байт-кода обычно используется интерпретация, хотя отдельные его части для ускорения работы программы могут быть транслированы в машинный код непосредственно во время выполнения программы по технологии компиляции "на лету" (Just-in-time compilation, JIT). Для Java байт-код исполняется виртуальной машиной Java (Java Virtual Machine, JVM), для C# - Common Language Runtime.

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

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

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

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

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

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

Компилятор - это обслуживающая программа, выполняющая трансляцию на машинный язык программы, записанной на исходном языке программирования. Также как и ассемблер, компилятор обеспечивает преобразование программы с одного языка на другой (чаще всего, в язык конкретного компьютера). Вместе с тем, команды исходного языка значительно отличаются по организации и мощности от команд машинного языка. Существуют языки, в которых одна команда исходного языка транслируется в 7-10 машинных команд. Однако есть и такие языки, в которых каждой команде может соответствовать 100 и более машинных команд (например, Пролог). Кроме того, в исходных языках достаточно часто используется строгая типизация данных, осуществляемая через их предварительное описание. Программирование может опираться не на кодирование алгоритма, а на тщательное обдумывание структур данных или классов. Процесс трансляции с таких языков обычно называется компиляцией, а исходные языки обычно относятся к языкам программирования высокого уровня (или высокоуровневым языкам). Абстрагирование языка программирования от системы команд компьютера привело к независимому созданию самых разнообразных языков, ориентированных на решение конкретных задач. Появились языки для научных расчетов, экономических расчетов, доступа к базам данных и другие.

Интерпретатор - программа или устройство, осуществляющее пооператорную трансляцию и выполнение исходной программы. В отличие от компилятора, интерпретатор не порождает на выходе программу на машинном языке. Распознав команду исходного языка, он тут же выполняет ее. Как в компиляторах, так и в интерпретаторах используются одинаковые методы анализа исходного текста программы. Но интерпретатор позволяет начать обработку данных после написания даже одной команды. Это делает процесс разработки и отладки программ более гибким. Кроме того, отсутствие выходного машинного кода позволяет не "захламлять" внешние устройства дополнительными файлами, а сам интерпретатор можно достаточно легко адаптировать к любым машинным архитектурам, разработав его только один раз на широко распространенном языке программирования. Поэтому, интерпретируемые языки, типа Java Script, VB Script, получили широкое распространение. Недостатком интерпретаторов является низкая скорость выполнения программ. Обычно интерпретируемые программы выполняются в 50-100 раз медленнее программ, написанных в машинных кодах.

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

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

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

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

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

Макропроцессоры используются и с языками высокого уровня. Они увеличивают функциональные возможности таких языков как PL/1, C, C++. Особенно широко макропроцессоры применяются в C и C++, позволяя упростить написание программ. Макропроцессоры повышают эффективность программирования без изменения синтаксиса и семантики языка.

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

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

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

Любой транслятор выполняет следующие основные задачи:

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

Одно, часто упоминаемое преимущество интерпретаторной реализации состоит в том, что она допускает "непосредственный режим". Непосредственный режим позволяет вам задавать компьютеру задачу вроде PRINT 3.14159*3/2.1 и возвращает вам ответ, как только вы нажмете клавишу ENTER (это позволяет использовать компьютер стоимостью 3000 долларов в качестве калькулятора стоимостью 10 долларов). Кроме того, интерпретаторы имеют специальные атрибуты, которые упрощают отладку. Можно, например, прервать обработку интерпретаторной программы, отобразить содержимое определенных переменных, бегло просмотреть программу, а затем продолжить исполнение.

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

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

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

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

Рассмотрим программу: на интерпретаторном Бэйсике 10 FOR N=1 TO 1000 20 PRINT N,SQR(N) 30 NEXT N при первом переходе по этой программе Бейсик-Интерпретатор должен разгадать что означает строка 20:

  • 1. преобразовать числовую переменную N в строку
  • 2. послать строку на экран
  • 3. переместить в следующую зону печати
  • 4. вычислить квадратный корень из N
  • 5. преобразовать результат в строку
  • 6. послать строку на экран

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

Транслятор (англ. translator - переводчик) - это программа-переводчик. Она преобразует программу, написанную на одном из языков высокого уровня, в программу, состоящую из машинных команд. Транслятор обычно выполняет также диагностику ошибок, формирует словари идентификаторов, выдаёт для печати тексты программы и т. д. Язык, на котором представлена входная программа, называется исходным языком, а сама программа - исходным кодом. Выходной язык называется целевым языком или объектным кодом.

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

Виды трансляторов

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

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

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

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

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

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

    Обратный. Для программы в машинном коде выдаёт эквивалентную программу на каком-либо языке программирования (см.: дизассемблер, декомпилятор).

Трансляторы реализуются в виде компиляторов или интерпретаторов. С точки зрения выполнения работы компилятор и интерпретатор существенно различаются.

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

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

    Векторизующий. Транслирует исходный код в машинный код компьютеров, оснащённых векторным процессором.

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

    Диалоговый. См.: диалоговый транслятор.

    Инкрементальный. Повторно транслирует фрагменты программы и дополнения к ней без перекомпиляции всей программы.

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

    Компилятор компиляторов. Транслятор, воспринимающий формальное описание языка программирования и генерирующий компилятор для этого языка.

    Отладочный. Устраняет отдельные виды синтаксических ошибок.

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

    Самокомпилируемый. Написан на том же языке, с которого осуществляется трансляция.

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



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: