adimetrius писал(а):
Вот тут коллеги рассуждали на тему диска, временных файлов и файлов в памяти:
viewtopic.php?f=23&t=4214спасибо, посмотрю!
adimetrius писал(а):
А чем ccall отличается от ccall16?
выравнивает стек на 16 байт. бравые парни из GCC давно возложили детородный орган на x86 ABI (который требует только выравнивания на 4 байта), и генерируют код с SSE (в том числе для memory transfers, так что даже не обязательно плавающую точку использовать), который ожидает 16-байтовых выравниваний. и подразумевают, что всё на свете GCC, и всё гарантирует на входе эти 16 байт. `[ccall16]` как раз и реализует хак для такого выравнивания. старому коду плевать, а новый код доволен. недостаток только в чуть более медленном вызове, потому что код для выравнивания надо везде пихать.
adimetrius писал(а):
Если ccall уже точно не нужен, и если он точно равносилен ccall16, то можно, не трогая парсер и не вводя "не верь глазам своим", поменять в документации SYSTEM@Linux и в реализации кодогенератора.
тогда будет проблема с библиотеками: если использовать селекторы, можно делать один модуль для нескольких систем. в винде, например, `[ccall]` вполне достаточно. оборачивать каждое объявление функции в селектор — замахаешься, так что проще сделать подмену в парзере, и не мусорить в коде. это всё равно системная фишка, зависящая от ABI конкретной ОС и архитектуры, так что компилятор вправе подменять её на то, что будет работать для конкретной цели, мне кажется.
p.s.: на самом деле всё сломано ещё кардинальней, и всяческие массивы тоже надо равнять на 16 байт. то есть, если мы передаём в библиотечную функцию буфер, и он не выравнен на 16 байт, то мы играем в русскую рулетку. в идеале надо просто сломать кодоген, чтобы он держал инвариант «всё выравнено» автоматически (так и делает GCC), но мне очень эта идея не нравится. не потому что кодоген сломать сложно (это дело нехитрое), а потому что это… неизящно. нужен флажок для локалов, который будет говорить: «этот локал надо выравнять для системного ABI», наподобие `[ccall]` для процедур. что-то типа:
Код:
VAR arr: ARRAY [align16] OF SHORTCHAR;
и кодоген гарантирует, что `arr` будет выравнен на 16 байтов. и то же самое надо для всех остальных типов, на которые требуется передать указатель. синтаксис получается уродливый, но зато можно будет гарантировать, что GCC останется доволен.