Comment j'ai créé mon PJ et mon compilateur pendant 12 ans



Les événements de l'histoire sont racontés par ordre chronologique, s'il vous semble qu'un événement n'est pas pertinent, alors ce n'est probablement pas le cas, juste un moment où il sera clair pourquoi je l'ai mentionné cet événement sera plus tard. La langue que je crée a changé au fil du temps, si vous lisez et comprenez que la langue n'est pas très bonne et que vous ne pouvez pas lire plus loin, je recommande toujours de lire jusqu'à la fin, peut-être que votre opinion changera. L'image de l'article ne reflète pas les principales caractéristiques de la langue, mais il n'y a vraiment aucun lien dans la langue.

Bonjour lecteur! Je m'appelle Alexander, je suis né dans une petite ville (moins de 10 000 habitants) au Bélarus. Ma famille était pauvre, il y avait très peu de jouets, à propos de l'ordinateur et des consoles du tout, on ne peut pas bégayer. Malgré le fait que la famille était pauvre, la mère n'avait pas de parents pauvres, qui nous donnaient parfois des choses non bon marché. Et puis un jour (quelque part en 2001) ces mêmes parents nous donnent un ordinateur Byte (l'analogue soviétique du ZX Spectrum 48k). Ma joie ne connaissait pas de limites! Immédiatement, j'ai commencé à lancer des jeux dessus. Les jeux sur cet ordinateur ont été téléchargés à partir de cassettes ordinaires. Le téléchargement d'un jeu a duré environ 5 minutes et sans grande probabilité aurait pu s'arrêter en raison d'un signal de mauvaise qualité. Pour augmenter la probabilité d'un téléchargement réussi, j'ai dû l'essuyer avec de l'alcool et régler la position de la tête de lecture du magnétophone. Tout ce chamanisme pendant le chargement, la durée du chargement et l'impossibilité de persister dans les jeux, ont conduit au fait que progressivement j'ai commencé à me désintéresser des jeux. Mais avec Byte, on m'a également présenté un livre sur le travail avec cet ordinateur. J'ai décidé de lire ce livre pour en savoir plus sur les fonctionnalités de Byte. Le livre s'est avéré être un manuel sur le langage de programmation BASIC intégré à Byte.

Je viens de prendre et de copier le premier programme que j'ai obtenu d'un livre sur un ordinateur, puis de le démarrer. Quand j'ai vu un cercle sur l'écran, j'étais tout simplement stupéfait - c'était un sentiment indescriptible. Quand je suis arrivé, j'ai commencé à changer divers nombres dans le programme et après avoir commencé la figure a changé de forme, j'ai changé de nombres et j'ai recommencé le programme encore et encore, j'avais l'impression d'être dans un autre univers et j'ai commencé à l'étudier. Après avoir lu tout ce qui était dans ce livre sur les bases, j'ai commencé à créer mes propres programmes. Au début, je les ai écrits sur un morceau de papier, les ai compilés et les ai lancés dans ma tête, puis les ai transférés sur un ordinateur et j'ai regardé ce qui allait se passer. Après avoir moi-même écrit mon premier programme sans manuel, j'ai réalisé - c'est le mien, c'est ce que je veux faire dans la vie. J'ai commencé à écrire toute la journée sur un morceau de papier divers programmes (dont des jeux).

Environ un an plus tard, après les événements décrits ci-dessus, l'informatique apparaît dans mon école. Au fil du temps, dans les leçons, nous commençons à apprendre la programmation dans le programme IntAl. Dans les leçons, nous avons programmé un peu, car il y avait beaucoup d'autres matériels non liés à la programmation, et nous avons également travaillé sur des ordinateurs à tour de rôle (il y avait moins d'ordinateurs que d'élèves). Mais il y avait un cours optionnel en informatique dans notre école et j'ai décidé de m'inscrire là-bas, dans l'espoir qu'ils me donneraient plus d'opportunités de programmation. À la faculté, nous avons commencé à étudier le Turbo Pascal, dès le premier moment j'ai vraiment aimé la langue. Il y avait des enregistrements (ce sont des structures), des unités (ce sont aussi des modules et des bibliothèques), des procédures et des fonctions. C'était une sorte de nouveau monde magnifique, plus beau que tout ce que je savais auparavant. Ayant commencé à étudier le pascal, j'ai finalement décidé que je voulais devenir programmeur.

Après avoir été diplômé de la 9e année de l'école, j'avais le choix entre aller dans n'importe quel collège ou aller en 10e année. J'ai décidé d'aller dans un lycée, spécialisé dans un opérateur informatique avec une étude approfondie de la physique, des mathématiques, de l'astronomie et de l'informatique. Beaucoup de gens ont dit que si je suis diplômé de cette spécialité, il me sera plus facile d'entrer dans une université en tant que programmeur. Trois heures ont été accordées pour résoudre l'examen d'entrée, je n'ai utilisé que 30 minutes, dont 10 j'ai vérifié si tout était correct. Reçu! Au Lyceum, j'ai continué à étudier Pascal, mais j'ai également commencé à étudier Photoshop, Corel Draw, Excel, la ligne de commande Windows et les fichiers .bat.

En apprenant ce que j'ai fait, les mêmes parents qui m'ont donné «Byte» m'ont donné un nouvel ordinateur avec les caractéristiques suivantes: Intel Celeron 800 Mhz monocœur, 64 Mo de RAM, disque dur de 14 Go, vidéo intégrée avec une résolution de 640 x 480 et 16 couleurs. Les parents ont décollé et mis à niveau en achetant 64 Mo de RAM et une carte vidéo Matrox Milenium g400 16 Mo, avec prise en charge de 16 millions de couleurs, la résolution était de 800 x 600 (limitation du moniteur). A cette époque, presque personne n'avait accès à Internet, toutes les informations provenaient principalement de disques vendus en magasin.

Un de mes amis a acheté plusieurs CD de programmation Delphi, les CD comprenaient Borland Delphi 7, un tas de tutoriels, un tas de composants et un programme avec beaucoup de questions sur Delphi et des réponses à ces questions (une sorte de StackOverflow hors ligne au minimum).

Tout était si simple et pratique que les programmes ont été écrits les uns après les autres. Toujours dans la bibliothèque du lycée, il y avait un manuel sur la programmation en C. Après l'avoir lu, j'ai réalisé que je n'aimais pas du tout C, j'aimais Pascal et surtout Delphi plusieurs fois plus. C est plus compliqué et pas si pratique, la seule chose que j'aimais c'est que les accolades sont utilisées au lieu de commencer la fin. Mais je n'ai pas besoin de penser que Pascal était une langue idéale pour moi, avec le temps, beaucoup de choses dans la langue ont commencé à m'ennuyer (en plus de commencer fin). Par exemple, je voulais que les chaînes et les tableaux soient des structures avec les champs suivants: un pointeur vers une zone mémoire avec des données, le nombre d'éléments, le nombre maximal d'éléments qu'un pointeur peut contenir dans la zone mémoire, afin que plusieurs tableaux ou lignes puissent pointer vers la même zone mémoire et vous pouvez créer un tableau à partir d'un morceau d'un autre tableau sans copier les éléments. Comme il s'est avéré plus tard, les tableaux que je voulais s'appellent des tranches. Ensuite, j'ai voulu écrire un traducteur qui traduit d'un pascal aussi modifié en un pascal régulier, mais j'ai abandonné cette idée.

Le même ami qui m'a présenté Delphi a déclaré qu'une certaine entreprise envoie des disques gratuits avec certains Ubuntu et Kubuntu. Je ne savais même pas ce que c'était, mais il m'a donné 2 disques gratuitement. Ubuntu n'a pas commencé avec moi, mais Kubuntu a commencé et a très bien fonctionné. J'ai été étonné - il s'avère qu'il y a autre chose que Windows et DOS. Je voulais vraiment mettre Kubuntu sur l'ordinateur et l'étudier, mais le lecteur de 14 Go était catégoriquement contre. De plus, à cette époque, j'avais déjà accès à Internet (5 Kb / s), et le modem de Kubuntu ne fonctionnait pas. Par conséquent, le disque avec Kubuntu a été jeté sur l'étagère. Soudain, le même ami a commencé à délirer avec une sorte d'assembleur, tout m'a montré une sorte de programme dessus, mais ils ne m'ont fait sourire, parce que 50 lignes d'assembleur ont été remplacées par une ligne de Delphi, mais un ami m'a persuadé d'essayer et a donné un disque avec FASM et les livres d'assemblage. Je n'ai pas aimé l'assembleur, bien que les macros dans FASM soient une bonne chose.

Et donc j'ai obtenu mon diplôme d'études secondaires, il est temps d'aller à l'université. Mais peu de temps avant la fin du lycée, j'ai commencé à gagner de l'argent sur Internet. Il y a beaucoup d'arnaqueurs sur Internet qui prétendent être des entrepreneurs prospères et offrent aux utilisateurs sans méfiance l'accord suivant - "Donnez-nous au moins un dollar, et après 2 semaines, nous vous rembourserons 2 $". Si vous donnez un dollar à ces escrocs, étrangement, après 2 semaines, ils retournent vraiment 2 $, mais si vous donnez 10 puis après 2 semaines, il sera indiqué que j'ai 20 $ sur mon compte, mais il sera impossible de le retirer. J'ai créé beaucoup de boîtes aux lettres et en utilisant diverses boîtes aux lettres et en changeant l'adresse IP (j'avais une IP dynamique), j'ai enregistré beaucoup de comptes sur les sites frauduleux, en y mettant 1 $ à chaque fois. Considérant que j'avais déjà gagné un peu d'argent de cette façon, j'ai commencé à être visité par la pensée - «Peut-être que je ne devrais pas aller à l'université? Je peux programmer comme je veux sans université. » J'étais également enclin à cette pensée par le fait qu'Internet écrivait souvent que le programmeur n'avait pas besoin de tour. Pendant que je pensais - «agir ou ne pas agir?», La vie elle-même a décidé pour moi. Mon père s'est inscrit sur un site de rencontres, a trouvé un nouvel amour pour lui et m'a jeté avec sa mère. Réalisant que ma mère seule ne pourrait pas me soutenir pendant mes études, je n'ai pas commencé à entrer à l'université. Après le lycée, j'ai dû travailler un an dans une entreprise. J'ai obtenu un emploi dans une épicerie, je m'occupais de l'extraction du TTN et de la saisie des marchandises qui venaient au magasin dans un ordinateur. Ayant un peu travaillé en magasin, j'ai écrit un programme qui analyse la base de données des produits du magasin et recherche les problèmes potentiels. Après cela, la société propriétaire du magasin a proposé de leur transférer en tant que programmeur, mais quand ils ont découvert que je n'avais pas d'études supérieures, ils ont changé d'avis. Et je suis resté travailler dans le magasin. Mon salaire n'était pas mauvais, mais les revenus des escrocs étaient très modestes. Les revenus étaient faibles car l'enregistrement des comptes prenait beaucoup de temps et au Bélarus, il était très difficile de travailler avec de l'argent sur Internet. Liberty Reserve - Argent sur Internet, dont le travail a été fourni par une banque au Costa Rica, qui n'a pas donné d'informations sur ses clients au gouvernement, c'est pourquoi la plupart des escrocs ont utilisé Liberty Reserve.

Il était particulièrement difficile d'acheter cet argent en Biélorussie, car dans les échangeurs automatiques, il fallait payer sept fois plus (si ma mémoire est bonne), et acheter aux gens était une entreprise risquée. J'ai arrêté de tromper les escrocs et j'ai reçu un revenu, uniquement du travail. Après avoir travaillé un an, j'ai décidé de chercher quelque chose de mieux. J'avais une bonne somme d'argent sous la main et j'ai décidé de mettre à jour mon ordinateur. Caractéristiques du nouveau PC: AMD Athlon 64 x2 2600 (avec prise en charge des instructions SSE2 qui n'étaient pas dans le processeur précédent. C'est important!), 1 Go de RAM, 80 Go de disque dur. En me rappelant que je voulais apprendre Kubuntu mais que j'avais un disque dur trop petit, j'ai décidé d'installer Linux et Windows en même temps, car je n'avais aucun problème avec le disque. Lorsque je suis allé au magasin de disques informatiques, j'ai acheté un disque openSUSE 10.2. Mon nouvel emploi consistait à réparer des ordinateurs dans l'une des entreprises de ma ville, avec une période d'essai d'un mois. Le chef de cette entreprise, ainsi que sa femme, développaient une sorte de logiciel de comptabilité, apprenant que j'aimais beaucoup la programmation, ils ont proposé de se joindre à un pourcentage des ventes futures, mais comme ils développaient en Visual FoxPro et SQL, j'avais besoin d'apprendre ces langues. J'étais d'accord. Un mois plus tard, il s'est avéré qu'ils n'allaient pas m'engager, mais ils avaient besoin de moi pour remplacer l'employé qui était parti en vacances à son retour, ils ont dit qu'ils n'avaient plus besoin de moi, mais qu'ils voulaient quand même que je les aide Avec le développement, bien sûr, j'ai refusé et j'ai commencé à chercher un nouvel emploi. Plusieurs mois de recherches infructueuses ont conduit au fait que je me suis rendu sur le chantier en tant que travailleurs auxiliaires.

Le salaire de l'auxiliaire était 3,5 fois inférieur à celui de l'opérateur informatique du magasin, mais je dois dire que le travail est beaucoup plus facile (j'étais un gars fort). Au cours du week-end, en utilisant FASM, j'ai commencé à apprendre ces nouvelles instructions SSE2 pour moi. Après avoir expérimenté, j'ai réalisé que dans certaines tâches, ces instructions peuvent augmenter considérablement la productivité. Je me demandais comment les développeurs de logiciels incorporent des instructions SSE2 dans leurs applications, car si toutes les tâches dans lesquelles il est logique d'utiliser SSE2 sont résolues en les utilisant, le programme ne fonctionnera pas sur les ordinateurs sans prise en charge SSE2, mais si vous ne les utilisez pas, alors le programme fonctionnera plus lentement. Bien sûr, vous pouvez savoir au début du programme si le processeur prend en charge SSE2 et, selon le résultat, exécuter du code différent, mais dans ce cas, la complexité du développement et des tests augmente, ainsi que la consommation accrue de RAM et de cache du processeur. Après avoir analysé plusieurs programmes, j'ai vu que la plupart des programmes n'utilisaient pas SSE2. Et puis je me suis demandé: "Pourquoi les compilateurs ne compilent-ils pas les macros dans l'assembleur, et sur l'ordinateur de l'utilisateur final un utilitaire ne remplira pas les constantes nécessaires aux macros et seulement après qu'un binaire soit créé?". Et moi, me souvenant du pascal modifié que j'ai inventé au Lyceum, j'ai décidé d'écrire un tel compilateur. J'ai également pris la décision d'ajouter des génériques à la langue et la langue a commencé à ressembler à ceci:

type Point(a){
    x, y: a;
}

type Line(a){
    a, b: Point(a);
}

function createLine(a, b: Point(a)) Line(a){
    result.a = a;
    result.b = b;
}

Windows Linux( Windows, Linux ). Ubuntu 8.10, . , Gentoo. Gentoo use- , . , , , , . , - LLVM, LLVM IR. , , FASM, LLVM IR, , , , LLVM , , . . LLVM IR , , , , , . , , LLVM IR, , , . :

function inc(a: ^Integer) Integer{
    result = a^ + 1;
}

procedure foo(){
    var
        a: ^Integer;
        b: Integer;
    ...
    // 
    ...
    b = inc(ro nocp a) //   inc       ,     
}

, (800 $/), . , Haskell, : « », « », , - , . . Haskell . , — , , , — , , , ( , ) — , , , — , . « Haskell ». , . , . , , Haskell, - , . Haskell , Haskell( Python), .

, . Haskell . - Junior Haskell Developer , . . , , IDE, firefox + google , . . Haskell .

, Haskell , , , Haskell , , Haskell — ! Haskell , , ( Haskell). :

function lineLength(line: Line) Real
    result = sqrt(sqr(line.a.x - line.b.x) + sqr(line.a.y - line.b.y))

- 800$ 400$, 120$ + + 250$. 250$, ? . , — , , . 35$ . , , , . , , , , , - . 2 . , - . , , , , , « , . » — . , , , (14 ). , , , , , , . , ( ), , , , 1-2 . . , , , 3 , . , 3 . , . ( ).

: , , , . ( ), , , , . , , , , , ( ). , . , - (, , , ), , - , . ( , , ), 60% . , , , . , , :

  1. , ( ).
  2. , LLVM IR . , A m, , LLVM IR , B A, m LLVM IR .
  3. .
  4. .

, . , :

  • Haskell?

    , , . :

    abstract class Printable
    
    require method (Printable) print()
    method (Printable) printLn()
        this.print()
        String.eol().print()
    

  • ?

    , , , . :

    class Some(SomeParent)
        a, b String
    
    class Some(Some, Printable)
    
    override method (Some) print()
        this.a.print()
        this.b.print()
    

  • ?

    ( 2 , — ).
  • , ?

    , . . :

    method (Some) foo(a :String, b String) // a -  , b - 
        c := 10 // c  
        d .= 12 // d  
        :someMethod() //   someMethod, c    
        c.someMethod() //   someMethod, c    
        //2  ,     ,    ,     
    

  • ?

    , . :

    class Point
        x,y Number
    
    method (Some) foo(a Point<x UInt64, y UInt64>) // a   ,     Point,      x  y.    ,     .
    
  • , Point x y .

    class Point
        x, y !Number //   x  ,  y   x
    

  • ?

    , , . :

    class Point
        numberClass #Number
        private x, y .numberClass
    
    method (Point) createPoint(x, y .numberClass) This //This -           
        result:x = x
        result:y = y
    

  • , LLVM IR ?

    ( ) , . :

    method (Some) foo(a .z, b Point<numberClass .f>, c UInt64)
    //a      z     
    //b       Point      numberClass,           f     
    //c    UInt64,     
    

  • ?

    , , , - , , . 0 — .

, . . , , , , , , . , , , — , . - 5 . , . : . — 170 $/. , , , , . , , .

, , , . , O0 O2, O1 O3. , LLVM IR, . LLVM IR, , clang C. - , C LLVM IR , LLVM IR. LLVM IR? .

C LLVM IR? LLVM IR C: , , , C . LLVM IR C. , . , , , . , this 2 ( ) 4. , , 20 — 40 ( ). , , . , 2 , , , , , , . , , — . , . , .

, :

  • , .
  • , .

— « , ?». , , , , . , this ( ). :

method (#Some) foo(a String, b `String, c ~String, d :String)
//this  
//a   
// b    ,         
//c        ,        
//d  ,  

. , , , ( ) , , , ( ) : , , , , this ( , ), , , , . , :

method (~Some) veryBadMethod(value This)
 this = value

method (#Some) foo()
    a := Some
    b .= Some#randomValue() //,    b    
    a~veryBadMethod(b)
    a:someMethod() //  ,   

, . , , . , , , . — 2 , , , , , — .

, , . , «! ! .». , . — . , , 150-180. 11 . , , , - , . (? , ). , . , , 30- , , , 200$ ( ), , , .

, . (Disciples 3) — , , — « !». , , , ? , ! , , . , « ? Haskell.». 10 , , , , , . -, , ( , ) , , .

, . , , . , , , , , .

, , , , , , . . . , , . :

type Point(a)
    x,y a

type SimplePoint
    x,y Double

//-  
a := Point(UInt64)

Haskell, , , , . , - . . :

group Equal
//equal(a, a) -> Bool

, Equal, equal, 2 , Bool.

(rules) — , . . :

rules
    1 = type == [_] //    
    2 = type[0] > Equal //      Equal
    3 = 1 & 2
    join 3 Equal //      Equal

. , , , , — . , 1 9 ( 5), , , , . :

func notEqual(a, b)
    rules
        final = a > Equal & a == b
        result = Bool
    result = !(a == b) //!  ==  ,    result = (neg(equal(a, b))  a.equal(b).neg()

, , , , . , , , , , . , bash , . ( ) .

, : cine, , fei. github:

cine fei.
.
.
( ).
XML Kate.

Linux x86_64( ) clang.

, , cine.

:

  • cine fei n-kine enfei.
  • cine C.
  • cine ( ).
  • 4ernika, , .
  • , , . size count , size count, . , , , .
  • , ( ).
  • , , ( , ). , , . .
  • cine , cine — UInt8, , .
  • LLVM IR C, clang GCC. , , , clang.
  • SIMD , 0.1 SIMD ( ), , SIMD .

Source: https://habr.com/ru/post/fr481276/


All Articles