to post messages and comments.

← All posts tagged CPC

Устанавливать старый опасный OCaml 3.12.1 не пришлось, FAR arclite справился с форматом NSIS. Директорию выбрал C:\ocamlmgw, как зашито в бинарники, потому что они там ищут библиотеки. Пришлось выжечь калёным HIEW из каждого flexlink.exe аргумент -mno-cygwin, который современный gcc не в силах потерпеть. Доустановить hg clone git+https://gitlab.camlcity.org/gerd/lib-findlib.git . Поставить make и perl из msys2. Закомментировать строчку 2202 в cpc.ml. И получилось собрать!

Без pthread и libev под Windows примеры не работают, но я всё равно под Windows только препроцессор хотел. Перловая обёртка вполне успешно собирает ошки, в том числе с сохранением промежуточных файлов. Для того, чтоб собрать ошки, рабочая реализация рантайма не нужна. Нужно отпрепроцессировать выбранным транслятором, потом отпрепроцессировать cpc cilly, потом оттранслировать обычным транслятором, вот такие этапы делает перловая обёртка. Смотрел промежуточный результат, вроде похоже на правду.

Промежуточный результат не такой оптимальный, как я надеялся. Скажем, g() в loops.cpc делает cps_yield(), имея аргумент c и переменную i. Я бы ожидал, что c и i между cps_yield() как сидели в контексте, так и оставались, но вместо этого __g_while_continue_2_push() постоянно принимает на вход c и i, перевыделяет под них место и копирует из своих аргументов в структуру. А процедуры, на которые ссылаются продолжения, постоянно открывают структуры со своими аргументами, вытаскивают оттуда c и i и под конец вызывают одну из _push() с этими c и i. И так по кругу. Чем больше стек процедуры, преобразованной в асинхронный вид, тем больше круговорот.

Прошлый раз потерпел неудачу с запуском Continuation Passing C, и вроде это было связано с устареванием CPC и встроенной в него версии CIL относительно OCaml. Так что в этот раз пытаюсь взять старый OCaml. В cpc/README указан Ocaml >= 3.12. Вот, значит, лучше всего и взять. Нашёл установщик OCaml 3.12.1. В предупреждении написано, что он уничтожит PATH, если переменные среды занимают больше 1024 байт, но я к этому могу подготовиться. На установщиках IBM VisualAge и Apple WebObjects уже натренирован.

Пытаюсь запустить Continuation Passing C
cpc.native.exe завершается с ошибкой: Программа "cpc.native.exe" не работает. Возникшая проблема привела к прекращению работы программы. Windows закроет эту программу, а если есть известный способ устранения проблемы, уведомит вас об этом.
cpc.byte.exe создаёт файл, который его просят, но виснет.

Почему-то типично для всяких Аллегро Лиспов и Окамлей

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. В чём тут проблема, не понятно. Может быть, всё же можно реализовать.