Информация об изменениях

Сообщение Re[3]: IT-батл - доцент МГУ vs студент Rust-офил от 01.10.2022 9:14

Изменено 02.10.2022 6:47 netch80

Re[3]: IT-батл - доцент МГУ vs студент Rust-офил
Здравствуйте, Kernan, Вы писали:

K>Здравствуйте, netch80, Вы писали:


N>>Rust неплох, но это другая тема.

K>А что ты скажешь про zero-runtime? Нужно оно в нашем мире?

Да, но редко. Вообще тут надо разделять несколько градаций движения к нему.

1. Просто возможность урезать стандартную библиотеку, чтобы что-то не подключалось, если явно не вызвано из основного кода. Как пример — работа с локалями для stdio или iostreams. В библиотеках, заточенных на статическую линковку, обычно это есть. Но вот в GNU libc очень долго этим не заморачивались, основной подход там был "все одинаково замапят в память, 20MB — пофиг, оно шарится между процессами". Сейчас несколько сдвинулись в сторону экономии.

2. Возможность собирать freestanding реализацию (не hosted), где часть возможностей просто отсутствует или сделана иначе. Например, ядра BSD систем обычно собираются во freestanding, что запрещает компилятору кучу всего. Если ты видишь printf, у него может даже совпадать сигнатура, но это другой printf (пишет в кольцевой буфер dmesg и пинает отдачу на читающий syslogd), всяких stdout тут просто нет. Менять printf("hello\n") на fputs("hello\n", stdout), как делает GCC начиная с 3.0, нельзя, fputs не предоставляется. malloc, free в стандартной библиотеке могут писать в stderr, но тут нет stderr. И так далее.

И эта возможность гранулируется — что именно удалено? Где-то, как выше, stdio вырезан и заменён на другой, где чего-то нету и не будет. Где-то на 32-битке деление 64-битных чисел отправляется в спец. функцию типа divdi3(). А её нет, и компилятору лучше бы отказаться такое компилировать.

В этом смысле ядро — пример среды, которая ещё не zero, но уже не полная, где есть всё, что в стандарте. Детали отданы реализациям — стандарт только говорит "бывает freestanding, но что там, мы не регулируем".

3. Полный zero runtime. По-моему, обычно это уже спортивный результат, а не практически обусловленный. Если всё равно нужен код реализации, что мешает подключить маленькую библиотеку? Главное — сама возможность отрезать любой компонент из автоматически требуемых, который не подходит почему-то, а это обратно к пункту 2.

Но как теоретический абсолют — очень даже полезно.
Re[3]: IT-батл - доцент МГУ vs студент Rust-офил
Здравствуйте, Kernan, Вы писали:

K>Здравствуйте, netch80, Вы писали:


N>>Rust неплох, но это другая тема.

K>А что ты скажешь про zero-runtime? Нужно оно в нашем мире?

Да, но редко. Вообще тут надо разделять несколько градаций движения к нему.

1. Просто возможность урезать стандартную библиотеку, чтобы что-то не подключалось, если явно не вызвано из основного кода. Как пример — работа с локалями для stdio или iostreams. В библиотеках, заточенных на статическую линковку, обычно это есть. Но вот в GNU libc очень долго этим не заморачивались, основной подход там был "все одинаково замапят в память, 20MB — пофиг, оно шарится между процессами". Сейчас несколько сдвинулись в сторону экономии.

2. Возможность собирать freestanding реализацию (не hosted), где часть возможностей просто отсутствует или сделана иначе. Например, ядра BSD систем обычно собираются во freestanding, что запрещает компилятору кучу всего. Если ты видишь printf, у него может даже совпадать сигнатура, но это другой printf (пишет в кольцевой буфер dmesg и пинает отдачу на читающий syslogd), всяких stdout тут просто нет. Менять printf("hello\n") на fputs("hello\n", stdout), как делает GCC начиная с 3.0 в hosted, нельзя, fputs не предоставляется. malloc, free в стандартной библиотеке могут писать в stderr, но тут нет stderr. И так далее.

И эта возможность гранулируется — что именно удалено? Где-то, как выше, stdio вырезан и заменён на другой, где чего-то нету и не будет. Где-то на 32-битке деление 64-битных чисел отправляется в спец. функцию типа divdi3(). А её нет, и компилятору лучше бы отказаться такое компилировать.

В этом смысле ядро — пример среды, которая ещё не zero, но уже не полная, где есть всё, что в стандарте. Детали отданы реализациям — стандарт только говорит "бывает freestanding, но что там, мы не регулируем".

3. Полный zero runtime. По-моему, обычно это уже спортивный результат, а не практически обусловленный. Если всё равно нужен код реализации, что мешает подключить маленькую библиотеку? Главное — сама возможность отрезать любой компонент из автоматически требуемых, который не подходит почему-то, а это обратно к пункту 2.

Но как теоретический абсолют — очень даже полезно.