2010-02-15 17 views
41

Python jest najmilszym językiem, jaki obecnie znam, ale statyczne pisanie jest wielką zaletą z powodu autouzupełniania (chociaż obsługa języków dynamicznych jest ograniczona, to nic w porównaniu z obsługą obsługiwaną w trybie statycznym). Jestem ciekawy, czy są jakieś języki, które próbują dodać zalety Pythona do statycznie napisanego języka. W szczególności jestem ciekawy w językach z funkcji, takich jak:Co statycznie napisane języki są podobne do Pythona?

  • wsparcie składni: taki jak w przypadku słowników, listowe tablicy
  • Funkcje: słowo kluczowe argumenty, zamknięcia, wartości krotka/wielokrotny zwrot
  • modyfikacja Runtime/utworzenie klas
  • Unikanie określania klas wszędzie (w Pythonie jest to spowodowane kaczki pisania, chociaż rodzaj wnioskowania będzie działać lepiej w statycznie wpisywanych języka)
  • wsparcie mETAPROGRAMOWANIE: osiąga się to w Pythonie poprzez refleksję, annotati ons i metaclasses

Czy są jakieś statycznie napisane języki z dużą liczbą tych funkcji?

+4

Ta "Modyfikacja/tworzenie klas w czasie pracy" jest prawie tak samo jak anty statyczne pisanie. Istnieją inne sposoby rozwiązania problemu w programach statycznie wpisanych. – viraptor

+3

Autouzupełnianie to funkcja narzędzia, a nie funkcja językowa. Niektóre IDE (np. Komodo) mogą wykonywać autouzupełnianie dla Pythona. Dopóki nie unikniesz skomplikowanego meta-programowania. –

+0

@viraptor: Mogłem dodać do tego "unikanie określania klas wszędzie". Klasy są typami w większości systemów klasowych, a brak konieczności określania typu jest nieco dziwny w przypadku języka statycznie pisanego. –

Odpowiedz

35

jest statycznie napisanym językiem dla wspólnej infrastruktury językowej (zwanej również platformą Microsoft .NET). Składnia jest wysoce inspirowane przez Python i mieszań/listy/tablicy są częścią składni:

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 jest naprawdę miły. Wsparcie syntaktyczne jest tak samo dobre lub lepsze niż Python. Wsparcie funkcji jest pierwszej klasy. Dostępne są typy wnioskowania i typowania kaczego. Istnieją zamknięcia i makra zapewniające formę meta-programowania. Klasy w ogóle nie mogą być modyfikowane w środowisku wykonawczym, ale z niektórymi funkcjami jest to mniejszy problem – Casebash

+0

Czy są jakieś porównania bechmarków dla prędkości wykonywania Boo vs. Python? – highBandWidth

+0

To tylko przypuszczenie, ale zakładam, że prędkość wykonywania Boo byłaby mniej więcej podobna do C#, w którym to przypadku wydajność byłaby prawdopodobnie znacznie większa niż w Pythonie: http://benchmarksgame.alioth.debian.org /u32/benchmark.php?test=all&lang=python3&lang2=csharp&data=u32 –

1

Autouzupełnianie jest nadal możliwe w dynamicznie pisanym języku; nic nie stoi na przeszkodzie, aby IDE wniosło wnioskowanie lub inspekcję typu, nawet jeśli implementacja języka tego nie robi.

+0

Dokładnie. Narzędzia takie jak PyDev są ładne, ale autocomplete/intellisense jest okropne. Kiedy działa, jest zbyt wolny. – Finglas

+0

Autouzupełnianie potrzebne w językach dynamicznych jest niczym w porównaniu do statycznego. – u0b34a0f6ae

+9

Autouzupełnianie jest niemożliwe _w ogóle w językach dynamicznie pisanych. I to też jest niepożądane. Całą zaletą dynamicznego pisania jest to, że często wygodnie jest pisać kod, który nie może być sprawdzony. Jeśli masz zamiar napisać program, który * można * automatycznie sprawdzić typem, równie dobrze możesz pisać statycznie. Stąd to pytanie. – Porculus

1

Jeśli szukanie automatyczne jest tym, czego szukasz, możesz chcieć trzymać się Pythona i zamiast niego używać świetnego IDE.

Spróbuj pycharm: http://www.jetbrains.com/pycharm/index.html

Jeśli nie jesteś pewien kodowania niezwykle dynamiczny materiał (który prawdopodobnie nie można zrobić w języku statycznej tak), to będzie nadążać z kodem i daje ukończeniu refaktoryzacji i wszystko inne smakołyki, do których jesteśmy przyzwyczajeni w statycznie napisanych językach.

Można dać typehints IDE, gdzie naprawdę trzeba go wykonując:

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

Ktoś wie, jak PyCharm porównuje się do obsługi Eclipse Python? Spoglądam na to, ale nadal będę zaskoczony, jeśli jest on nawet blisko statycznie napisanych języków. – Casebash

+0

Uważam, że jest lepszy od PyDev'a. Ale przerzuciłem się na PyCharm około roku temu, więc moje opinie o PyDev są nieco przestarzałe. – truppo

+0

Jak to zrobić, jeśli 0 zawiera wskazówkę dotyczącą typu? – Casebash

13

Cobra jest statycznie wpisane języka CLR (jako Boo).Z jego strony internetowej:

Cobra jest uniwersalnym programowania język z:

- 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

Język programowania D jest statycznie wpisane, natywnie kompilowane język, który ma kilka istotnych cech inspirowane przez Python.

Tablice i tablice asocjacyjne są wbudowane w język. Nie ma żadnych spisanych słów, ale biblioteki std.range i std.algorithm wypełniają większość tej pustki. Na przykład, oto sposób podsumować wszystkie parzyste liczby od 0 do 100 w D:

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

Brak argumentów kluczowych do tej pory, ale zamknięcia są tam. Krotki są obsługiwane, ale nie są rozpakowywane automatycznie.

W języku D należy unikać określania klas (i typów w ogóle) wszędzie za pomocą słowa kluczowego auto i szablonów. Na przykład, tutaj jest kod rodzajowy, aby znaleźć produkt tablicy dowolnego typu liczbowego:

// 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's wsparcie metaprogramming składa się z kompilacji introspekcji (na przykład, można iteracyjne nad polami klasy lub struktury w czasie kompilacji czas), informacje o typie środowiska wykonawczego i szablony, które są faktycznie zaprojektowane do metaprogramowania poza zwykłymi rodzajami. Na przykład, oto jak napisać rodzajowe funkcji, która generuje operację porównania domyślne dla dwóch strukturach, co jest przydatne, gdy trzeba dowolną całkowitą zamawiania czegoś podobnego binarnego drzewa:

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

Wygląda bardziej jak C++ do mnie ... – refi64

9

Chociaż nie jest to obiekt- zorientowane Haskell oferuje dużą liczbę funkcji, które Cię interesują:

  • Składnia wsparcie dla listowych, plus do notacja dla szerokiej gamy sekwencjonowania konstruktów wiążących /. (Wsparcie składni dla słowników jest ograniczone do wykazów parach, np

    dict = ofElements [("Sputnik", 1957), ("Apollo", 1969), ("Challenger", 1988)] 
    
  • Funkcje wspierać pełne zamknięć i wiele wartości zwracanych stosujące krotka. Argumenty Hasło nie są obsługiwane, ale potężnym cechą „ukrytych argumentów” może czasami substytutem.

  • Żadna modyfikacja czasu wykonywania zajęć, rodzajów lub obiektów.

  • Unikanie specificying Zajęcia/typów wszędzie przez typu wnioskowania.

  • Metaprogramowanie za pomocą szablonu Haskell.

Ponadto, abyś poczuł się jak w domu, Haskell ma znaczące wcięcia!

Właściwie uważam, że Haskell ma zupełnie inne odczucie niż Python, ale głównie z powodu niezwykle potężnego systemu statycznego typu.Jeśli jesteś zainteresowany próbowaniem statycznego języka, Haskell jest jednym z najbardziej ambitnych w tej chwili.

+8

Haskell nie jest tak naprawdę podobny do Pythona ... – Timmmm

6

Język programowania Go. Widziałem podobny paradygmat.

+0

Go ma kilka fajnych konstrukcji składniowych, ale o ile wiem, nie ma wielu innych funkcji. – Casebash

4

Rpython jest podzbiorem Pythonie, który jest wpisane statycznie.

+3

Brak standardowych bibliotek, przeznaczonych wyłącznie do tworzenia tłumaczy. – andychase

Powiązane problemy