Как стать автором
Обновить

Комментарии 72

Взято отсюда
case 23:
case23:
if (width==4) {
sf = fcval;
printf("%o;%o\n", sf);
break;
}

C case23 судя по всему опечатался.
Клёво смотреть исходники Великих. Без иронии.
Почему опечатался? «case 23» — конструкция из switch. «case23» — метка на которую прыгает goto (CTRL+F + «case23»). Никакой опечатки нет, просто такая логика.
Это не опечатка. Там выше по коду есть
goto case23;
Да действительно. Теперь в религиозных спорах о goto и линейности кода можно будет ссылаться на Ритчи :-)
Умным решением было бы не участвовать в религиозных спорах, на самом деле.
Большинство же спорит ради удовольствия, а не чтобы найти правду.
Нет. Спор иногда позволяет понять лучше свою точку зрения, чтобы принять более правильно решение. С одним человеком у вас разногласия и у каждого из Вас разные точки зрения, у вас это точка-зрения-1, у него точка-зрения-2. Вы можете начать дискуссию и всячески доказывать правоту точки-зрения-2, а не своей точки-зрения-1. Дело в том, что пока Вы будете доказывать точку-зрения-2 Вы найдете еще много аргументов чтобы ей следовать и следовательно после нового спора у Вас появится больше сведений и знаний для анализа. Я не знаю как этот момент в психологами называется, но он отталкивает от того что человек будет любую точку зрения защищать если она прямо сейчас высказывается им самим

То есть когда нужно принять очень серьезное решение по очень важному вопросу, то нужно как можно больше сведений для анализа, чтобы избежать факапа
Я думаю в 72ом году, Ритчи меньше всего волновал goto в языке. Наоборот, он казался естественным и понятным для любого ассебмлер программиста, коими почти все тогда и являлись.
НЛО прилетело и опубликовало эту надпись здесь
Деннис Ритчи был физиком и прикладным математиком, поэтому я думаю, что он скорее фортран и алгол знал, чем ассемблер. А фортран тех времён чуть ли не наполовину состоял из разнообразных GOTO. Практически все конструкции, циклы, условные переходы, работали с метками.
Ну методология структурного программирования вместе с теоремой Бома-Якопини как раз только развивались в те годы параллельно.
Мило смотрятся эти "%o" — на PDP-11 восьмеричное представление чисел было наиболее удобным и привычным.
Ещё не совсем понял как тут работает printf("%o;%o\n", sf); — %-параметра тут два, а представлен один.
НЛО прилетело и опубликовало эту надпись здесь
Подозреваю, что это тест на ошибки с varargs или даже на float, в смысле вывод флоата в восьмеричном виде
Мне думается, что здесь параметры для printf сгружаются в стек, поэтому первым печатается sf, второго параметра нет, поэтому берётся то что дальше по стеку, т.е. адрес возврата — получаем в выдаче параметр плюс адрес места где он получен.
Либо же это просто вывод float в виде двух word.
Видимо потому что sizeof(float) == 2*sizeof(int), поэтому один float в стэке равен двум int'ам.

Не знал, что так можно:
main(argc, argv)
int argv[]; { 
//...
//...
}
Для cpp-файлов компилятор может выдать ошибку, а для с-файлов не должен.
Этот стиль и в C считается устеревшим с 91го года. И для C++ не может выдать а должен выдать, ибо в стандарте на C++ подобные конструкции не фигурировали.
А я думал, что первый компилятор выглядел как-то так:
image
Ну и «скомпилируйте» на нем, скажем, «Hello, World!». Жду недождусь результата.
github.com/mortdeus/legacy-cc/blob/master/last1120c/c10.c

waste() /* waste space */
{
waste(waste(waste),waste(waste),waste(waste));
waste(waste(waste),waste(waste),waste(waste));
waste(waste(waste),waste(waste),waste(waste));
waste(waste(waste),waste(waste),waste(waste));
waste(waste(waste),waste(waste),waste(waste));
waste(waste(waste),waste(waste),waste(waste));
waste(waste(waste),waste(waste),waste(waste));
waste(waste(waste),waste(waste),waste(waste));
}
Кто-нибудь пояснит зачем это?
В файле README.md есть ссылка на описание: www.cs.bell-labs.com/who/dmr/primevalC.html

Можно почитать со слов: «space allocation». Если коротко — это способ переместить начало программы подальше от нулевого адреса. На древних машинах переменные хранились начиная с нуля.
Насколько я понял из объяснения — там просто затирается кусок памяти, где расположено начало программы, для того чтобы освободить память для дальнейшей работы:
temporary storage is allocated that deliberately overwrites the beginning of the program, smashing its initialization code to save space

Или я не прав? Довольно интересный способ освободить память =)
Машинный код функции waste() нигде не используется. адреса 0x0000-sizeof(размер waste() инстркций) используется компилятором для своих внутренних нужд
Всё понял, спасибою Т.е. мы ешё на этапе компиляции выделяем блок памяти для хранения переменных и т.д.
На говнокод намекаете? ))
Оно так выделяло память, похоже.

UPD: выше точно ответили
Это не говнокод, это следствие портирования с абстрактного СИ на объективно существующий ;)
Смотрится красиво…
image
Чем сделали такую симпатичную пепяку? Инстаграм не предлагать. Или он?
Это инстакод. Картинка кликабельна ;)
Вау! Спасибо, это очень круто
Да, весьма интересный сервис. Там топы красивые…
Ехал waste() через waste()…
waste(); waste(); waste(); waste(); waste(); waste(); waste(); waste(); waste(); waste(); waste(); waste();
ospace(); ospace();
waste(); waste(); waste(); waste(); waste(); waste(); waste(); waste(); waste(); waste(); waste(); waste();
ospace(); ospace();
waste(); waste(); waste(); waste(); waste(); waste(); waste(); waste(); waste(); waste(); waste(); waste();
ospace(); ospace();
waste(); waste(); waste(); waste(); waste(); waste(); waste(); waste(); waste(); waste(); waste(); waste();
Oh, it's a main()! main(), a main(), oh, it's a main()!
Поэзия блин.
#define waste() badger
#define ospace() mushroom
#define main() snake
А писал бы он на C++, мог бы написать что-то вроде
for (int i = 0; i < 100; ++i) { new waste; }
Так здесь сожрать место надо было во время компиляции, а не выполнения, для хранения глобальных переменных (код и данные хранились в одной памяти).
Представьте, что бы было со стеком, если бы этот waste запустили.
Пришлось бы аналогичный цикл на template meta programming инстанциировать)
Насколько всё-таки красива старая техника
Вы про технику (стиль) написания программ или компьютер DEC с картинки?
Про компьютер на картинке
>> ранние версии самого первого компилятора С в истории.
Какое-то масло масленное (в истории — лишнее).

Вы мне вот лучше что скажите: это ведь не самый первый вариант? А самый первый вариант был написан на B?
Это две из ранних версий первого компилятора, как я понимаю.
В логику работы вдаваться не было времени, но по крайней мере выглядит все очень целостно и аккуратно, а ведь многие моменты в 72 году не были настолько очевидными, насколько они очевидны сейчас. И отформатировано отлично. В общем снимаю шляпу.
Никто кстати не знает, стиль K&R регламентирует каким либо образом использование пробелов/табуляций (я понимаю что K&R это стиль расстановки скобок, но вопрос думаю должен быть понятен)
Как раз тогда auto обозначало, что переменная автоматическая (а раз тип не указан, то используется тип int), потом оно в этом значении перекочевало в C++, а уже потом в C++11 решили его использовать для других целей. Так что это просто совпадение.
В Би, кстати, типов не было, поэтому локальный int задавали через auto.
Вообще, какой же похожий старый Си на Би…
Глобальные переменные без оператора присваивания, массивы без {}.
А на строке 429 отряд полиции особого назначения охраняет Путина!
Судя по всему иначе выглядело составное присваивание:
i =% hshsiz;
i =* pssiz;

(c00.c)

Порядок поменяли из-за конфликта в грамматике: выражение n=-1 парсилось и как


n = -1,

и как


n = n - 1

(пробелы в те далёкие времена не очень жаловали).

Этот паренек Ритчи вряд ли бы прошел peer code review в нашем проекте
Возможно, без этого паренька вы бы не проверяли бы никого на peer code review :)
Если бы не он, то кто-то другой, история требовала языка высокого уровня и многозадачной переносимой операционной системы.
Я согласен с Вашей мыслью, поэтому выделил что могла быть такая вероятность. На сколько она большая, это уже другой вопрос
А ваша Peer review платформа влезет в 256k памяти?
А еще это один из создателей Unix. Не знаю, что Вы там пишете, но у этого паренька система успешно проходит code review уже 40 с лишним лет.
Ok, ok, я уже понял что у посетителей хабра нет чувства юмора. В следующий раз буду подобное выделять красненьким.
Может дело в юморе?
Подождите, минимальный код, который позволял работать с С — ассемблер в файлах *.s, так?
Наличие Путина в исходниках вызывает expression overflow, что не ясно?
Археопрограммирование набирает обороты. Что-то будет через 20 лет…
Это первый компилятор C и он написан на C. Если он первый, то есть, никакого другого не было, то чем его скомпилировали?
Самая первая, нулевая версия пишется на другом языке — К примеру на бэйсике, или на ASM. И после того как готов первый мало мальский рабочий вариант компилятора, его можно компилировать самого на себе.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории