2010-03-31 11 views
31

Mi chiedevo se v'è un linguaggio di programmazione che compila in codice macchina/binario (non bytecode poi eseguito da una macchina virtuale, che è qualcosa di completamente diverso se si considera battitura) che presenta dinamica e/o digitando deboli, ad esempio:Esiste un linguaggio di programmazione compilato * con una digitazione dinamica, forse anche debole?

Pensate di un linguaggio compilato dove:

  • variabili non devono essere dichiarate
  • Le variabili possono essere creati durante il runtime
  • funzioni possono restituire valori di tipi diversi

Domande:

  • Esiste un tale linguaggio di programmazione?
  • (Perché) no?

Penso che un linguaggio tipizzato dinamicamente forte ma compilato avrebbe davvero senso, ma è possibile?

+2

Um, C# 4.0? .... –

+0

@Robert Harvey: Questo è stato compilato per codice macchina? Ho pensato che fosse stato prima compilato in bytecode. –

+1

@Platinum: è possibile ottenere il codice macchina utilizzando NGen. –

risposta

6

L'obiettivo-C potrebbe avere alcune delle proprietà che si cercano. Le classi possono essere aperte e modificate in runtime e puoi inviare qualsiasi tipo di messaggio a un oggetto, indipendentemente dal fatto che risponda o meno ad esso. In questo modo, puoi implementare la digitazione anatra, proprio come in Ruby. Il tipo id, approssimativamente equivalente a void*, può essere dotato di interfacce che specificano un contratto a cui il tipo (altrimenti sconosciuto) aderirà.

6

C# 4.0 ha molte, se non tutte queste caratteristiche. Se si desidera realmente il codice macchina nativo, è possibile utilizzare compile the bytecode down to machine code utilizzando un'utilità.

In particolare, l'utilizzo della parola chiave dynamic consente agli oggetti e ai relativi membri di essere associati dinamicamente in fase di runtime.

Partenza il video di Anders Hejlsberg, Il futuro di C#, per un primer:

http://channel9.msdn.com/pdc2008/TL16/

+0

Tecnicamente non è corretto. Tutto ciò che fa C# dinamico è fornire zucchero sintattico sull'uso dell'oggetto come tipo. – lassombra

1

non so di qualsiasi linguaggio che ha esattamente quelle capacità. Mi vengono in mente due che hanno un sottoinsieme significativo, però:

  • D ha inferenza di tipo, raccolta dei rifiuti, e potenti impianti di metaprogrammazione, ma viene compilato in codice macchina efficiente. Tuttavia, non ha digitazione dinamica.
  • C# può essere compilato direttamente sul codice macchina tramite il progetto mono. C# ha una funzione simile impostata su D, ma di nuovo senza digitazione dinamica.
4

Objective-C ha molte delle funzionalità che si menzionano: si compila in codice macchina ed è effettivamente digitato dinamicamente rispetto alle istanze dell'oggetto.Il tipo id può memorizzare qualsiasi istanza di classe e Objective-C utilizza la trasmissione di messaggi invece delle chiamate di funzioni membro. I metodi possono essere creati/aggiunti in fase di esecuzione. Il runtime Objective-C può anche sintetizzare le variabili di istanza della classe in fase di esecuzione, ma le variabili locali devono ancora essere dichiarate (proprio come in C).

C# 4.0 ha molte di queste funzionalità, tranne che è compilato in IL (bytecode) e interpretato utilizzando una macchina virtuale (CLR). Ciò tuttavia fa apparire un punto interessante: se il bytecode è compilato just-in-time in codice macchina, conta? Se è così, si apre la porta non solo una delle lingue Net, ma Python (vedi PyPy o Unladed Swallow o IronPython) e Ruby (vedi MacRuby o IronRuby) e molte altre lingue dinamicamente tipizzati, non menzionano molte varianti LISP.

2

VB 6 ha la maggior parte di quel

+1

... ma in realtà non viene compilato come codice macchina (compila in p-code). –

+2

L'impostazione predefinita è compilare il codice nativo. (Puoi cambiarlo nelle proprietà del progetto.) – svinto

0

Python a C, probabilmente ha bisogno di questi criteri.

  1. Scrivere in Python.

  2. Compilare Python a Executable. Vedi Process to convert simple Python script into Windows executable. Vedere anche Writing code translator from Python to C?

+0

Non stai parlando/non sono tutti questi linker "compilatori" che semplicemente impacchettano i file binari di Python insieme allo script in un unico file eseguibile? – sub

+0

@sub: in che modo "binari di impacchettamento ... in un eseguibile" non è un compilatore? Fornire una definizione che escluda la creazione di un eseguibile dalla fonte. E alcuni si traducono in C prima di compilare il binario, FWIW. –

+0

no non lo è. Un compilatore converte il codice in binari leggibili dal computer. Py2exe (e altri sistemi) spedisce semplicemente l'eseguibile Python insieme allo script Python, quindi il codice originale rimane Python e rimane eseguibile solo dall'eseguibile Python. Ma esistono 'variazioni' del linguaggio Python che consentono la compilazione in C, ma non è mai il Python originale (come Cython) – Manux

3

In modo simile a Lisp, c'è Factor, * Lingua concatenativa con alcuna variabile per impostazione predefinita, la tipizzazione dinamica, e un sistema di oggetti flessibile. Il codice fattore può essere eseguito nell'interprete interattivo o compilato in un eseguibile nativo utilizzando la sua funzione deploy.

* libero-point funzionale basato su stack

4

Sì, è possibile. Vedi Julia. È un linguaggio dinamico (puoi scrivere programmi senza tipi) ma non funziona mai su una VM. Compila il programma in codice nativo in fase di esecuzione (compilazione JIT).