2009-09-23 1 views
9

У вас есть вопросы, как C (K & R C)? Вопрос касается первых десяти или двадцати лет жизни C?Как C выглядел до того, как я родился?

Я знаю, Я слышал их от профессора в моем uni, что у C не было стандартных библиотек, которые мы получаем с ANSI C сегодня. Они использовали для записи процедур ввода-вывода в завернутой сборке! Во-вторых, книга K & R является одной из лучших книг для программиста, которую я читал. Это то, что мне рассказал мой профи:

Я хотел бы узнать больше о хорошем ольце. Например, какое главное различие вы знаете об этом по сравнению с ANSI C, или как C сменил программистов на программирование?


Просто для записи, я задаю этот вопрос после прочтения в основном эти два документа:

Они о C++, я знать! вот почему я хочу узнать больше о C, потому что эти две статьи о том, как родился C++ из C. Теперь я спрашиваю, как это выглядело до. Спасибо Lazarus за указание на 1-ом издание K & R, но я до сих пор стремлюсь узнать больше о C от SO гуру;)

+9

Запахи, как домашняя домашняя работа для подростков – Lazarus

+2

Может быть, несправедливо, почему бы не взглянуть на копию первого издания книги K & R. Это должно дать вам представление о том, как это было в старые добрые времена. – Lazarus

+0

Какова ваша дата рождения? – TigerTiger

ответ

2

Посмотрите на код для ядра Unix версии 6 - это было похоже на C!

См. Lion's Commentary on Unix 6th Edition (Amazon).

Кроме того, было бы проще, если бы вы сказали нам ваш возраст - ваш профиль говорит, что ты 22, так что вы спрашиваете о коде до 1987

Также рассмотрим: The Unix Programming Environment от 1984.

+0

Спасибо, кажется, большой ресурс, который следует за :) – AraK

3

Говоря из личного опыта, моя первая два C компиляторов/Dev среды была DESMET C (16 -битной командной строки MS-DOS) и Lattice C (также 16-разрядная командная строка MS-DOS). В DeSmet C появился собственный текстовый редактор (see.exe), а библиотеки - нестандартные функции, такие как scr_rowcol(), позиционировали курсор. Однако даже тогда были определенные функции, которые были стандартными, например printf(), fopen() fread(), fwrite() and fclose().

Одна из интересных особенностей того времени заключалась в том, что у вас был выбор между четырьмя основными моделями памяти - S, P, D и L. На протяжении многих лет приходили и шли другие варианты, но они были самыми значительными. S была «маленькой» моделью, 16-разрядной адресацией как для кода, так и для данных, ограничивая вас до 64K для каждого. L использовала 24-битную адресацию, которая была регистром 16-разрядного сегмента и 16-разрядным регистром смещения для вычисления адресов, ограничивая вас 1024 КБ адресного пространства. Конечно, в 16-битном мире DOS вы были ограничены физическим ограничением 640K. P и D были компромиссом между двумя режимами, где P разрешено для 24-битного (640K) кода и 64K данных, а D разрешено для кода 64K и адресации 640K.

+0

К счастью, Lattice решила сделать этот опыт как Unix-подобным, насколько это возможно, чему способствовал тот факт, что MS-DOS 2.0 сделал то же самое. И когда Microsoft лицензировала компилятор Lattice, они сделали то же самое. – kdgregory

+1

Обратите внимание, что модели памяти были изобретением Microsoft. У Unix C никогда не было таких чудовищ. – Jay

+2

На самом деле, они были изобретением Intel. Mainstream Unix имеет роскошь работы на архитектурах процессоров со смежными (и обычно большими) адресными пространствами: PDP-11, VAX, 68000, 80386 и т. Д. Если вы не собираетесь ограничивать себя сегментом данных 64 КБ, у вас должен быть какой-то механизм для решения остальной части 1M в 8086. Я не использовал ранний компилятор Intel C (который, как я полагаю, не был получен из Lattice или Microsoft), но подозревают, что у него есть какой-то явный контроль сегментации. – kdgregory

3

Википедия имеет some information по этой теме.

+0

Спасибо Натан. Страница Википедии действительно краткая, если я хочу больше узнать о предмете. – AraK

+0

Несомненно, я это заметил и сразу после того, как отправил. :( –

7

Взгляните на «home page» для книги K & R в Bell Labs, в частности заголовок «История языка прослеживается в« Разработка языка C »от HOPL II, 1993 "

12

Ну, для начала не было ничего из этого прототипа прототипа функции. main() был объявлен следующим образом:

/* int */ main(c,v) 
int c; 
char *v[]; 
{ 
    /* Do something here. */ 
} 

И не было ни одного из того, что фантазии комментариев двойного слэша либо. Также не перечислены. Реальные мужчины использовали #define.

Ааа, приносит слезы на моих глазах, вспоминая старые добрые времена :-)

+19

хорошие дни ole, где все было хуже и, следовательно, лучше. –

+6

На самом деле возвращаемые типы также были опущены. Раннее C всегда возвращало одно слово. И аргумент int был по умолчанию, поэтому простой «основной (c, v) char * v []; {/*...*/} "был типичным. –

+0

Я забыл этот бит, @Andy. – paxdiablo

3

Вот еще один пример кода, который изменил с ANSI C для лучшего:

double GetSomeInfo(x) 
int x; 
{ 
    return (double)x/2.0; 
} 

int PerformFabulousTrick(x, y, z) 
int x, int y; 
double z; 
{ 
    /* here we go */ 
    z = GetSomeInfo(x, y); /* argument matching? what's that? */ 
    return (int)z; 
} 
+0

Вы забыли парас вокруг возвращаемого аргумента. Некоторые компиляторы до ANSI действительно требовали их. ;) –

+0

Да, жизнь сосала именно так. Я никогда не попадал в привычку paren, так как компилятор C, который я использовал, был написан K & R (я работал в Bell Labs, когда узнал C). – plinth

+0

Мне особенно не нравились парнеры.Меня всегда беспокоило, как они выглядели приемлемым в то время, несмотря на то, что многие источники утверждали, что «избегайте ненужных парнеров». Некоторые компиляторы реализовали return() как вызов функции, который просто добавил к путанице. –

3

Я первый начал работать с C на VAX/VMS в 1986. Вот различия, которые я помню:

  • нет прототипов - определения функций и delcarations были написаны, как
 
    int main() /* no void to specify empty parameter list */ 
    { 
     void foo(); /* no parameter list in declaration */ 
     ... 
    } 
    ... 
    void foo(x,y) 
     int x; 
     double y; 
    { 
     ... 
    } 
  • Нет родовое (аннулируются) тип указателя; все функции *alloc() возвращены char * (что является частью того, почему некоторые люди все еще используют возвращаемое значение malloc(), с помощью компиляторов pre-ANSI у вас было);

  • Функции Variadic обрабатывались по-разному; не требовалось никаких фиксированных аргументов, а заголовочный файл был назван по-разному (varargs.h вместо stdarg.h);

  • А шт. Материал был добавлен в math.h на протяжении многих лет, особенно в стандарте C99; «80-е-старинный C не был самым большим инструментом для численной работы;

  • Библиотеки не стандартизированы; почти во всех реализациях была версия stdio, math, string, ctype и т. д., но содержимое не обязательно было одинаковым во всех реализациях.

+0

Я тоже был парнем VAX/VMS. В Unix- и PC-землях возврат 0 из main() означает, что все нормально. Но VMS интерпретировал возвращаемое значение как стандартный код ошибки, где нечетные значения были хорошими, а четные - плохими. Портированные программы неизменно выходят с сообщениями «Нарушение доступа», потому что это то, что 0 отображается в таблицах системных сообщений. Даже с ANSI вы не можете «вернуть EXIT_SUCCESS», вам нужно было использовать «exit (EXIT_SUCCESS);», а затем добавить комментарий '/ * NOTREACHED * /' для lint и, наконец, «return 0;», чтобы удовлетворить предупреждение компилятора , –

+0

была довольно поздней разработкой; перед этим существовало множество других гораздо более сомнительных методов. –

+0

выход (SS $ _SUCCESS); будет отлично работать на vms. – EvilTeach

0

Я начал использовать C в начале 1980-х годов. Ключевое различие, которое я видел между то и дело, заключалось в том, что у раннего C не было прототипов функций, как кто-то заметил. Самый ранний C, который я когда-либо использовал, имел почти такую ​​же стандартную библиотеку, как сегодня. Если бы у C не было printf или fwrite, это было до моего времени! Я изучил C из оригинальной книги K & R. Это действительно классика и доказательство того, что технически искушенные люди также могут быть отличными писателями. Я уверен, вы можете найти его на Amazon.

0

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

2

Хотя по понятным причинам основной язык появился перед библиотекой, если вы приобретете копию первого издания K & R, опубликованную в 1978 году, вы найдете очень знакомую библиотеку. Кроме того, C первоначально использовался для разработки Unix, а библиотека подключалась к службам ввода-вывода ОС. Поэтому я думаю, что утверждение вашего профессора, вероятно, апокрифично.

Наиболее очевидным отличием является способ были определены функции:

VOID* copy(dest, src, len) 
    VOID* dest ; 
    VOID* src ; 
    int len ; 
{ 
    ... 
} 

вместо:

void* copy(void* dest, void* src, int len) 
{ 
    ... 
} 

, например. Обратите внимание на использование VOID; K & R C не имеет типа void, и обычно VOID был макросом, определяемым как int *. Разумеется, чтобы позволить этому работать, проверка типов в ранних компиляторах была разрешительной. С практической точки зрения способность C проверять код была плохой (в основном из-за отсутствия прототипов функций и проверки слабого типа), и, следовательно, популярность таких инструментов, как линт.

В 1978 году определение языка было K & R book. В 1989 году он был стандартизован ANSI, а затем ISO, второе издание больше не рассматривается как определение языка и основано на ANSI C. Это все еще лучшая книга о C IMO и хорошая книга программирования в целом.

Краткое описание Wikipedia, которое может помочь. Лучше всего получить копию первого экземпляра K & R, однако я бы не использовал его, чтобы узнать C, получить второе издание. для этого.

0

16-битные целые числа были довольно распространены в дни ol.