[PYTHON] Skriptsprache KINX (Einführung)

Einführung

Ich habe diese Art von Dingen schon einmal geschrieben, aber als Handwerker war ich versucht, meine eigenen Werkzeuge herzustellen.

Nun, selbst wenn Sie nein sagen, können Sie es irgendwo finden (ich werde es hier nicht sagen), aber ich bin einsam, auch wenn ich selbstzufrieden bin. Lassen Sie uns also eine Spur von Erklärungen hinterlassen. (Ich werde diesen Artikel einzeln aktualisieren, wenn ich ihn dem Inhaltsverzeichnis hinzufüge.)

Inhalt (Links zu einzelnen Kommentarartikeln)

Als ich es stetig gepostet habe, hat sich die Anzahl der Artikel erheblich erhöht.

Was?

Eine Skriptsprache, die die traditionelle Syntax der C-Serie erbt, die der Hand vertraut ist. Das Ziel ist "** sieht aus wie JavaScript **, ** Gehirn (Inhalt) ist Ruby **, ** Stabilität ist AC / DC (?) **".

Ich habe noch keine Bibliotheken und grundlegenden Methoden, daher ist es noch nicht praktisch, aber der grundlegende Teil der Sprache funktioniert fast.

Es sieht aus wie JavaScript

Ein guter Erwachsener, kein Kind.

JavaScript ist die erfolgreichste Skriptsprache in der C-Familie. Es ist jedoch nicht gut für den Desktop. node.js ist praktisch, aber zu schwer und zu eigenartig in seinem Verhalten.

Auf der anderen Seite mag ich die Idee von Ruby, aber ich zögere es, die Syntax zu verwenden, dass "Ende" auffällt. Gewöhnliche Schlüsselwörter werden normalerweise begraben ...

Das Gehirn (Inhalt) ist Ruby

Trotzdem hasse ich Ruby-ähnliches Denken nicht. Ja, es ist nur eine Frage des Aussehens. Dann sollte es Ruby sein, der anders aussieht.

Ein Gefühl der Stabilität ist AC / DC

Lassen Sie uns den Ort emulieren, an dem es keine Unschärfe gibt.

Ursprung des Namens

Ich kann es nicht tief berühren (?), Aber das Meisterwerk "KING'S" von Red Warriors Sagen wir einfach, dass es auf KING'S zurückgeht.

Im Moment ist es "KINX" geworden, daher ist der Ursprung "[You Really Got Me](https: /), berühmt für ([VAN HALEN](https://ja.wikipedia.org/wiki/Van Halen)). /ja.wikipedia.org/wiki/You Really Gut Me) "original) Kinks Ich denke auch über Dinge nach.

Stichprobe

Detaillierte Erklärungen werden in einer Reihe geliefert. Es ist mir egal, ob Nachfrage besteht.

Wenn Sie die detaillierten Spezifikationen jetzt wissen möchten ... "hier" bitte beziehen Sie sich auf.

fibonacci

fib.kx


function fib(n) {
    if (n < 3) return n;
    return fib(n-2) + fib(n-1);
}

System.println(fib($$[1].toInt()));

Das erste, was zu schreiben ist, ist ein Benchmark. Es sieht aus wie JavaScript.

Zu dieser Zeit hat Ruby alle angeheizt und gesagt: "Geschwindigkeit ist nicht das Ziel, macht es nicht Spaß?" Als ich mir die Menge an Duft seit der Veröffentlichung von YARV ansah, sah ich, dass es sich bei dieser Haltung genau um "saure Trauben" handelte ... (Nein, ich mag Ruby, außer wie es aussieht)

Lassen Sie es uns sofort vergleichen. Übrigens würde ich gerne sehen, dass es in Python erscheint, das Ruby als Rivalen sieht. Im Vergleich zu diesem Bereich können Sie Ihre Fähigkeiten abschätzen. Der Quellcode lautet wie folgt. Python3 ist langsamer als Python2, also 2

fib.rb


def fib(n)
  if n < 3
    return n;
  else
    return fib(n-2) + fib(n-1);
  end
end

puts fib(ARGV[0].to_i)

fib.py


import sys

def fib(n):
    if n < 3:
        return n
    else:
        return fib(n-1) + fib(n-2)

print fib(int(sys.argv[1]))

Ergebnis

Zunächst die Versionsanzeige.

$ ruby --version
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86-64-linux-gnu]
$ python --version
Python 2.7.15+

Und das Ergebnis. Das Gerät ist ** "Sekunden" **. Der Befehl time wird in der Reihenfolge user time verwendet. Die schnellste Zeit habe ich ungefähr 5 Mal gemacht.

Sprache fib(34) fib(38) fib(39)
Ruby 0.391 2.016 3.672
Kinx 0.594 4.219 6.859
Python 0.750 5.539 9.109
Wert 9227465 63245986 102334155

Ruby ist super schnell. Langsam Langsam ist nur eine Geschichte der Vergangenheit. Es scheint eher, dass es in der schnellen Kategorie ist.

Ich habe Python geschlagen, also ist es so. Ich denke nicht daran, ein Geschwindigkeitskönig zu werden, also lasst es uns als akzeptablen Bereich festlegen, wenn es eine praktische Geschwindigkeit ist. Kinx hat jedoch tatsächlich einen speziellen Zug namens "native". Um ehrlich zu sein, ich weiß nicht, wie nützlich es in der Praxis ist, aber ich habe die Möglichkeit gespürt und es umgesetzt. Der Quellcode ist unten. Ich habe gerade function in native geändert.

nfib.kx


native fib(n) {
    if (n < 3) return n;
    return fib(n-2) + fib(n-1);
}

System.println(fib($$[1].toInt()));

Fügen wir der obigen Tabelle hinzu, um die Ergebnisse zu zeigen, wie sich diese geringfügige Änderung auf uns auswirkt.

Sprache fib(34) fib(38) fib(39)
Kinx(native) 0.063 0.453 0.734
Ruby 0.391 2.016 3.672
Kinx 0.594 4.219 6.859
Python 0.750 5.539 9.109
Wert 9227465 63245986 102334155

Kita.

Wie der Name schon sagt, wird eine Funktion mit dem Schlüsselwort "native" nativ in Maschinensprachencode kompiliert und von JIT ausgeführt, was Sie wahrscheinlich bereits kennen. Es ist schnell, nicht wahr? Der Code der Ausgabebaugruppe ist jedoch nicht optimiert oder weist keine Register zu, sodass er überhaupt nicht schön ist. Ich weiß nicht, ob es praktisch nützlich ist, da es verschiedene Einschränkungen gibt. Ich werde es später ansprechen, aber ich werde es heute nicht anfassen. Weitere Informationen finden Sie unter "hier".

Andere Eigenschaften

Ich werde diesmal nicht im Detail erklären, weil es eine Serie sein wird, aber ich werde nur zeigen, was Sie tun können.

Prototyp Basis

Prototypbasiert wie JavaScript. Es gibt jedoch kein "proto". Die Methode ist direkt an die Objekteigenschaft gebunden. Wenn Sie es überschreiben möchten, überschreiben Sie es einfach. Das Schlüsselwort class wird vorbereitet und die Klasse kann definiert werden. So was.

class ClassName {

    var privateVar_;

    private initialize() {
        privateVar_ = 0;
        this.publicVar = 0;
    }

    /* private method */
    private method1() { /* ... */ }
    private method2() { /* ... */ }

    /* public method */
    public method3() { /* ... */ }
    public method4() { /* ... */ }

}

var obj = new ClassName();

Müllabfuhr

Ein einfaches und klares Stop The World-Zeichen und Sweep. Ich bin bisher nicht in Schwierigkeiten (ich habe es nicht so oft benutzt), also gibt es kein Problem. Wenn es ein Problem gibt, denken Sie darüber nach.

Schließung

Funktionsobjekte haben einen lexikalischen Umfang und können Abschlüsse realisieren. Wenn es zu JavaScript wird (aber nicht), funktioniert es natürlich. So was.

function newCounter() {
    var i = 0;          // a lexical variable.

    return function() { // an anonymous function.
        ++i;            // a reference to a lexical variable.
        return i;
    };
}

var c1 = newCounter();
System.println(c1()); // 1
System.println(c1()); // 2
System.println(c1()); // 3
System.println(c1()); // 4
System.println(c1()); // 5

Lambda

Anonyme Funktionsobjekte können präzise geschrieben werden. Die Pfeilfunktion wurde in ES6 eingeführt, ist jedoch nicht genau dieselbe und erfordert am Anfang ein "&". Warum fragst du? Ich konnte mit Yacc nicht gut schreiben. Ich kann den Konflikt nicht lösen (sorry). So was.

function calc(x, y, func) {
    return func(x, y);
}

System.println("add = " + calc(10, 2, &(a, b) => a + b));
System.println("sub = " + calc(10, 2, &(a, b) => a - b));
System.println("mul = " + calc(10, 2, &(a, b) => a * b));
System.println("div = " + calc(10, 2, &(a, b) => a / b));
// add = 12
// sub = 8
// mul = 20
// div = 5

Ballaststoff

Eigentlich habe ich diese Funktion noch nie benutzt. Es ist nur in Ruby und es scheint praktisch zu sein, also habe ich es implementiert. Ich habe es mit dem leichten Gefühl versucht, dass ich es so machen kann, und es hat ganz gut funktioniert. Da der Stapelstatus jedoch während "Yield" nicht beibehalten wird, ist "Yield" nur als einzelne Ausdrucksanweisung gültig. Substitution ist möglich. Dies bedeutet, dass Sie "Ausbeute" nicht direkt als Funktionsargument einbetten können, aber Ausdrücke wie "a = Ausbeute 10;" sind in Ordnung. Zu diesem Zeitpunkt ist "a" ein Array von Argumenten des Aufrufers. Ein einfaches Beispiel sieht so aus.

var fiber = new Fiber(function() {
    System.println("fiber 1");
    yield;
    System.println("fiber 2");
});

System.println("main 1");
fiber.resume();
System.println("main 2");
fiber.resume();
System.println("main 3");
// main 1
// fiber 1
// main 2
// fiber 2
// main 3

Spread-Operator

Der in ES6 eingeführte Spread (Rest) -Operator (nicht wahr?). Ja, das wollte ich. Super praktisch. Es gibt verschiedene Verwendungszwecke, aber es sieht so aus.

function sample(a1, a2, ...a3) {
    // a1 = 1
    // a2 = 2
    // a3 = [3, 4, 5]
}

sample(1, 2, 3, 4, 5);

Schließlich

Vielen Dank, dass Sie so weit gelesen haben. Wenn Sie Lust dazu haben, verwenden Sie es bitte. Ich glaube, es gibt noch keinen praktischen Nutzen.

Beiträge sind willkommen. Am einfachsten können Sie einen Beitrag leisten, indem Sie auf "★" klicken. Es gibt immer noch wenige, aber wenn Sie es erhöhen, werden Sie motivierter sein. Ich hoffe es wird mehr ★ geben.

Hier (https://github.com/Kray-G/kinx).

Recommended Posts

Skriptsprache KINX (Einführung)
Inter-Ausführung der Skriptsprache
Einführung in die Python-Sprache
Einführung
Einführung in Protobuf-c (C-Sprache ⇔ Python)