Программы
ВХОД
Логин:    

Пароль:  

   Запомнить меня
Вам нужно авторизоваться.
Забыли пароль? / Регистрация
Статьи


   Статьи
   Soft
   Программирование
   Что такое компилятор?

Что такое компилятор?

Добавлено: 22.05.2012

Прочитано: 2888

Читать комментарии [1]

Как работает компилятор?

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

Некоторые языки пошли другим путем, использовав модель интерпретации, когда исходная программа анализируется раз за разом построчно, разбивается на команды и выполняется исполнительной средой. Более того, начавшись с Lisp, Smalltalk, Java и прочих языков, интерпретаторы сейчас практически вытеснили компилирующие языки. Платформы .NET, JVM и их варианты представляют собой среду, где исходная программа переводится в промежуточный код, а лишь на последнем этапе этот код заменяется машинным. Это дает многие преимущества в разработке, но теряется автономность программ, их законченная элегантность, скорость выполнения. Судите сами: программа на C# может занимать 10-15 Кб, но при этом требует присутствия .NET 3.5, чьи библиотеки занимают более 600 Мб на диске. Не аккуратненько как-то. Раньше можно было создавать программы, работая прямо с дискеты, на флешке или виртуальной памяти, сейчас же инструменты с собой не унесешь.

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

что такое компилятор

Давайте для примера разберемся, как работает простейший компилятор входного языка, напоминающего Си. Во-первых, программа должна проанализировать все ссылки на библиотеки из вызовов #include. Далее, начинать лексический анализ (парсинг) операторов, разделяя вызов функций, объявления и инициализацию локальных и глобальных переменных, выделение данных. Все эти «запчасти» сохраняются в динамической таблице памяти. На данном этапе машинный код пока не строится, так как существуют ситуации в виде вызовов функций «вперед», которым нельзя присвоить реальные адреса переходов. После того, как все «уложено» по таблицам, начинается генерация кода. При этом уже известен размер стека, размер данных под переменные, константы и массивы, известны также все вызываемые функции. Строится машинный код тоже хитрым способом: дело в том, что многие функции в программе являются библиотечными. В этом случае библиотека просто объединяется с готовой программой, а внутри программы прописываются адреса вызовов. То же самое, что API в Windows. Многие вещи в готовой программе вставляются постоянными «кусками» – секция инициализации, сборщики мусора в памяти, подпрограммы анализа аварийных ситуаций и прочее. Все это составляет так называемую RTL среду исполнения, которая, собственно, является замечательной вещью и одновременно проклятием, так как RTL жестко привязана к возможностям конкретной операционной системы. К примеру, если можно было бы сменить привязку RTL от MS-DOS к BIOS, то загрузчики, драйверы, операционные системы, программы обработки прерываний можно было писать на языке высокого уровня.

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

Это лишь вводная статья – к теме по компиляторам мы будем возвращаться постоянно, так как это интереснейшая тема для исследования и самостоятельных разработок.



обновить программы бесплатно

<<  Что такое декомпилятор? Как работает компилятор? Часть первая.  >>


Всего комментариев: 1
Комментировал: я
06.03.2013 00:26:22
Классно написанные статьи, мне нравится!

Добавить Комментарий

Скачать программу для проверки на ошибки
Скачать программу автоматического обновления программ
Статьи
Новые Программы
Новые статьи
Популярные Программы
Самые читаемые статьи
Copyright © Дай Прогу 2011 Контакты ¤ Статистика