2010-02-15 21 views
41

Python es el mejor lenguaje que conozco actualmente, pero el tipado estático es una gran ventaja debido a la finalización automática (aunque hay soporte limitado para lenguajes dinámicos, no es nada comparado con el soportado en estática). Tengo curiosidad por saber si hay algún idioma que intente agregar los beneficios de Python a un lenguaje estáticamente tipado. En particular, estoy interesado en lenguas con características como:¿Qué lenguajes tipados estáticamente son similares a Python?

  • apoyo Sintaxis: como el de los diccionarios, por comprensión de matriz
  • Funciones: argumentos de palabras clave, los cierres, los valores tupla/retorno múltiples
  • modificación de tiempo de ejecución/creación de clases
  • evitación de especificar las clases en todas partes (en Python esto se debe a la tipificación de pato, aunque la inferencia de tipos funcionaría mejor en un lenguaje de tipos estáticos)
  • apoyo Metaprogramación: esto se logra en Python través de la reflexión, annotati ons y metaclasses

¿Hay algún lenguaje estáticamente tipado con un número significativo de estas características?

+4

Esta "modificación/creación de clases en tiempo de ejecución" es casi tan "antiestática" como la que se puede obtener. Hay otras formas de resolver un problema en programas de tipo estático. – viraptor

+3

Autocompletar es una función de herramienta, no una función de idioma. Algunos IDE (por ejemplo, Komodo) pueden realizar autocompletado para Python. Siempre y cuando evites la meta-programación complicada. –

+0

@viraptor: podría agregar "evitar la especificación de clases en todas partes" a eso. Las clases son tipos en la mayoría de los sistemas de clases, y no tener que especificar un tipo es un poco extraño para un lenguaje estáticamente tipado. –

Respuesta

35

Boo es un lenguaje estáticamente tipado para Common Language Infrastructure (también conocido como plataforma Microsoft .NET). La sintaxis es altamente inspirada en Python, y hashes/listas/serie son parte de la sintaxis:

i = 5 
if i > 5: 
    print "i is greater than 5." 
else: 
    print "i is less than or equal to 5." 

hash = {'a': 1, 'b': 2, 'monkey': 3, 42: 'the answer'} 
print hash['a'] 
print hash[42] 

for item in hash: 
    print item.Key, '=>', item.Value 
+2

Boo es realmente agradable. El soporte sintáctico es tan bueno o mejor que Python. El soporte de la función es de primera clase. La inferencia de tipo y la tipificación de pato están disponibles. Hay cierres y las macros proporcionan una forma de metaprogramación. Las clases, en general, no se pueden modificar en tiempo de ejecución, pero con algunas de las funciones, esto es menos problemático. – Casebash

+0

¿Hay alguna comparación de bechmark para la velocidad de ejecución de Boo frente a Python? – highBandWidth

+0

Esto es sólo una suposición, pero supongo que la velocidad de ejecución de Boo sería más o menos similar a la de C#, en cuyo caso el rendimiento probablemente sería sustancialmente mayor que Python: http://benchmarksgame.alioth.debian.org /u32/benchmark.php?test=all&lang=python3&lang2=csharp&data=u32 –

1

El autocompletado todavía es posible en un lenguaje de tipado dinámico; nada impide que el IDE realice una inferencia o inspección de tipo, incluso si la implementación del lenguaje no lo hace.

+0

Exactamente. Las herramientas como PyDev son buenas, pero la autocompletar/intellisense es horrible. Cuando funciona, es demasiado lento. – Finglas

+0

La autocompletacion necesaria para lenguajes dinámicos no es nada comparada con la estática. – u0b34a0f6ae

+9

Autocompletar es imposible _en general_ en lenguajes de tipo dinámico. Y no es deseable, también. Toda la ventaja del tipado dinámico es que a menudo es conveniente escribir un código que no puede verificarse. Si va a escribir un programa que * puede * verificarse automáticamente, también podría usar tipeo estático. De ahí esta pregunta. – Porculus

1

Si la autocompletación es lo que está buscando, entonces es posible que desee quedarse con Python y usar un gran IDE en su lugar.

Try PyCharm: http://www.jetbrains.com/pycharm/index.html

A menos que usted está codificando un poco de materia extremadamente dinámico (que no se puede hacer, probablemente, en un lenguaje estático de todos modos), que se mantendrá al día con el código y darle terminación, refactorización y todos las otras cosas buenas a las que estamos acostumbrados en lenguajes tipados estáticamente.

le puede dar typehints al IDE en el que realmente lo necesite haciendo:

def foo(bar): 
    if 0: bar = Bar() # "if 0" will be removed from the bytecode automatically by python 
    bar. # will now autocomplete 
+0

¿Alguien sabe cómo se compara PyCharm con el soporte de Eclipse Python? Lo veré, pero aún me sorprendería si está cerca de los idiomas estáticos – Casebash

+0

. Me parece mucho mejor que PyDev al menos. Pero cambié a PyCharm hace un año, por lo que mis opiniones sobre PyDev están un poco desactualizadas. – truppo

+0

¿Cómo funciona si 0 proporciona una sugerencia de tipo? – Casebash

13

Cobra es un lenguaje de tipos estáticos para el CLR (como Boo).Desde su página web:

Cobra es un propósito general de programación lenguaje con:

- a clean, high-level syntax 
- static and dynamic binding 
- first class support for unit tests and contracts 
- compiled performance with scripting conveniences 
- lambdas and closures 
- extensions and mixins 
- ...and more 
Sample code: 

""" 
This is a doc string for the whole module. 
""" 


class Person 
    """ 
    This is a class declaration. 
    """ 

    var _name as String # declare an object variable. every instance of Person will have a name 
    var _age as int 

    cue init(name as String, age as int) 
     _name = name 
     _age = age 

    def sayHello 
     # This is a method 

     # In strings, anything in brackets ([]) is evaluated as an expression, 
     # converted to a string and substituted into the string: 
     print 'Hello. My name is [_name] and I am [_age].' 

    def add(i as int, j as int) as int 
     """ Adds the two arguments and returns their sum. """ 
     return i + j 
2

El lenguaje de programación D es un lenguaje de tipos estáticos, de forma nativa compilado que tiene algunas características importantes inspirado en Python.

Las matrices y las matrices asociativas están integradas en el lenguaje. No hay listas de comprensión, pero las bibliotecas std.range y std.algorithm ocupan gran parte de ese vacío. Por ejemplo, he aquí una manera de resumir todos los números pares de 0 a 100 en Re:

auto result = reduce!"a + b"(
    filter!"a % 2 == 0"(
     iota(0, 100) 
    ) 
); 

No hay argumentos de palabra clave hasta ahora, pero los cierres están ahí. Las tuplas son compatibles, pero no se desempaquetan automáticamente.

En D, evita especificar clases (y tipos en general) en todas partes con la palabra clave auto y con plantillas. Por ejemplo, aquí está el código genérico para encontrar el producto de la matriz de cualquier tipo numérico:

// The return type of product() is inferred. 
auto product(T)(T[] array) { 
    T ret = 1; 
    foreach(num; array) { // typeof(num) is inferred. 
     ret *= num; 
    } 

    return ret; 
} 

apoyo metaprogramming D's consiste en la introspección tiempo de compilación (por ejemplo, se puede iterar sobre los campos de una clase o estructura durante la compilación hora), información del tipo de tiempo de ejecución y plantillas diseñadas en realidad para metaprogramar más allá de los genéricos simples. Por ejemplo, aquí se explica cómo escribir una función genérica que genera una operación de comparación por defecto para dos estructuras, lo cual es útil si necesita una ordenación total arbitraria para algo como un árbol binario:

/**Returns -1 if lhs < rhs, 0 if lhs == rhs, 1 if lhs > rhs.*/ 
int compareStructs(T)(T lhs, T rhs) { 
    foreach(tupleIndex, value; lhs.tupleof) { 
     if(value < rhs.tupeof[tupleIndex]) { 
      return -1; 
     } else if(value > rhs.tupleof[tupleIndex]) { 
      return 1; 
     } 
    } 

    return 0; 
} 
+0

Parece más como C++ para mí ... – refi64

9

Aunque no es objeto- orientado, Haskell ofrece un número significativo de las características que le interesan:

  • apoyo sintaxis de las listas por comprensión, además de do notación para una amplia variedad de construcciones de secuenciación/encuadernación. (Sintaxis apoyo para los diccionarios está limitado a las listas de parejas, por ejemplo,

    dict = ofElements [("Sputnik", 1957), ("Apollo", 1969), ("Challenger", 1988)] 
    
  • funciones de apoyo cierres completos y valores de retorno múltiples utilizando tipos tupla. Argumentos de palabra clave no son compatibles, pero una potente función de "argumentos implícitos" puede a veces . sustituto

  • Ninguna modificación de tiempo de ejecución de las clases, tipos o objetos.

  • evitación de specificying clases/tipos en todas partes a través de inferencia de tipos.

  • Metaprogramación con la plantilla Haskell.

Además, para que te sientas como en casa, ¡Haskell tiene una sangría significativa!

De hecho, creo que Haskell se siente bastante diferente de Python en general, pero eso se debe principalmente al extremadamente poderoso sistema de tipo estático.Si está interesado en probar un lenguaje estáticamente tipado, Haskell es uno de los más ambiciosos en este momento.

+8

Haskell no es ni remotamente similar a Python ... – Timmmm

6

El lenguaje de programación Go. He visto un paradigma similar.

+0

Go tiene algunas construcciones sintácticas agradables, pero hasta donde yo sé, no tiene muchas de las otras características – Casebash

4

Rpython es un subconjunto de Python que se escribe de forma estática.

+3

No hay bibliotecas estándar, solo para uso en la creación de intérpretes. – andychase

Cuestiones relacionadas