IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> PAF, Portable Assembler Framework, Переносимый Ассемблер (Си)
сообщение
Сообщение #1


Большевик–концептуал
***

Группа: Пользователи
Сообщений: 160
Пол: Мужской
Реальное имя: Иван Левашев
Jabber: octagram@jabber.ru
Skype: i.levashew
QQ: 3152538431
WeChat
Ада: Сторонник
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик
Turbo Pascal: Установлен

Репутация: -  1  +


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

Цели, которые при этом преследуются, различны:
  1. обработка выходного языка AdaMagic и других трансляторов в Си, для преобразования в зелёные потоки
  2. чтение заголовков Objective-C и генерация моста из продвинутой объектной модели во встроенные библиотеки Objective-C на макОС
  3. чтение исходных текстов на Objective-C, для переноса на более продвинутую объектную модель и повышения безопасности
PAF в своих целях пересекается с достаточно выдающейся разработкой CIL (C Intermediate Language). Примечательны два применения CIL: CPC и CCured. В CPC жизнь ещё теплится, про второй давно не слышно, протухли его сайты, но он всё равно достаточно интересен.

С тем и другим возникли серьёные архитектурные проблемы, усугублённые плохой переносимостью OCaml, а именно на нём CIL и его приложения. Запустить CPC стоило немало нервов, с несколькими днями неудач с OCaml4, он тупо падал, хоть в байткоде, хоть в нативе. На какой-то файлопомойке удалось найти OCaml3 для Win32. Сходу не заработал, патчить его пришлось бинарно, что пути зашитые поменять. Ещё пришлось искать Perl для Windows, ведь обёртки для вызова на нём, и там важная часть логики. И вот, после всех стараний, взору открылась такая картина.

Порезанная на куски процедура так порезалась на куски, что эти куски на старте копируют данные из структуры в локальные переменные, освобождают структуру, что-то полезное делают, а в конце выделяют новую структуру и копируют данные из локальных переменных в неё. И так без конца, освобождение и выделение. Там, может быть, даже набор переменных не изменился, всё равно программа давит на менеджер памяти. Чистосердечное признание, что они натворили, можно найти здесь, на странице 8, в разделе с пафосно умным названием Lambda Lifting.

С одной стороны, можно поапплодировать глубине понимания вопроса, и тому, что оно у них работает, и Университету Кембриджа за то, что даёт возможность заниматься такими фундаментальными разработками, так далёкими от инноваций, стартапов и прочей проприетарщины, по которой сходят с ума в наших университетах. Но с другой стороны, почему за столько лет во всём мире только они одни, в особенности, Gabriel Kernes везде фигурирует, исследуют эти тропы? В мире что, трансляторы Си писать не умеют? А если умеют, то почему бы не такой, чтоб транслировал в зелёные потоки? И какой-нибудь из них был бы устроен не так убого, как CPC. Какие-то они слишком академичные в сторону функциональщины.

Но такого нет, а делать что-то надо, вот так это и стало одним из направлений деятельности Фонда. Неубогий трансформатор, аналогичный CPC, не должен так нещадно давить на менеджер памяти, и не должен почём зря перекладывать из пустого в порожнее на каждом пробуждении. Не зря в названии PAF есть Ассемблер. Чтобы понять, как сделать лучше, надо смотреть, что делается в обычной программе на уровне машинных кодов. А на уровне машинных кодов всё можно разложить в операции с регистрами, памятью и стеком. Особенный интерес представляет стек. Неубогий трансформатор должен в явном виде производить операции наращения и освобождения стека синхронно со входом в и выходом из блоков. Стек зелёного потока сегментированный, поэтому оптимальнее, чем просто менеджер памяти. И все переменные, которые не получилось сделать временными (они пересекают линию разреза), лежат себе и лежат на месте, не дёргаются, не перекладываются по сто раз.

Второй проблемой с CPC является то, что его разработчиков совершенно не волнуют темы структурных исключений, раскрутки стека и т.п. AdaMagic умеет проецировать исключения на C++ throw или C setjmp/longjmp. CPC не поддерживает ни то, ни другое. Если с перекладыванием ещё можно было мириться, то без исключений никуда не уедешь. Это же адский коронный номер, чтоб при обнаружении неведомого бросить исключение, и все ресурсы в Controlled посрубало пролетающим мимо исключением, никакие ресурсы не остались висеть. Как можно без этого вообще жить? Сегментированный или даже, как в CPC, полностью динамический стек — точно такой же стек, его тожно можно раскручивать, но в CPC просто не собираются деать. Есть мнение, что в CPC архитектура, ориентированная на передачу значений, без возможности навесить действия на уничтожение и копирование, просто не готова к RAII и прочему. Нет и не дождёмся.

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

Начиная с QEMU/CPC синтаксис был изменён так, что у трансформиуемых функций как будто бы другое соглашение о вызове, и под таким соусом из AdaMagic можно было бы протягивать нити в CPC, но в этом же сразу и четвёртое разногласие. Пропасть между трансформированным и нетрансформированным кодом должна быть ещё больше. Это не соглашение о вызове, это другая архитектура процессора, вот такая должна быть пропасть. Те, кто делали пропасть меньше, Расты всякие, потом на этом горели, шляпа у них получалась.



Повышение безопасности связано с переосмыслением CCured. К CCured гораздо меньше нареканий возникает.

Проблема с ним и не только с ним в том, что они упирались в C++. И Cyclone, и CCured свою кодовую базу позволяют быстро наращивать, поедая унаследованный мусор на языке Си. Когда дело доходит до ООП, логично напрашивается C++, но вот тут-то зубы и ломаются. Не поддаётся C++. Кроме сложности, есть такой нюанс, например, что в Си особо нет конструкций, анализирующих тип, а вот в C++ шаблоны пробуют на вкус, что в них положили. Пробуют хотя бы тем обстоятельством, что шаблоны от разных типов будут разными типами. В CCured разные типы сплошь и рядом образуются как указатели разной степени жирности.

Как результат, CCured так и остался чисто-Си, а в Cyclone нагородили неких ADT, ни на что не похожих. Ну, лучше, чем ничего, да, но вот этого быстрого поедания, его нет. Без эффекта поедания остаётся всего лишь ещё один претендующий на безопасность язычок, безнадёжно уступающий в этом вопросе языкам с правильным фундаментом, Аде и Делфям.

И не пытались исследователи пойти другим путём, в сторону Objective-C. А меж тем, изначально для скриптов, для API Objective-C написали длинные BridgeSupport XML, в которых чётко сказано, какую роль играют указатели в параметрах. То ли это массив (в каком параметре его длина?), то ли одиночное значение на ввод/вывод. Эти бы данные, да интегрировать с движком CCured. И generic в Objective-C легковесные, такие не помешают. С C++ не получилось, а с Objective-C получается. А Objective-C — это оттачиваемый с конца 80х GUI, реализованный независимыми разработчиками несколько раз. Его обезопасить, цены бы не было.


Эти две разноплановые задачи, а также парсер API, приводят к мысли, что нужно развивать компетенции в анализе и обработке Переносимого Ассемблера (Си).


--------------------
If you want to get to the top, you have to start at the bottom
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 26.08.2019 11:51
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name