Аннотация: В данной лекции изучаются требования к компиляции функциональных программ и строится определение компилятора. Для Лиспа такое определение написано на Лиспе, как и определение интерпретатора. Рассматриваются Венская методика определения языков программирования, а именно отображение абстрактного синтаксиса языка на язык абстрактной машины, и приемы оптимизационного программирования. Разложение программы на функции с разным уровнем отладки является отправной точкой при выборе оптимизационных решений. Компиляция программ рассматривается как один из методов оптимизации процессов, осуществляемый как символьное преобразование — трансляция с исходного языка высокого уровня на язык низкого уровня, допускающий оптимизирующую кодогенерацию.
Компилятор и требования к коду программы
Описанная в предыдущей лекции специальная абстрактная машина SECD удобна для спецификации машинно-зависимых аспектов семантики Лиспа . Такой подход позволяет не загромождать определение компилятора, добиться его прозрачности, но главное, такое определение может быть машинно-независимым и переносимым [ 3 ] .
Как защитить программу от Взлома на C#
Для функционального стиля в программировании характерно стремление снять непринципиальные ограничения на применение и построение функций. Для этого приходится сдерживать привычные для многих областей применения разграничения, а также смягчать стандартные границы при организации процессов в системах программирования. В этом отношении следует отметить:
- единое пространство функций, их аргументов и всех обозначений, роль которых определяется по контексту при интерпретации форм;
- разрешение функциональных переменных , значение которых конструируется (вычисляется) в процессе их интерпретации. Это позволяет вводить частичные определения, уточняемые по мере необходимости;
- самоопределение основных механизмов символьной обработки и, следовательно, открытый характер системы программирования, поддерживающей функциональное программирование;
- мягкость пространственно-временных ограничений, без точных численных оценок по отдельным параметрам;
- поощрение рекурсивных определений ;
- предельная уточняемость и детализируемость определений , управление временем их существования и выполнения.
Лисп — компилятор — это программа , написанная на Лисп , которая транслирует S-выражения, определяющие функции, в машинные подпрограммы. Это средство оптимизации, позволяющее ускорить работу программ от двух до ста раз, чем было бы при простой интерпретации.
Когда компилятор вызывается для компиляции функций, он находит определение функции в списке свойств названия функции. Компилятор транслирует найденное исходное S- выражение в объектное S- выражение , которое представляет подпрограмму на языке ассемблера. Ассемблер после этого ассемблирует код программы . Затем в списке свойств функции размещается ссылка на код программы .
Опыт показывает, что скомпилированная программа может работать намного раз быстрее, чем интерпретируемая программа , в зависимости от ее природы. Скомпилированные программы могут быть и экономичнее с точки зрения расхода памяти, требуя 50–80% от полного объема.
Что такое cpp и h и как их применять и использовать на c++
Основная часть компилятора — транслятор или функция , отображающая S-выражения, которые обозначают функции, на язык ассемблера. Единственное основание для того, чтобы рассматривать компилятор как псевдо-функцию, состоит в том, что он изменяет свойства названий функций по завершении компиляции.
Лисп — компилятор имеет уникальную историю. Он развивался пошаговым образом ( метод раскрутки ) [ 1 ] .
- Компилятор был написан и отлажен как Лисп -программа, состоящая из набора определений функций в виде S-выражений. Это позволило компилировать любые Лисп -программы и строить специализированные расширения Лисп -интерпретатора.
- Компилятору была дана команда скомпилировать себя самого. Данная операция называется раскруткой ( bootstrapping ). На это потребовалось более 5 минут на IBM 7090, поскольку значительная часть компилятора в основном интерпретировалась. В результате было создано эффективное расширение Лисп -системы, способное компилировать Лисп -программы и строить расширения Лисп -интерпретатора.
- Чтобы исключить повторение медленной раскрутки при дальнейших шагах установки системы, весь код компилятора заново был введен на языке ассемблера.
- Была создана системная лента, и компилятор стал загружаемым на уровне ассемблера.
- Процесс раскрутки был повторен до полного формирования кода Лисп -системы.
Компилятор вызывается псевдо-функцией COMPILE . Аргумент COMPILE — список названий функций, которые следует компилировать. Каждый атом в списке должен иметь определение функции в своем списке свойств до компиляции.
Обработка каждой функции происходит в три шага. Во-первых, S- выражение , задающее функцию, транслируется в текст на уровень ассемблера. При отсутствии S-выражения, компилятор сообщает об этом и переходит к другой функции.
Во-вторых, текст программы на уровне ассемблера транслируется в код программы . И, наконец, если никаких ошибок не обнаружено, то S- выражение функции может быть удалено из списка свойств. Когда некоторые ошибки указывают на появление необъявленной переменной, компилятор предупреждает об этом и продолжает работу. Такая диагностика будет дополнительно уточнена при анализе значений переменной.
При написании большой Лисп -программы лучше отлаживать отдельные функции, используя интерпретатор , а компилировать только те из них, которые уже хорошо изучены.
Программист, планирующий применять компилятор , должен обратить внимание на следующие моменты.
- Нет необходимости компилировать все функции, которые используются лишь эпизодически. Интерпретатору доступны скомпилированные функции. Компилированные функции, использующие интерпретируемые функции, могут вычислять их непосредственно при счете.
- Порядок выполнения компиляции не имеет значения. Даже нет необходимости определять все функции до тех пор, пока они не понадобятся при счете. (Исключение из этого правила — специальные формы. Они должны быть определены до того, как компилируется их вызов.)
- При динамическом использовании LABEL результирующая функция не может быть скомпилирована полностью.
- Свободные переменные в компилируемых функциях должны объявляться до компиляции функций (См. лекцию 7).
Последнее требование проясняет роль типового контроля в стандартных, ориентированных на компиляцию без интерпретации, системах программирования. Компиляция всех объектов осуществляется без анализа фактических данных, а это и означает, что на момент компиляции переменные, как правило, являются свободными. Интерпретация располагает более полной информацией, связывающей необходимые для вычислений переменные с конкретными значениями, тип которых определен.
Компилятор и ассемблер могут быть удалены из комплекта Лисп-системы . В целом существует механизм пакетов , позволяющий управлять составом функций и объектов, включаемых в комплект. При удалении части системы освободившаяся память может быть присоединена к списку свободной памяти. Имеются реализации, в которых выделено минимальное ядро системы, все остальные функции загружаются по мере необходимости, а мусорщик может рассматривать память от неиспользуемых функций как свободную.
Источник: intuit.ru
Как разложить exe файл на исходники

Декомпиляция подразумевает воссоздание исходного кода программы на том языке, на котором она была написана. Иными словами, это процесс обратный процессу компиляции, когда исходный текст преобразуется в машинные инструкции. Декомпиляцию можно провести, используя специализированный софт.
Способы декомпиляции EXE-файлов
Декомпиляция может быть полезной автору ПО, который потерял исходные коды, или просто пользователям, желающим узнать свойства той или иной программы. Для этого существуют специальные программы-декомпиляторы.
Способ 1: VB Decompiler
Первым рассмотрим VB Decompiler, который позволяет декомпилировть программы, написанные на Visual Basic 5.0 и 6.0.
- Нажмите «Файл» и выберите пункт «Открыть программу» (Ctrl+O).

- Найдите и откройте программу.

Способ 2: ReFox
В плане декомпиляции программ, скомпилированных через Visual FoxPro и FoxBASE+, неплохо себя зарекомендовал ReFox.
- Через встроенный обозреватель файлов найдите нужный EXE-файл. Если его выделить, то справа будет отображаться краткая информация о нём.

- Откройте контекстное меню и выберите пункт «Decompile».

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

- По окончании появится такое сообщение:

Можно просмотреть результат в указанной папке.
Способ 3: DeDe
А DeDe будет полезна для декомпиляции программ на Delphi.
- Нажмите кнопку «Добавление файла».

- Найдите файл EXE и откройте его.

- Для запуска декомпиляции нажмите кнопку «Процесс».

- При успешном завершении процедуры появится такое сообщение:

В отдельные вкладки будет выведена информация о классах, объектах, формах и процедурах.
Способ 4: EMS Source Rescuer
Декомпилятор EMS Source Rescuer позволяет работать с EXE-файлами, скомпилированными при помощи Delphi и C++ Builder.
- В блоке «Executable File» нужно указать нужную программу.
- В «Project name» пропишите имя проекта и нажмите «Next».

- Выберите необходимые объекты, укажите язык программирования и нажмите «Next».

- В следующем окне исходный код доступен в режиме предпросмотра. Осталось выбрать выходную папку и нажать кнопку «Save».

Методы повышения читаемости программного кода
public void method(int p) < … >> Средство документирования анализирует все файлы вашего проекта, извлекает документацию, строит перекрестную базу данных всей извлеченной информации и выводит документ со всей этой информацией. Документировать можно практически любой код, который вы пишете: классы, типы, функции, параметры, флаги, переменные, пространства имен, пакеты и т. д. Есть средства для получения многообразных данных, которые позволяют: Задать информацию об авторских правах.
Зафиксировать дату создания. Получить информацию о перекрестных ссылках. Пометить код как устаревший. Дать синопсис для краткой справки. Описать все параметры функции Кратко рассмотрим некоторые из таких средств построения программной документации.
Javadoc — генератор документации в HTML-формате из комментариев исходного кода на Java от Sun Microsystems. Javadoc — стандарт для документирования классов Java. Sandcastle — генератор документации (открытая часть некоторого внутреннего инструмента) компании Microsoft, который позволяет автоматически получить техническую документацию в стиле MSDN по заданной .NETсборке с управляемым кодом.
Sandcastle состоит из набора утилит, которые получают метаинформацию из сборки, и затем рядом операций преобразуют её в конечный вид. В процессе преобразования информация представлена в формате XML, часть преобразований выполняется с помощью шаблонов XSLT. Sandcastle используется внутри Microsoft для получения документации на Visual Studio и .NET Framework.
Doxygen — это кроссплатформенная система документирования исходных текстов, которая поддерживает C++, Си, Objective-C, Python, Java, IDL, PHP, C#, Фортран, VHDL и, частично, D. Doxygen генерирует документацию на основе набора исходных текстов и также может быть настроен для извлечения структуры программы из недокументированных исходных кодов. Возможно составление графов (с применением Graphviz) зависимостей программных объектов, диаграмм классов и исходных кодов с гиперссылками. Doxygen имеет встроенную поддержку генерации документации в формате HTML, LAΤΕΧ, man, RTF и XML. Также вывод может быть легко сконвертирован в CHM, PostScript, PDF.
В закладки
Разместил пособие
snezhanakoz86
Эксперт по предмету «Информатика»
Поделись лекцией и получи скидку 30% на платформе Автор24
Заполни поля и прикрепи лекцию.
Мы вышлем промокод со скидкой тебе на почту
Твоя лекция отправлена! Жди скидку на почте. Есть еще материалы? Загрузи прямо сейчас
Загрузить еще лекции
Поделись лекцией и получи промокод на скидку 30% на платформе Автор24
Заполни поля и прикрепи лекцию. Мы вышлем промокод со скидкой тебе на почту
Источник: spravochnick.ru