Logo

5 марта 2017 г.

Обрезка программ при помощи PE Tool

Когда Windows только освоила 32-битную платформу, все программы в ней грузились по одному виртуальному адресу. В Windows 2000 появилась возможность грузить программу по любому адресу, но он по-прежнему оставался фиксированным. А вот в ядре Windows Vista была реализована новая фишка — формирование адресного пространства программы случайным образом (ASLR), для реализации которой система научилась перемещать и программы тоже.

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

1 июля 2015 г.

«Hello, world!» из объектно-ориентированной ОС

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

Кантор разрабатывается как компилируемый язык и язык системного программирования, но основан на функциональной и объектно-ориентированной парадигмах. Цель — создать новые направления системного программирования: функциональное системное программирование и объектно-ориентированное системное программирование, а затем разработать перспективную ОС, которая не будет копией уже имеющихся.

Далее речь пойдет об альфа-версии Кантора, разрабатываемого на Delphi как интерпретатор — это первый шаг к самораскрутке компилятора. Со временем Кантор будет переписан на Канторе и научится собирать сам себя.

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

13 февраля 2015 г.

Неоднозначность разбора и возможный возврат elsif

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

Неоднозначность

Без elsif при синтаксическом разборе всегда возникает неоднозначность, поскольку на момент входа в оператор еще не известно, единственный он во вложенном блоке или нет. Все последующие блоки также под вопросом, поскольку теперь не понятно, какой end какой блок завершает:
if условие1 then
операторы;
else if условие2 then
операторы;
end;
операторы;
end; /* это лишний end или завершение предыдущего if,
не единственного в блоке? */
С привычными отступами выглядит понятней:
if условие1 then
операторы;
else
if условие2 then
операторы;
end;
операторы;
end;
Проблема характерна для любого языка с блочными операторами ветвления и свободной записью: SQL, Модула-2, частично Ада.

В Канторе я вижу два выхода:
  • Вернуть elsif и получить тонны ненависти от программистов, не любящих это ключевое слово.
  • Не бояться «лишних» end при разборе. Тут нужен дополнительный анализ — что делать с возможными неоднозначностями. В любом случае это усложнит компилятор и затруднит проверку синтаксиса.
Возвращение elsif, если случится, может быть частичным, — только для алгоритмических блоков. В выражениях с if/case вполне может остаться принудительное совмещение.

Принудительное совмещение в выражениях

В выражениях с if/case внутри веток могут стоять только одиночные значения или кортежи, поэтому принудительное совмещение не приводит к неоднозначности и elsif не нужен:
a = if условие1 then
значение1 // в выражениях точка с запятой не ставится
else if условие1 then
значение2
// из-за отсутствия точки с запятой никакие другие операторы
// тут недопустимы
end;
Пример с кортежем отличается только числом значений:
a, b, c = if условие1 then
значение1, значение2, значение3 // точка с запятой опять не ставится
else if условие2 then
значение4, значение5, значение6
end;

1 января 2015 г.

Отказ от ключевого слова elsif

Синтаксис Кантора вновь подвергся небольшому пересмотру: исключено ключевое слово elsif. Спасибо коллеге Zealint за наводку. На смену elsif приходит совмещение блоков, не требующее отдельного end. Это означает, что теперь вместо elsif нужно писать else case или else if, и ничего за это не будет.

Совмещение блоков

Совмещение блоков — синтаксический механизм в языке Кантор, позволяющий совмещать идущие друг за другом или вложенные блочные операторы с целью завершения их одним end.
В данный момент совмещение работает для блочных объявлений с of, блоков where all и where any, а теперь еще и для else case и else if.

4 июня 2014 г.

Итераторы и охранные выражения. Отличие охраны от следования

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

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

Главное отличие охраны от следования — проверка охраняемого выражения при каждом изменении его членов и немедленный выход из блока итерации при выходе значения за охраняемые границы. Итераторы с where позволят задать как сам цикл, так и условия выхода из него, делая операторы while и until ненужными.

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

Примера кода пока нет, поскольку охрану нужно давать вместе с итераторами, а синтаксис итераторов еще не додуман.