Pergunta

Eu estou tentando obter um melhor controle sobre o que realmente significa para uma linguagem a ser "dinâmico". Eu tenho um pouco de experiência com Lingo , que é a linguagem de script para o Adobe (anteriormente Macromedia) linha de produtos Diretor, e eu só estou querendo saber se ele seria considerado uma "linguagem dinâmica".

As variáveis ??vias e listas são tratados parece muito "linguagem dinâmica" ish para mim.

Com variáveis, você poderia apenas escrever foo = 3 ou bar = "Hello World". Você não declarar uma variável como um int ou string -. Ele descobre que como é vai

Com as listas, você pode simplesmente escrever algo como miscCollection = [3, "Hello World", #helloWorld, ["Embedded List", "Goes Here", 3], [#phrase: "Property List goes here", #value: 3]]. Isso não seria semelhante a um tuple?

São estes recursos suficientes para beneficiar do estatuto de "linguagem dinâmica"?

Curiosamente, eu tenho usado C # muito mais e Diretor / Lingo muito menos, mas com toda a excitação sobre linguagens dinâmicas nos dias de hoje, gostaria de saber se eu estou realmente ir contra a corrente.

Editar

Em relação resposta Mark Rushakoff, abaixo, aqui é uma tentativa de analisar se Lingo qualifica como "dinâmico" de usar este Wikipedia artigo :

  1. Eval - Lingo tem do e value palavras-chave. do irá executar um comando inteiro, por exemplo, do "foo = 23" ou do "foo = sum(20, 3)". tentativas value para converter uma string em um valor numérico, mas é mais do que apenas um operador de análise - pode realmente converter a representação de uma variável em seu número, por exemplo, assumindo foo = 23, o value("foo") declaração irá avaliar a 23

  2. de ordem superior Funções - Se eu estou entendendo esse direito, este é basicamente o que eu seria chamado de "delegado" em C #. não Lingo não suporta isso diretamente, tanto quanto eu sei, embora você poderia criar um tipo (chamado um "script pai") que tem uma função e passar uma instância do tipo.

  3. Closures -. Não há suporte para este, tanto quanto eu sei

  4. continuação -. Não há suporte para este, tanto quanto eu sei

  5. Reflexão - Em certo sentido, pelo menos, sim. Você realmente criar novas instâncias de tipos usando uma corda, por exemplo, fooInstance = script("Foo").new(bar). Também é possível converter uma instância de um tipo em uma cadeia que contém o nome do tipo (assim você pode classificar de 's imitar c # funcionalidade GetType()). Você também pode consultar as propriedades de um tipo sem saber os nomes das propriedades (por exemplo, procurar um imóvel pelo índice) e descobrir os nomes das propriedades por índice.

  6. Macros - A forma como o artigo Wikipedia descreve um macro , eu não acredito que sim. É possível editar scripts em tempo de execução, no entanto, talvez por isso que conta.

Assim, parece que Lingo pontuação de 2 para 3 de 6 em características dinâmicas, mas eu não sou suficientemente clara sobre encerramentos e continuações de saber com certeza que Lingo não apoiá-los. Eu acho que eu não tenho certeza do que concluir. Comentários bem-vindos.

Foi útil?

Solução

"dinâmico" é uma daquelas palavras que está na moda, mas realmente significa pouco mais do que "O I fazer é cool" ... ele não tem uma definição precisa.

Dito isso, eu posso responder à sua pergunta sobre os tipos, ou pelo menos tentar explicar a diferença entre digitadas e sem tipo (o que algumas pessoas chamam de dinâmica, ou dinamicamente digitado) línguas melhor.

A digitado cheques de idioma que você nunca acabam tentando fazer algo com uma variável que você não pode fazer antes você executar o programa. Uma linguagem sem tipo não faz esta verificação -. Ele simplesmente espera pelo melhor e, se qualquer ponto que tem um valor que não é adequado para o que ele precisa, dá um erro

Esses são dois extremos. Como tudo na vida, em linguagens de prática estar em algum lugar entre os dois extremos teóricos. Por isso, às vezes é difícil dizer que uma língua é digitado ou sem tipo - muitas vezes tudo o que posso dizer é algo como "linguagem X tem melhor verificação de tipo em tempo de compilação do que a linguagem Y, porque esses erros são capturados em X, mas não no Y: ... . "

Dado que a definição que você pode se preocupar que (1) uma linguagem digitada requer muito mais texto no programa (porque você precisa dizer o que digitar cada valor é) e (2) que uma linguagem digitada pode restringir o que você pode fazer desnecessariamente (porque o sistema do tipo não é inteligente o suficiente para permitir que algo que você pode ver iria trabalhar).

Ambos os pode haver problemas. Mas eles são os dois problemas que estão recebendo menos importante como linguagens digitadas ficar melhor. Por exemplo, por que um código como:

String s = "hello"

quando é óbvio com apenas

s = "hello"

que "S" deve ser uma String? Línguas que são "inteligentes" como este, e onde você não precisa dizer o que todos os tipos são, mas eles ainda são verificados, são freqüentemente chamados de "Hindley Milner", porque essas são as pessoas que trabalhou pela primeira vez para fora como fazer isso em detalhes.

Então, quando você olha para um programa escrito para uma língua com um sistema de tipo Hindley Milner pode parecer que ele não tem tipos. Mas isso é um erro. Vai ainda, antes que o programa é executado, o trabalho para fora o que todos os tipos de todas as variáveis ??devem ser, e verifique se você não pode obter quaisquer erros por tentar fazer algo com o tipo errado (acho que isso é incrível - é perto de um tipo de inteligência artificial ...)

Isso significa que, por vezes, a única maneira de saber se uma linguagem é digitado ou não saber como ele é implementado. Pode não ser óbvio a partir de apenas olhando para a fonte.

Editar: Eu apenas re-ler o acima, e eu poderia ter sido um pouco mais clara. A distinção que eu estava tentando fazer era entre os idiomas que têm um tipo sistema e idiomas que não o fazem. A sistema de tipo inclui duas coisas:. Próprios e lógica tipos de verificar que os tipos estão corretas

As línguas que eu estava chamando "sem tipo" (ou digitado dinamicamente) têm tipos. Em Python, por exemplo (o qual é, uma linguagem dinâmica não tipado), há ainda uma diferença entre uma corda e um número inteiro. Mas eles não têm a lógica extra que verifica o programa antes é executado. Portanto, seria mais correto dizer que eles têm tipos, mas não têm um tipo sistema .

Em contraste "digitado" línguas, como eu disse, fazer verificação de antes o programa é executado, e assim deve ter não apenas tipos, mas a lógica extra para fazer esse trabalho.

Outras dicas

Digite inferência (como seus exemplos de foo = 3 e bar = "Hello World") não implica uma linguagem dinâmica. A palavra-chave var em C # infere o tipo de variável em tempo de compilação, e Haskell também pode usar digitação implícita para todas as variáveis, mesmo em programas compilados.

"linguagem de programação dinâmica" é um termo muito vagamente definido, mas eu acho que se você teve que restringi-lo a um qualificador, seria tempo de execução reflexão. Se você pode fazer reflexão, você provavelmente pode fazer os outros qualificadores listados no artigo Wikipedia (eval, objeto runtime alteração, fechos, macros ...).

Eu não sei nada sobre a linguagem Lingo, mas eu diria que é geralmente mais fácil de Desqualificar a linguagem como sendo dinâmica do que está a qualificar uma linguagem . Can Lingo fazer qualquer / todos os qualificadores no artigo Wikipedia? Se não, então ele simplesmente não é provavelmente dinâmico. Se pode fazer qualquer, então provavelmente é pelo menos "o suficiente dinâmica".

Quando as pessoas falam uma linguagem de programação a ser "dinâmico", eles são geralmente referindo-se a um sistema de tipo dinâmico. A melhor definição do que um sistema de tipo dinâmico é (eo que não é) que eu já li é excelente artigo de Chris Smith O que saber antes Debatendo Tipo Sistemas .

Uma vez que você ler esse artigo, eu acho que você deve ter a sua resposta sobre se alguma dadas qualifica a linguagem como sendo estática ou dinâmica digitado.

Eu gostaria de mostrar que Lingo é uma linguagem dinâmica.

Eu fiz LingoF um Funcional Programação Quadro de Lingo. Este quadro é inteiramente escrito em Lingo, não xtra, sem componentes de baixo nível usado, por isso não seria possível desenvolver tal quadro se o idioma não foi dinâmica.

Considerando esse quadro, aqui está a minha avaliação para Lingo como linguagem dinâmica:

1 - Eval - Lingo tem do e value palavras-chave. Além disso, você pode compilar um script em tempo de execução. Ver Recursos de LingoF "Lingo Expressões".

2 - de ordem superior Funções -. Espectáculos LingoF como possível é fazer uso extensivo de funções de ordem superior em Lingo

3 - Closures -. Novamente LingoF mostra como é possível trabalhar com Closures em Lingo

4 - continuação - ajudantes LingoF sintaxe são definidos com técnicas de continuação. É possível escrever funções na continuação Passando Style. Marque esta (retirado do módulo LingoF):

on public_factorialCPS_2
on fac me, n,k
  x = LingoF().var()
  if ( n = 0 ) then return k [1] 
  else return me.factorialCPS[$(#-,n,1) ] [ LingoF().fun(x) [ k [ $(#*,n,x) ]  ] ]
end

5 - Reflexão - Já respondeu sim e eu concordo. Por exemplo LingoF gerente de módulo é implementado usando Reflexão do Lingo características mencionadas por DanM.

6 - Macros - Vou ter que fazer mais pesquisas neste campo. Desde Director suporta Scripts referenciados (scripts armazenados em arquivos de texto externos) é possível implementar algum tipo de macros. Talvez o gerente macro pode interceptar alguns eventos como startMovie (para expandi-las) e stopMovie (comprimi-los novamente). Outra possibilidade é usar campos como scripts e expandi-los em membros de script, eu tenho certeza que ele vai funcionar bem.

Assim, a minha pontuação é de 5 a 6 de 6 em características dinâmicas.

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