Все так, как и должно быть.Crystal имеет библиотеку времени выполнения, которая всегда присутствует, даже если вы ничего не включили.Это необходимо для запуска программы Crystal.
Пример C практически не содержит ничего, кроме системного вызова printf
.Вот почему скомпилированный ASM также очень крошечный.
Простой вызов Crystal puts
гораздо больше стоит за этим.Он основан на библиотеках для обработки асинхронного ввода-вывода, параллелизма, обработки сигналов, сбора мусора и многого другого.Некоторые из этих библиотек полностью реализованы в стандартной библиотеке Crystal, некоторые используют другие библиотеки, которые либо непосредственно встроены в двоичный файл (libgc
), либо для которых по-прежнему требуются динамические библиотеки из системы (libpcre
, libpthread
).
По умолчанию любая программа Crystal поставляется с этой библиотекой времени выполнения.Даже пустая программа.Обычно это остается совершенно незамеченным, поскольку в любом случае этим программам в конечном итоге понадобятся более крупные программы, а размер скомпилированного двоичного файла библиотеки времени выполнения составляет менее 500 КБ (в режиме выпуска).Такая маленькая программа, как ваша, на самом деле не нуждается в этом всего лишь для печати строки.Но эти библиотеки необходимы для среды выполнения Crystal.
ПРИМЕЧАНИЕ. Вы можете скомпилировать программу Crystal без этих библиотек по умолчанию.Но это означает, что вы не можете использовать что-нибудь из stdlib Crystal, и вам необходимо написать код C с синтаксисом Crystal (или реализовать свой собственный stdlib):
require "lib_c"
require "c/stdio"
LibC.printf pointerof("hello world".@c)
скомпилирован с опцией --prelude=empty
, и он сгенерирует существенно меньший ASM, примерно такой же, как в примере с Си.