Istnieje kilka definicji mocy przekraczającej kompletność Turinga. Mark przytoczył to, co zwykle nazywam „definicją Paula Grahama”. To całkiem dobra definicja, z jedną poważną wadą: jest błędna. Teoretycznie jest to bardzo dobra definicja siły języka, ale wiesz, co mówią o różnicy między teorią a praktyką ...
Gdyby każdy był w stanie napisać idealny kod, nie tylko doskonale wolny od błędów, ale również doskonale przyszłościowy, konsekwentnie, to definicja Paula Grahama byłaby poprawna. Ale oczywiście tak nie jest. W prawdziwym świecie większość czasu i wysiłku poświęconego inżynierii oprogramowania nie jest podejmowana przez początkowe stworzenie produktu, ale później przez jego konserwację. W zależności od tego, jakich statystyk słuchasz (i prawdopodobnie różnią się one znacznie w zależności od projektu), utrzymanie może stanowić od 60% do 90% całkowitego wysiłku włożonego w program.
Konserwacja jest często wykonywana przez osoby inne niż osoba, która napisała kod początkowo, a często miesiące lub nawet lata po początkowym napisaniu kodu, co oznacza, że nawet dla oryginalnego kodera może to być również „kod innej osoby” punkt. Jeśli chcesz być produktywny podczas konserwacji, musisz być w stanie szybko ustalić pierwotną intencję kodu, czytając go.
Dlatego bardziej zaawansowanym językiem jest taki, który ułatwia szybkie czytanie kodu , a nie taki, który ułatwia szybkie pisanie kodu . Oba te elementy często nakładają się na siebie, ale koncepcje te są często również krzyżowe, ponieważ składnia zwięzła często pomija szczegóły, że kompilator / interpreter jest w stanie wnioskować o wiele łatwiej niż programista konserwacji.
EDYCJA: Jest jeszcze jeden ważny punkt w opisie siły języka: zakres pojęć, które jesteś w stanie wyrazić i jak łatwo możesz trafić na oba końce. Paul Graham lubi oceniać, jak wysoki poziom abstrakcji można osiągnąć, ale to tylko połowa tego. Każdy język, który nakłada dolną granicę abstrakcji, poniżej której nie można przejść w razie potrzeby, jest kaleką, ponieważ szczegóły, które są abstrahowane, istnieją z jakiegoś powodu. Jest to różnica między łatwym do odczytania językiem zabawek, takim jak COBOL, a łatwym do odczytania, potężnym językiem: COBOL nie ma wskaźników ani dostępu do wbudowanego zestawu, w którym można wyrazić dowolne obliczenia, nawet te, do których COBOL nie jest odpowiedni.
COBOL również nie jest szczególnie dobry w uderzaniu w górną granicę spektrum abstrakcji. Według Wikipedii nie ma „typów zdefiniowanych przez użytkownika ani funkcji zdefiniowanych przez użytkownika”, co bardzo utrudnia tworzenie algorytmów i struktur danych.