to post messages and comments.

← All posts tagged C

То чувство, когда нет вменяемой системы модулей и жёстко привязанной к ним системы пространств имён.

#include <Object.h>
#define Object XtObject
#include <X11/Intrinsic.h>
#include <X11/IntrinsicP.h>
#undef Object

Ещё, помню, заголовки Qt вываливают в пространство имён помойку из WinAPI, а вместе с ней — #define GetComputerName GetComputerNameW, и в самом Qt ломается класс с таким методом, вот просто взять и собрать Qt не получается, там тоже хаки против таких конфликтов, работающие с переменным успехом.

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

Разработка ПО похоже на переплывание реки из бурлящей кислоты, и мы строим корабли с толстыми стенами, и мы делаем толстые иллюминаторы, а кислота сильна, кислота разъедает, а мы строим корабли всё толще. Выбрать Аду — значит, отгородиться хотя бы с точки зрения пространств имён от творящихся снаружи ужасов.

Continuation Passing C Руководство
Вот эту бы штуку — да в разрыв между AdaMagic и EmScripten воткнуть, раз уж с Asyncify не заладилось.
ASYNCIFY has a bad worst-case of large code size: If it needs to modify many methods, it can grow code size very significantly (even 10x more was seen).Вот интересно, а в CPC тоже в 10 раз увеличение из-за нескольких точек входа или как-то попроще всё обошлось? Если там смогли, что не так с EmScripten?

Нашёл пока ключевую проблему в CPC — это отсутствие поддержки longjmp, а при компиляции в режиме C AdaMagic использует longjmp. В чём тут проблема, не понятно. Может быть, всё же можно реализовать.

Был такой компилятор AdaMagic, умел транслировать Ada в C и C++. Там ещё и в Java компиляция была, но это и сейчас есть в GNAT. Потом SofCheck был куплен AdaCore, и этот компилятор пропал из поля зрения. Однако, его продают под другим брендом тут. Его там завернули в какой-то AppCOE на базе Eclipse, но всё это можно развернуть, выкинуть лишнее и докопаться до самых важных файликов, adacgen.exe и adabgen.exe. На них навешена типа защита. Типа — потому что там, во-первых, есть отладочная информация, во-вторых, неиспользуемые функции не выбрасываются. Очень пригодилась мне такая неиспользуемая функция, как write_license_file, например.

Файл license_key.txt генерить научился, зашифрованные DES файлы типа libadartl.a.enc, разшифровал, для PDF пароль нашёл, поставлю qpdf и тоже разшифрую, впрочем, PDF в открытом виде можно и так скачать с сайта. Сейчас пишу инструкции, чтобы мои действия можно было повторить со следующими версиями. Вообще, не похоже, чтобы новый владелец-индиец разбежался развивать этот компилятор, он, скорее, вокруг достраивает всякие OS абстракторы на C, так что смысла большого обновляться не вижу, но тем не менее. Если думать на тему использования вместе со всякими emscripten, то от libadartl.a толку не очень много, но на всякий случай оно есть. С самим компилятором надо ещё разбираться. Он по умолчанию работает в режиме Ada->C->GCC, но в GCC есть GNAT, который гораздо лучше, и если кто-то заинтересовался AdaMagic, как я, то сценарий изпользования у него будет позабористее, и надо читать доки.

Таким образом, теперь есть компилятор Ada->C/C++, с помощью которого можно целиться во всякие дурацкие, но иногда нужные платформы, хостится он либо на Windows, либо на Linux, а через эмуляторы можно потенциально запускать из ещё большего набора OS. По плану выложить на форум только для зарегистрированных пользователей. Раз и навсегда адвокаты языков программирования, для которых на всех платформах есть транслятор, уедят.

«Под Куполом» спонсировался Microsoft, и поэтому там у всех виндопланшеты с Windows 8. А в S02E08 хакер ломает комп, и что же на компе? Неужели тоже винды? Да, винды. Седьмые.

Но в восьмёрке–то все сишные и плюсовые компоненты переписали на Аде, такой Windows хакеры бы не сломали, уж конечно

Сегодня смог продолжить разбираться с libipset ( #2826442 ). Из спортивного интереса попытался обойтись без C, заюзать GCC'шные фичи через доступ к фичам GCC из GNAT. Так вот, эта штука успешно заимпортировалась:
procedure VA_Start (Arg_Ptr : in out System.Address; Prev_Param : System.Address);
pragma Import (Intrinsic, VA_Start, "__builtin_va_start");

Однако, при попытке ею воспользоваться из адской процедуры получается error: 'va_start' used in function with fixed args. Пытался полечить, добавив функции GCC'шный аттрибут. Атрибуты в GNAT можно навешивать через pragma Machine_Attribute, а сам список атрибутов можно посмотреть здесь. Там всякая всячина, но вот заставить функцию быть varargs там нету. Так что я в печали. То немногое из C, что недоступно в GNAT, всё–таки добралось до меня. Можно попробовать найти не–built-in версию va_start, в Delphi прокатывало, либо подключать libffi, заодно и трамплин будет, чем сделать.

C som

Мытарство с манглингом в Це кончилось тем, что я сгенерил два .lib: один — для stdcall функций, другой — для cdecl:
coff2omf.exe -v -lib:st somtk.lib somtk_omf.lib
coff2omf.exe -v somtk.lib somtk_omf2.lib

И подключил оба именно в таком порядке. И животные наконец–то запустились.

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