Открыт доступ (https://github.com/mortdeus/legacy-cc) к исходным текстам первого компилятора для языка Си, написанного Дэнисом Ритчи в 1972 году для платформы PDP-11. Код был обнаружен (http://cm.bell-labs.com/cm/cs/who/dmr/primevalC.html) при разборе архивных магнитных лент в рамках инициированной задолго до смерти Дэниса Ритчи инициативы по поиску и восстановлению первых наработок, связанных с языком Си. Код компилятора написан на первом диалекте языка Си, который сильно отличается от современного Си и уже не поддерживается ни одним из компиляторов.
Работа по выявлению архивного кода проведена энтузиастами нового направления истории - индустриальной палеонтологии, в рамках которого осуществляется анализ истоков развития тех или иных технологий. Первым успехом нового направления было восстановление (http://epublications.bond.edu.au/cgi/viewcontent.cgi?article...) в 2010 году кода первой редакции Unix.
URL: http://www.theregister.co.uk/2013/03/06/github_ancient_c_rep.../
Новость: http://www.opennet.me/opennews/art.shtml?num=36312
Ждем исходников первой виндуз!
reactos не?
Reactos — клон NT, о невежественный. Windows 1.0 же — досовское приложение.
какая разница??? что одно, что другое уже НЕ нужно.
Не уверен не подрезай, т.е. не говори. Первая винда вынырнула в октябре(или ноябре не помню точно) 1985 года, хотя по планам должна была выйти еще летом того же года. До реактОС оставалось еще дофига времени.
И к чему это сказано?
Это вы о чем?
Ради смеха что ли?
Наоборот, люди хотят ужастиков.
Это DOS Shell что ли? Так он валяется где-то на торрентах вместе с исходниками MS-DOS.
В том-то и дело, что на торрентах.
Да они только "на посмотреть", больше ни для чего и не нужны.
В том-то и дело, что официально смотреть-то нельзя (уж простите за тавтологию).
Just for fun можно попробовать даже скомпилировать его в Unix v7 через SIMH. Это, пожалуй, будет покруче "пропатчить KDE2 на FreeBSD". :)
мне чтото эта строчка мозг взорвала:
i = namsiz;
sp = symbuf;
while(i--)
if ((*sp++ = *s++)=='\0') --s;я так понимаю что тут копируется строка а остальные байты забиваются нулями?
просто копируется до 0
Скопировать namsiz элементов symbuf в s, пропуская нуль-символы.
> Скопировать namsiz элементов symbuf в s, пропуская нуль-символы.Хотя, нет, я ошибся. Ваше предположение верно.
вы почитайте K&R, там подобного добра навалом
Самая стандартнейшая из Сишных идиом жеп
> Самая стандартнейшая из Сишных идиом жеТак :/ "стандартнее":
while(i--)if(*sp++ = *s)s++;
Имхо нет.
1) 0 и '\0', строго говоря, это не одно и то же;
2) Зачем вы делаете s++, уж тогда лучше ++s;
3) Имо, оригинальный пример проще читался, так как сдвиг указателей происходил в обеих строках одновременно и _после_ операции сравнения.
1. с чего это не одно и тоже?
2. чем лучше? значение инкремента прям тут же не используется.
> 1. с чего это не одно и тоже?В отсутствие знакового расширения [в рассматриваемом случае программ-археологии] в старшем (?)байте может оказаться [ненулевой] мусор.
> 2. чем лучше? значение инкремента прям тут же не используется.
Предпочтение же, чего не понятно, утёнок и проч.
убивать их за такое - ничерта не понятно и неоптимальноsize = nameSize;
outStr = symbolBuffer;
while(size-- && *inStr++ != '\0')
*outStr++ = *inStr++;
while(size--)
*outStr++ = '\0';
вот уж точно неоптимально
новое поколение знает как программировать лучше создателей языка. Как известный факт: на конкурсе походок а-ля Чарли Чаплин выйграл не Чаплин, а кто-то другой..
> новое поколение знает как программировать лучше создателей языка.Нет-нет, послушайте! Человек же в курсе самых трендОвых оптимизаций для PDP-11.</:>
У меня подозрение, что второй цикл будет бесконечным.
> У меня подозрение, что второй цикл будет бесконечным.s/будет/может быть/
Глазастый, молодец! А не "не оптимальненько".
> У меня подозрение, что второй цикл будет бесконечным.Проверь, или подумай об исключениях(если таковые тогда были). И никто не дает гарантии что именно этот код компилировали и использовали.
Но после просмотра кода стало понятно - куда тянется мастерство крутых програмеров, сделать код запутанным, даже запутанней чем создатели Си.
> мне чтото эта строчка мозг взорвала:
> i = namsiz;
> sp = symbuf;
> while(i--)
> if ((*sp++ = *s++)=='\0') --s;
> я так понимаю что тут копируется строка а остальные байты забиваются нулями?Правильно понимаешь, только "нулями" - это не совсем точно. А вот коментарии "просто копирует" неправильные.
Цикл while выполняется namesiz раз (скорее всего namsiz это размер области на которую указывает symbuf).
sp принимает значения от symbuf до symbuf + namesiz * (размер *sp)
s принимает значения от своего начального до адреса первого '\0',
а потом каждый раз увеличивается на размер *s и тут же уменьшается,
потому как условие в if выполняется.Ну, и чтоб не быть голословным:
#include <stdio.h>
void
print_array(unsigned int n, char *a)
{
unsigned int i = 0;printf("%p:", a);
while(i < n) printf(" 0x%X", a[i++]);
printf("\n");
}int
main()
{
int namsiz,
i;char dst[] = {'A', 'A', 'A', 'A', 'A', 'A', '\0'},
src[] = {'B', 'B', 'B', '\0', 'B', 'B', 'B'};char *symbuf = dst,
*sp,
*s = src;namsiz = sizeof(dst);
i = namsiz;
sp = symbuf;
printf("dst: ");
print_array(namsiz, dst);
printf("src: ");
print_array(namsiz, src);while(i--)
if ((*sp++ = *s++)=='\0') --s;printf("dst: ");
print_array(namsiz, dst);
printf("src: ");
print_array(namsiz, src);return 0;
}P.S. Не нашел как форматировать код
И копирует _из_ s _в_ symbuf (s - источник, symbuf - приемник)
> P.S. Не нашел как форматировать код[code]...[/code]
main(argc, argv)
int argv[];Объясните дебилу, пожалуйста, как argv может быть int?
Указатель это число, ага
> Указатель это число, агаhttp://rewalls.com/pic/201111/1920x1080/reWalls.com-54928.jpg
что не так?
>что не так?Да не обращай внимания. Ну не понимает человек что такое массив в Си. Либо троллит.
>>что не так?
> Да не обращай внимания. Ну не понимает человек что такое массив в
> Си. Либо троллит.Ну-кась, расскажи-ка, как argv[] могет быть целым?
>>>что не так?
>> Да не обращай внимания. Ну не понимает человек что такое массив в
>> Си. Либо троллит.
> Ну-кась, расскажи-ка, как argv[] могет быть целым?int того же размера, что и char *. И отсутствие целых _других размеров_. Может, и unsigned int _тоже не было. Иди даже _полное отсутствие 'char *', а то и самоё char.
printf("avgv0=%s\n",argv[0]);
+++Впрочем, printf и '\n' тоже не.
>>>>что не так?
>>> Да не обращай внимания. Ну не понимает человек что такое массив в
>>> Си. Либо троллит.
>> Ну-кась, расскажи-ка, как argv[] могет быть целым?
> int того же размера, что и char *. И отсутствие целых _других размеров_.
> Может, и unsigned int _тоже не было. Иди даже _полное отсутствие 'char *',
> а то и самоё char. printf("avgv0=%s\n",argv[0]); +++Впрочем, printf и '\n' тоже не.1. char и int - одна х..я. Поэтому пофигу, что int array[], что char array[];
2. sizeof(char *) != sizeof(int)Ессесенно, программер будет ССЗБ, если всунет в массив целых, число 123456789 и
будет юзать его как char;
>1. char и int - одна х..я.я понял, что ты хотел написать, но те, кто совсем не в курсе - совсем уж не поймут ;) если попытаемся записать на место char данные int получаем переполнение - нечаянно переписываем рядом стоящие переменные в памяти. ясно что манипулировать областями данных можно до посинения
>>>>>что не так?
>>>> Да не обращай внимания. Ну не понимает человек что такое массив в
>>>> Си. Либо троллит.
>>> Ну-кась, расскажи-ка, как argv[] могет быть целым?
>> int того же размера, что и char *. И отсутствие целых _других размеров_.
>> Может, и unsigned int _тоже не было. Иди даже _полное отсутствие 'char *',
>> а то и самоё char. printf("avgv0=%s\n",argv[0]); +++Впрочем, printf и '\n' тоже не.
> 1. char и int - одна х..я. Поэтому пофигу, что int array[],
> что char array[];
> 2. sizeof(char *) != sizeof(int)Ну точно как в бейсике — смешение типов данных. Если нет разницы в размерах, то считаем всё одним невнятным типом, такие данные можно присваивать друг другу, не опасаясь ругани компилятора. Можно байт читать как число, а можно как ASCII-символ. :))
>пофигу, что int array[], что char array[];Началось-то с 'int' против [модернового] 'char *'.
int main(int argc, char *argv[])> 2. sizeof(char *) != sizeof(int)
На PDP-11 -- иначе.
>>>что не так?
>> Да не обращай внимания. Ну не понимает человек что такое массив в
>> Си. Либо троллит.
> Ну-кась, расскажи-ка, как argv[] могет быть целым?Цит. "argv is a pointer to an array of pointers".
>>>>что не так?
>>> Да не обращай внимания. Ну не понимает человек что такое массив в
>>> Си. Либо троллит.
>> Ну-кась, расскажи-ка, как argv[] могет быть целым?
> Цит. "argv is a pointer to an array of pointers".Ага, щаз...
ISO/IEC 9899:201x5.1.2.2.1 Program startup
1 The function called at program startup is named main. The implementation declares no
prototype for this function. It shall be defined with a return type of int and with no
parameters:
int main(void) { /* ... */ }
or with two parameters (referred to here as argc and argv, though any names may be
used, as they are local to the function in which they are declared):
int main(int argc, char *argv[]) { /* ... */ }
or equivalent [*10] or in some other implementation-defined manner.2 If they are declared, the parameters to the main function shall obey the following
constraints:
— The value of argc shall be nonnegative.
— argv[argc] shall be a null pointer.
— If the value of argc is greater than zero, the array members argv[0] through
argv[argc-1] inclusive shall contain pointers to strings, which are given
implementation-defined values by the host environment prior to program startup. The
intent is to supply to the program information determined prior to program startup
from elsewhere in the hosted environment. If the host environment is not capable of
supplying strings with letters in both uppercase and lowercase, the implementation
shall ensure that the strings are received in lowercase.
— If the value of argc is greater than zero, the string pointed to by argv[0]
represents the program name; argv[0][0] shall be the null character if the
program name is not available from the host environment. If the value of argc is
greater than one, the strings pointed to by argv[1] through argv[argc-1]
represent the program parameters.
— The parameters argc and argv and the strings pointed to by the argv array shall
be modifiable by the program, and retain their last-stored values between program
startup and program termination.* [10] Thus, int can be replaced by a typedef name defined as int, or the type of argv
can be written as char ** argv, and so on.
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
>>>>>что не так?
>>>> Да не обращай внимания. Ну не понимает человек что такое массив в
>>>> Си. Либо троллит.
>>> Ну-кась, расскажи-ка, как argv[] могет быть целым?
>> Цит. "argv is a pointer to an array of pointers".
> — argv[argc] shall be a null pointer.
> — The parameters argc and argv and the strings pointed to by
> the argv array shallПаша, читай вниметельней. argv, argv[argc] - указатели (pointer). Конструкт типа char * - _указатель_ на ячейку памяти, содержащую данные типа "char" (а в данном случае, так вообще - указатель на цепочку, точнее, первый элемент, указателей на ячейки, содержащие char). Сам по себе argv (как и любой указатель) - не менее чем int.
НЕ путай указатель и ячейку памяти, на которую он указывает.
> Паша, читай вниметельней. argv, argv[argc] - указатели (pointer).Пля, мой косяк,... Я почему-то прочитал как "argv is a pointer to pointer". :-/
> НЕ путай указатель и ячейку памяти, на которую он указывает.
Я про ремарку *[10]
А честно говоря, присутствие в стандарте выражений типа "...and so on",
"...or in some other implementation-defined manner" и порождают подобные темы :)
>> Паша, читай вниметельней. argv, argv[argc] - указатели (pointer).
> Я про ремарку *[10]
> А честно говоря, присутствие в стандарте выражений типа "...and so on",
> "...or in some other implementation-defined manner" и порождают подобные темы :)А что про ремарку? То что там написано, что "int argc" может быть написано как "sometype counter", при этом sometype должен соответствовать int'у - так ведь правду пишут: хрен его знает, как в какой реализации типы обзовут.
UPD: Ну или, на крайний случай, как программизд развлекаться будет.
> Указатель это число, агаБолее того, это просто адрес в памяти.
На каком языке написан первый компилятор Си? Стопудово не на Си.
изначально видимо на B как и unix, а потом может переписан на C
Вас удивляет, что самый первый компилятор какого-то языка написан не на том языке? :)
"Код компилятора написан на первом диалекте языка Си, который сильно отличается от современного Си и уже не поддерживается ни одним из компиляторов"новость не читай@херню пиши
Вопрос не читай@сразу отвечай. Человек спросил про самый первый компилятор, а не первый компилятор, написанный на Си.
Первый компилятор C был написан на языке Ассемблера для PDP-11 -- B на этой платформе не было, его не стали тянуть с PDP-7.
"... Первый компилятор С для платформы PDP-11 ..."
// Obvious fix
> Стопудово не на Си.Не, ты явно не в курсе того что программеры любят задачу про Мюнхаузена и подъем самого себя за свои же шнурки из болота ("bootstrap", в память о Мюнхаузене и его ботинках).
Это называется "слышал звон, но не знает где он". При bootstrap компилятор ЯП может собрать сам себя, или свою новую версию, или первую версию себя для другой архитектуры. Однако это не отменяет необходимость в наличии самой первой версии компилятора, написанной на другом ЯП, ну или в клиническом случае вручную переведенной в машинный код.
> наличии самой первой версии компилятора, написанной на другом ЯП, ну или
> в клиническом случае вручную переведенной в машинный код.Капитан, спасибо вам :). Но в результате все-таки получается что первая версия компилятора которая именно им и считается - таки собрана сама собой. А чем там собран бутстраппер - второй вопрос. Бутстрап окружение врядли тянет на "первый компилятор". Особенно если программу вручную перевели в машинный код.
> Но в результате все-таки получается что первая версия компилятора которая именно им и считается - таки собрана сама собой.Нет. Компилятор вовсе не обязан быть написанным на том же языке, который компилирует.
>Опубликован код первого компилятора для языка Си
>Код компилятора написан на первом диалекте языка СиНо ведь наверное он всё-таки не первый, его ведь чем-то компилили?
Почитай о раскрутке компилятора
Почитал. Раскрутка всё равно предполагает, что сначала должен был использоваться компилятор, написанный на чём-то другом.
> Почитал. Раскрутка всё равно предполагает, что сначала должен был использоваться компилятор,
> написанный на чём-то другом.Не подразумевает. Например первую версия компилятора подмножества Паскаля после неудавшейся попытки написать ее на Фортране написали на самом подмножестве. Затем один из разработчиков уединился на пару недель для перевода текста компилятора в машинные коды вручную.
>Затем один из разработчиков уединился на пару недель для перевода текста компилятора в машинные коды вручную.Один из разработчиков в качестве первого %) компилятора это готичненько.
http://homepage.ntlworld.com/edmund.grimley-evans/bcompiler....
Кстати. Вот ведь магнитная лента -- мега-носитель! 40 лет прошло -- а хоть бы фиг, читаются!
не чета современным носителям
Магнитная лента же вполне современный носитель, используется для бэкапов. Зато она не обеспечивает произвольный доступ.
Извините, Капитан, не узнал Вас в гриме...
> Кстати. Вот ведь магнитная лента -- мега-носитель! 40 лет прошло -- а
> хоть бы фиг, читаются!Да и флоппики через 40 лет читаться будут, вероятно. Если вы, конечно, сможете найти для них привод и куда его такой хороший подключать.
Магнитные диски в принципе тоже будут читаться. Ну, если флеш-память с микропрограммой не слетит. Сама по себе магнитная запись - условно-вечная, в том плане что у нее нет поводов исчезать куда-то "просто так".
Такую вещь как "закон возрастания энтропии" в школе Вы успешно проходили?
> Такую вещь как "закон возрастания энтропии" в школе Вы успешно проходили?Флоппик есть адиабатический термопроцесс? :) Бамбук, ты чё, себя курил!?
> Сама по себе магнитная запись - условно-вечная, в том
> плане что у нее нет поводов исчезать куда-то "просто так".Н-да, то есть про саморазмагничивание, естественное магнитное поле Земли и потоки элементарных частиц мы не подозреваем...
Да уж, на структурное программирование они клали с прибором.
а Попов лоханулся что в своё радио не впаял fm-декодер
Паскаль, вышедший незадолго до Си, создавался в том числе для структурного программирования. Си тоже содержит в себе все необходимое для этого.
Исходники Windows 1.0 хочется глянуть только из спортивного интереса. Как в том анекдоте - "... только Гейтс может что-то жопой написать..."