Dlaczego słabo pisane języki wciąż są aktywnie rozwijane?

17

Zastanawiam się, dlaczego słabo pisane języki wciąż są aktywnie rozwijane. Na przykład, jaką korzyść można czerpać z umiejętności pisania

$someVar = 1;
(...)  // Some piece of code
$someVar = 'SomeText';

zamiast używać znacznie innej, mocno wpisanej wersji

int someInt = 1;
(...)
string SomeString = 'SomeText';

To prawda, że ​​musisz zadeklarować zmienną dodatkową w drugim przykładzie, ale czy to naprawdę boli? Czy wszystkie języki nie powinny dążyć do silnego pisania na maszynie, ponieważ wymuszają bezpieczeństwo typu w czasie kompilacji, unikając w ten sposób pewnych pułapek podczas rzutowania?

DotNetStudent
źródło
9
„Silnie wpisane” nie jest dobrze zdefiniowanym terminem. Przeważnie oznacza to „nie można obalić systemu typów”. Jest prostopadły do ​​tego, co opisujesz powyżej, co może być utajone w porównaniu z pisaniem jawnym lub statyczne w porównaniu z pisaniem dynamicznym.
Frank Shearar
10
Czego mi brakuje, co przenosi to z przynęty płomieniowej z kilkoma blisko powiązanymi, prawdopodobnie nawet zduplikowanymi pytaniami (wystarczy wyszukać w SackOverflow pytania dotyczące statycznego i dynamicznego pisania w tagach) do uzasadnionego pytania?
1
Istnieją zarówno zalety, jak i wady języków statycznych i dynamicznych. Języki o typie dynamicznym dobrze nadają się do szybkiego opracowywania lub tworzenia prototypów (stąd też „języki skryptowe” są zwykle typowane dynamicznie), podczas gdy języki o typie statycznym (prawdopodobnie) są łatwiejsze w utrzymaniu i rozszerzaniu, gdy stają się dużymi, skomplikowanymi projektami.
Charles Salvia
6
Pierwszy przykład przypomina trochę Pythona, w którym zmienne nie mają zadeklarowanego typu. Jednak Python jest bardzo silnie typowanym językiem, ponieważ obiekty - same w sobie - są typu, którego zmiana lub przymuszenie są prawie niemożliwe. Myślę, że niewłaściwe użycie terminologii bardzo utrudnia odpowiedź na to pytanie.
S.Lott,
1
@delnan Fakt, że to pytanie zawiera dwie rozsądne odpowiedzi i nie przekształcił się w wojnę z płomieniem, pomaga.
Adam Lear

Odpowiedzi:

25

Pisanie mocne / słabe oraz pisanie statyczne / dynamiczne są ortogonalne.

Mocna / słaba dotyczy tego, czy rodzaj wartości ma znaczenie, mówiąc funkcjonalnie. W słabo wpisanym języku możesz wziąć dwa ciągi, które są wypełnione cyframi i wykonać na nich dodawanie liczb całkowitych; w silnie napisanym języku jest to błąd (chyba że najpierw rzutujesz lub konwertujesz wartości na poprawne typy). Mocne / słabe pisanie nie jest czymś czarno-białym; większość języków nie jest ani w 100% ścisła, ani w 100% słaba.

Wpisywanie statyczne / dynamiczne dotyczy tego, czy typy wiążą się z wartościami, czy z identyfikatorami. W języku dynamicznie wpisywanym możesz przypisać dowolną wartość dowolnej zmiennej, niezależnie od typu; typowanie statyczne definiuje typ dla każdego identyfikatora, a przypisywanie z innego typu jest błędem lub skutkuje niejawnym rzutowaniem. Niektóre języki przyjmują podejście hybrydowe, dopuszczając zarówno statycznie deklarowane typy, jak i nietypowe identyfikatory („wariant”). Istnieje również wnioskowanie o typie, mechanizm, w którym możliwe jest pisanie statyczne bez jawnego deklarowania typu wszystkiego, poprzez kompilator rozróżniający typy (Haskell używa tego szeroko, C # eksponuje to poprzez varsłowo kluczowe).

Słabe dynamiczne programowanie pozwala na pragmatyczne podejście; język przez większość czasu ci nie przeszkadza, ale też nie wkracza, gdy strzelasz sobie w stopę. Natomiast silne pisanie statyczne popycha programistę do wyraźnego wyrażenia pewnych oczekiwań dotyczących wartości w kodzie, w sposób umożliwiający kompilatorowi lub interpreterowi wykrycie klasy błędów. Przy dobrym systemie typów programista może dokładnie zdefiniować, co można, a czego nie można zrobić z wartością, a jeśli przypadkiem ktoś spróbuje czegoś niepożądanego, system typów może często temu zapobiec i dokładnie pokazać, gdzie i dlaczego coś idzie nie tak.

tdammers
źródło
We właściwym słabo wpisanym języku, takim jak HyperTalk z osobnymi operatorami do łączenia i dodawania ciągów (np. Zakładaj, że &łączenie) operacje są podobne "12"+3lub 45 & "6"nie stanowią niejednoznaczności (obliczają odpowiednio 15 i „456”). W języku silniej typowanym operator „+” może być bezpiecznie przeciążony zarówno dla łączenia łańcuchów, jak i dodawania liczb, bez powodowania dwuznaczności, ponieważ operacje na łańcuchach i liczbach byłyby zabronione. Problemy pojawiają się, gdy język określa gwoździe w dół ani typy, ani operacje, które należy wykonać.
supercat
4

Słabe pisanie jest bardziej podobne do 1 == "TRUE". Ta sekcja na Wikipedii ładnie ilustruje różnicę.

Pamiętaj, że żaden przykład z wikipedii nie jest wpisany statycznie, do czego odwołujesz się w drugim przykładzie.

Więc jeśli pytanie brzmi, dlaczego ludzie używają dynamicznie pisanych języków, odpowiedź brzmi: statyczne systemy typów nakładają na ciebie ograniczenia. Wiele osób po prostu nigdy nie pracowało z ekspresyjnym systemem typu statycznego, co prowadzi do wniosku, że wady typowania statycznego przeważają nad korzyściami.

back2dos
źródło
0

Języki słabo typowane są wciąż rozwijane, ponieważ ludzie ich używają i lubią. Jeśli nie lubisz słabego pisania, nie używaj słabo pisanych języków. Stwierdzenie, że coś jest jedyną prawdziwą drogą i że każdy powinien to zrobić jedyną prawdziwą drogą, ignoruje złożoność świata.

mjfgates
źródło
0

Czy wszystkie języki nie powinny dążyć do silnego pisania na maszynie, ponieważ wymuszają bezpieczeństwo typu w czasie kompilacji, unikając w ten sposób pewnych pułapek podczas rzutowania?

Niekoniecznie. Nauka celu C: elementarz zajmuje się tym pytaniem bezpośrednio w kontekście celu C:

Zmiennie wpisane zmienne są często używane do takich rzeczy, jak klasy kolekcji, w których dokładny typ obiektów w kolekcji może być nieznany. Jeśli jesteś przyzwyczajony do używania silnie typowanych języków, możesz pomyśleć, że użycie słabo typowanych zmiennych spowodowałoby problemy, ale w rzeczywistości zapewniają ogromną elastyczność i pozwalają na znacznie większą dynamikę w programach Objective-C.

Caleb
źródło