Какие статически типизированные языки похожи на Python? - PullRequest
44 голосов
/ 15 февраля 2010

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

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

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

Ответы [ 11 ]

35 голосов
/ 15 февраля 2010

Boo - статически типизированный язык для инфраструктуры общего языка (он же платформа 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
14 голосов
/ 15 февраля 2010

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
9 голосов
/ 16 февраля 2010

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

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

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

  • Нет изменений во время выполнения классов, типов или объектов.

  • Избегание указания классов / типов вездечерез вывод типа .

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

Также, чтобы вы чувствовали себя как дома, Haskellимеет значительные отступы!

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

8 голосов
/ 15 февраля 2010

Может не соответствовать всем вашим потребностям, но взгляните на Бу - дружеский язык для CLI

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

Кроме того, учебники являются отличным ресурсом.

5 голосов
/ 16 февраля 2010

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

4 голосов
/ 19 декабря 2012

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

2 голосов
/ 15 февраля 2010

Язык программирования 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;
}
1 голос
/ 30 декабря 2018

Lobster (http://strlen.com/lobster/) - статически типизированный язык программирования с синтаксисом Python-esque.

Есть несколько вещей, которые вы просите:

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

Это не очень хорошо для этих предметов:

  • Синтаксис для словарей или массивов. Хотя его синтаксис для карты / фильтра настолько минимален, что он может конкурировать с массивами.
  • Ключевые аргументы в настоящее время только для конструкторов.
  • Модификация классов во время выполнения: нет .. это довольно статичный язык.
  • Отражение: тоже нет, хотя это, безусловно, было бы возможно.
1 голос
/ 15 февраля 2010

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

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

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

Вы можете дать печатные машинки в IDE, где они вам действительно нужны, выполнив:

def foo(bar):
    if 0: bar = Bar() # "if 0" will be removed from the bytecode automatically by python
    bar. # will now autocomplete
1 голос
/ 15 февраля 2010

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

...