Moc ekspresyjna jest definiowana przez Wikipedię jako:
Dajmy tej stronie ponownie. Jedną z pierwszych rzeczy, na które należy zwrócić uwagę, jest to, że mówi „język”, a nie „język programowania”, a większość jego przykładów nie jest językami programowania, np. Pierwszy podany przykład to porównanie OWL2 EL i OWL2 RL, które są zarówno ontologią Języki.
Można zastosować tę koncepcję do języków programowania, ale także do języków, w których używane są wzorce, języki znaczników, języki zapytań, języki do wizualnego arkusza stylów, wyrażenia regularne (i wszystkie języki, do których się odnoszą) i tak dalej. Można nawet odnieść się do ekspresyjnej mocy języków naturalnych, takich jak angielski, co często odbywa się bardzo nieformalnie, ale z większą powagą przy rozważaniu problemów związanych z przetwarzaniem języka naturalnego.
Czy „pomysły” odnoszą się do rzeczy (operacji, struktur, algorytmów itp.), Które możemy komunikować z maszyną? Czy też odnosi się do „ludzkich” pojęć, które można uchwycić i komunikować z językiem innym ludziom?
Odnosi się do tego, co można wyrazić w tym języku, uważanym wyłącznie za rzecz samą w sobie.
Na przykład (użyję javascript w moich przykładach, ponieważ twoje pytanie wskazuje, że jest to jeden z języków, które znasz) rozważ instrukcję javascript:
var x = 3 + 4;
Oznacza to, że obliczana jest suma wartości 3 i 4, a wartość powiązana z etykietą x
w danym zakresie przestrzeni nazw.
Gdybyśmy zniszczyli wszystkie komputery na świecie i napisali ten kod na kartce papieru, pozostałoby, że w javascript nadal miałby to samo znaczenie; nie bylibyśmy w stanie uruchomić takiego kodu na niczym, ale abstrakcyjna definicja języka jest nadal czymś, o czym moglibyśmy porozmawiać.
Może się to wydawać pedantyczne, ale w rzeczywistości bardzo ważne jest, aby języki były rozumowane w sposób abstrakcyjny bez uwzględnienia prawdziwych komputerów. Po pierwsze, ludzie myślący o teoretycznych aspektach języków komputerowych, które nie były jeszcze wykonalne w praktyce, są jedną z rzeczy, które doprowadziły nas do tego, gdzie jesteśmy dzisiaj; komputery potrzebują informatyki, ale informatyka nie potrzebuje komputerów, wystarczy idea obliczeń.
Oczywiście korzystamy z komputerów w prawdziwym świecie, a obecnie wiele osób korzysta z nich w praktyce, a nie kilku specjalistów dyskutujących o nich teoretycznie. Strona, do której prowadzisz link, mówi:
Termin moc ekspresyjna może być używany z szeregiem znaczeń. Może to oznaczać miarę pomysłów wyrażanych w tym języku:
Pierwszy zmysł dominuje w obszarach matematyki i logiki, które dotyczą formalnego opisu języków i ich znaczenia, takich jak formalna teoria języka, logika matematyczna i algebra procesów.
W nieformalnych dyskusjach termin często odnosi się do drugiego zmysłu lub obu. Często dzieje się tak przy omawianiu języków programowania. Podjęto wysiłki w celu sformalizowania tych nieformalnych zastosowań tego terminu
Z tych dwóch zastosowań tego terminu praktyczny wpływ pierwszego dotyczy wyłącznie tego, co można przekazać do komputera.
Drugi odnosi się bardziej do ludzkiego zrozumienia zarówno w czytaniu, jak i pisaniu, chociaż stopień, w jakim to robi, różni się znacznie między zastosowaniami, ponieważ są nieformalne i jako takie nie są ściśle określone.
Na przykład, jeśli weźmiemy język taki jak JavaScript i narzucimy dziwne ograniczenie nazw zmiennych, takie jak zmienna musi być 8-cyfrową liczbą poprzedzoną podkreśleniem, dopasowaniem /^_[0-9]{8}$/
, czy stracilibyśmy moc ekspresji?
Zgodnie z formalną definicją nie straciliśmy żadnej mocy ekspresji: jesteśmy ograniczeni do 100 000 000 zmiennych, ale gdybyśmy naprawdę tego potrzebowali, moglibyśmy obejść ten problem, tworząc obiekty przechowujące więcej zmiennych w nowo utworzonej przestrzeni nazw. W związku z tym każdy program napisany dzisiaj w javascript może zostać przepisany w tej nowej formie, więc są równie ekspresyjne.
Zgodnie z nieformalną definicją straciliśmy trochę, ale to, jak bardzo zależy od tego, jak bardzo jesteśmy nieformalni, będzie się różnić, ponieważ ponownie nie możesz powiedzieć, jaka jest „reguła” dotycząca używania nieformalnego. Można powiedzieć, że straciliśmy niewielką ilość, ponieważ programy zawierające ponad 100 000 000 zmiennych w tej samej przestrzeni nazw muszą zostać przepisane poza prostą zamianą. Jeszcze bardziej nieformalne użycie ponownie odnosiłoby się do mentalnego wpływu takich niezgrabnie zmiennych nazw na ludzkie kompleksowe.
Warto również zauważyć, że ludzie nieformalnie rozważą rzeczy, które nie są ściśle częścią języka. Zastanów się nad zmianami w Javascripcie od jego stworzenia do dzisiaj.
Zgodnie z najbardziej formalną definicją ekspresja pozostała niezmieniona; W końcu Turing był kompletny.
Dzięki bardziej nieformalnej definicji stała się znacznie bardziej ekspresyjna w niektórych kwestiach, takich jak manipulacje tablicami, obsługa wyjątków i (być może przede wszystkim) włączenie wyrażeń regularnych. Nie robią nic, czego wcześniej nie można było zrobić w javascript, chociaż często potrafią zrobić coś w kilku wierszach i w ciągu drugiego sekundy wykonania, co zajęłoby kilobajty kodu do napisania w javascript1.0 i długo trwało.
Według znacznie bardziej nieformalnej definicji zmiana od pierwszego użycia javascript w przeglądarkach (możliwość zmiany wartości danych wejściowych formularza, document.write
podczas gdy strona jest najpierw analizowana i przenoszona do nowej lokalizacji lub cofania się w przód lub w historii, ale ładna nic więcej) do tego dzisiaj (możliwość zmiany prawie wszystkiego na stronie, w tym na podstawie danych z wywołań serwera) jest absolutnie ogromna, chociaż większość nie dotyczy javascript, ale modeli obiektowych i stworzonych interfejsów API dostępne, a nie język (np. vbscript w IE korzystał z tych zmian w równym stopniu).
Moim zdaniem, to ostatnie użycie jest tak nieformalne, że tak naprawdę nie jest poprawne, ale taki jest problem z nieformalnymi definicjami.
Według formalnej definicji tak naprawdę wcale nie stała się bardziej ekspresyjna.