Sarebbe possibile creare un linguaggio simile a Ruby / Python con una tipizzazione statica che abbia l'utilizzo di velocità / memoria di un programma C compilato? [chiuso]

-1

Uno dei principali svantaggi di Ruby / Python è rappresentato dalle prestazioni. Capisco che sono interpretati e C è compilato. (E ci sono cose come JRuby che compilano JIT con Ruby). Ma non riescono mai a ottenere la stessa velocità / utilizzo della memoria di un programma compilato. Sarebbe possibile creare un nuovo linguaggio che avesse la stessa sintassi di Ruby per esempio (con una modifica: tipizzazione statica) compilato fino a qualcosa di veloce come un programma in C?

Sto cercando di pensare a quali altre differenze ci siano oltre alla tipizzazione statica piuttosto che a ottenere la stessa velocità. (Forse allocare buffer di una dimensione fissa invece di un'astrazione che gestisce questo per te). Ma sembra che potresti avvicinarti di più?

In caso affermativo, perché nessuno ha creato una versione compilata di Ruby / Python con la tipizzazione statica?

    
posta Brian Armstrong 02.07.2015 - 05:49
fonte

3 risposte

5

L'aggiunta di annotazioni di tipo esplicito a Ruby non avrebbe funzionato. Una caratteristica chiave di Ruby è che qualsiasi metodo può essere ridefinito in fase di runtime. Quindi, anche se sai che un certo valore sarà sempre un'istanza di classe C , questo non ti consente di fare cose come l'inlining.

Si noti che in Ruby, anche i loop pari sono effettivamente implementati come chiamate di metodo. Quindi il tuo compilatore non può nemmeno presumere che un loop sia ... effettivamente un ciclo, poiché #each potrebbe essere ridefinito in fase di runtime.

Potresti progettare una lingua con "Sintassi di Ruby", ma rimuovere tutta la metaprogrammazione del runtime. Questo potrebbe essere compilato con un codice macchina efficiente, ma non sarebbe Ruby. La caratteristica chiave che rende Ruby quello che è, è l'estrema flessibilità di modificare quasi tutto dinamicamente, in fase di runtime.

Si potrebbe concepibilmente scrivere un compilatore incredibilmente sofisticato che farebbe l'analisi globale di un intero programma e determinare se una di quelle caratteristiche "dinamiche" siano effettivamente utilizzate o meno. In molti casi, ciò richiederebbe praticamente qualcosa di simile a "IA strong". Non pratico.

Un'altra opzione, che è stata fatta con altri linguaggi e potrebbe essere fatta in Ruby, sarebbe quella di scrivere un compilatore JIT che fa ottimizzazioni come l'inlining basandosi sul presupposto che le attuali definizioni di classe e metodo non cambieranno, e < em> backs out di quelle ottimizzazioni se lo fanno. Questo è il modo per rendere il codice Ruby molto, molto veloce. Sfortunatamente, nessuno lo ha ancora fatto.

    
risposta data 02.07.2015 - 08:50
fonte
1

Le prestazioni non sempre vengono interpretate e compilate. Ci sono tanti altri fattori che possono influenzare l'equazione delle prestazioni:

  1. La natura del software può favorire la produttività del programmatore su cicli di clock.
  2. Altri fattori sono più importanti, come la latenza della rete e del database.
  3. La compilazione e l'interpretazione sono comunque un'area grigia. Un JIT è interpretato o compilato?
  4. Il codice byte e alcuni costrutti del linguaggio di programmazione possono rendere possibili le ottimizzazioni che altrimenti non sarebbero disponibili.
risposta data 02.07.2015 - 07:32
fonte
0

Cython e Numba sono esempi di come sarebbe questo per Python, e sì, è possibile ottenere prestazioni paragonabili al codice C. Cython è un'estensione del linguaggio Python che aggiunge annotazioni di tipo e semplifica la chiamata alle funzioni C. Numba usa hint forniti come Python @decorators per informarlo dei tipi di dati per i quali genererà un efficiente codice C vettorizzato, e genererà un errore se la funzione risultante viene chiamata con argomenti tipizzati erroneamente.

    
risposta data 02.07.2015 - 08:21
fonte

Leggi altre domande sui tag