9
votes

Comment a-t-il ressemblé à celles-ci?

Voici la question, comment a-t-on l'air C (K & R C)? La question concerne les dix ou vingt vingt ans de la vie de C?

Je sais, Eh bien, je les ai entendus d'un professeur dans mon Uni , que c n'a pas eu les bibliothèques standard que nous obtenons avec ANSI C aujourd'hui. Ils avaient l'habitude d'écrire des routines IO dans l'assemblage enveloppé! La deuxième chose est que K & R Book, est l'un des meilleurs livres pour un programmeur à lire, c'est ce que mon professeur nous a dit :)

J'aimerais en savoir plus sur Good OL 'C. Par exemple, quelle différence majeure que vous connaissez à ce sujet par rapport à ANSI C, ou comment a-t-il changé de changement de programmateur à propos de la programmation?


Juste pour enregistrer, je pose cette question après avoir lu principalement ces deux papiers:


4 commentaires

Peut être injuste, pourquoi ne pas regarder autour de lui pour une copie de la première édition du livre K & R. Cela devrait vous donner une bonne idée de ce que c'était comme dans le bon vieux temps.


@WBDVLPR Je suis aussi vieux que vous êtes, au moins de ce qui écrit dans votre profil de sorte :)


Remarque: je demande l'expérience d'utilisateurs réels. J'ai lu beaucoup de ce que STROSTRUP a écrit à propos de C ++ et C est l'une des languages ​​que vous rencontrez beaucoup dans les papiers de Stroustrup :)


Voir aussi Stackoverflow.com/questions/650351/Your-first-c-caller (pas dupliquer).


11 Réponses :


3
votes

Parler de l'expérience personnelle, mes deux premiers compilateurs C compilateurs C étaient desmetteurs C (ligne de commande MS-DOS de 16 bits) et de Lattice C (ligne de commande MS-DOS de 16 bits). Desmet c est venu avec son propre éditeur de texte ( See.exe ) et des bibliothèques - fonctionnalités non standard telles que SCR_ROWCOL () positionné le curseur. Même alors, cependant, certaines fonctions étaient des fonctions qui étaient standard, telles que printf (), fantaisie (), fopen (), FOPEN () et FCLOSE () . .

Une des particularités intéressantes de l'époque était que vous aviez le choix entre quatre modèles de base de mémoire - S, P, D et L. D'autres variations sont venues et sont passées au fil des ans, mais celles-ci étaient les plus importantes. S Était le "petit" modèle, adressage 16 bits pour le code et les données, vous limitant à 64k pour chacun. L'adressage 24 bits a utilisé un registre de segment de 16 bits et un registre de compensation de 16 bits pour calculer des adresses, vous limitant à 1024k d'espace d'adresses. Bien sûr, dans un monde de 16 bits Dos, vous avez été confiné à une limitation physique de 640K. P et D ont été des compromis entre les deux modes, où p perforée pour des données 24 bits (640K) et 64k Data, et d autorisés pour le code 64K et l'adressage de données 640K.


3 commentaires

Heureusement, Lattice a décidé de rendre l'expérience aussi unique que possible que possible, aidée par le fait que MS-DOS 2.0 a fait la même chose. Et lorsque Microsoft a licencié le compilateur de réseau, ils ont fait de même.


Notez que les modèles de mémoire étaient une invention Microsoft. Unix C n'a jamais eu de telles monstruosités.


En fait, ils étaient une invention Intel. Mainstream Unix a eu le luxe de courir sur des architectures de processeur avec des espaces d'adresses contigus (et typiquement importants): PDP-11, VAX, 68000, 80386, etc. Sauf si vous alliez vous limiter à un segment de données de 64k, vous devez avoir un mécanisme pour résoudre le reste de 1 m dans un 8086. Je n'ai pas utilisé le petit compilateur Intel C (dont je ne crois pas non plus. Lattice ou Microsoft), mais suspecte qu'il avait une sorte de contrôle de segmentation explicite.



3
votes

wikipedia a Quelques informations sur ce sujet.


2 commentaires

Merci Nathan. La page Wikipedia est vraiment bref si je veux en savoir plus sur le sujet.


Bien sûr, j'ai remarqué cela aussi .. juste après avoir posté. :(



7
votes

Regardez le ' page d'accueil ' pour le livre K & R chez Bell Labs, en particulier la rubrique "L'histoire de la langue est traçée dans" le développement du langage C ", de Hoppl II, 1993"


0 commentaires

12
votes

Eh bien, pour un début, il n'y avait aucune de ces déchets de prototype. Main () Code> a été déclaré ainsi:

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


4 commentaires

Les bons jours d'Ole, où tout était pire, et donc mieux.


En fait, les types de retour ont également été omis. Le début C a toujours retourné un mot. Et un argument INT était par défaut, donc un simple "principal (c, v) char v []; {/ ... * /}" était typique.


J'avais oublié ce bit, @andy.


"Les vrais hommes utilisés #define." Aujourd'hui, l'utilisation de telles choses fantaisistes telles que des variables constantes ou des fonctions en ligne ou, Dieu interdisons, lambdas Cela me rappelle, j'aimerais avoir une Lambada maintenant :-)



3
votes

Voici un exemple du code qui a changé avec ANSI C pour le meilleur:

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;
}


3 commentaires

Vous avez oublié les parens autour de l'argument de retour. Certains compilateurs pré-ANSI les ont réellement requis. ;)


Oui, la vie a sucé de cette façon. Je n'ai jamais participé à l'habitude de Paren depuis que le compilateur C J'ai utilisé a été écrit par K & R (j'ai travaillé chez Bell Labs quand j'ai appris c).


Jamais particulièrement aimé les parens, moi-même. Cela me dérange toujours comment ils semblaient être le style accepté à l'époque, malgré le fait que tant de sources ont affirmé "éviter les parens inutiles". Certains compilateurs ont mis en œuvre le retour () en tant qu'appel de fonction, qui a simplement ajouté à la confusion.



3
votes

J'ai commencé à travailler avec C sur VAX / VMS en 1986. Voici les différences que je me souviens:

  • Aucun prototypes - Les définitions de fonction et les délais de fonctionnement ont été écrits comme xxx
    • aucun type de pointeur générique (vide); Tout le * alloc () Fonctions renvoyées Char * à la place (qui fait partie de la raison pour laquelle certaines personnes ont toujours la valeur de retour de MALLOC (); avec compilateurs pré-ANSI, vous avait à);

    • Les fonctions variadiques ont été traitées différemment; Il n'y avait aucune exigence pour aucun argument fixe et le fichier d'en-tête a été nommé différemment (varargs.h au lieu de STDARG.H);

    • un lot de matériel a été ajouté à Math.h au fil des ans, en particulier dans la norme C99; '80-Vintage C n'était pas le plus grand outil de travail numérique;

    • Les bibliothèques n'étaient pas normalisées; Presque toutes les implémentations avaient une version de Stdio, Maths, String, Ctype, etc., mais le contenu n'était pas nécessairement la même chose entre les implémentations.


2 commentaires

J'étais un gars VAX / VMS aussi. Dans UNIX et PC-TERRES, RETOURNANT 0 de MAIN () signifie que tout est bon une bonne normale. Mais VMS interprétait la valeur de retour en tant que code d'erreur standard, où des valeurs impaires étaient bonnes et même les plus mauvaises. Les programmes portés sont invariablement sortis avec des messages de «violation d'accès», car c'est ce que 0 mappé dans les tables de message système. Même avec ANSI, vous ne pouvez pas retour exit_success , vous avez dû utiliser quitter (EXIT_SUCCESS); , puis ajouter un / * notedached * / Commentaire pour Lint et enfin Retour 0; Pour satisfaire l'avertissement du compilateur.


était un développement assez tard; Il y avait une variété d'autres techniques beaucoup plus douteuses utilisées avant cela.



2
votes

Regardez le code de la version 6 Unix Kernel - c'est ce que c'était ce qui ressemblait!

voir Commentaire de Lion sur UNIX 6ème édition ( Amazon ).

En outre, il serait plus facile si vous nous avez dit votre âge - votre profil dit que vous avez 22 ans, vous avez donc posé des questions sur le code avant 1987.

Aussi considérez: L'environnement de programmation UNIX à partir de 1984.


0 commentaires

0
votes

J'ai commencé à utiliser C au début des années 1980. La différence essentielle que j'ai vus d'ici de temps en temps était que le début de la caution n'a pas eu de prototypes de fonctions, comme l'a noté quelqu'un. Le plus ancien C I jamais utilisé avait à peu près la même bibliothèque standard que aujourd'hui. S'il y avait un moment où c n'avait pas de printf ou de follier, c'était avant même de mon temps! J'ai appris c dans le livre K & R original. C'est en effet un classique et la preuve que les personnes techniquement sophistiquées peuvent également être d'excellents écrivains. Je suis sûr que vous pouvez le trouver sur Amazon.


0 commentaires

0
votes

Vous pourriez jeter un coup d'œil sur les entrées du concours C Obfusated C à partir de la période que vous recherchez.


0 commentaires

2
votes

Alors que pour des raisons évidentes, la langue principale est venue avant la bibliothèque, si vous obtenez une copie d'une première édition de K & R publiée en 1978, vous trouverez la bibliothèque très familière. C'était également utilisé à l'origine pour le développement Unix et la bibliothèque accrochée dans les services d'E / S du système d'exploitation. Je pense donc que votre assertion de votre professeur est probablement apocryphe.

La différence la plus évidente est la manière dont les fonctions ont été définies: p> xxx pré>

au lieu de: p>

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


0 commentaires

0
votes

Les entiers 16 bits étaient assez courants dans les journées OL '.


0 commentaires