Квадратні дужки []
легше ввести, з тих пір як IBM 2741 терміналу , який був «широко використовується в Multics» OS, яка , в свою чергу , був Денніс Рітчі, один з творців мови C , як член команди розробників .
Зверніть увагу на відсутність фігурних брекетів у версії IBM 2741!
У C квадратні дужки "беруться", оскільки вони використовуються для масивів та покажчиків . Якщо дизайнери мови очікували, що масиви та покажчики будуть важливішими / використовуються частіше, ніж блоки коду (що звучить як обґрунтоване припущення на їх стороні, більше про історичний контекст стилю кодування нижче), це означатиме, що фігурні дужки перейдуть до "менш важливих" "синтаксис.
Важливість масивів досить очевидно в статті "Розвиток мови С " Річі. Існує навіть чітко висловлене припущення про "поширеність покажчиків у програмах на С" .
... нова мова зберегла цілісне і працездатне (якщо незвичне) пояснення семантики масивів ... Дві ідеї найбільш характерні для С серед мов свого класу: взаємозв'язок між масивами та покажчиками ... Інша характерна особливість C, його обробка масивів ... має справжні достоїнства . Хоча взаємозв'язок між вказівниками та масивами незвичний, його можна дізнатися. Більше того, мова демонструє значну силу для опису важливих понять, наприклад, векторів, довжина яких змінюється під час виконання, лише з кількома основними правилами та умовами ...
Для подальшого розуміння історичного контексту та стилю кодування того часу, коли створена мова C, потрібно враховувати, що "походження C тісно пов'язане з розвитком Unix", а саме, що перенесення ОС на PDP- 11 "призвело до розробки ранньої версії С" ( цитує джерело ). За даними Вікіпедії , "у 1972 році Unix був переписаний мовою програмування на С" .
Вихідний код різних старих версій Unix доступний в Інтернеті, наприклад, на сайті Unix Tree . З різних версій, представлених там, найбільш релевантним видається Unix другого видання 1972-06 рр .:
Друге видання Unix було розроблено для PDP-11 у Bell Labs Кеном Томпсоном, Деннісом Річі та іншими. Перше видання розширило ще більше системних викликів та більше команд. Це видання також побачило початок мови С, яка була використана для написання деяких команд ...
Ви можете переглянути та вивчити вихідний код C на сторінці другого видання Unix (V2), щоб отримати уявлення про типовий для того часу стиль кодування.
Видатний приклад, який підтримує думку про те, що тоді програмісту було досить важливо легко вводити квадратні дужки, можна знайти у вихідному коді V2 / c / ncc.c :
/* C command */
main(argc, argv)
char argv[][]; {
extern callsys, printf, unlink, link, nodup;
extern getsuf, setsuf, copy;
extern tsp;
extern tmp0, tmp1, tmp2, tmp3;
char tmp0[], tmp1[], tmp2[], tmp3[];
char glotch[100][], clist[50][], llist[50][], ts[500];
char tsp[], av[50][], t[];
auto nc, nl, cflag, i, j, c;
tmp0 = tmp1 = tmp2 = tmp3 = "//";
tsp = ts;
i = nc = nl = cflag = 0;
while(++i < argc) {
if(*argv[i] == '-' & argv[i][1]=='c')
cflag++;
else {
t = copy(argv[i]);
if((c=getsuf(t))=='c') {
clist[nc++] = t;
llist[nl++] = setsuf(copy(t));
} else {
if (nodup(llist, t))
llist[nl++] = t;
}
}
}
if(nc==0)
goto nocom;
tmp0 = copy("/tmp/ctm0a");
while((c=open(tmp0, 0))>=0) {
close(c);
tmp0[9]++;
}
while((creat(tmp0, 012))<0)
tmp0[9]++;
intr(delfil);
(tmp1 = copy(tmp0))[8] = '1';
(tmp2 = copy(tmp0))[8] = '2';
(tmp3 = copy(tmp0))[8] = '3';
i = 0;
while(i<nc) {
if (nc>1)
printf("%s:\n", clist[i]);
av[0] = "c0";
av[1] = clist[i];
av[2] = tmp1;
av[3] = tmp2;
av[4] = 0;
if (callsys("/usr/lib/c0", av)) {
cflag++;
goto loop;
}
av[0] = "c1";
av[1] = tmp1;
av[2] = tmp2;
av[3] = tmp3;
av[4] = 0;
if(callsys("/usr/lib/c1", av)) {
cflag++;
goto loop;
}
av[0] = "as";
av[1] = "-";
av[2] = tmp3;
av[3] = 0;
callsys("/bin/as", av);
t = setsuf(clist[i]);
unlink(t);
if(link("a.out", t) | unlink("a.out")) {
printf("move failed: %s\n", t);
cflag++;
}
loop:;
i++;
}
nocom:
if (cflag==0 & nl!=0) {
i = 0;
av[0] = "ld";
av[1] = "/usr/lib/crt0.o";
j = 2;
while(i<nl)
av[j++] = llist[i++];
av[j++] = "-lc";
av[j++] = "-l";
av[j++] = 0;
callsys("/bin/ld", av);
}
delfil:
dexit();
}
dexit()
{
extern tmp0, tmp1, tmp2, tmp3;
unlink(tmp1);
unlink(tmp2);
unlink(tmp3);
unlink(tmp0);
exit();
}
getsuf(s)
char s[];
{
extern exit, printf;
auto c;
char t, os[];
c = 0;
os = s;
while(t = *s++)
if (t=='/')
c = 0;
else
c++;
s =- 3;
if (c<=8 & c>2 & *s++=='.' & *s=='c')
return('c');
return(0);
}
setsuf(s)
char s[];
{
char os[];
os = s;
while(*s++);
s[-2] = 'o';
return(os);
}
callsys(f, v)
char f[], v[][]; {
extern fork, execv, wait, printf;
auto t, status;
if ((t=fork())==0) {
execv(f, v);
printf("Can't find %s\n", f);
exit(1);
} else
if (t == -1) {
printf("Try again\n");
return(1);
}
while(t!=wait(&status));
if ((t=(status&0377)) != 0) {
if (t!=9) /* interrupt */
printf("Fatal error in %s\n", f);
dexit();
}
return((status>>8) & 0377);
}
copy(s)
char s[]; {
extern tsp;
char tsp[], otsp[];
otsp = tsp;
while(*tsp++ = *s++);
return(otsp);
}
nodup(l, s)
char l[][], s[]; {
char t[], os[], c;
os = s;
while(t = *l++) {
s = os;
while(c = *s++)
if (c != *t++) goto ll;
if (*t++ == '\0') return (0);
ll:;
}
return(1);
}
tsp;
tmp0;
tmp1;
tmp2;
tmp3;
Цікаво відзначити, як прагматична мотивація вибору символів для позначення елементів синтаксису мови на основі їх використання в цільових практичних програмах нагадує Закон Зіпфа, як пояснено в цій приголомшливій відповіді ...
спостережуваний взаємозв'язок між частотою і довжиною називається законом Зіпфа
... з тією лише різницею, що довжина у наведеному викладі замінюється / узагальнюється як швидкість набору тексту.