6

Ho visto alcuni confronti tra Smalltalk e Ruby da un lato e Ruby e Python dall'altra, ma non tra Python e Smalltalk. Mi piacerebbe soprattutto sapere quali sono le differenze fondamentali in Implementation, Syntax, Extensiabillity e Philosophy.Come Smalltalk (Pharo per esempio) si confronta con Python?

Per esempio Python non sembra avere metaclassi. Smalltalk non ha concetto di generatori. E sebbene entrambi si dica che siano tipizzati dinamicamente, credo che Python non esegua il dispatch dinamico dei metodi. È corretto?

+2

"Mi piacerebbe soprattutto sapere quali sono le differenze fondamentali in Implementation, Syntax, Extensibility e Philosophy." Beh, questo è praticamente tutto. Quindi l'unico modo per rispondere a questa domanda è insegnarti entrambe le lingue. :-) –

+0

Ho imparato entrambi ora: D –

risposta

9

Per esempio Python non sembra avere metaclassi.

Lo fa sicuro - semplicemente non implicitamente genera un nuovo metaclasse per ogni classe: si utilizza lo stesso metaclasse come la classe genitore, o type per impostazione predefinita. La filosofia di design di Python, alias "The Zen of Python", può essere esaminata facendo import this al prompt dell'interprete interattivo; il punto applicabile qui è il secondo, "Explicit è meglio di implicito".

In Python 2.X, si specifica un metaclasse personalizzato con la seguente sintassi:

class sic: 
    __metaclass__ = mymeta 
    ... 

In Python 3.X, più elegantemente, si utilizza la sintassi-argomento denominato:

class sify(metaclass=mymeta): 
    ... 

Smalltalk non ha il concetto di generatori .

I generatori di Python sono di prima classe (in genere indipendenti) e Smalltalk non ha il concetto di funzioni "standalone": ha metodi all'interno delle classi. Ma certamente non hanno iteratori - come classi, ovviamente:

iterator := aCollection iterator. 
[iterator hasNext] whileTrue: [iterator next doSomething]. 

Dal Smalltalk ha prima classe "blocchi di codice" (Rubino li ha portati da esso), a realizzare l'iterazione, proprio come le altre "strutture di controllo" , con l'invio di un blocco di codice per un metodo adeguato, e se lo si desidera si può fare direttamente con la raccolta (si pensi select:):

aCollection select: [:item | item doSomething]. 

Così in Smalltalk (e Ruby) si invia il blocco di codice per l'iterazione ; Python fa le cose al contrario, l'iterazione invia valori al codice "chiamata" circostante. Sembra molto diverso, ma non "profondamente" diverso alla fine.

blocchi di codice di prima classe significa che Smalltalk non ha bisogno né hanno dichiarazioni e parole chiave come if o while "struttura di regolazione": possono essere realizzate mediante l'invio di blocchi di codice come argomenti di metodi adeguati (ad esempio ifTrue: metodo booleani). (Ruby sceglie di avere le parole chiave/le affermazioni in aggiunta ai blocchi di codice di prima classe, direi che Python [[esplicitamente]] e Smalltalk [[implicitamente]] provano entrambi, come C, per "offrire un unico modo eseguire un'operazione ", mentre Ruby è più nella scuola Perl di" ci sono molti modi per farlo ").

E anche se entrambi sono detto di essere dinamicamente tipizzati, io credo che Python non fa metodo dinamico spedizione. È corretto questo ?

No, assolutamente non corretta - Python intensamente non metodo dinamico spedizione, agli estremi.Consideriamo ad esempio:

for i in range(10): 
    myobject.bah() 

Per semantica Python, questo esegui 10 ricerche per il metodo bah in myobject - nel caso precedente esecuzione del metodo aveva causato myobject a tutto ristrutturarsi internamente in modo che la sua corrente Il metodobah è completamente diverso da quello precedente (potrebbe essere una cosa abbastanza folle per il programmatore affidarsi a un tale dinamismo furioso, ma Python lo supporta). Questa è la ragione che rende:

themethod = myobject.bah 
for i in range(10): 
    themethod() 

un comune mano ottimizzazione nel codice Python - fa una ricerca dinamica prima del ciclo, invece di 10 all'interno del ciclo, una per gamba (si tratta di un caso di "sollevamento costante" , dal momento che al compilatore è vietato eseguire la "costante piegatura" stessa dalle regole estreme di Python per ricerche dinamiche - a meno che non possa provare che sia innocuo, e in pratica tale dimostrazione è troppo difficile quindi le implementazioni Python di solito non disturbano).

Python utilizza gli spazi dei nomi unificati: i metodi sono attributi di un oggetto come qualsiasi altro, tranne che sono richiamabili. Ecco perché estrarre il metodo senza chiamarlo (noto come "metodo associato"), impostando un riferimento ad esso in una variabile (o nascondendolo in una lista o in un altro contenitore, restituendolo da una funzione, qualunque cosa sia) è chiaro e operazione semplice come nell'esempio di sollevamento costante di cui sopra.

Smalltalk e Ruby hanno spazi dei nomi separati per i metodi e altri attributi (in Smalltalk, gli attributi non dei metodi non sono visibili al di fuori dei metodi dell'oggetto), quindi "estrarre un metodo" e "chiamare l'oggetto risultante" richiedono una cerimonia più introspettiva (ma il caso comune di dispatching può essere in tal modo reso leggermente più semplice in alcuni casi - in particolare, "solo menzionare" un metodo senza argomenti lo chiama implicitamente, mentre in Python, come in C, la chiamata viene esplicitamente eseguita aggiungendo parentesi, mentre "solo menzionando", beh ... "menziona" semplicemente, rendendolo disponibile per qualsiasi tipo di operazione esplicita compresa la chiamata ;-).

1

Secondo la pagina Wikipedia s' sul metodo di spedizione dinamica:

Smalltalk Attuazione

Smalltalk utilizza una base di tipo di messaggio dispatcher. Ogni istanza ha un singolo tipo la cui definizione contiene i metodi . Quando un'istanza riceve un messaggio , il dispatcher cerca il metodo corrispondente nella mappa messaggio-per-metodo per il tipo e quindi richiama il metodo. [...]

Molti altri dinamicamente tipizzati lingue, tra cui Python , Ruby, Objective-C e Groovy uso simile approcci.

Enfasi aggiunta e un paragrafo tagliato. Quindi, almeno quella parte sembra essere simile tra le due lingue.

2

Ho letto coders at work che è davvero un bel libro pieno di interviste con i migliori programmatori. Comunque, uno di loro è l'inventore di smalltalk e parla a lungo del suo linguaggio e di come si rapporta a Python (a lui piace anche un po 'di pitone). L'unico problema che aveva con python era il codice lento ... voleva davvero avere il compitatore jit smalltalk come backend per python, ma sfortunatamente a causa del software appartenente alla società per cui lavorava, questo non era possibile.

comunque ... forse non un confronto punto per punto, ma davvero una buona lettura comunque questo libro.

7

Python ha sicuramente metaclassi.

Smalltalk ha alcune caratteristiche insolite:

  • Ha un piuttosto semplice sintassi e solo circa 6 parole chiave (!). Tutto il resto (compresa la definizione di nuove classi) si ottiene chiamando i metodi (inviando messaggi in Smalltalk). Questo ti permette di creare alcuni DSL nella lingua.
  • In Smalltalk, non si memorizzano i file di origine, ma si ha invece una grande immagine di memoria e la si modifica al volo. È inoltre possibile modificare la maggior parte del Smalltalk stesso (e forse romperlo;)
2

Smalltalk non ha alcun concetto di generatori .

Vero, ma possono essere implementati nella maggior parte dei dialoghi Smalltalk all'interno della lingua. GNU Smalltalk viene fornito con i generatori come parte del suo stream library.

Problemi correlati