Krótka odpowiedź: nie, ponieważ równoważność Turinga.
Długa odpowiedź: ten facet jest trollem. Chociaż prawdą jest, że systemy typów „ograniczają cię do podzbioru”, rzeczy poza tym podzbiorem są z definicji rzeczami, które nie działają.
Wszystko, co możesz zrobić w dowolnym języku programowania kompletnym Turinga (który jest językiem zaprojektowanym do programowania ogólnego, plus wiele innych, których nie ma; to dość niski pasek do wyczyszczenia i istnieje kilka przykładów systemu, który staje się Turing- niezamierzone wypełnienie) możesz zrobić w dowolnym innym języku programowania Turing-complete. Nazywa się to „równoważnością Turinga” i oznacza tylko dokładnie to, co mówi. Co ważne, nie oznacza to, że możesz zrobić drugą rzecz równie łatwo w innym języku - niektórzy twierdzą, że o to właśnie chodzi w tworzeniu nowego języka programowania: aby dać ci lepszy sposób na wykonanie pewnych czynności rzeczy, które ssą istniejące języki.
Na przykład system typu dynamicznego można emulować na podstawie statycznego systemu typu OO, po prostu deklarując wszystkie zmienne, parametry i zwracane wartości jako Object
typ podstawowy, a następnie używając refleksji, aby uzyskać dostęp do określonych danych wewnątrz, więc kiedy sobie to uświadomisz widać, że dosłownie nic nie można zrobić w języku dynamicznym, czego nie można zrobić w języku statycznym. Ale zrobienie tego w ten sposób byłoby oczywiście ogromnym bałaganem.
Facet z cytatu ma rację, że typy statyczne ograniczają to, co możesz zrobić, ale to ważna funkcja, a nie problem. Linie na drodze ograniczają to, co możesz zrobić w samochodzie, ale czy uważasz je za restrykcyjne lub pomocne? (Wiem, że nie chciałbym jeździć po ruchliwej, złożonej drodze, na której nic nie mówi samochodom jadącym w przeciwnym kierunku, aby trzymały się z boku i nie podjeżdżały tam, gdzie jadę!) Ustalając zasady, które jasno określają, co jest uważane za nieprawidłowe zachowanie i zapewniające, że tak się nie stanie, znacznie zmniejszasz ryzyko wystąpienia nieprzyjemnego wypadku.
Poza tym źle opisuje drugą stronę. Nie chodzi o to, że „wszystkie ciekawe programy, które chcesz pisać, będą działały jak typy”, ale „wszystkie interesujące programy, które chcesz pisać, będą wymagać typów”. Po przekroczeniu pewnego poziomu złożoności bardzo trudno jest utrzymać bazę kodu bez systemu typów, który utrzymywałby Cię w linii z dwóch powodów.
Po pierwsze, ponieważ kod bez adnotacji typu jest trudny do odczytania. Rozważ następujący Python:
def sendData(self, value):
self.connection.send(serialize(value.someProperty))
Jak wyglądają dane, które odbiera system na drugim końcu połączenia? A jeśli odbiera coś, co wygląda zupełnie nie tak, jak możesz dowiedzieć się, co się dzieje?
Wszystko zależy od struktury value.someProperty
. Ale jak to wygląda? Dobre pytanie! Co znajduje się powołanie sendData()
? Co to przechodzi? Jak wygląda ta zmienna? Skąd to się wzieło? Jeśli nie jest lokalny, musisz prześledzić całą historię, value
aby śledzić, co się dzieje. Może przekazujesz coś innego, co również ma someProperty
właściwość, ale nie robi tego, co myślisz, że ma?
Teraz spójrzmy na to z adnotacjami typu, jak możesz zobaczyć w języku Boo, który używa bardzo podobnej składni, ale jest statycznie wpisany:
def SendData(value as MyDataType):
self.Connection.Send(Serialize(value.SomeProperty))
Jeśli coś pójdzie nie tak, nagle zadanie debugowania stało się o rząd wielkości łatwiejsze: spójrz na definicję MyDataType
! Dodatkowo szansa na złe zachowanie, ponieważ minąłeś jakiś niezgodny typ, który również ma właściwość o tej samej nazwie, nagle spada do zera, ponieważ system typów nie pozwoli ci popełnić tego błędu.
Drugi powód opiera się na pierwszym: w dużym i złożonym projekcie najprawdopodobniej masz wielu współpracowników. (A jeśli nie, to budujesz go sam przez długi czas, co jest w zasadzie to samo. Spróbuj przeczytać kod napisany 3 lata temu, jeśli mi nie wierzysz!) Oznacza to, że nie wiesz, co było przechodząc przez głowę osoby, która napisała prawie każdą część kodu w momencie, gdy go napisali, ponieważ nie było cię tam lub nie pamiętasz, czy to był twój własny kod dawno temu. Posiadanie deklaracji typu naprawdę pomaga zrozumieć, jaki był zamiar kodu!
Ludzie tacy jak facet w cytacie często mylnie opisują zalety pisania statycznego jako „pomoc kompilatorowi” lub „wszystko o wydajności” w świecie, w którym prawie nieograniczone zasoby sprzętowe sprawiają, że z każdym rokiem staje się to coraz mniej istotne. Ale jak wykazałem, chociaż te korzyści z pewnością istnieją, podstawową korzyścią są czynniki ludzkie, w szczególności czytelność kodu i łatwość konserwacji. (Jednak dodatkowa wydajność to z pewnością niezły bonus!)