Domanda

L'articolo Wikipedia su Sistema di effetti è attualmente solo un breve stub e da un po 'mi chiedo cosa sia un sistema di effetti.

  • Esistono lingue che hanno un sistema di effetti oltre a un sistema di tipi?
  • Quale sarebbe una possibile (ipotetica) notazione in un linguaggio tradizionale , che conosci, con gli effetti?
È stato utile?

Soluzione

Un "tipo e sistema di effetti" descrive non solo i tipi di valori in un programma, ma le modifiche in tali valori. & Quot; Typestate " il controllo è un'idea correlata.

Un esempio potrebbe essere un sistema di tipi che tiene traccia degli handle di file: invece di avere una funzione chiudi con tipo restituito void , il sistema dei tipi registrerebbe l'effetto di chiudi come eliminazione della risorsa file: qualsiasi tentativo di leggere o scrivere sul file dopo aver chiamato chiudi diventerebbe un errore di tipo.

Non sono a conoscenza di alcun tipo e sistema di effetti che appare in un linguaggio di programmazione tradizionale. Sono stati usati per definire analisi statiche (ad esempio, è del tutto naturale definire un'analisi per il corretto blocco / sblocco in termini di effetti). Come tale, i sistemi di effetti sono generalmente definiti usando schemi di inferenza piuttosto che sintassi concreta. Potresti immaginare una sintassi simile a

File open(String name) [+File]; // open creates a new file handle
void close(File f)     [-f]   ; // close destroys f 

Se vuoi saperne di più, i seguenti articoli potrebbero essere interessanti (giusto avvertimento: i documenti sono piuttosto teorici).

Altri suggerimenti

(Questa non è una risposta autorevole; sto solo cercando di strascicare la mia memoria.)

In un certo senso, ogni volta che codifichi una 'monade di stato' in una lingua, stai usando il sistema dei tipi come potenziale sistema di effetti. Quindi "Stato" o " IO " in Haskell catturare questa nozione (IO acquisisce anche molti altri effetti). Ricordo vagamente di aver letto articoli su varie lingue che usano sistemi di tipi avanzati, tra cui cose come "tipi dipendenti". controllare una gestione più fine degli effetti, in modo che ad esempio il sistema tipo / effetto potesse acquisire informazioni su quali posizioni di memoria sarebbero state modificate in un dato tipo di dati. Ciò è utile, in quanto fornisce modi per consentire a due funzioni che modificano bit di stato reciprocamente esclusivi di "commutare". (le monadi in genere non si spostano e le diverse monadi non sempre si compongono bene l'una con l'altra, il che spesso rende difficile la digitazione (leggi: assegna un tipo statico a) programmi "ragionevoli") ...

Un'analogia a un livello molto ondulato è come Java ha verificato le eccezioni. Esprimi ulteriori informazioni nel sistema di tipi su determinati effetti (puoi pensare a un'eccezione come a un "effetto" ai fini dell'analogia), ma questi "effetti" in genere perdono in tutto il programma e non compongono bene in pratica (si finisce con un milione di clausole 'getta' o si ricorre a molti tipi di eccezioni di runtime non controllate).

Penso che si stiano facendo molte ricerche in questo settore, sia per i linguaggi di ricerca che per quelli di mainstream-y, poiché la capacità di annotare le funzioni con le informazioni sull'effetto può sbloccare la capacità del compilatore di fare una serie di ottimizzazioni, può influire concorrenza e può fare grandi cose per varie analisi e strumenti del programma. Personalmente non ho grandi speranze per questo presto, però, poiché penso che molte persone intelligenti ci stiano lavorando da molto tempo e c'è ancora molto poco da mostrare per questo.

Puoi dare un'occhiata a http://www.haskell.org/haskellwiki/DDC

È una versione di Haskell che implementa un sistema di effetti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top