Comments 72
Почему опечатался? «case 23» — конструкция из switch. «case23» — метка на которую прыгает goto (CTRL+F + «case23»). Никакой опечатки нет, просто такая логика.
Это не опечатка. Там выше по коду есть
goto case23;
goto case23;
Да действительно. Теперь в религиозных спорах о goto и линейности кода можно будет ссылаться на Ритчи :-)
Умным решением было бы не участвовать в религиозных спорах, на самом деле.
Большинство же спорит ради удовольствия, а не чтобы найти правду.
Нет. Спор иногда позволяет понять лучше свою точку зрения, чтобы принять более правильно решение. С одним человеком у вас разногласия и у каждого из Вас разные точки зрения, у вас это точка-зрения-1, у него точка-зрения-2. Вы можете начать дискуссию и всячески доказывать правоту точки-зрения-2, а не своей точки-зрения-1. Дело в том, что пока Вы будете доказывать точку-зрения-2 Вы найдете еще много аргументов чтобы ей следовать и следовательно после нового спора у Вас появится больше сведений и знаний для анализа. Я не знаю как этот момент в психологами называется, но он отталкивает от того что человек будет любую точку зрения защищать если она прямо сейчас высказывается им самим
То есть когда нужно принять очень серьезное решение по очень важному вопросу, то нужно как можно больше сведений для анализа, чтобы избежать факапа
То есть когда нужно принять очень серьезное решение по очень важному вопросу, то нужно как можно больше сведений для анализа, чтобы избежать факапа
Я думаю в 72ом году, Ритчи меньше всего волновал goto в языке. Наоборот, он казался естественным и понятным для любого ассебмлер программиста, коими почти все тогда и являлись.
Деннис Ритчи был физиком и прикладным математиком, поэтому я думаю, что он скорее фортран и алгол знал, чем ассемблер. А фортран тех времён чуть ли не наполовину состоял из разнообразных GOTO. Практически все конструкции, циклы, условные переходы, работали с метками.
Ну методология структурного программирования вместе с теоремой Бома-Якопини как раз только развивались в те годы параллельно.
Мило смотрятся эти "%o" — на PDP-11 восьмеричное представление чисел было наиболее удобным и привычным.
Ещё не совсем понял как тут работает printf("%o;%o\n", sf); — %-параметра тут два, а представлен один.
Ещё не совсем понял как тут работает printf("%o;%o\n", sf); — %-параметра тут два, а представлен один.
Подозреваю, что это тест на ошибки с varargs или даже на float, в смысле вывод флоата в восьмеричном виде
Мне думается, что здесь параметры для printf сгружаются в стек, поэтому первым печатается sf, второго параметра нет, поэтому берётся то что дальше по стеку, т.е. адрес возврата — получаем в выдаче параметр плюс адрес места где он получен.
Либо же это просто вывод float в виде двух word.
Либо же это просто вывод float в виде двух word.
Видимо потому что sizeof(float) == 2*sizeof(int), поэтому один float в стэке равен двум int'ам.
Не знал, что так можно:
main(argc, argv)
int argv[]; {
//...
//...
}
А я думал, что первый компилятор выглядел как-то так:

Ну и «скомпилируйте» на нем, скажем, «Hello, World!». Жду недождусь результата.
www.linux.org.ru/forum/talks/1693529?cid=1694007 имел в виду это
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));
}
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». Если коротко — это способ переместить начало программы подальше от нулевого адреса. На древних машинах переменные хранились начиная с нуля.
Можно почитать со слов: «space allocation». Если коротко — это способ переместить начало программы подальше от нулевого адреса. На древних машинах переменные хранились начиная с нуля.
Насколько я понял из объяснения — там просто затирается кусок памяти, где расположено начало программы, для того чтобы освободить память для дальнейшей работы:
Или я не прав? Довольно интересный способ освободить память =)
temporary storage is allocated that deliberately overwrites the beginning of the program, smashing its initialization code to save space
Или я не прав? Довольно интересный способ освободить память =)
На говнокод намекаете? ))
Оно так выделяло память, похоже.
UPD: выше точно ответили
Оно так выделяло память, похоже.
UPD: выше точно ответили
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()!
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()!
А писал бы он на C++, мог бы написать что-то вроде
for (int i = 0; i < 100; ++i)
{
new waste;
}
Насколько всё-таки красива старая техника
>> ранние версии самого первого компилятора С в истории.
Какое-то масло масленное (в истории — лишнее).
Вы мне вот лучше что скажите: это ведь не самый первый вариант? А самый первый вариант был написан на B?
Какое-то масло масленное (в истории — лишнее).
Вы мне вот лучше что скажите: это ведь не самый первый вариант? А самый первый вариант был написан на B?
В логику работы вдаваться не было времени, но по крайней мере выглядит все очень целостно и аккуратно, а ведь многие моменты в 72 году не были настолько очевидными, насколько они очевидны сейчас. И отформатировано отлично. В общем снимаю шляпу.
Никто кстати не знает, стиль K&R регламентирует каким либо образом использование пробелов/табуляций (я понимаю что K&R это стиль расстановки скобок, но вопрос думаю должен быть понятен)
Забавно встретить
auto
в столь раннем языке (например, здесь github.com/mortdeus/legacy-cc/blob/master/last1120c/c00.c)Как раз тогда auto обозначало, что переменная автоматическая (а раз тип не указан, то используется тип int), потом оно в этом значении перекочевало в C++, а уже потом в C++11 решили его использовать для других целей. Так что это просто совпадение.
А на строке 429 отряд полиции особого назначения охраняет Путина!
Этот паренек Ритчи вряд ли бы прошел peer code review в нашем проекте
Подождите, минимальный код, который позволял работать с С — ассемблер в файлах *.s, так?
github.com/mortdeus/legacy-cc/blob/master/last1120c/c00.c#L434 — вот именно с этого момента исходники перестали быть понятны совсем
Археопрограммирование набирает обороты. Что-то будет через 20 лет…
Это первый компилятор C и он написан на C. Если он первый, то есть, никакого другого не было, то чем его скомпилировали?
Непроизвольно вздрогнул
github.com/mortdeus/legacy-cc/blob/master/prestruct/c00.c#L472
putin:
switch (o) {
...
github.com/mortdeus/legacy-cc/blob/master/prestruct/c00.c#L472
Sign up to leave a comment.
Первый компилятор C от Денниса Ритчи — на Github