Надёжная Debian 12
От: B0FEE664  
Дата: 15.10.24 14:55
Оценка: :))

sudo date --set="2040-12-13 10:09:08"
sudo hwclock --systohc --noadjfile --utc


и всё. приплыли.
А почему? А потому, что опытные программисты знают как там оно на самом деле устроено и кастят time_t к int.
И каждый день — без права на ошибку...
Re: Надёжная Debian 12
От: Shmj Ниоткуда  
Дата: 15.10.24 15:10
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>и всё. приплыли.

BFE>А почему? А потому, что опытные программисты знают как там оно на самом деле устроено и кастят time_t к int.

А Ubuntu так же себя ведет? Другие версии Linux?
Re: Надёжная Debian 12
От: Философ Ад http://vk.com/id10256428
Дата: 15.10.24 15:52
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>А почему? А потому, что опытные программисты знают как там оно на самом деле устроено и кастят time_t к int.


А time_t в линухе не 8 байт? Почему кастят?
Блин, прибил бы автора слова "int" — не понятно же, какого размера...

UPD: проверил — действительно 8 байт, как и в винде. А как они это кастят? Почему кастится?
Всё сказанное выше — личное мнение, если не указано обратное.
Отредактировано 15.10.2024 15:57 Философ . Предыдущая версия . Еще …
Отредактировано 15.10.2024 15:56 Философ . Предыдущая версия .
Re[2]: Надёжная Debian 12
От: B0FEE664  
Дата: 15.10.24 16:35
Оценка: :)
Здравствуйте, Shmj, Вы писали:

S>А Ubuntu так же себя ведет?

Не знаю. Попробуй.

S>Другие версии Linux?

Debian 10 на все даты уходящие за 2038 год говорил, что формат даты не правильный. А в версии 12 ядро подправили и теперь этот порог можно преодолеть, но к такому остальные части системы не готовы...
И каждый день — без права на ошибку...
Re: Надёжная Debian 12
От: Pzz Россия https://github.com/alexpevzner
Дата: 15.10.24 16:46
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>

BFE>sudo date --set="2040-12-13 10:09:08"
BFE>sudo hwclock --systohc --noadjfile --utc
BFE>


BFE>и всё. приплыли.


Куда приплыли-то? Подробности расскажи.

BFE>А почему? А потому, что опытные программисты знают как там оно на самом деле устроено и кастят time_t к int.


А там в хардварии сколько битов-то?
Re[2]: Надёжная Debian 12
От: Pzz Россия https://github.com/alexpevzner
Дата: 15.10.24 16:49
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>Блин, прибил бы автора слова "int" — не понятно же, какого размера...


Удобного для процессора. На PDP/11 вообще 16 бит было. И на 16-битном 8086 тоже.

Автор-то уже помер, поди. Наверное, это был Денис Ричи.

Ф>UPD: проверил — действительно 8 байт, как и в винде. А как они это кастят? Почему кастится?


Мне интересно, тот регистр в железе, куда они это пишут, там-то сколько бит?
Re[2]: Надёжная Debian 12
От: B0FEE664  
Дата: 15.10.24 17:03
Оценка:
Здравствуйте, Философ, Вы писали:

BFE>>А почему? А потому, что опытные программисты знают как там оно на самом деле устроено и кастят time_t к int.

Ф>А time_t в линухе не 8 байт? Почему кастят?
Ф>Блин, прибил бы автора слова "int" — не понятно же, какого размера...

Ф>UPD: проверил — действительно 8 байт, как и в винде. А как они это кастят?


Никогда не видели кода:
    int n = time(NULL);

?

Ф>Почему кастится?

by designe

Причём с gcc опции -Wall -Wpedantic -Wextra не спасут. Нужно дополнительно -Wconversion и только тогда будет предупреждение.

Но это ещё цветочки.
Я не знаю кто и что в недрах gcc или Linux что-то такое предусмотрел, но приложение в конторе (что я консультирую) падает не доходя до main. Причём с какой-то совершенно невнятной диагностикой про размер файла.
И каждый день — без права на ошибку...
Re[2]: Надёжная Debian 12
От: B0FEE664  
Дата: 15.10.24 17:34
Оценка: 1 (1) :))) :)
Здравствуйте, Pzz, Вы писали:

BFE>>

BFE>>sudo date --set="2040-12-13 10:09:08"
BFE>>sudo hwclock --systohc --noadjfile --utc
BFE>>


BFE>>и всё. приплыли.

Pzz>Куда приплыли-то? Подробности расскажи.
Клиенты решили протестировать девайс.
И первым же делом поменяли дату на вышеуказанную (из интерфейса).
И всё, девайс кажет чёрный экран.
Клиент, что характерно, на другом континенте. На этом никому в голову подобное не пришло.
Шев проекта не рискнул повторить трюк, а мне было интересно.
Результат тот же.
По ssh не зайти, девайса в сети нет (хотя ip на нём фиксированный)
Через последовательный порт видно , что загрузка с ошибками, но проходит.
putty подвисает после каждого нажатия enter, так что каждая команда требует переподключения.
Обратно дату на текущую не изменить: команда завершается с ошибкой.
У многих файлов и каталогов дата поменялась на 2040... и именно это приводит к проблемам. Если поменять даты каталогов /etc и /dev на текущие, то кое-что начинает работать.
Я не стал дальше разбираться, а просто переставил систему с флешки.

BFE>>А почему? А потому, что опытные программисты знают как там оно на самом деле устроено и кастят time_t к int.

Pzz>А там в хардварии сколько битов-то?
ARM 64 бита.
И каждый день — без права на ошибку...
Re[3]: Надёжная Debian 12
От: Pzz Россия https://github.com/alexpevzner
Дата: 15.10.24 17:38
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>>>А почему? А потому, что опытные программисты знают как там оно на самом деле устроено и кастят time_t к int.

Pzz>>А там в хардварии сколько битов-то?
BFE>ARM 64 бита.

Это у процессора. Интересно, сколько битов в том месте железа, куда время пишется.

Кстати, раз это ARM, то вся эта дичь в BSP, или в "общем" коде?
Re[3]: Надёжная Debian 12
От: Alekzander  
Дата: 15.10.24 18:52
Оценка: +1
Здравствуйте, Pzz, Вы писали:

Ф>>Блин, прибил бы автора слова "int" — не понятно же, какого размера...


Pzz>Удобного для процессора. На PDP/11 вообще 16 бит было. И на 16-битном 8086 тоже.


Pzz>Автор-то уже помер, поди. Наверное, это был Денис Ричи.


Я слышал, в старые времена железо тормозило на неродной разрядности. Например, задефайнив INT на 16 бит и используя его повсюду, можно было совершенно бесплатно получить просадку производительности на 86 времён, примерно, 9x.

Никогда не любил тестировать подобные штуки, в те времена особенно, но если это так, то это костыль, ныне утративший единственный смысл, который в нём был. Но люди упорно пытаются найти новый (смысл).
I'm a sewer mutant, and my favorite authors are Edgar Allan Poo, H.G. Smells and George R.R. Martin.
Re[4]: Надёжная Debian 12
От: Pzz Россия https://github.com/alexpevzner
Дата: 15.10.24 19:00
Оценка: +1
Здравствуйте, Alekzander, Вы писали:

A>Никогда не любил тестировать подобные штуки, в те времена особенно, но если это так, то это костыль, ныне утративший единственный смысл, который в нём был. Но люди упорно пытаются найти новый (смысл).


В смысле?

Во времена, когда Си был придуман, были 16-битные компьютеры, они аппаратно складывали за раз два 16-битных числа, а вот чтобы сложить два 32-битных числа, требовалось несколько команд, и были 32-битные компьютеры, их команды за раз оперировали 32-битными числами.

Если использовать int по назначению (например, в качестве счетчика цикла), то обычно вообще все равно, 16 он бит или 32. Поэтому тип, достаточно длинный для подобных применений, но при этом без гарантий относительно конкретной длины (1) имеет смысл (2) очень востребован. Даже и до сих пор.
Re[5]: Надёжная Debian 12
От: Философ Ад http://vk.com/id10256428
Дата: 15.10.24 19:45
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Если использовать int по назначению (например, в качестве счетчика цикла), то обычно вообще все равно, 16 он бит или 32...


А что, во время 16-битных регистров мегабайтных файлов ещё не было? Или никто последовательно не вычитывал сотни тысяч элементов структуры? Вроде когда C придумали, уже юникс был — уже должны были быть подобные задачи, тем более Масачусетском универе.
Я не сишник, если что.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[5]: Надёжная Debian 12
От: Alekzander  
Дата: 15.10.24 19:47
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Во времена, когда Си был придуман, были 16-битные компьютеры, они аппаратно складывали за раз два 16-битных числа, а вот чтобы сложить два 32-битных числа, требовалось несколько команд, и были 32-битные компьютеры, их команды за раз оперировали 32-битными числами.


Что происходило с производительностью, если на тех 16-битных компьютерах ты складывал два 8-битных числа?

Допустим, ты портировал код с 8-битной платформы и поэтому точно знал, что диапазона тебе хватит. Получал ли ты выигрыш по скорости, заменив безо всякого прикладного смысла все переменные на 16-битные?

Я, к сожалению, так давно не живу. Почитываю иногда старые статьи, и не уверен, что понимаю их правильно.
I'm a sewer mutant, and my favorite authors are Edgar Allan Poo, H.G. Smells and George R.R. Martin.
Re[6]: Надёжная Debian 12
От: Pzz Россия https://github.com/alexpevzner
Дата: 15.10.24 19:52
Оценка: +1
Здравствуйте, Философ, Вы писали:

Pzz>>Если использовать int по назначению (например, в качестве счетчика цикла), то обычно вообще все равно, 16 он бит или 32...


Ф>А что, во время 16-битных регистров мегабайтных файлов ещё не было? Или никто последовательно не вычитывал сотни тысяч элементов структуры? Вроде когда C придумали, уже юникс был — уже должны были быть подобные задачи, тем более Масачусетском универе.

Ф>Я не сишник, если что.

Для этого был тип long.
Re[6]: Надёжная Debian 12
От: Pzz Россия https://github.com/alexpevzner
Дата: 15.10.24 19:55
Оценка:
Здравствуйте, Alekzander, Вы писали:

A>Что происходило с производительностью, если на тех 16-битных компьютерах ты складывал два 8-битных числа?


A>Допустим, ты портировал код с 8-битной платформы и поэтому точно знал, что диапазона тебе хватит. Получал ли ты выигрыш по скорости, заменив безо всякого прикладного смысла все переменные на 16-битные?


Не знаю. Думаю, для разных машин разный ответ.

Но в целом, во времена засилия 16-битных машин памяти было очень мало. Поэтому тратить при работе со строками по 16 бит на символ было бы расточительством; возможность напрямую работать с 8-битными значениями была важна.

Так что я думаю, с 8-ю битами все было ОК.
Re[3]: Надёжная Debian 12
От: Pzz Россия https://github.com/alexpevzner
Дата: 15.10.24 20:01
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Никогда не видели кода:

BFE>
BFE>    int n = time(NULL);
BFE>

BFE>?

Я видел код, в котором в int запихивали указатель. А потом рассчитывали его оттуда достать, в целости и сохранности.

Собственно, даже во времена MS-DOS это было дикостью, потому что int был 16-битным, а far pointer — нет. Но на VAX-е, где родился BSD UNIX, все было 32-битным, очень удобно, пока кому-нибудь не придет в голову такой код куда-нибудь спортировать.

BFE>Я не знаю кто и что в недрах gcc или Linux что-то такое предусмотрел, но приложение в конторе (что я консультирую) падает не доходя до main. Причём с какой-то совершенно невнятной диагностикой про размер файла.


Можно написать функцию, которая исполнится (и упадет) до main-а. В C++ для этого предусмотрены конструкторы статических объектов, для Си в gcc есть специальные расширения.

Ты б дал ему отложить core и посмотрел бы отладчиком на стек...
Re[7]: Надёжная Debian 12
От: Alekzander  
Дата: 15.10.24 20:09
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Но в целом, во времена засилия 16-битных машин памяти было очень мало. Поэтому тратить при работе со строками по 16 бит на символ было бы расточительством


Речь не про символы, а про счётчики циклов и тому подобное. До сих пор тратить по 16 бит на символ считается расточительством (UTF-8).

Плюс, что тогда было с многозадачностью? Программа начинала требовать больше памяти, но если эта память была увеличена пропорционально разрядности, и никто её больше не тратил, не один ли хрен.
I'm a sewer mutant, and my favorite authors are Edgar Allan Poo, H.G. Smells and George R.R. Martin.
Отредактировано 15.10.2024 20:11 Alekzander . Предыдущая версия .
Re[8]: Надёжная Debian 12
От: Pzz Россия https://github.com/alexpevzner
Дата: 15.10.24 20:54
Оценка:
Здравствуйте, Alekzander, Вы писали:

Pzz>>Но в целом, во времена засилия 16-битных машин памяти было очень мало. Поэтому тратить при работе со строками по 16 бит на символ было бы расточительством


A>Речь не про символы, а про счётчики циклов и тому подобное. До сих пор тратить по 16 бит на символ считается расточительством (UTF-8).


Ну если мы можем вычесть из ASCII-символа цифры '0', чтобы получить ее численное значение, значит, 8-битная арифметика в машине предусмотрена.

Другой вопрос, что счетчик цикла с хорошей вероятностью ляжет на регистр, а дальше надо уже архитектуру конкретных процессоров смотреть, чтобы понять, будет ли ему удобнее в 16-битном регистре, чем в его половинке, или это все равно.

A>Плюс, что тогда было с многозадачностью? Программа начинала требовать больше памяти, но если эта память была увеличена пропорционально разрядности, и никто её больше не тратил, не один ли хрен.


Если памяти, скажем, 128 килобайт на всех, то не один хрен.

Килобайт, обрати внимание. В килобайте 1024 байта.
Re[9]: Надёжная Debian 12
От: Alekzander  
Дата: 15.10.24 21:51
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Если памяти, скажем, 128 килобайт на всех, то не один хрен.


Pzz>Килобайт, обрати внимание. В килобайте 1024 байта.


128 килобайт было ещё у восьмибитного Спектрума. А Спектрум я уже вполне застал. А у промышленных систем, ну вот я загуглил:

PDP–11/70 – 1975.[15] The 11/45 architecture expanded to allow 4 MB of physical memory segregated onto a private memory bus, 2 KB of cache memory, and much faster I/O devices connected via the Massbus.


Другая известная 16-битная система, 80286 — "640К хватит всем". 640, а не 128.

Я думаю, при переносе восьмибитных программ на практике ты всегда влезал в память, если тупо заменял главный int на 16-битный. Если при этом ты избавлялся от тормозов или ещё какого-нибудь говна, связанного с неродной разрядностью, то в этом и был смысл плавающего размера.
I'm a sewer mutant, and my favorite authors are Edgar Allan Poo, H.G. Smells and George R.R. Martin.
Re[10]: Надёжная Debian 12
От: Pzz Россия https://github.com/alexpevzner
Дата: 16.10.24 04:35
Оценка:
Здравствуйте, Alekzander, Вы писали:

A>128 килобайт было ещё у восьмибитного Спектрума. А Спектрум я уже вполне застал. А у промышленных систем, ну вот я загуглил:


A>

A>PDP–11/70 – 1975.[15] The 11/45 architecture expanded to allow 4 MB of physical memory segregated onto a private memory bus, 2 KB of cache memory, and much faster I/O devices connected via the Massbus.


"Allow" != "installed". 128-256 Kb — вполне нормальная сборка для PDP-ки (вернее, я застал советские PDP, СМ/4). В персоналки (Электронока-60) больше 64К не ставили.

A>Другая известная 16-битная система, 80286 — "640К хватит всем". 640, а не 128.


Это уже была прям продвинутая система.

A>Я думаю, при переносе восьмибитных программ на практике ты всегда влезал в память, если тупо заменял главный int на 16-битный. Если при этом ты избавлялся от тормозов или ещё какого-нибудь говна, связанного с неродной разрядностью, то в этом и был смысл плавающего размера.


Что-то я не припомню, чтобы я куда-нибудь переносил 8-битные программы.

16-битные, с MS-DOS на UNIX переносил, как и в обратном направлении.
Re[5]: Надёжная Debian 12
От: mike_rs Россия  
Дата: 16.10.24 07:53
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Если использовать int по назначению (например, в качестве счетчика цикла), то обычно вообще все равно, 16 он бит или 32.


даа, теперь понятно откуда тонны уязвимостей integer overflow с последующим корраптом памяти...
Re[4]: Надёжная Debian 12
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 16.10.24 08:05
Оценка:
Здравствуйте, Alekzander, Вы писали:

A>Я слышал, в старые времена железо тормозило на неродной разрядности. Например, задефайнив INT на 16 бит и используя его повсюду, можно было совершенно бесплатно получить просадку производительности на 86 времён, примерно, 9x.


Это во все времена так. Железо умеет работать только с конкретной разрядностью. Всё что другое корректируется компилятором, т.е. софтварно. Вот вам и просадка.
Re[5]: Надёжная Debian 12
От: Alekzander  
Дата: 16.10.24 08:18
Оценка:
Здравствуйте, Pauel, Вы писали:

A>>Я слышал, в старые времена железо тормозило на неродной разрядности. Например, задефайнив INT на 16 бит и используя его повсюду, можно было совершенно бесплатно получить просадку производительности на 86 времён, примерно, 9x.


P> Это во все времена так. Железо умеет работать только с конкретной разрядностью. Всё что другое корректируется компилятором, т.е. софтварно. Вот вам и просадка.


И что, ты хочешь сказать, что современные 64-битные процы не пилятся специально так, чтобы не было просадок на тоннах 32-битного софта?
I'm a sewer mutant, and my favorite authors are Edgar Allan Poo, H.G. Smells and George R.R. Martin.
Re[6]: Надёжная Debian 12
От: Pzz Россия https://github.com/alexpevzner
Дата: 16.10.24 09:43
Оценка:
Здравствуйте, mike_rs, Вы писали:

Pzz>>Если использовать int по назначению (например, в качестве счетчика цикла), то обычно вообще все равно, 16 он бит или 32.


_>даа, теперь понятно откуда тонны уязвимостей integer overflow с последующим корраптом памяти...


Ну, Си не для всех...
Re[7]: Надёжная Debian 12
От: mike_rs Россия  
Дата: 16.10.24 10:35
Оценка:
Здравствуйте, Pzz, Вы писали:

_>>даа, теперь понятно откуда тонны уязвимостей integer overflow с последующим корраптом памяти...

Pzz>Ну, Си не для всех...

краудстрайк тоже так думал
Re[3]: Надёжная Debian 12
От: Stanislaw K СССР  
Дата: 16.10.24 12:00
Оценка:
Здравствуйте, B0FEE664, Вы писали:


BFE>У многих файлов и каталогов дата поменялась на 2040... и именно это приводит к проблемам. Если поменять даты каталогов /etc и /dev на текущие, то кое-что начинает работать.


Хм, интересно. похоже это бага драйвера fs. Какая там fs?

И зачем вообще системе смотреть на даты файлов? это атрибут user level.
Все проблемы от жадности и глупости
Re: Надёжная Debian 12
От: velkin Удмуртия https://kisa.biz
Дата: 16.10.24 12:25
Оценка: 3 (1)
Здравствуйте, B0FEE664, Вы писали:

BFE>Надёжная Debian 12


Я начал использовать Debian с 6 версии, с переходом на 7 версию на полный цикл. Больше всего мне нравилась 9 версия. А 12 версия на мой взгляд неудачная.

И в Debian есть выведенное мною правило, что начинать использовать выпуск нужно тогда, когда выпустили следующую версию.

Например, выпускают установочный образ 13 версии, тогда идём и скачиваем последний установочный образ 12 версии.

В последнем установочном образе уже исправили многие баги из коробки. Это лучше, чем ставить баганутый образ первых выпусков и обновления, так как реконфигурация сама по себе не делается.

В целом же Debian это рабочий инструмент. Цель его дать пользователям операционку для последующей настройки.

Для таких случаев и существует профессия администратора. Если сам не хочешь настраивать можешь заплатить. А если настраиваешь сам, то сам и становишься админом.
Re[6]: Надёжная Debian 12
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 16.10.24 14:26
Оценка:
Здравствуйте, Alekzander, Вы писали:

A>И что, ты хочешь сказать, что современные 64-битные процы не пилятся специально так, чтобы не было просадок на тоннах 32-битного софта?


Я хочу сказать, что в любой процессор закладывается ограниченное количество кейсов для оптимизации.
Нынешние процессоры затачиваются в основном под 32 и 64 бита.
Иногда 32х битная версия быстрее, иногда 64.
Для интересу можно 16 битный код потестировать, не знаю, правда, как этого добиться.
Еще есть и 8 битные команды, вроде бы их не выбрасывали.

А вот если вы захотите 128бит — у вас снова будут просадки, как и в стародавние времена. Только поменьше, т.к. раньше в процессорах отсутствовали многие механизмы, типа буфер ветвления, кеширование итд итд
Re[7]: Надёжная Debian 12
От: Alekzander  
Дата: 16.10.24 15:00
Оценка:
Здравствуйте, Pauel, Вы писали:

P>Нынешние процессоры затачиваются в основном под 32 и 64 бита.


"Что ж ты, фраер, сдал назад?" Сначала ты пишешь:

>Это во все времена так. Железо умеет работать только с конкретной разрядностью. Всё что другое корректируется компилятором


А теперь, значит, "затачиваются" сразу "под 32 и 64 бита", да?

Об этом и речь шла. Если верна гипотеза, что когда-то плавающий инт ввели с Си в порядке оптимизации, чтобы при переносе на другие платформы автоматически (без изменения кода) получать родную разрядность и максимальную производительность, то теперь смысла в плавающем инте больше нет. А нет смысла потому, что имея такой корпус 32-битных программ создатели 64-битных процессоров вложились в оптимизацию под "неродную", 32-битную разрядность. Хотя я даже не уверен, что там к 32-битности вообще применимо понятие "неродная".
I'm a sewer mutant, and my favorite authors are Edgar Allan Poo, H.G. Smells and George R.R. Martin.
Re[8]: Надёжная Debian 12
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 16.10.24 19:43
Оценка:
Здравствуйте, Alekzander, Вы писали:

A>"Что ж ты, фраер, сдал назад?" Сначала ты пишешь:

A>А теперь, значит, "затачиваются" сразу "под 32 и 64 бита", да?

Вы так торопитесь, что ваши мысли вас не догоняют.

Цитирую себя: "А вот если вы захотите 128бит — у вас снова будут просадки, как и в стародавние времена. "

Разница между 32 и 64 небольшая, но есть. Не нравится — рассмотрите кейсы с 16 битными вычислениями, 8 битными, и даже 128 битными.
Re[9]: Надёжная Debian 12
От: Alekzander  
Дата: 17.10.24 07:12
Оценка:
Здравствуйте, Pauel, Вы писали:

P>Цитирую себя: "А вот если вы захотите 128бит — у вас снова будут просадки, как и в стародавние времена. "


Вот тогда, возможно, снова станет актуальным плавающий инт. А на данный момент он актуальность утратил, в связи с тем, что хорошая нативная поддержка 32-битного софта всеми процессорами это фактор конкуренции.

Если, конечно, подчёркиваю, верна гипотеза о перформансных или каких-то иных плюшках автоматического приведения разрядности к родной. А другой разумной гипотезы, собственно, я не вижу.
I'm a sewer mutant, and my favorite authors are Edgar Allan Poo, H.G. Smells and George R.R. Martin.
Re[5]: Надёжная Debian 12
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 17.10.24 13:32
Оценка: 6 (2)
Здравствуйте, Pzz, Вы писали:

Pzz>Если использовать int по назначению (например, в качестве счетчика цикла), то обычно вообще все равно, 16 он бит или 32.


Очень даже есть разница.

typedef int INDEX;
int xset(int *arr, INDEX pos, int val) {
  arr[pos] = val;
}


Компилируем (gcc -O -S -masm=intel):
xset:
        movsx   rsi, esi
        mov     DWORD PTR [rdi+rsi*4], edx
        ret


Ой, а откуда это movsx взялось? До адреса-то расширить надо...

То же для ARM/64:

xset:
        str     w2, [x0, w1, sxtw 2]
        ret


Тут вложенная sxtw делает то же самое.

Если взять unsigned, то для такого простого кода, да, на x86 срабатывает автозатирка старших 32 бит при 32-битных операциях (но не при 16-битных!) На ARM аналогично появляются uxtw.

А теперь ещё интереснее — делаем индекс unsigned short и делаем цикл по нему:

typedef unsigned short INDEX;
int xfill(int *arr, INDEX size) {
  INDEX i;
  for (i = 0; i < size; ++i) {
    arr[i] = i;
  }
  arr[size] = 0;
}


ARM:

xfill:
        ands    w1, w1, 65535
        beq     .L2
        mov     x2, 0
.L3:
        str     w2, [x0, x2, lsl 2]
        add     x2, x2, 1
        cmp     w1, w2, uxth
        bhi     .L3
.L2:
        and     x1, x1, 65535
        str     wzr, [x0, x1, lsl 2]
        ret


А зачем нам аж два and с 65535? А это нас арестовывать идут есть правило C/C++, что арифметика unsigned она modulo. В результате лишние операции в цикле.
На x86 GCC на это решил использовать 16-битные регистры, типа ax. Clang не захотел, поэтому там есть явный movzx после инкремента.

А теперь ещё и поменяем аргумент размера на size_t. GCC, x86:

xfill:
        test    rsi, rsi
        je      .L2
        mov     eax, 0
        mov     edx, 0
.L3:
        movzx   ecx, ax
        mov     DWORD PTR [rdi+rdx*4], ecx
        add     eax, 1
        movzx   edx, ax
        cmp     rdx, rsi
        jb      .L3
.L2:
        mov     DWORD PTR [rdi+rsi*4], 0
        ret


Два лишних movzx. Мы убрали гарантию, что предел влезает в те же 16 бит, и включается полная арифметика по модулю 2^16 в регистре размером на 2^64. Это полное орейро.

Эффект я наблюдал в коде проектов, в которых почему-то очень любили, что если количество, например, модулей железа для чего-то приходит в виде uint8_t, то и итерировать по ним надо через uint8_t. В результате код был переполнен всякими ubfx и uxtw.

Для архитектур типа ARM я уже вообще не вижу причин оставлять int 32-битным, кроме совместимости с неизвестно чем. Для x86 минимальный аргумент — что 32-битные команды в массе, в отличие от 64-битных, не требуют REX префикса, поэтому чуть экономнее.

Зато в рекомендации по кодированию давно надо внести — все переменные циклов, которые используются для индексации, надо делать size_t или ssize_t. Иначе повылазят эти конверсии где не нужны.
The God is real, unless declared integer.
Re[7]: Надёжная Debian 12
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 17.10.24 13:36
Оценка:
Здравствуйте, Pzz, Вы писали:

Ф>>А что, во время 16-битных регистров мегабайтных файлов ещё не было? Или никто последовательно не вычитывал сотни тысяч элементов структуры? Вроде когда C придумали, уже юникс был — уже должны были быть подобные задачи, тем более Масачусетском универе.

Ф>>Я не сишник, если что.

Pzz>Для этого был тип long.


И которого не хватило.
The God is real, unless declared integer.
Re[6]: Надёжная Debian 12
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 17.10.24 14:16
Оценка: 3 (1)
Здравствуйте, Alekzander, Вы писали:

A>>>Я слышал, в старые времена железо тормозило на неродной разрядности. Например, задефайнив INT на 16 бит и используя его повсюду, можно было совершенно бесплатно получить просадку производительности на 86 времён, примерно, 9x.


P>> Это во все времена так. Железо умеет работать только с конкретной разрядностью. Всё что другое корректируется компилятором, т.е. софтварно. Вот вам и просадка.


A>И что, ты хочешь сказать, что современные 64-битные процы не пилятся специально так, чтобы не было просадок на тоннах 32-битного софта?


С подходами _современных_ процессоров вообще должно быть пофиг, какая разрядность, пока речь идёт об операциях над полным объектом (обычно регистром).

Во всех основных архитектурах это обеспечено тем, что операция с младшей частью регистра чистит старшую часть. X86 — любая 32-битная операция зануляет старшую половину 64-битного регистра. ARM/64 — то же самое. RISC-V — знаковое расширение на старшую часть, но последствия те же. Или загрузка из памяти в регистр: у тебя есть какие-нибудь lb, lbu, lh, lhu, lw, lwu, ld (список по RISC-V) с расширением, но нет условного lhk (поменять младших 16 бит не трогая старшие). Нужно такое — делаешь особым комбинированием (как bfm в ARM/64), но нужно очень редко.

А вот с 8 и 16 битами в x86 иначе. Они старшую часть, какого она бы ни была размера (16, 32, 64), вообще не трогают. Для 8086 это было ещё логично: работаешь с AL, не меняешь AH. Но сделав такое правило в 386, Intel сама себе подложила огромную свинью. Те задержки, о которых ты говоришь, происходят от того, что возникает "ложная зависимость" между старым и новым значением регистра, которая не даёт параллелить операции.

Особенно это грустно было на PPro. В P2 и особенно в P3 это исправили, вместе с другими проблемами — в PPro, например, Flags рассматривался целиком, и любимые Intel подходы, что некоторые команды меняют только часть condition codes, давали тут такую же неустранимую зависимость. В P2 его разделили на каждый бит CC (CF, SF, OF, ZF, AF, PF) отдельно. Наверняка это ты и вспомнил в вопросе скорости 16-битных программ "во времена 9x".

Но я думаю, что с последними поколениями, когда 16-битный код в нормальном софте используется только для загрузки до момента перехода в защищённый режим с загруженным ядром, эту подпорку начинают убирать обратно. Хочешь легаси — не вопрос, но будет тормозить на тех же false dependency.
The God is real, unless declared integer.
Re[5]: Надёжная Debian 12
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 17.10.24 14:18
Оценка:
Здравствуйте, Pauel, Вы писали:

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


A>>Я слышал, в старые времена железо тормозило на неродной разрядности. Например, задефайнив INT на 16 бит и используя его повсюду, можно было совершенно бесплатно получить просадку производительности на 86 времён, примерно, 9x.


P> Это во все времена так. Железо умеет работать только с конкретной разрядностью. Всё что другое корректируется компилятором, т.е. софтварно. Вот вам и просадка.


X86 таки тут особый случай. Поддержка 8- и 16-битных операций в легаси-стиле. Я в соседнем комментарии расписал подробнее.

(Честно говоря, не только он, конечно. SystemZ отличается тем же. Но там такие пользователи, что их это в большинстве случаев не волнует.)
The God is real, unless declared integer.
Re[10]: Надёжная Debian 12
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 17.10.24 14:21
Оценка:
Здравствуйте, Alekzander, Вы писали:

A>Я думаю, при переносе восьмибитных программ на практике ты всегда влезал в память, если тупо заменял главный int на 16-битный.


Насколько я понял твою хитро завёрнутую мысль, то таки нет.

Самая ходовая среди таких платформ — 6502 — имела с этим серьёзные проблемы. Позволить себе 16-битный int было чудовищно дорого.
The God is real, unless declared integer.
Re[3]: Надёжная Debian 12
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 17.10.24 14:24
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>По ssh не зайти, девайса в сети нет (хотя ip на нём фиксированный)

[...]

BFE>Через последовательный порт видно , что загрузка с ошибками, но проходит.

BFE>putty подвисает после каждого нажатия enter, так что каждая команда требует переподключения.
BFE>Обратно дату на текущую не изменить: команда завершается с ошибкой.
BFE>У многих файлов и каталогов дата поменялась на 2040... и именно это приводит к проблемам. Если поменять даты каталогов /etc и /dev на текущие, то кое-что начинает работать.
BFE>Я не стал дальше разбираться, а просто переставил систему с флешки.

BFE>>>А почему? А потому, что опытные программисты знают как там оно на самом деле устроено и кастят time_t к int.

Pzz>>А там в хардварии сколько битов-то?
BFE>ARM 64 бита.

Крайне странно. На 64 битах уже давно time_t 64-битный насквозь.

Присоединяюсь к вопросу, не виноват ли какой-нибудь код за пределами Linux (аббревиатура BSP, которую тут упомянули, в этом числе).
The God is real, unless declared integer.
Re[6]: Надёжная Debian 12
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.10.24 16:04
Оценка: 3 (1)
Здравствуйте, Alekzander, Вы писали:
A>И что, ты хочешь сказать, что современные 64-битные процы не пилятся специально так, чтобы не было просадок на тоннах 32-битного софта?
тынц
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Надёжная Debian 12
От: B0FEE664  
Дата: 18.10.24 18:55
Оценка:
Здравствуйте, netch80, Вы писали:

N>Крайне странно. На 64 битах уже давно time_t 64-битный насквозь.

N>Присоединяюсь к вопросу, не виноват ли какой-нибудь код за пределами Linux (аббревиатура BSP, которую тут упомянули, в этом числе).

И за пределами, конечно, тоже виноват. Например, sft-plugin для Total Commander вообще не видит файлы, если их дата (причём любая из трёх) уходит за порог.

Ну и Debian от больших дат глючит.
Вот, ради эксперимента под Debian12 на WSL под Windows 10:

19:59:50 dev@Debian12:~/Temp/T3>touch --date="2040-12-11 10:09:08" test.txt
20:04:53 dev@Debian12:~/Temp/T3>ls -l
total 0
-rw-r--r-- 1 dev dev 0 Dec 11 2040 test.txt
20:04:57 dev@Debian12:~/Temp/T3>stat test.txt
File: test.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 8,32 Inode: 235196 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1001/ dev) Gid: ( 1001/ dev)
Access: 2040-12-11 10:09:08.000000000 +0100
Modify: 2040-12-11 10:09:08.000000000 +0100
Change: 2024-10-18 20:04:53.994201718 +0200
Birth: 2024-10-18 20:04:53.994201718 +0200
20:05:15 dev@Debian12:~/Temp/T3>touch --date="2340-12-11 10:09:08" test2.txt
20:06:13 dev@Debian12:~/Temp/T3>ls -l
total 0
-rw-r--r-- 1 dev dev 0 Dec 11 2340 test2.txt
-rw-r--r-- 1 dev dev 0 Dec 11 2040 test.txt
20:06:17 dev@Debian12:~/Temp/T3>stat test2.txt
File: test2.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 8,32 Inode: 235251 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1001/ dev) Gid: ( 1001/ dev)
Access: 2340-12-11 10:09:08.000000000 +0100
Modify: 2340-12-11 10:09:08.000000000 +0100
Change: 2024-10-18 20:06:13.946818028 +0200
Birth: 2024-10-18 20:06:13.946818028 +0200
20:06:29 dev@Debian12:~/Temp/T3>touch --date="12340-12-11 10:09:08" test3.txt
20:06:53 dev@Debian12:~/Temp/T3>stat test3.txt
File: test3.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 8,32 Inode: 235255 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1001/ dev) Gid: ( 1001/ dev)
Access: 2446-05-11 00:38:55.000000000 +0200
Modify: 2446-05-11 00:38:55.000000000 +0200
Change: 2024-10-18 20:06:53.268100549 +0200
Birth: 2024-10-18 20:06:53.268100549 +0200
20:06:58 dev@Debian12:~/Temp/T3>ls -l
total 0
-rw-r--r-- 1 dev dev 0 Dec 11 2340 test2.txt
-rw-r--r-- 1 dev dev 0 May 11 2446 test3.txt
-rw-r--r-- 1 dev dev 0 Dec 11 2040 test.txt
20:07:24 dev@Debian12:~/Temp/T3>


Скажите мне, каким образом 11-ое декабря 12340 года превратилось в 11-ое мая 2446 года? Программисты опять живут сегодняшним днём? Не, я понимаю, Земля замедляется, но за 10300 лет год увеличится не больше чем на 3 минуты и это никак не объясняет, куда делись 9894 года и почему 10:09 превратилось в 00:38.

Винда, кстати, в колонке Date на эти файлы показывает пустое место. Ну, хоть ничего не падает...
И каждый день — без права на ошибку...
Re[5]: Надёжная Debian 12
От: Anton Batenev Россия https://github.com/abbat
Дата: 18.10.24 20:24
Оценка: 2 (1)
Здравствуйте, B0FEE664, Вы писали:

BFE> Скажите мне, каким образом 11-ое декабря 12340 года превратилось в 11-ое мая 2446 года?


Ответ здесь
Re: Надёжная Debian 12
От: imh0  
Дата: 19.10.24 11:12
Оценка: 1 (1)
Здравствуйте, B0FEE664, Вы писали:

BFE>и всё. приплыли.

BFE>А почему? А потому, что опытные программисты знают как там оно на самом деле устроено и кастят time_t к int.

Ну я не шеф, я рискнул — нихрена из описанного ужоса не происходит.
Отбой тревоги.
Фейк.
Re[4]: Надёжная Debian 12
От: AlexGin Беларусь  
Дата: 21.10.24 11:06
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Можно написать функцию, которая исполнится (и упадет) до main-а.


Конструктор глобального объекта?
Re[5]: Надёжная Debian 12
От: Pzz Россия https://github.com/alexpevzner
Дата: 21.10.24 11:07
Оценка:
Здравствуйте, AlexGin, Вы писали:

Pzz>>Можно написать функцию, которая исполнится (и упадет) до main-а.


AG>Конструктор глобального объекта?


Статического.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.