Wie ich mein YP und meinen Compiler fĂĽr 12 Jahre erstellt habe



Die Ereignisse der Geschichte werden in chronologischer Reihenfolge erzählt. Wenn Sie den Eindruck haben, dass ein Ereignis irrelevant ist, ist dies höchstwahrscheinlich nicht der Moment, an dem klar wird, warum ich dieses Ereignis später erwähnte. Die Sprache, die ich erstelle, hat sich im Laufe der Zeit geändert. Wenn Sie lesen und verstehen, dass die Sprache nicht sehr gut ist und Sie nicht weiter lesen können, empfehle ich dennoch, sie bis zum Ende durchzulesen. Vielleicht wird sich Ihre Meinung ändern. Das Bild für den Artikel spiegelt nicht die Hauptmerkmale der Sprache wider, aber es gibt wirklich keine Links in der Sprache.

Hallo Leser! Mein Name ist Alexander, ich wurde in einer kleinen Stadt (weniger als 10.000 Menschen) in Weißrussland geboren. Meine Familie war arm, es gab nur sehr wenige Spielsachen, über den Computer und irgendwelche Konsolen kann man überhaupt nicht stottern. Trotz der Tatsache, dass die Familie arm war, hatte die Mutter keine armen Verwandten, die uns manchmal einige nicht billige Sachen gaben. Und dann, eines Tages (irgendwo im Jahr 2001), geben uns dieselben Verwandten einen Byte-Computer (das sowjetische Analogon des ZX Spectrum 48k). Meine Freude kannte keine Grenzen! Sofort begann ich damit, Spiele zu starten. Spiele auf diesem Computer wurden von gewöhnlichen Bandkassetten heruntergeladen. Das Herunterladen eines Spiels dauerte ungefähr 5 Minuten und hätte mit nicht geringer Wahrscheinlichkeit aufgrund eines Signals von schlechter Qualität gestoppt werden können. Um die Wahrscheinlichkeit eines erfolgreichen Downloads zu erhöhen, musste ich ihn mit Alkohol abwischen und die Position des Lesekopfs des Tonbandgeräts anpassen. All dieser Schamanismus während des Ladens, die Dauer des Ladens und die Unfähigkeit, in Spielen zu bestehen, führten dazu, dass ich allmählich das Interesse an Spielen verlor. Aber zusammen mit Byte wurde mir auch ein Buch über die Arbeit mit diesem Computer vorgestellt. Ich habe beschlossen, dieses Buch zu lesen, um mehr über die Funktionen von Byte zu erfahren. Das Buch entpuppte sich als Lehrbuch über die in Byte integrierte Programmiersprache BASIC.

Ich habe gerade das erste Programm, das ich von einem Buch bekommen habe, auf einen Computer kopiert und es dann gestartet. Als ich einen Kreis auf dem Bildschirm sah, war ich einfach verblüfft - es war ein unbeschreibliches Gefühl. Als ich zu kam, fing ich an, verschiedene Zahlen im Programm zu ändern, und nachdem die Figur ihre Form geändert hatte, änderte ich die Zahlen und startete das Programm immer wieder. Ich fühlte mich wie in einem anderen Universum und fing an, es zu studieren. Nachdem ich alles in diesem Buch über Basic gelesen hatte, begann ich, meine eigenen Programme zu erstellen. Zuerst schrieb ich sie auf ein Blatt Papier, stellte sie zusammen und startete sie in meinem Kopf. Dann übertrug ich sie auf einen Computer und schaute, was sich herausstellen würde. Nachdem ich selbst mein erstes Programm ohne Lehrbuch geschrieben hatte, wurde mir klar - das ist meins, das ist, was ich im Leben machen möchte. Ich fing an, den ganzen Tag über verschiedene Programme (einschließlich Spiele) auf ein Blatt Papier zu schreiben.

Ungefähr ein Jahr später, nach den oben beschriebenen Ereignissen, taucht an meiner Schule Informatik auf. Im Laufe der Zeit lernen wir in den Lektionen das Programmieren im IntAl-Programm. In den Lektionen haben wir ein wenig programmiert, da es viele andere Materialien gab, die nicht mit dem Programmieren zu tun hatten, und wir haben auch abwechselnd an Computern gearbeitet (es gab weniger Computer als Schüler). Aber an unserer Schule gab es ein Wahlfach in Informatik, und ich entschied mich, mich dort einzuschreiben, in der Hoffnung, dass sie mir mehr Programmiermöglichkeiten geben würden. An der Fakultät haben wir angefangen, Turbo Pascal zu studieren, von dem Moment an, als ich die Sprache wirklich mochte. Es gab Datensätze (sie sind Strukturen), Units (sie sind auch Module und Bibliotheken), Prozeduren und Funktionen. Es war eine Art neue schöne Welt, schöner als alles, was ich vorher wusste. Nachdem ich angefangen hatte Pascal zu studieren, beschloss ich endlich, Programmierer zu werden.

Nachdem ich die 9. Klasse der Schule abgeschlossen hatte, hatte ich die Wahl, ob ich an ein College oder in die 10. Klasse gehen wollte. Ich beschloss, an ein Lyzeum zu gehen, das sich auf Computeroperatoren mit einem vertieften Studium der Physik, Mathematik, Astronomie und Informatik spezialisierte. Viele Leute sagten, dass es für mich einfacher sein wird, als Programmierer an einer Universität zu studieren, wenn ich von diesem Fach abschließe. Für die Prüfung wurden drei Stunden zur Verfügung gestellt, ich habe nur 30 Minuten gebraucht, von denen 10 ich überprüfte, ob alles in Ordnung war. Erhalten! Am Lyceum habe ich mich weiter mit Pascal befasst, aber auch mit Photoshop, Corel Draw, Excel, der Windows-Befehlszeile und .bat-Dateien.

Als ich erfuhr, was ich getan habe, gaben mir dieselben Verwandten, die mir "Byte" gaben, einen neuen Computer mit den folgenden Eigenschaften: Single-Core Intel Celeron 800 MHz, 64 MB RAM, 14 GB Festplatte, integriertes Video mit einer Auflösung von 640 x 480 und 16 farben. Die Eltern kauften 64 MB RAM und eine Matrox Milenium g400 16 MB-Grafikkarte mit Unterstützung für 16 Millionen Farben. Die Auflösung betrug 800 x 600 (Monitorbeschränkung). Zu dieser Zeit hatte fast niemand Zugang zum Internet, alle Informationen stammten hauptsächlich von Datenträgern, die in Geschäften verkauft wurden.

Einer meiner Freunde kaufte mehrere Delphi-Programmier-CDs, darunter Borland Delphi 7, eine Reihe von Tutorials, eine Reihe von Komponenten und ein Programm mit vielen Fragen zu Delphi und Antworten auf diese Fragen (eine Art Offline-StackOverflow im Minimum).

Alles war so einfach und bequem, dass die Programme nacheinander geschrieben wurden. Auch in der Bibliothek des Lyzeums gab es ein Lehrbuch zum Programmieren in C. Nachdem ich es gelesen hatte, stellte ich fest, dass ich C überhaupt nicht mochte, ich mochte Pascal und besonders Delphi um ein Vielfaches mehr. C ist komplizierter und nicht so praktisch. Das einzige, was mir gefallen hat, ist, dass geschweifte Klammern anstelle von begin und end verwendet werden. Aber ich brauche nicht zu glauben, dass Pascal eine ideale Sprache für mich war. Im Laufe der Zeit begannen mich viele Dinge in der Sprache zu ärgern (außer begin end). Ich wollte zum Beispiel, dass Strings und Arrays Strukturen mit den folgenden Feldern sind: Zeiger auf einen Speicherbereich mit Daten, Anzahl der Elemente, maximale Anzahl der Elemente, die ein Zeiger im Speicherbereich enthalten kann, damit mehrere Arrays oder Zeilen auf denselben Speicherbereich verweisen können und Sie könnten ein Array aus einem Teil eines anderen Arrays erstellen, ohne die Elemente zu kopieren. Wie sich später herausstellte, werden solche Arrays, die ich wollte, Slices genannt. Dann wollte ich einen Übersetzer schreiben, der von einem so modifizierten Pascal in einen regulären übersetzt, aber ich gab diese Idee auf.

Der gleiche Freund, der mich mit Delphi bekannt gemacht hat, sagte, dass eine bestimmte Firma kostenlose Festplatten mit einigen Ubuntu und Kubuntu verschickt. Ich wusste nicht einmal, was es war, aber er gab mir 2 CDs kostenlos. Ubuntu startete nicht mit mir, aber Kubuntu startete und arbeitete sehr gut. Ich war erstaunt - es stellte sich heraus, dass es neben Windows und DOS noch etwas anderes gibt. Ich wollte Kubuntu unbedingt auf den Computer setzen und studieren, aber die 14-GB-Festplatte war kategorisch dagegen. Außerdem hatte ich zu diesem Zeitpunkt bereits einen Internetzugang (5 Kb / s) und das Modem in Kubuntu funktionierte nicht. Daher wurde die Platte mit Kubuntu ins Regal geworfen. Plötzlich fing derselbe Freund an, mit einer Art Assembler zu toben, alles zeigte mir irgendeine Art von Programmen, aber sie brachten mich nur zum Lächeln, weil 50 Zeilen Assembler durch eine Zeile Delphi ersetzt wurden, aber ein Freund überredete mich, zu versuchen, eine Diskette mit FASM zu geben und Montagebücher. Ich mochte den Assembler nicht, obwohl Makros in FASM eine coole Sache sind.

Und so absolvierte ich die High School, es ist Zeit, aufs College zu gehen. Doch kurz vor dem Ende des Lyzeums begann ich, im Internet Geld zu verdienen. Es gibt viele Betrüger im Internet, die sich als erfolgreiche Unternehmer ausgeben und ahnungslosen Nutzern das folgende Angebot unterbreiten: "Geben Sie uns mindestens einen Dollar, und nach zwei Wochen erstatten wir Ihnen 2 US-Dollar." Wenn Sie diesen Betrügern nach 2 Wochen seltsamerweise einen Dollar geben, geben sie wirklich 2 Dollar zurück, aber wenn Sie nach 2 Wochen 10 Dollar geben, wird angezeigt, dass ich 20 Dollar auf meinem Konto habe, aber es ist unmöglich, ihn abzuheben. Ich habe viele Postfächer erstellt, verschiedene Postfächer verwendet und die IP-Adresse geändert (ich hatte eine dynamische IP-Adresse). Ich habe viele Konten auf betrügerischen Websites registriert und jedes Mal 1 US-Dollar auf sie gesetzt. In Anbetracht dessen, dass ich auf diese Weise bereits ein wenig Geld verdient hatte, begann mich der Gedanke zu besuchen: „Vielleicht sollte ich nicht auf eine Universität gehen? Ich kann ohne Universität nach Belieben programmieren. “ Zu diesem Gedanken neigte ich auch, dass das Internet oft schrieb, der Programmierer brauche keinen Turm. Während ich dachte - „handeln oder nicht handeln?“, Entschied sich das Leben für mich. Mein Vater hat sich auf einer Dating-Site angemeldet, eine neue Liebe für sich gefunden und mich mit seiner Mutter geworfen. Als ich merkte, dass meine Mutter mich während meines Studiums nicht alleine unterstützen konnte, begann ich nicht, eine Universität zu besuchen. Nach dem Lyzeum musste ich ein Jahr in einem Unternehmen arbeiten. Ich bekam einen Job in einem Lebensmittelgeschäft, war damit beschäftigt, TTN zu extrahieren und die Waren, die in das Geschäft kamen, in einen Computer einzugeben. Nachdem ich ein bisschen im Laden gearbeitet habe, habe ich ein Programm geschrieben, das die Datenbank der Produkte im Laden analysiert und nach möglichen Problemen sucht. Danach bot die Firma, die den Laden besaß, an, sie als Programmierer zu beauftragen, aber als sie herausfanden, dass ich keine Hochschulausbildung hatte, änderten sie ihre Meinung. Und ich blieb im Laden arbeiten. Mein Gehalt war nicht schlecht, aber das Einkommen von Betrügern war sehr bescheiden. Die Einkommen waren niedrig, da die Registrierung von Konten viel Zeit in Anspruch nahm und es in Belarus sehr schwierig war, mit Internetgeldern zu arbeiten. Liberty Reserve - Internetgeld, dessen Arbeit von einer Bank in Costa Rica bereitgestellt wurde, die der Regierung keine Informationen über ihre Kunden übermittelte, weshalb die meisten Betrüger Liberty Reserve verwendeten.

In Weißrussland war es besonders schwierig, dieses Geld zu kaufen, da man in automatischen Geldwechslern das Siebenfache bezahlen musste (wenn das Gedächtnis dient) und das Kaufen von Leuten ein riskantes Geschäft war. Ich habe aufgehört, Betrüger zu betrügen, und Einkommen erhalten, nur von der Arbeit. Nachdem ich ein Jahr gearbeitet hatte, entschied ich mich, etwas besseres zu suchen. Ich hatte eine Menge Geld zur Hand und entschied mich, meinen Computer zu aktualisieren. Merkmale des neuen PCs: AMD Athlon 64 x2 2600 (mit Unterstützung für SSE2-Anweisungen, die nicht im vorherigen Prozessor enthalten waren. Dies ist wichtig!), 1 GB RAM, 80 GB Festplatte. Als ich daran dachte, dass ich Kubuntu lernen wollte, aber eine zu kleine Festplatte hatte, entschied ich mich, Linux und Windows gleichzeitig zu installieren, da ich keine Probleme mit der Festplatte hatte. Als ich zum Computerlaufwerksspeicher ging, kaufte ich ein openSUSE 10.2-Laufwerk. Meine neue Aufgabe bestand darin, Computer in einer der Firmen in meiner Stadt zu reparieren, mit einer Probezeit von einem Monat. Der Firmenchef und seine Frau entwickelten eine Art Buchhaltungssoftware und lernten, dass ich gerne programmiere. Sie boten an, sich für einen Prozentsatz des zukünftigen Umsatzes zu beteiligen. Da sie sich jedoch in Visual FoxPro und SQL entwickelten, musste ich diese Sprachen lernen. Ich habe zugestimmt. Einen Monat später stellte sich heraus, dass sie mich nicht zur Arbeit bringen wollten, aber sie brauchten mich, um den Angestellten zu ersetzen, der nach seiner Rückkehr in den Urlaub gefahren war. Sie sagten, dass sie mich nicht mehr brauchten, aber trotzdem wollten, dass ich ihnen half Mit der Entwicklung habe ich mich natürlich geweigert und mich auf die Suche nach einem neuen Job gemacht. Mehrere Monate erfolgloser Durchsuchungen führten dazu, dass ich als Hilfsarbeiter auf die Baustelle ging.

Das Gehalt des Hilfsarbeiters war 3,5-mal niedriger als das des Computerbetreibers im Laden, aber ich muss sagen, dass die Arbeit viel einfacher ist (ich war ein starker Typ). Während des Wochenendes begann ich mit FASM, diese neuen SSE2-Anweisungen für mich zu lernen. Nachdem ich experimentiert hatte, stellte ich fest, dass diese Anweisungen bei einigen Aufgaben die Produktivität erheblich steigern können. Ich habe mich gefragt, wie Softwareentwickler SSE2-Anweisungen in ihre Anwendungen einbetten. Wenn alle Aufgaben, bei denen die Verwendung von SSE2 sinnvoll ist, mit ihnen gelöst werden, wird das Programm nicht auf Computern ohne SSE2-Unterstützung ausgeführt. Wenn Sie sie jedoch nicht verwenden, wird das Programm ausgeführt wird langsamer arbeiten. Natürlich können Sie zu Beginn des Programms herausfinden, ob der Prozessor SSE2 unterstützt, und je nach Ergebnis unterschiedlichen Code ausführen. In diesem Fall steigt jedoch die Komplexität der Entwicklung und des Testens sowie der erhöhte Verbrauch von RAM und Prozessor-Cache. Nach der Analyse mehrerer Programme stellte ich fest, dass die meisten Programme SSE2 nicht verwenden. Und dann fragte ich mich: "Warum kompilieren Compiler keine Makros in Assembler und auf dem Computer des Endbenutzers werden die für Makros erforderlichen Konstanten von einem Dienstprogramm nicht ausgefüllt und erst danach wird eine Binärdatei erstellt?" Und ich erinnerte mich an den modifizierten Pascal, den ich am Lyceum erfunden hatte, und beschloss, einen solchen Compiler zu schreiben. Ich traf auch die Entscheidung, der Sprache Generika hinzuzufügen, und die Sprache sah ungefähr so ​​aus:

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/de481276/


All Articles