web-dev-qa-db-ja.com

静的に型付けされた言語はPythonに似ていますか?

Pythonは私が現在知っている中で最も優れた言語ですが、オートコンプリートにより静的型付けは大きな利点です(動的言語のサポートは限られていますが、静的言語でサポートされている言語と比較して何もありません)。 Pythonの利点を静的に型付けされた言語に追加しようとする言語があるかどうか知りたいです。特に、次のような機能を備えた言語に興味があります。

  • 構文サポート:辞書、配列内包表記など
  • 関数:キーワード引数、クロージャ、タプル/複数の戻り値
  • クラスの実行時の変更/作成
  • どこでもクラスを指定することの回避(Pythonこれはダックタイピングによるものですが、静的に型付けされた言語では型推論の方がうまくいくでしょう)
  • メタプログラミングのサポート:これは、リフレクション、アノテーション、メタクラスを通じてPython

これらの機能のかなりの数を備えた静的に型付けされた言語はありますか?

47
Casebash

Boo は、共通言語インフラストラクチャ(別名、Microsoft .NETプラットフォーム)用の静的に型指定された言語です。構文はhighlyPythonに触発されており、ハッシュ/リスト/配列は構文の一部です。

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
35

Cobra は、CLR用の静的に型指定された言語です(Booとして)。そのWebページから:

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
14
Manuel Ceron

オブジェクト指向ではありませんが、 Haskell は、興味のある機能を数多く提供しています。

  • リスト内包表記の構文サポートに加えて、さまざまなシーケンス/バインディング構造のdo表記。 (辞書の構文サポートは、ペアのリストに限定されています。

    dict = ofElements [("Sputnik", 1957), ("Apollo", 1969), ("Challenger", 1988)]
    
  • 関数は、タプル型を使用した完全なクロージャと複数の戻り値をサポートします。キーワード引数はサポートされていませんが、「暗黙の引数」の強力な機能で代用できる場合があります。

  • クラス、タイプ、またはオブジェクトの実行時の変更はありません。

  • 型推論によるあらゆる場所でのクラス/タイプの特定の回避。

  • TemplateHaskellを使用したメタプログラミング。

また、自宅にいるように感じるように、Haskellには大きなインデントがあります!

Haskellは全体的にPythonとはかなり違う感じだと思いますが、それは主に非常に強力な静的型システムによるものです。静的型付き言語を試すことに興味があるなら、Haskellは今そこにある最も野心的なもの。

9
Norman Ramsey

すべてのニーズに一致するわけではありませんが、 Boo-CLIの手に優しい言語 をご覧ください。

もしそうなら、私は強くお勧めします BooのDSL:.NETのドメイン固有言語 これはDSLの側面とは別に、非常に素晴らしい付録と多くのメタプログラミングでBoo構文をカバーしています。

さらに、 tutorials は素晴らしいリソースです。

8
Luhmann

Goプログラミング言語。私はいくつかの同様のパラダイムを見てきました。

5
dzen

Rpythonは、静的に型指定されたPythonのサブセットです。

4
Chirag

Dプログラミング言語は、静的に型付けされ、ネイティブにコンパイルされた言語であり、Pythonに触発されたいくつかの重要な機能を備えています。

配列と連想配列は言語に組み込まれています。リスト内包表記はありませんが、std.rangeおよびstd.algorithmライブラリはその空白の多くを埋めます。たとえば、Dの0から100までのすべての偶数を合計する方法は次のとおりです。

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のメタプログラミングのサポートは、コンパイル時のイントロスペクション(たとえば、コンパイル時にクラスまたは構造体のフィールドを反復処理できます)、実行時型情報、および単純なジェネリックを超えたメタプログラミング用に実際に設計されたテンプレートで構成されます。たとえば、2つの構造体のデフォルトの比較操作を生成するジェネリック関数を作成する方法を次に示します。これは、バイナリツリーのようなものに任意の全順序が必要な場合に役立ちます。

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

Lobster( http://strlen.com/lobster/ )は、Python風の構文を持つ静的に型付けされたプログラミング言語です。

それはあなたが求めているいくつかのことを持っています:

  • 型推論なので、コードはどこでも型を指定しなくてもPythonのように見えます。実際、Haskellのような言語よりも型推論が進んでいます。
  • クロージャ:構文的にはPython(独自の制御構造を作成)よりも軽量であり、さらに強力です(複数行の場合もありますが、それらから囲んでいる関数に戻ることができます)。
  • 複数の戻り値。

これらのアイテムではうまくいきません:

  • 辞書または配列内包表記の構文。 map/filterの構文は非常に最小限であるため、配列内包表記と競合する可能性があります。
  • 現在、コンストラクター専用のキーワード引数。
  • クラスの実行時の変更:いいえ。かなり静的な言語です。
  • 振り返り:これも確かに可能ですが、いいえ。
1
Aardappel

オートコンプリートは、動的に型指定された言語でも引き続き可能です。言語の実装が行わない場合でも、IDEが型推論または検査を行うことを妨げるものは何もありません。

1
Andrew McGregor

オートコンプリートがあなたが探しているものであるなら、あなたは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
truppo

EricとPyScripterはWindowsで優れたオートコンプリート機能を備えていると思いますが、PyTools for Visual Studio(Express)ほど良くはないかもしれません。

Pythonでの静的型付けには、Cythonを使用します: http://docs.cython.org/src/quickstart/cythonize.html

0
Cees Timmerman