Pergunta

Eu já vi algumas comparações entre Smalltalk e Ruby por um lado e Ruby e Python por outro, mas não entre Python e Smalltalk. Gostaria especialmente de saber quais são as diferenças fundamentais de implementação, sintaxe, extensiabillidade e filosofia.

Por exemplo, Python não parece ter metaclasses. SmallTalk não tem conceito de geradores. E embora ambos sejam dinâmicos digitados dinâmico, acredito que o Python não faz o envio dinâmico do método. Isso está correto?

Foi útil?

Solução

Por exemplo, Python não parece ter metaclasses.

Com certeza - simplesmente não gera implicitamente uma nova metaclasse para todas as aulas: usa o mesmo metaclasse que a classe pai ou type por padrão. A filosofia de design de Python, também conhecida import this no prompt de um intérprete interativo; O ponto aplicável aqui é o segundo: "Explícito é melhor que implícito".

No Python 2.x, você especifica um metaclasse personalizado com a seguinte sintaxe:

class sic:
  __metaclass__ = mymeta
  ...

No Python 3.x, com mais elegância, você usa a sintaxe do nome nomeado:

class sify(metaclass=mymeta):
  ...

SmallTalk não tem conceito de geradores.

Os geradores do Python são funções de primeira classe (normalmente independentes) e o SmallTalk não tem o conceito de funções "independentes"-possui métodos nas classes. Mas certamente tem iteradores - como aulas, é claro:

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

Como o SmallTalk possui "blocos de código" de primeira classe (Ruby os tirou), você realiza iteração, assim como outras "estruturas de controle", enviando um bloco de código para um método adequado e, se desejar, pode fazer isso diretamente com a coleção (pense select:):

aCollection select: [:item | item doSomething].

Então, em SmallTalk (e Ruby), você envia o bloco de código para a iteração; O Python faz as coisas ao contrário, a iteração envia valores para o código "chamando" circundante. Parece muito diferente, mas não "profundamente" diferente no final.

Os blocos de código de primeira classe significam que o SmallTalk não precisa nem tem declarações e palavras-chave de "estrutura de controle", como if ou while: Eles podem ser realizados enviando blocos de código como argumentos de métodos apropriados (por exemplo ifTrue: método de booleanos). (Ruby escolhe ter as palavras -chave/declarações além do que, além do mais para os blocos de código de primeira classe; Eu diria que Python [[explicitamente]] e SmallTalk [[implicitamente]] tentam, como C, "oferecer uma única maneira de executar uma operação", enquanto Ruby está mais na Escola Perl-ish de "Existem muitas maneiras de para fazer isso ").

E embora ambos sejam dinâmicos digitados dinâmico, acredito que o Python não faz o envio dinâmico do método. Isso está correto?

Não, absolutamente incorreto - python intensamente Despacho de método dinâmico, para extremos. Considere por exemplo:

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

Pela semântica do Python, isso realiza 10 pesquisas para método bah dentro myobject - apenas no caso de a execução anterior do método ter causado myobject para se reestruturar totalmente internamente para que seja seu atual bah o método é completamente diferente do anterior Uma (pode ser uma coisa bastante insana para o programador confiar em um dinamismo tão furioso, mas o Python o suporta). Esta é a razão que faz:

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

Uma otimização manual comum no código Python-faz uma pesquisa dinâmica antes do loop em vez de 10 dentro do loop, uma por perna (é um caso de "elevação constante", já que o compilador é proibido de fazer a "dobra constante" em si pelas regras extremas do Python para pesquisas dinâmicas - a menos que possa provar que é garantido que seja inócuo e, na prática, essa prova é muito difícil para que as implementações do Python normalmente não se incomode).

O Python usa namespaces unificados: os métodos são atributos de um objeto como qualquer outro, exceto que são chamáveis. É por isso que extrair o método sem chamá -lo (conhecido como "método vinculado"), definindo uma referência a ele em uma variável (ou guardando -a em uma lista ou outro contêiner, devolvendo -o de uma função, seja um claro Operação simples, como no exemplo constante acima.

SmallTalk e Ruby têm espaços de nome separados para métodos e outros atributos (em pequenos atributos não-metodos não são visíveis fora dos próprios métodos do objeto); portanto, "extrair um método" e "chamar o objeto resultante" requer uma cerimônia mais introspectiva (mas o comum Caso de despacho pode ser assim, assim, marginalmente mais simples em certos casos-em particular, "apenas mencionando" um método sem argumento o chama implicitamente, enquanto em Python, como em C, chamadas é explicitamente executado pela anexação de parênteses, enquanto "apenas mencionando ", bem ..." apenas menciona ", disponibilizando -o para qualquer tipo de operação explícita Incluindo chamando ;-).

Outras dicas

Python certamente tem metaclasses.

SmallTalk tem alguns recursos incomuns:

  • Tem uma sintaxe bastante simples e apenas 6 (!) Palavras -chave. Tudo o mais (incluindo a definição de novas classes) é realizado chamando métodos (enviando mensagens no SmallTalk). Isso permite que você crie algum DSL dentro do idioma.
  • No SmallTalk, você não armazena arquivos de origem, mas, em vez disso, possui uma grande imagem de memória e a modifica em tempo real. Você também pode modificar a maior parte do próprio SmallTalk (e possivelmente quebrá -lo;)

Eu tenho lido codificadores no trabalho O que é um livro muito bom, cheio de entrevistas com os principais programadores. De qualquer forma, um deles é o inventor de SmallTalk e ele fala em comprimento em seu idioma e como ele se relaciona com Python (ele gosta muito de Python). O único problema que ele teve com o Python foi o código lento ... ele realmente queria ter o compilador JIT SmallTalk como um back -end para o Python, mas infelizmente devido ao software pertencente à empresa em que trabalhava, isso não era possível.

De qualquer forma ... talvez não seja um ponto a ponto de comparação, mas realmente uma boa leitura de qualquer maneira este livro.

SmallTalk não tem conceito de geradores.

É verdade, mas eles podem ser implementados na maioria dos dialetos SmallTalk de dentro do idioma. GNU SmallTalk vem com geradores como parte de seu Biblioteca de fluxo.

De acordo com WikipediaPágina do Dynamic Method Dispatch:

Implementação de SmallTalk

SmallTalk usa um despachante de mensagem baseado em tipo. Cada instância possui um único tipo cuja definição contém os métodos. Quando uma instância recebe uma mensagem, o despachante procura o método correspondente no mapa mensagem para métodos para o tipo e chama o método. [...

Muitos outros idiomas dinamicamente digitados, incluindo Pitão, Ruby, Objective-C e Groovy usam abordagens semelhantes.

Ênfase adicionada, e um parágrafo cortou. Então, pelo menos essa parte parece ser semelhante entre os dois idiomas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top