[JAVA] Verschluss der Pony- und Referenzfähigkeit

Was ist Pony?

Kennen Sie die Sprache Pony? Einfach ausgedrückt handelt es sich um eine "statisch typisierte objektorientierte Sprache, die mit dem Actor-Modell eine parallele und parallele Verarbeitung durchführen kann". Darüber hinaus handelt es sich um eine Sprache namens ** Capabilities-Secure **, die zahlreiche Funktionen bietet, um nicht nur Typen, sondern auch Fehler im Zusammenhang mit der Parallelverarbeitung zur Kompilierungszeit zu erkennen. Unter diesen möchte ich kurz ** Referenzfähigkeit **, ein rudimentäres Konzept, durch Abschluss einführen.

Zähler mit einem Verschluss

Eine Gegenimplementierung, die häufig als Beispiel für die Schließung angeführt wird. Ich habe es in mehreren Sprachen implementiert, um das Verständnis der Leistungsfähigkeit der Referenzfähigkeit von Pony zu erleichtern.

Es wird davon ausgegangen, dass die folgenden Ergebnisse für beide Sprachen ausgegeben werden.

1
2
3
4
5
6
7
8
9
10

JavaScript

const createCounter = () => {
    let count = 0;

    return () => {
        count += 1;
        return count;
    }
}

const counter = createCounter();

Array.from({length: 10}, () =>
    console.log(counter())
)

Java

import java.util.function.*;
import java.util.stream.IntStream;

public class Counter {
    public static void main(String ...args) {
        final Supplier<IntSupplier> createCounter = () -> {
            //Da count endgültig ist, wird der Wert mithilfe eines Arrays neu geschrieben.
            final Integer[] count = {0};

            return () -> {
                count[0]++;
                return count[0];
            };
        };

        IntSupplier counter = createCounter.get();
        IntStream.rangeClosed(1, 10).forEach(i -> {
            System.out.println(counter.getAsInt());
        });
    }
}

Scala

object Counter extends App {
  val createCounter = () => {
    var count = 0

    () => {
      count += 1
      count
    }
  }

  val counter = createCounter()

  (1 to 10).foreach { _ =>
    println(counter())
  }
}

Die Implementierung durch JavaScript und Scala ist im Konzept ähnlich. Ähnlich ist es, dass eine anonyme Funktion eine freie Variable annehmen, zu einem Abschluss werden und den Wert der freien Variablen neu schreiben kann.

Auf der anderen Seite kann Java nur Variablen (* 1) importieren, die mit `` `final``` als freie Variablen deklariert sind. Importieren Sie also veränderbare Objekte wie Arrays anstelle von primitiven Werten und schreiben Sie das Referenzziel neu. Sie können den Wert nur mit ändern. Dies ist ein sicheres und korrektes Verhalten für einen Verschluss, kann jedoch hinsichtlich Bequemlichkeit und Lesbarkeit hart sein.

Zähler von Pony

Welchen Ansatz verfolgt Pony, um die oben aufgeführten Sprachprobleme zu lösen? Beachten Sie die Variable `count```, die im Code erscheint. Standardmäßig kann Pony den Wert einer freien Variablen, die von außerhalb des Lambda-Ausdrucks stammt, nicht umschreiben. In dieser Hinsicht verhält es sich wie Java. Wenn Sie den Wert einer Variablen neu schreiben möchten, fügen Sie dem Lambda-Ausdruck das Schlüsselwort ref``` hinzu. Auf diese Weise kann der Lambda-Ausdruck selbst die darin enthaltenen Variablen neu schreiben. Außerdem bleibt `` count 0, mit Ausnahme von Lambda-Ausdrücken, die` `` count aktualisieren. Wenn Sie es wirklich aktualisieren möchten, benötigen Sie einen Ansatz wie das Einfügen in ein Array wie Java. Es scheint jedoch nur wenige solcher Fälle zu geben, sodass Sie sehr sicheren Code schreiben können.

use "collections"

actor Main
  new create(env:Env) =>
    let createCounter = {(): {ref(): U32} => 
      var count = U32(0)
      
      //Mit dem Schlüsselwort ref ist es möglich, den Wert von count neu zu schreiben.
      {ref()(count): U32 => 
          count = count + 1
          count
      }
    }
    
    let counter = createCounter()
    
    for i in Range[U32](0,10) do
      env.out.print(counter().string())
    end

refWenn Sie mit entfernten Schlüsselwörtern kompilieren, wird die folgende Fehlermeldung angezeigt: Es ist sehr leicht zu verstehen.

Error:
main.pony:9:17: cannot write to a field in a box function. If you are trying to change state in a function use fun ref
          count = count + 1

Zusammenfassung

Es ist ein sehr einfaches Beispiel, aber hat sich die Leistungsfähigkeit von ** funktionssicherem ** Code durch die Schließung durchgesetzt? Ich finde es attraktiv, Code durch Umschalten des Modus sicher schreiben zu können, anstatt zu vereinheitlichen, ob ein Umschreiben je nach Sprachspezifikation möglich oder unmöglich ist. Dies ist nur ein Teil der Attraktivität von Pony. Lassen Sie uns gemeinsam mit Pony's Charme in Kontakt treten!

Ergänzung

Recommended Posts

Verschluss der Pony- und Referenzfähigkeit
Basisdatentyp und Referenztyp
Grundlegende Datentypen und Referenztypen (Java)
Java-Referenzmechanismus (Stack und Heap)
[PHP] Vererbungs-, Schutz- und Referenzmuster
Java als Wert übergeben und als Referenz übergeben
Unterschied zwischen primitivem Typ und Referenztyp
Informationen zu primitiven Java-Typen und Referenztypen
Java-Basisdatentypen und Referenztypen