Первый компилятор C от Денниса Ритчи — на Github


    Компьютер DEC с носителем DECtape

    На Github выложили last1120c и prestruct-c — ранние версии самого первого компилятора С в истории. Код написан самим Деннисом Ритчи в 1972-1973 гг.

    Компиляторы найдены несколько лет назад на старой магнитной ленте DECtape, вставленной в антикварный компьютер VAX производства компании DEC.

    Деннис Ритчи известен как создатель языка программирования C и ключевой разработчик операционной системы UNIX, чем внёс неоценимый вклад в развитие компьютерной науки и вычислительной техники. К сожалению, величие заслуг Ритчи перед человечеством большинство из нас осознало только после его смерти в 2011 году.

    Как написал сам автор в истории создания языка C, ключевыми стали 1972-1973 годы: именно тогда произошёл переход от бестипового языки B к слабо типизованному C, с переходной стадией NB. Ни один из предшествующих языков не сохранился до наших дней.

    Ранние версии первого компилятора C удалось с трудом скомпилировать в самого себя, используя ранние эмуляторы Unix для PDP-11. Тем не менее, сам компилятор сегодня совершенно непригоден к использованию, он представляет исключительно историческую ценность.

    Кроме катушки с кодом last1120c, найдена лента с кодом prestruct-c, это предварительная копия компилятора до внесения изменений в структуры. Ранний компилятор ничего не знает о структурах, строка struct нигде не появляется. В версии last1120c структуры появились, но синтаксис сильно отличается от современного C и даже от K&R I (ранняя версия C). В общем, это очень древний реликт.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 71
    • –7
      Взято отсюда
      case 23:
      case23:
      if (width==4) {
      sf = fcval;
      printf("%o;%o\n", sf);
      break;
      }

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

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

                    • 0
                      Не знал, что так можно:
                      main(argc, argv)
                      int argv[]; { 
                      //...
                      //...
                      }
                      
                      • +2
                        Для cpp-файлов компилятор может выдать ошибку, а для с-файлов не должен.
                        • +3
                          Этот стиль и в C считается устеревшим с 91го года. И для C++ не может выдать а должен выдать, ибо в стандарте на C++ подобные конструкции не фигурировали.
                        • +2
                          В K&R C только так и можно было:
                          http://www.iu.hio.no/~mark/CTutorial/CTutorial.html#Functions
                        • –33
                          А я думал, что первый компилятор выглядел как-то так:
                          image
                        • +8
                          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));
                          }
                          • 0
                            Кто-нибудь пояснит зачем это?
                            • +2
                              В файле README.md есть ссылка на описание: www.cs.bell-labs.com/who/dmr/primevalC.html

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

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

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

                                          Вы мне вот лучше что скажите: это ведь не самый первый вариант? А самый первый вариант был написан на B?
                                          • 0
                                            Это две из ранних версий первого компилятора, как я понимаю.
                                          • +2
                                            В логику работы вдаваться не было времени, но по крайней мере выглядит все очень целостно и аккуратно, а ведь многие моменты в 72 году не были настолько очевидными, насколько они очевидны сейчас. И отформатировано отлично. В общем снимаю шляпу.
                                            • 0
                                              Никто кстати не знает, стиль K&R регламентирует каким либо образом использование пробелов/табуляций (я понимаю что K&R это стиль расстановки скобок, но вопрос думаю должен быть понятен)
                                              • –4
                                                Забавно встретить auto в столь раннем языке (например, здесь github.com/mortdeus/legacy-cc/blob/master/last1120c/c00.c)
                                                • +8
                                                  Как раз тогда auto обозначало, что переменная автоматическая (а раз тип не указан, то используется тип int), потом оно в этом значении перекочевало в C++, а уже потом в C++11 решили его использовать для других целей. Так что это просто совпадение.
                                                  • 0
                                                    В Би, кстати, типов не было, поэтому локальный int задавали через auto.
                                                    Вообще, какой же похожий старый Си на Би…
                                                    Глобальные переменные без оператора присваивания, массивы без {}.
                                                  • +3
                                                    А на строке 429 отряд полиции особого назначения охраняет Путина!
                                                  • +4
                                                    Судя по всему иначе выглядело составное присваивание:
                                                    i =% hshsiz;
                                                    i =* pssiz;
                                                    

                                                    (c00.c)
                                                    • –1
                                                      Этот паренек Ритчи вряд ли бы прошел peer code review в нашем проекте
                                                      • +21
                                                        Возможно, без этого паренька вы бы не проверяли бы никого на peer code review :)
                                                        • +1
                                                          Если бы не он, то кто-то другой, история требовала языка высокого уровня и многозадачной переносимой операционной системы.
                                                          • +1
                                                            Я согласен с Вашей мыслью, поэтому выделил что могла быть такая вероятность. На сколько она большая, это уже другой вопрос
                                                        • +11
                                                          А ваша Peer review платформа влезет в 256k памяти?
                                                          • +2
                                                            А еще это один из создателей Unix. Не знаю, что Вы там пишете, но у этого паренька система успешно проходит code review уже 40 с лишним лет.
                                                            • 0
                                                              Ok, ok, я уже понял что у посетителей хабра нет чувства юмора. В следующий раз буду подобное выделять красненьким.
                                                        • 0
                                                          Подождите, минимальный код, который позволял работать с С — ассемблер в файлах *.s, так?
                                                          • +8
                                                            github.com/mortdeus/legacy-cc/blob/master/last1120c/c00.c#L434 — вот именно с этого момента исходники перестали быть понятны совсем
                                                            • 0
                                                              Наличие Путина в исходниках вызывает expression overflow, что не ясно?
                                                            • +1
                                                              Археопрограммирование набирает обороты. Что-то будет через 20 лет…
                                                              • 0
                                                                Это первый компилятор C и он написан на C. Если он первый, то есть, никакого другого не было, то чем его скомпилировали?
                                                                • +2
                                                                  Самая первая, нулевая версия пишется на другом языке — К примеру на бэйсике, или на ASM. И после того как готов первый мало мальский рабочий вариант компилятора, его можно компилировать самого на себе.
                                                                • +1
                                                                  Непроизвольно вздрогнул

                                                                  putin:
                                                                  		switch (o) {
                                                                  ...
                                                                  


                                                                  github.com/mortdeus/legacy-cc/blob/master/prestruct/c00.c#L472

                                                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.