Existe uma linguagem de programação compilada* com digitação dinâmica, talvez até fraca?
-
23-09-2019 - |
Pergunta
Eu me perguntei se existe uma linguagem de programação que compila para código de máquina/binário (não bytecode e então executado por uma VM, isso é algo completamente diferente quando se considera a digitação) que apresenta digitação dinâmica e/ou fraca, por exemplo:
Pense em uma linguagem compilada onde:
- Variáveis não precisam ser declaradas
- Variáveis podem ser criadas durante o tempo de execução
- Funções podem retornar valores de diferentes tipos
Questões:
- Existe tal linguagem de programação?
- (Por que não?
Eu acho que uma linguagem compilada de tipo dinâmico, mas forte, realmente faria sentido, mas é possível?
Solução
Acredito que Lisp se encaixa nessa descrição.
Outras dicas
Objective-C pode ter algumas das propriedades que você procura.As classes podem ser abertas e alteradas em tempo de execução, e você pode enviar qualquer tipo de mensagem para um objeto, independentemente de ele responder normalmente ou não.Dessa forma, você pode implementar a digitação duck, assim como em Ruby.O tipo id
, aproximadamente equivalente a um void*
, pode ser dotado de interfaces que especificam um contrato ao qual o tipo (de outra forma desconhecido) irá aderir.
O C# 4.0 tem muitas, senão todas essas características.Se você realmente deseja código de máquina nativo, você pode compilar o bytecode até o código da máquina usando um utilitário.
Em particular, a utilização do dynamic
A palavra-chave permite que objetos e seus membros sejam vinculados dinamicamente em tempo de execução.
Confira o vídeo de Anders Hejlsberg, O futuro do C#, para uma cartilha:
Objective-C tem muitos dos recursos que você mencionou:ele compila em código de máquina e é efetivamente digitado dinamicamente em relação às instâncias de objeto.O id
type pode armazenar qualquer instância de classe e Objective-C usa passagem de mensagens em vez de chamadas de função de membro.Os métodos podem ser criados/adicionados em tempo de execução.O tempo de execução do Objective-C também pode sintetizar variáveis de instância de classe em tempo de execução, mas as variáveis locais ainda precisam ser declaradas (assim como em C).
O C# 4.0 possui muitos desses recursos, exceto que é compilado em IL (bytecode) e interpretado usando uma máquina virtual (o CLR).Isso traz à tona um ponto interessante, no entanto:se o bytecode for compilado just-in-time em código de máquina, isso conta?Nesse caso, isso abre a porta não apenas para qualquer uma das linguagens .Net, mas também para Python (consulte PyPy ou Andorinha sem carga ou FerroPython) e Ruby (veja MacRuby ou FerroRubi) e muitas outras linguagens de tipo dinâmico, sem mencionar muitas variantes do LISP.
Sim, é possível.Ver Júlia.É uma linguagem dinâmica (você pode escrever programas sem tipos), mas nunca roda em uma VM.Ele compila o programa em código nativo em tempo de execução (compilação JIT).
Na mesma linha do Lisp, existe Fator, uma linguagem concatenativa* com sem variáveis por padrão, digitação dinâmica e um sistema de objetos flexível.O código do fator pode ser executado no interpretador interativo ou compilado em um executável nativo usando seu deploy
função.
* baseado em pilha funcional sem pontos
VB 6 tem mais disso
Não conheço nenhuma linguagem que tenha exatamente essas capacidades.Posso pensar em dois que têm um subconjunto significativo:
- D possui inferência de tipo, coleta de lixo e recursos poderosos de metaprogramação, mas compila em código de máquina eficiente.No entanto, ele não possui digitação dinâmica.
- C# pode ser compilado diretamente em código de máquina por meio do projeto mono.C# possui um conjunto de recursos semelhante ao D, mas novamente sem digitação dinâmica.
Python para C provavelmente precisa desses critérios.
Escreva em Python.
Compile Python para executável.Ver Processo para converter script Python simples em executável do Windows.Veja também Escrevendo tradutor de código de Python para C?