to post messages and comments.

← All posts tagged CIL

Устанавливать старый опасный 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. И так по кругу. Чем больше стек процедуры, преобразованной в асинхронный вид, тем больше круговорот.