Подтвердить что ты не робот

Какие статически типизированные языки похожи на Python?

Python - самый приятный язык, о котором я знаю в настоящее время, но статическая типизация - большое преимущество из-за автоматического завершения (хотя ограниченная поддержка динамических языков, это ничто по сравнению с тем, которое поддерживается в статическом). Мне любопытно, есть ли какие-либо языки, которые пытаются добавить преимущества Python к статически типизированному языку. В частности, мне интересны языки с такими функциями, как:

  • Поддержка синтаксиса: например, для словарей, понимание массива
  • Функции: аргументы ключевого слова, замыкания, кортеж/множественные возвращаемые значения
  • Изменение времени выполнения/создание классов
  • Избегание спецификаций классов везде (в Python это происходит из-за утиного ввода текста, хотя вывод типа будет работать лучше на статически типизированном языке)
  • Поддержка метапрограммирования: это достигается в Python через отражение, аннотации и метаклассы

Существуют ли какие-либо статически типизированные языки со значительным числом этих функций?

4b9b3361

Ответ 1

Boo - это статически типизированный язык для Common Language Infrastructure (например, платформа Microsoft.NET). Синтаксис очень вдохновлен Python, а хеши/списки/массив являются частью синтаксиса:

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

Cobra - это статически типизированный язык для CLR (как Boo). На веб-странице:

Cobra - это программирование общего назначения язык с:

 - 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

Ответ 3

Хотя он не является объектно-ориентированным, Haskell предлагает значительное количество функций, которые вас интересуют:

  • Поддержка синтаксиса для распознавания списков, плюс обозначение do для большого числа конструкций секвенирования/связывания. (Поддержка синтаксиса для словарей ограничена списками пар, например

    dict = ofElements [("Sputnik", 1957), ("Apollo", 1969), ("Challenger", 1988)]
    
  • Функции поддерживают полное закрытие и множественные возвращаемые значения с использованием типов кортежей. Аргументы ключевого слова не поддерживаются, но могучая функция "неявных аргументов" иногда может быть заменена.

  • Отсутствует модификация классов, типов или объектов во время выполнения.

  • Избегание специфических классов/типов во всем мире через вывод типа.

  • Метапрограммирование с использованием шаблона Haskell.

Кроме того, так, чтобы вы чувствовали себя как дома, у Haskell есть значительный отступ!

Я действительно думаю, что у Haskell совсем другое чувство от Python в целом, но это в первую очередь из-за чрезвычайно мощной системы статического типа. Если вы заинтересованы в статическом типизированном языке, Haskell является одним из самых амбициозных из них прямо сейчас.

Ответ 4

Это может не соответствовать всем вашим потребностям, но посмотрите Boo - Язык, открытый для CLI

Если вы это сделаете, я настоятельно рекомендую DSL в Boo: Языки домена в .NET, который, помимо аспектов DSL, охватывает синтаксис Boo в очень приятном приложении и много метапрограммирования.

Кроме того, tutorials - отличный ресурс.

Ответ 5

Язык программирования Go. Я видел некоторую аналогичную парадигму.

Ответ 6

Rpython - это подмножество Python, статически типизированное.

Ответ 7

Язык программирования D - это статически типизированный, изначально скомпилированный язык, который имеет некоторые существенные функции, вдохновленные Python.

Массивы и ассоциативные массивы встроены в язык. Нет никаких понятий в списках, но библиотеки std.range и std.algorithm заполняют большую часть этой пустоты. Например, здесь можно суммировать все четные числа от 0 до 100 в D:

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

До сих пор нет аргументов с ключевыми словами, но закрыты. Кортежи поддерживаются, но не распаковываются автоматически.

В D вы избегаете указания классов (и типов вообще) везде с ключевым словом auto и с шаблонами. Например, вот общий код, чтобы найти произведение массива любого числового типа:

// 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;
}
Поддержка метапрограммирования

D состоит из интроспекции времени компиляции (например, вы можете перебирать поля класса или структуры во время компиляции), информацию о типе времени выполнения и шаблоны, которые фактически предназначены для метапрограммирования за пределами простых дженериков. Например, здесь, как написать общую функцию, которая генерирует операцию сравнения по умолчанию для двух структур, что полезно, если вам требуется произвольное полное упорядочение для чего-то вроде двоичного дерева:

/**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;
}

Ответ 8

Автозаполнение по-прежнему возможно на динамически типизированном языке; ничто не мешает IDE выполнять вывод или проверку типа, даже если реализация языка не делает.

Ответ 9

Если автозаполнение - это то, что вы ищете, тогда вы можете захотеть использовать Python и использовать отличную среду IDE.

Попробуйте PyCharm: http://www.jetbrains.com/pycharm/index.html

Если вы не кодируете некоторые чрезвычайно динамичные материалы (которые вы, возможно, не можете делать на статическом языке, так или иначе), он будет идти в ногу с кодом и давать вам завершение, рефакторинг и все другие полезные эффекты, с которыми мы привыкли в статическом набранных языках.

Вы можете указать typehints для IDE, где вам это действительно нужно:

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

Ответ 10

Я думаю, что Eric и PyScripter имеют хорошее автозаполнение в Windows, но, возможно, не так хорошо, как PyTools для Visual Studio (Express).

Для статического ввода в Python я бы использовал Cython: http://docs.cython.org/src/quickstart/cythonize.html