Dore: Ogre

Странности нашего городка

MEMSET(3)                 Linux Programmer's Manual                MEMSET(3)
NAME        
memset - fill memory with a constant byte
SYNOPSIS        
#include <string.h> void *memset(void *s, int c, size_t n);
DESCRIPTION        
The memset() function fills the first n bytes of the memory area pointed to by s with the constant byte c.

Кто-нибудь знает, почему c целоe, если заполняем память байтами?
Tags:
Они, не знаю, как сейчас, а раньше в int транслировались (даже char) потому что 8-битное слово в стек не пушается.
memset писался лет на 25 раньше чем был определен int8_t который в общем typedef просто
ну а char платформо-зависимый в общем случае, поэтому для значений байтов int подходит лучше
оно конечно было бы лучше Кернигану с Томпсоном определить разные типы integer изначально, но в начале 70х никто по-моему этим не заморачивался
Не пойму, побайтовая адресация памяти была, а байтов не было? Или в каком смсыле они заполняли память байтами?
Да и в любом случае это современная сигнатура, если там size_t, а не времен Кернигана.
Это не мог бы быть char, в те года были машины, на которых он 7-битовый. Только начиная с POSIX.1-2001 постулируется, что CHAR_BIT == 8 (в C99 вроде бы >= 8, но надо проверить). short int мог бы подойти, но и он не в точности байт, так, наверное, решили идти по пути меньшего сопротивления "все на свете или void* или int"
Более того, в оригинальном K&R C у деклараций функций вообще не было параметров. Поэтому параметры были просто равны размеру регистра. При этом memset уже был включён в run-time библиотеку.
Но это же не код Кернигана. Там вообще синтаксис не такой.
Думаю что потом уже задним числом оформили сигнатуру, при сохранении функциональности. Горы кода уже были написаны подразумевая там int. К тому же, как верно заметили выше, ранние версии С вообще сильно с типами не заморачивались, а уж с таким неудобным как char и подавно. Есть ещё древние функции, которые используют int: getc, putc и тд..
Как у Винджи: многие из этих функций были написаны еще на Земле.
Как человек, который вот этими руками перелопатил ядро 6 и 7 версии, а также все библиотеки, чтоб они правильно обрабатывали 8 бит - умолкаю, потому что если б в этом машинном зале выступили слезы всех тех...

Видели бы вы, как оригинальный Борновский шелл был написан. Это вам не Баш какой-нибудь.
А есть все-таки простой ответ?В несуществование байтов как типа чего-то не верится.
Так вначале этой ветки его и дали. Все регистры были 16-битовыми, манипулировать байтами, которые еще к тому же в самое неудобное время распространяли 8 бит на остаток регистра, была головная боль. Тип char использовался для строк. Были всякие заморочки, когда надо было экономить память и делался массив из байтов для чисел. Но тогда приходилось специально писать функции для борьбы с 8 битом.

То есть, вначале было слово. И слово было 16 бит. А потом многие годы это постепенно, очень медленно менялось и эти следы до сих пор можно обнаружить. Позикс когда вышел, все аж ахнули от его чудесной стройности. Но не работало еще много лет.
А как тогда работал memset? Он тоже заполнял память словами, а не байтами?
Сейчас уже не помню, но практически уверен, что да. Быстрее же. Память из 16-битных слов, регистры 16 бит, зачем заморачиваться. Можно, кстати, найти. где-то наверняка оригинальные тексты гуляют.
Хм, тогда ответ на мой вопрос - c слово потому, что в старину память заполняли словами. Но тогда непонятно, какая тут может быть совместимость со стариной, ведь если мой старинный код вызовет memset со словом, состоящим из двух различных байтов, то все равно ничего хорошего не выйдет.
Я бы тоже сказал "слово", в те годы, когда ассемблер дышал в спину, это было бы понятно. А вот насчет совместимости со стариной - хороший вопрос, никто ж не гарантирует, что старинный код должен работать. Ему место в Палате Мер и Весов. Хотя вот, недавно Эппл 1 на аукционе продали тысяч за 300. Там можно попробовать.
Так если совместимости все равно нет, то какая разница, что делали в старину? Почему в тот момент, когда отказались от совместимости и поменяли семантику мемсета, не поменяли его сигнатуру? Ведь один человек принял оба решения, одновременно? Это и безопаснее было бы - компилятор бы мог предупреждать, что кто-то передает слово туда, где теперь нужен байт.

Edited at 2018-09-28 03:46 pm (UTC)
К тому моменту это был уже точно не один человек, в Позиксе заседали десятки. И я помню все эти бесконечные войны между Позиксом, System V specs и прочими изводами в виде Дековского Ультрикса, БиЭсДи, еще бродящими версиями, основанными на 7 и пр. Совместимость тогда была проблемой, наш код пестрел ifdef-ами на десятки платформ. Даже уже в Штатах в начале 90-х, наши файловые системы должны были работать на нескольких Юниксах - условной компиляции было полно.
В смысле, один человек писал имплементацию мемсета, в байтах, а совсем другой - его декларацию, в словах? Серьезно, что ли?
Да нет, ну не до такой же степени. Сигнатуру брали из какого-нибудь стандарта, благо было из чего выбирать. Потом кто-то подпиливал компилятор под выбранный стандарт. Потом старые программы переставили работать. Потом кто-то вставлял ифдефы в старый код, а совсем другой человек решил править компилятор и третий - библиотечные функции. Тут на Линуса бочку катят, что мол грубый он и к людям невнимателен. А вы этих людей видели???

Скажем так, у меня от тех времен остались советские лагерные ощущения - "не верь, не бойся, не проси". Я никогда не верил написанному, просить было некого, а делать было надо. "Довьерьяй но провьерьяй"
Ну не знаю, я думал, libc пишут люди с седыми бородами, у которых все всегда портабельно, совместимо со всем и заголовки имеют смысл.

Edited at 2018-09-28 04:11 pm (UTC)
В те далекие годы так и было. Мне еще повезло познакомиться с Ритчи на одной из Юзниковских конференций. Я всю эту толпу помню, еще молодой МкКузик бегал с горящими глазами и вальяжный Бил Джой пил мартини в ресторане "Прага".

Был такой хороший фильм советский, там герой вспоминает "Но тут пришел гегемон и все пошло прахом". ЛибСи действительно писали люди с седыми бородами и пока они были у руля и количество версий не зашкаливало, было легче. Потом был период разброда и шатания, потом все вроде опять улеглось. Вы спрашиваете первоначальную мотивацию - я думаю, что она была приблизительно так как тут обсуждается. Потом разброд закончился, люди с седыми бородами ушли на пенсию, умерли и теперь это интересно только археологам. Ну и нам, людям с седыми бородами....
О! Спасибо. Теперь стало чуть более понятно, почему на моей первой работе зубры С++ обернули все примитивы в дополнительные классы для Джавы: company.Int, company.Short, company.Long и т.д.