Jakie są argumenty za słabym pisaniem na klawiaturze?

40

Stało się to podczas dyskusji z przyjacielem i ciężko mi było wymyślić jakieś dobre argumenty. Jakie korzyści przynoszą słabe pisanie?

Fishtoaster
źródło
17
Cooper i Torczon w Inżynierii kompilatora definiują słabe pisanie jako słabo zaprojektowany system typów. To z pewnością nie brzmi tak, jakby przyniosło korzyści każdemu.
Corbin March
@Corbin March: Niezły. Muszę dodać to do mojej listy.
Jörg W Mittag
5
Najlepszy argument może zostać podany przez dyrektorów korporacyjnych: pozwala mi zatrudniać tanich ludzi do budowy moich systemów
Wektor

Odpowiedzi:

46

Problemem w tego rodzaju dyskusji jest po prostu to, że terminy „słabe pisanie” i „mocne pisanie” są niezdefiniowane, w przeciwieństwie do na przykład terminów „pisanie statyczne”, „pisanie dynamiczne”, „pisanie jawne”, „pisanie niejawne”, „ typowanie „kaczych”, „typowanie strukturalne” lub „typowanie typowe”. Heck, nawet terminy „pisanie manifestów” i „pisanie ukryte”, które są nadal otwartymi obszarami badań i dyskusji, są prawdopodobnie lepiej zdefiniowane.

Tak więc, dopóki twój przyjaciel nie zdefiniuje terminu „słabe pisanie”, który jest wystarczająco stabilny, aby służyć jako podstawa dyskusji, nie ma nawet sensu odpowiadać na to pytanie.

Niestety, poza odpowiedzią Nicka , żaden z ankieterów nie zadał sobie trudu, by podać swoją definicję, i widać zamieszanie, które generuje niektóre komentarze. Trudno powiedzieć, ponieważ nikt tak naprawdę nie podaje ich definicji, ale myślę, że liczę co najmniej trzy różne, tylko na tej stronie.

Niektóre z najczęściej używanych definicji to (i tak, wiem, że prawie żadna z nich nie ma żadnego sensu, ale są to definicje, których ludzie faktycznie używają):

  • słabe pisanie = niebezpieczne pisanie / mocne pisanie = bezpieczne pisanie
  • słabe pisanie = dynamiczne pisanie / mocne pisanie = pisanie statyczne
  • słabe pisanie = pisanie kaczek / mocne pisanie = pisanie nominalne
  • słabe pisanie = pisanie strukturalne / mocne pisanie = pisanie nominalne
  • słabe pisanie = niejawne pisanie / mocne pisanie = pisanie wyraźne
  • słabe pisanie = ukryte pisanie / mocne pisanie = pisanie manifestów
  • słabe pisanie = brak pisania / mocne pisanie = pisanie
  • słabe pisanie = niejawne rzutowania / mocne pisanie = tylko jawne rzutowania
  • słabe pisanie = niejawne lub jawne rzutowania / silne pisanie = brak rzutów w ogóle
  • słabe pisanie = niejawne konwersje / mocne pisanie = tylko jawne konwersje
  • słabe pisanie = niejawne lub jawne konwersje / mocne pisanie = w ogóle żadnych konwersji
  • słabe pisanie = interpretacja / mocne pisanie = kompilacja
  • słabe pisanie = wolne / mocne pisanie = szybkie
  • słabe pisanie = odśmiecanie / silne pisanie = ręczne zarządzanie pamięcią
  • słabe pisanie = ręczne zarządzanie pamięcią / mocne pisanie = odśmiecanie
  • … i wiele innych

Trzy definicje, które wydają się być używane najbardziej powszechnie są jednak

  • słabe pisanie = twój głupi gówniany język programowania / mocne pisanie = mój super niesamowity język programowania
  • słabe pisanie = każdy inny język programowania / mocne pisanie = jedyny język programowania, na którym miałem ochotę się uczyć (zwykle Java, C # lub C ++; dziwnie, ludzie, którzy uczą się np. Haskell lub Scheme jako swojego pierwszego i jedynego języka nie wydają się dzielić ten światopogląd)
  • słabe pisanie = każdy język, którego nie rozumiem / mocne pisanie = Java (zamień na C # lub C ++ do woli)

Chyba że wszyscy zgadzają się na definicji tego, co „słaby wpisując” nawet jest , to nie ma sensu myśleć o tym, co może mieć swoje zalety. Zalety czego? Co gorsza, jeśli nie ma definicji w ogóle , to każdy może po prostu przesunąć ich definicje w celu dopasowania ich argumentów, a każda dyskusja jest dość dużo gwarancją, ponosi w flamewar.

Przez lata osobiście kilkakrotnie zmieniałem własną definicję i doszedłem do punktu, w którym nawet nie uważam, by te terminy były już przydatne. Kiedyś myślałem, że słabe pisanie (w różnych definicjach) ma swoje miejsce w skryptach powłoki, ale ilekroć muszę rozwiązać ten sam problem w Bash i PowerShell, boleśnie przypomina mi się, jak się myliłem.

Jörg W Mittag
źródło
5
Całkiem cyniczna odpowiedź! Rozumiem, skąd pochodzisz, ale uważam, że „wystarczająco dobrze”, aby zgadnąć, że każdy, kto nie podaje definicji, odnosi się do „słabego i / lub dynamicznego pisania”, dlatego w odpowiedzi umieściłem oba te słowa. Wiem, że to nie jest idealne, ale wydaje się, że większość ludzi wygrywa, jeśli chodzi o definiowanie systemów typów.
Nicole,
7
@Reneesis: Nazwałbym to „realizmem” :-) Widziałem wystarczająco dużo dyskusji na temat systemów typów, aby zdać sobie sprawę, że połowa ludzi nie zdaje sobie sprawy, że mówią o zupełnie innych rzeczach, a druga nie wie o czym mówią o w ogóle . Kilka miesięcy temu odbyła się dyskusja na temat podstawowej listy rozwojowej języka, którego nie wymienię, na temat dodania opcjonalnego systemu typów w celu poprawy wydajności. Ta dyskusja trwała przez tydzień, obejmując dziesiątki osób i setki maili. Nikt nie zdawał sobie sprawy, że opcjonalny system typów z definicji nie może poprawić wydajności. …
Jörg W Mittag,
8
+1 za kynizm! Możesz dodać „mocne pisanie = gdy IDE zna typy moich zmiennych (Intellisense itp.), Słabe pisanie = kiedy nie
wie
1
Lepiej zdefiniowanym nazwom systemów piszących brakuje domyślnej oceny wartości, słabej i silnej .
Eva,
1
Wspaniały, zabawny i dokładny. Im więcej nauczyłem się o systemach typu, tym bardziej zdawałem sobie sprawę, jak długo cierpiałem pod złudzeniem, że jeden język różni się od drugiego w sposób, w jaki po prostu nie był wcale. To niesamowite, jak wiele zamieszania wywołuje ta koncepcja, i naprawdę uważam, że nie jest to konieczne, jeśli tylko zaakceptujemy, że słabość / moc nie jest rzeczywistością, więc pomówmy o czymś, co naprawdę jest i może się czegoś nauczymy.
BrianH
25

Pamiętaj, że istnieją dwa główne pojęcia, które są często mylone:

Pisanie dynamiczne

Mówi się, że język programowania jest dynamicznie typowany, gdy większość jego sprawdzania typów jest wykonywana w czasie wykonywania, a nie w czasie kompilacji. W typowaniu dynamicznym wartości mają typy, ale zmienne nie; to znaczy zmienna może odnosić się do wartości dowolnego typu.

Zalety tutaj są często odrzucane tylko dla „nowych” programistów, ale mogą być również wygodne dla każdego programisty:

if (!(arr is Array)) arr = [arr]; // is, instanceof, .constructor ==, whatever

Mniej kodu w każdym przypadku, w którym w innym przypadku konieczne byłoby przesłanie lub przypisanie nowej wartości:

if (data is Array)) {
    i = data.length; // no i = ((Array)data).length or Array myArr=(Array)data;
}

Luźne lub słabe pisanie

Słabe pisanie oznacza, że ​​język domyślnie konwertuje (lub rzutuje) typy, gdy są używane.

Korzyści:

  • Przekaż dowolną wartość typu jako parametr do funkcji . Przydatny w przypadku wywołań zwrotnych, elastycznych interfejsów API i ułatwia implementację zamknięć.
  • Niejawna ocena logiczna . Każdy typ może być oceniony jako wartość logiczna. Ma to również zalety uboczne, takie jak część zmiennej, ||której można użyć w przypisaniu bez konwersji na wartość logiczną:

    var a = param || defaultValue;
    
  • Ponownie mniej kodu:

    var num = 5;
    var str = "Hello";
    input.innerHTML = input.value = num;
    for (var i=0; i < input.value; i++) { ... }
    

    Nawet Java musiała odejść częściowo, z niejawnym wezwaniem do .toString()łączenia obiektów z String; w przeciwnym razie programiści Java przeklinaliby to przez cały dzień (instrukcje dziennika byłyby poza kontrolą).


Obie definicje pochodzą z http://en.wikipedia.org/wiki/Type_system . Powiedział to lepiej niż ja.

Nicole
źródło
1
Pisanie dynamiczne jest również korzystne, gdy wymagane jest dużo generowania kodu w języku o typie statycznym. Porównaj ilość generowania kodu wymaganego, powiedzmy, Entity Framework w języku C # z bibliotekami ORM w dynamicznie pisanych językach (PHP, Python itp.). Chociaż niektórzy mogą twierdzić, że korzyści w postaci IDE IntelliSense przewyższają koszt całego generowania kodu ...
Dean Harding
3
Twój komentarz „// no i = ((Array) data) .length lub Array myArr = (Array) data;” tak naprawdę nie ma nic wspólnego z dynamicznym pisaniem, ponieważ tablica danych jest możliwa do udowodnienia w czasie kompilacji. Język o typie statycznym może propagować wiedzę uzyskaną z instanceof.
Peter Taylor
@Peter Taylor, przypuszczam, że to prawda w prostych przypadkach, czy znasz coś takiego? Ma to związek z dynamicznym pisaniem, polegającym na tym, że niezależnie od tego, czy ifużyto bloku, czy innej bardziej złożonej (nawet środowiska wykonawczego lub dynamicznego) logiki, następny wiersz będzie zgodny z prawem i zabezpieczony przed błędami.
Nicole,
@Reneesis, ja nie, nie. Ale rodzina języków ML jest typowana statycznie i korzysta z wnioskowania o typie, więc bardzo rzadko trzeba jawnie podawać typ zmiennej.
Peter Taylor
1
@Peter Taylor ma rację. Wiele korzyści płynących z dynamicznego pisania jest dostępnych w językach z lepszymi statycznymi systemami pisania, takimi jak Haskell, Scala, a nawet C # w niektórych przypadkach. Powiedziałbym, że główną zaletą dynamicznego pisania jest radzenie sobie z rzeczami, które z natury są bez typowe, jak HTML DOM. Po co pisać node [„attr”] zamiast node.attr? W każdym razie zawsze są one rozwiązywane.
Matt Olenik
7

Głównym argumentem za słabym pisaniem jest wydajność. (aby odpowiedzieć na pytanie PO, jak podano). Istnieje wiele dobrych dyskusji na temat dynamiki vs. statyczności, niejawności vs. jawności. itp.

C jest najsłynniejszym słabo wpisanym językiem i nie wykonuje żadnego sprawdzania czasu wykonywania ani sprawdzania czasu kompilacji typu zmiennych. W gruncie rzeczy możesz rzucić char *na a, int *a języka nie obchodzi. Dlaczego miałbyś to zrobić?

Programowanie w C jest bardzo zbliżone do sposobu, w jaki robisz to przy montażu, więc są chwile, w których zależy ci tylko na adresie. Z tego powodu nierzadko rzuca się lub przekazuje void *referencje. Jeśli wiesz, jak zorganizowana jest pamięć (ponownie sprawa C i montażu), możesz wykonać całkiem fajne obliczenia na podstawie adresu w, void *aby uzyskać potrzebne informacje. Może to pozwolić na zerwanie procesu, na przykład w Javie.

Podczas gdy sprawdzanie typu w czasie wykonywania nie ma nadzwyczajnego narzutu, zdarzają się sytuacje, w których wystarczy, aby krytyczna sekcja była zbyt wolna. W tym przypadku myślę głównie o programowaniu wbudowanym i systemach czasu rzeczywistego.

To powiedziawszy, w większości przypadków posiadanie silnego systemu typów, który jest sprawdzany podczas kompilacji lub sprawdzany w czasie wykonywania, pomaga częściej niż boli.

Berin Loritsch
źródło
2
Nie rozumiem, dlaczego silnie napisany język nie może się kompilować tak skutecznie jak C. Jednak kompilator powinien być znacznie bardziej złożony.
9000
2
C ++ jest przykładem jednego z takich języków. W C ++ sprawdzanie wszystkich typów odbywa się w czasie kompilacji, a żadne nie jest wykonywane w czasie wykonywania ... O ile nie włączono RTTI.
Berin Loritsch,
2
Nie jestem pewien, czy zgadzam się z tym argumentem dotyczącym wydajności, ale jest to interesujący pogląd.
Martin Ba,
2

Słabe pisanie jest zazwyczaj łatwiejsze do zrozumienia dla początkujących, na przykład w takich programach, jak Excel, javascript i vbscript. Wymieniasz także pewną prędkość programowania na potencjalne błędy.

Dobry artykuł na ten temat: Mocne pisanie vs Mocne testowanie

Homde
źródło
1
Nie sądzę, aby istniała silna zgodność między słabo napisanymi językami a językami przyjaznymi dla początkujących. Ruby i python są silnie napisane i ogólnie uważane za przyjazne dla początkujących. C jest słabo wpisany i ogólnie uważany za początkującego wrogo.
sepp2k
Nie, nie w ogóle język, ja tylko mówiłem o pisaniu
Homde
2
Dynamiczna i silnie napisana kombinacja jest przyjazna dla początkujących. Chociaż widziałem, że kiedy ludzie przechodzą z języka o typie statycznym do języka o typie dynamicznym, są również bardzo zdezorientowani. Nigdy nie spotkałem kogoś, kto zaczynał od pisania na maszynie dynamicznej, odkąd szkoły najczęściej uczyły najpierw języka C lub Java.
jsternberg,
3
@Mchl: nie ma to nic wspólnego z pisaniem statycznym / dynamicznym ani mocnym / słabym. Konieczność deklarowania typów dotyczy pisania jawnego / niejawnego.
Jörg W Mittag,
1
Równie dobrze może być;) Więc przeniosłem się również z języka jawnie wpisanego. Popraw mnie, jeśli się mylę, Pascal jest wpisywany statycznie, silnie i jawnie, podczas gdy PHP jest dynamicznie, słabo i niejawnie, prawda?
Mchl,