Kare parantezlerin yazılması []
daha kolaydır, çünkü “Multics'te yaygın olarak kullanılan” IBM 2741 terminalinden beri , sırayla ekip üyesi olarak C dilini oluşturanlardan Dennis Ritchie vardı .
Not yokluğunu IBM 2741 düzenini küme parantezleri!
C'de, köşeli parantezler diziler ve işaretçiler için kullanıldığından "alınır" . Dil tasarımcıları, dizilerin ve işaretçilerin kod bloklarından daha önemli olmalarını / kullanılmalarını beklerse (bu , kendi tarafında makul bir varsayım gibi geliyor , aşağıdaki kodlama stilinin tarihi bağlamında daha fazla), bu, kaşlı ayraçların "daha az önemli olacağı" anlamına geliyor "sözdizimi"
Dizilerin önemi, Ritchie'nin C Dilinin Gelişimi makalesinde oldukça belirgindir . Hatta açıkça ifade edilen "C programlarında işaretçilerin yaygınlığı" varsayımı .
... yeni dil tutarlı ve uygulanabilir (sıradışıysa) dizilerin anlambilimsel açıklamalarını korudu ... İki fikir sınıfının dilleri arasında C'nin en karakteristik özelliği : diziler ve işaretçiler arasındaki ilişki ... C, dizilerin tedavisi ... gerçek erdemlere sahiptir . İşaretçilerle diziler arasındaki ilişki sıradışı olmasına rağmen, öğrenilebilir. Dahası, dil önemli kavramları açıklamada hatırı sayılır bir güç gösterir ; örneğin, çalışma zamanında uzunluğu değişen vektörler, sadece birkaç temel kural ve konvansiyonla ...
Tarihsel bağlamı ve C dilinin yaratıldığı zamanın kodlama stilini daha iyi anlamak için, "C'nin kökeninin Unix'in gelişimine yakından bağlı olduğu" ve özellikle işletim sisteminin bir PDP'ye aktarıldığı dikkate alınmalıdır. 11 "C'nin eski bir sürümünün geliştirilmesine öncülük etti" ( kaynak tırnak ). Wikipedia'ya göre , "1972'de Unix C programlama dilinde yeniden yazıldı" .
Unix'in çeşitli eski sürümlerinin kaynak kodu çevrimiçi olarak mevcuttur, örneğin Unix Ağacı sitesinde. Orada sunulan çeşitli sürümlerden en alakalıları 1972-06 tarihli İkinci Sürüm Unix gibi görünüyor :
Unix'in ikinci baskısı, Bell Thompson’daki PDP-11 için Ken Thompson, Dennis Ritchie ve diğerleri tarafından geliştirilmiştir. First Edition'ı daha fazla sistem çağrısı ve daha fazla komutla genişletti. Bu sürüm aynı zamanda bazı komutları yazmak için kullanılan C dilinin de başlangıcını gördü ...
Zamanın tipik kodlama stili hakkında bir fikir edinmek için Second Edition Unix (V2) sayfasından C kaynak kodunu tarayabilir ve inceleyebilirsiniz .
V2 / c / ncc.c kaynak kodunda , programcının kolaylıkla köşeli parantezler yazabilmesinin çok önemli olduğu fikrini destekleyen belirgin bir örnek bulunabilir :
/* 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;
Hedeflenen pratik uygulamalarda kullanımlarına dayanarak dil sözdizimi öğelerini ifade etmek için karakter toplama pragmatik motivasyonunun, bu müthiş cevabında açıklandığı gibi Zipf Yasası ile aynı olduğuna dikkat etmek ilginçtir ...
frekans ve uzunluk arasındaki gözlenen ilişkiye Zipf Yasası denir
... yukarıdaki açıklamadaki uzunluktaki tek farkla yazım hızı yerine / generalized kullanılır.