Page 177

c utilità anch'essi interamente scrittI In C. La migrazione dall'ambiente a sedici bit del PDP-II a quello a trentadue bit dell'Interdata 8/32 usato come cavia (per la sua architettura assai vicina a quella dell'IBM 370) avvenne tutto sommato senza troppe difficoltà, evidenziando senza più alcun dubbio gli enormi vantaggi di avere tutto il sistema scritto in un linguaggio ad alto livello. (A titolo di cronaca, solo 800 linee in tutto Uni x Settima Edizione erano scritte in Assembler). Unix e C sui micro Il successo di Unix da allora non è più diminuito. Anche se oramai lo si potrebbe definire «vecchio» (ed alcune sue parti sono in effetti obsolete, valga per tutte la gestione delle periferiche come TTY), anche se la sua «scorbuticità» è oramai proverbiale, Unix si mantiene più vivo e vitale che mai. Implementato oramai su tutti i principali mini e mainframe in versioni più o meno custom (dal PC/RT IBM al VAX), sta ora tentando l'assalto perfino al mondo dei micro con la versione reingegnerizzata da Microsoft denominata Xenix. Quest'ultima, già disponibile da qualche tempo per le macchine basate sul microprocessore Intel 80286, è stata da poco riscritta per il nuovo processo re a 32 bit Intel 80386 per sfruttarne al meglio le elevatissime potenzialità native di multitask e gestione della memoria virtuale. Parallelamente a questo dilagante successo di Uni x è accaduto che il C, da linguaggio di sistema che era, si sia sganciato ad un certo momento dal carrozzone Uni x riscuotendo l'interesse autonomo dei programmatori per le sue caratteristiche assai peculiari. Hanno così cominciato a comparire i primi compilatori C per ambienti nonUnix, dapprima timidamente ma ben presto in modo sempre più aggressivo. Il primo ambiente in cui si è pensato di portare il C è stato quello dei processori a sedici bit 8088/8086, e quindi quasi per forza sotto MSDOS. All'inizio si trattava magari di compilatori scritti da qualche ditta o software house per puro uso interno, ma ben presto sono nate versioni commerciali compiete e rispettabili. Una delle prime, ancora oggi valida, fu prodotta dalla Lattice ed in seguito acquistata dalla Microsoft. Neppure il mondo delle macchine ad otto bit è stato risparmiato: esistono attualmente compilatori C perfino MCmicrocomputer

n. 63 - maggio 1987

per il C64 e gli MSX (quest'ultimo fatto dalla Microsoft giapponese), con quali salti mortali e stiracchiamenti al linguaggio solo Dio lo sa! Il mercato poi, si sa, è un cane che si morde la coda: più un prodotto «tira» più viene spinto, e viceversa; e cosÌ è accaduto che il C sia assurto a livelli di notorietà che nessuno, solo pochi anni fa, avrebbe immaginato. La «corsa al C» come linguaggio alternativo è nata in America, ovviamente, ma sta verificandosi anche da noi (e questo è uno dei motivi per cui ho cominciato a scrivere questa serie). In effetti il C risulta attualmente essere il linguaggio maggiormente usato dalle software house per lo sviluppo di applicazioni serie di personal computing. Basta citare il caso dell' AshtonTate (dBase III e Framework), della MicroPro (Word Star 2000) e della stessa Microsoft (parte dell'MSDOS è scritta in C, così come i nuovi compilatori C, Fortran e Pascal, il Macro Assembler 4.0 ed il debbuger simbolico CodeView). Riflessioni sulle caratteristiche

del C

Il C, dunque, è nato come linguaggio di livello intermedio: più di un Assembler ma meno di un Algoi o di un PL/I. Il perché ora ci appare chiaro: le limitazioni dell'ambiente di sviluppo originale non lasciavano ai suoi creatori molte libertà di azione. Non sarebbe stato possibile per loro realizzare un grosso compilatore per un linguaggio di alto livello; d'altronde quello di cui avevano bisogno non era un linguaggio particolarmente elevato quanto uno strumento semplice e abbastanza vicino alla macchina, adatto per fare programmazione di sistema in sostituzione dell' Assembler. Queste limitazioni sono quelle che hanno fatto sì che il C fosse ciò che è. Come abbiamo visto brevemente la volta scorsa, il C manca ad esempio di alcuni tipi di dati presenti in altri linguaggi. Tanto per dirne una le stringhe, presenti perfino in Basic, o i set tipici del Pascal; per non parlare dei tipi ancora più eterogenei quali i numeri complessi del Fortran o i «tipi definiti dall'utente» sempre del Pasca!. A questa apparente mancanza di dati «ad alto livello», tuttavia, il C sopperisce con la possibilità di lavorare con dati «a basso livello» quali le word, i byte e perfino i singoli bit, in

un modo che pochi fra i linguaggi evoluti consentono (Assembler a parte). Questo è in parte retaggio del BCPL, che come dicevo prima contemplava solo la parola di memoria come dato, ed in parte risultato della necessità di semplificare il più possibile il linguaggio eliminando tutto il non strettamente necessario. D'altronde per scrivere un sistema operativo occorre lavorare con i bit e i byte reali, non con tipi di dati fantasiosi e astratti. Un'altra fra le peculiarità del C, la presenza degli strani operatori di autoincremento e autodecremento, trova la sua giustificazione nella struttura del linguaggio macchina del PDP-Il. Come vedremo meglio in futuro, gli autoincrementi (e autodecrementi) sono operatori unari che si scrivono «+ +» e «- -» ed hanno la funzione di incrementare o decrementare di una unità il valore della variabile (intera) a cui vengono applicati. Ad esempio l'espressione «pippo + +» in C equivale al costrutto «pippo = pippo + l» di uso comune in qualunque altro linguaggio. Attualmente questi operatori hanno la sola utilità di aumentare la chiarezza e la sintesi dell'espressione; in origine, tuttavia, il loro scopo era più ampio e più importante: semplificare un po' la vita al compilatore generando un codice più efficiente. Infatti il linguaggio macchina del PDPII comprendeva un'istruzione di incremento o decremento unitario del contenuto di una cella di memoria, e quindi gli operatori «+ +» e «- - » potevano essere direttamente ed efficientemente tradotti in una singola istruzione macchina. Conclusioni Pur non avendo affrontato ancora il linguaggio vero e proprio, questo mese credo che abbiamo fatto la conoscenza con diverse cose interessanti. Quanto meno abbiamo gettato un po' di luce sulle origini del C, e questo ci servirà per darci una giustificazione di alcune cose che vedremo in futuro. Ho appena accennato ai tipi di dati ammessi dal C; non sono entrato in argomento in quanto il discorso si sarebbe esteso ben oltre lo spazio rimasto in questa puntata. Per cui lo rimando alla prossima, nella quale vedremo in dettaglio non solo questo aspetto ma anche quello degli operatori e della struttura di un programma. Appuntamento quindi fra trenta giorni. Me 177

063 MCmicrocomputer  

Maggio 1987

063 MCmicrocomputer  

Maggio 1987

Advertisement