Czy można zaprojektować język, w którym nie występują błędy składniowe? [Zamknięte]

14

Innymi słowy, język, w którym każdy możliwy ciąg znaków jest poprawną składnią?

EDYCJA : To pytanie teoretyczne.
Nie jestem zainteresowany używaniem takiego języka; Pytam tylko, czy to możliwe.

Dalsza edycja

Udało mi się zaprojektować taki język. Zobacz ErrorFree

SLaks
źródło
2
Gdybyśmy mogli to zrobić, stworzylibyśmy sztuczną inteligencję.
Michael K
5
@Michael: Nie; Nie wydaje mi się
SLaks,
7
!!! Perl !!!
8
Zdecydowanie sprzeciwiam się zamknięciu pytania! To nie jest ani subiektywne, ani konstruktywne !!!
Felix Dombek
1
dlaczego nie wziąć języka asemblera zawierającego: dokładnie 256 instrukcji, 128 rejestrów i ogólną składnię instruction operand*, gdzie operand może być rejestrem lub liczbą z przedziału od 0-127 (i wszystko powyżej, co jest traktowane jako rejestr) i jeśli operand brakuje dla instrukcji wielowarstwowej, przyjmuje się „0”.
Felix Dombek

Odpowiedzi:

8

Tak, jeśli spojrzysz na to w bardzo analityczny sposób, tworząc Deterministyczną Maszynę Turinga, która zawsze zatrzymuje się w dobrym stanie końcowym dla każdego pojedynczego ciągu określonego języka, to możesz zdemoralizować to, co jest możliwe. Demostration jest dość prosty, musisz zwykłą TM z funkcją przejścia z tylko jednym przejściem, które wygląda następująco:

TF(w,q) -> (w,Qa) 

Considerations:
    L = { w | w is any possible string }
    w e L
    q e Q
    F is a set with all good final states {Qa,Qr}
    Qa e F

Udowodniono, że TM ma taką samą moc obliczeniową, jak każdy pojedynczy komputer z prawdziwego życia, więc jest to absolutnie możliwe

guiman
źródło
1
Co to u licha oznacza dla nas, zwykłych ludzi świeckich? Co to jest „w”, „e”, „L”, „q”, „Q”, „Qa”, „Qr”, „F”, „TF”. Bez żadnego z tych zdefiniowanych nie mam układu odniesienia.
Berin Loritsch,
1
Przepraszamy, ale nie ma łatwego sposobu na wyjaśnienie podejścia Turinga do tej odpowiedzi. Sprawdź ten link, aby trochę wyjaśnić: en.wikipedia.org/wiki/Turing_machine
guiman
16

Tak, oczywiście, że jest to możliwe, nawet banalnie proste.

<programm> ::= char | char <program> |

Nie rozumiem, jak ktokolwiek może powiedzieć „nie”. To powiedziawszy, może być trudno zdefiniować znaczącą semantię dla takiego języka, ale jest to również możliwe. Spójrz tylko na białe znaki .

użytkownik 281377
źródło
Więc jeśli język go ignoruje, to jest to poprawny systax? i czy „tabtabspace” nie jest poprawnym ciągiem?
Michael K
1
Semantyka języka była moim problemem, ale tak naprawdę nie mogę go omówić, nie wchodząc poza temat do właściwej filozofii / językoznawstwa.
StuperUser
2
Michael: Dokładnie. Wszystko jest poprawne pod względem składniowym, ale może być NOP (nie ma specjalnego znaczenia). Nie ma nic złego w języku ignorującym wiele rzeczy. Spójrz tylko na wszystkie rzeczy, które C ignoruje w tym przykładowym programie: int main () {3 ;;; / * komentarz * /}
user281377
Wiele osób mówi „nie”, ponieważ nie ma rozróżnienia koncepcyjnego między składnią a semantyką. „Nie można go skompilować? To musi być błąd składniowy!”
fredoverflow
Wiele osób mówi „nie”, ponieważ nie ma w tym prawdziwego znaczenia. Po dodaniu struktury (tj. Więcej niż reguła parsowania rekurencyjnego) masz pojęcie składni. Naruszenie struktury jest błędem wywołanym składnią. Błąd wywołany składnią jest błędem składniowym, niezależnie od tego, czy analizator składni oznaczy go jako taki, czy nie.
Berin Loritsch,
5

Myślę, że to zależy od tego, co rozumiesz przez prawidłową składnię.

Możesz zaprojektować język, który akceptuje dowolny ciąg, ale ignoruje wszystko, co nie miało określonego znaczenia. Jest to w zasadzie odpowiednik powiedzenia „Pozbędę się błędów składniowych, ale powiedzenie, że nie są błędami” - dość bezcelowe i bardzo niepożądane z wielu powodów.

Poza tym jedynym sposobem, w jaki można mieć język, w którym nie występują błędy składniowe, jest powiązanie z każdym możliwym łańcuchem prawidłowej instrukcji / użycia. Jedyny sposób, w jaki mogę to zrobić, to mieć wszystkie operacje jako pojedyncze znaki i upewnić się, że każda pojedyncza postać ma przypisaną operację.

Jest w tym milion rzeczy nie tak - oczywiście nie ma słów zastrzeżonych, chodzi o to, gdzie jest użyte w kontekście, w wyniku czego byłby w zasadzie nieczytelny i, chociaż odporny na błędy składniowe byłby znacznie bardziej prawdopodobne, aby doświadczyć każdego innego rodzaju błędu.

Tak teoretycznie możliwe (AmmoQ stawia to o wiele bardziej starannie niż ja), ale całkowicie niepożądane.

Jon Hopkins
źródło
Czytałem, że TECO było takie, ponieważ każda postać ma przypisane znaczenie.
David Thornley,
3
Kod maszynowy działa w ten sposób. Każda możliwa kombinacja bajtów może być postrzegana jako program, który coś robi , nawet jeśli wszystko to powoduje przerwanie.
user281377,
David, tak właśnie myślałem, bardzo TECO. Chociaż dane wejściowe TECO IIRC mogą zawierać błędy składniowe. Ale pokazuje trudność tak gęstego języka - bardzo trudny do odczytania i podatny na trudne do zrozumienia błędy.
Omega Centauri,
@ user281377: Na 6502 jest sporo instrukcji bez zdefiniowanych znaczeń. Niektóre mają zachowania, które są spójne, użyteczne i niedostępne z żadną udokumentowaną instrukcją (mój ulubiony ma przydomek „DCP” - zmniejsza adres pamięci i porównuje wynik z akumulatorem, odpowiednio ustawiając flagi), ale niektóre mają zachowanie, które zależy od taktowanie magistrali w dziwny i dziwny sposób, a niektóre zablokują procesor wystarczająco mocno, aby wymagać resetu (nawet przerwanie „nie-maskowalne” nie pomoże). Myślę, że te ostatnie instrukcje można uznać za „błędy składniowe”.
supercat
5

Kod w nietekstowym języku programowania może nie zawierać błędów składniowych.

Mam na myśli język wizualny taki jak BYOB . Nie można przypadkowo wpisać „if x dziesięć else foo”, ponieważ „składnia” jest zdefiniowana przez bloki graficzne.

LennyProgrammers
źródło
3

Głównym celem składni jest rozróżnienie między poprawnym a nieważnym w sposób, który jest szybszy i bardziej efektywny niż wykonywanie kodu. Składnia to tylko optymalizacja, co się w niej dzieje, a co w semantykę jest arbitralne.

Zwykle chcesz czegoś wręcz przeciwnego: aby rozciągnąć składnię tak daleko, jak to możliwe, aby zaoszczędzić więcej czasu, ale oczywiście możesz też całkowicie pominąć składnię i zadeklarować każdy błąd semantyczny: skończysz z interpreterem bez tokenizacji.

biziclop
źródło
0

Ahbefiasdlk aslerhsofa; f jwi [ asdfasdf ] aew / & Q! @ # $} {;-P

Więc, co to znaczy?

Tak długo, jak język ma strukturę i gramatykę, zawsze istnieje koncepcja błędu składniowego. Pytanie brzmi, czy to egzekwujesz, czy nie. Ludzie popełniają błędy, a błędy składniowe są tym, do czego dąży większość projektantów języków, aby pomóc programistom uniknąć głupich błędów.

Błąd składniowy to błąd wprowadzany przez programistów piszących kod, który nie ma znaczenia dla języka.

Na podstawie powyższej definicji nie można pozbyć się błędów składniowych. Wszyscy źle wpisaliśmy identyfikatory, wszyscy błędnie wprowadziliśmy nazwy metod. Posługiwanie się językiem w ciszy i akceptowanie błędów w pisowni i na szczęście nic nie robienie nie jest moim pomysłem na przyjemne doświadczenie.

Możliwe jest zaprojektowanie języka, który może wykorzystywać dowolny prawidłowy znak Unicode (lub sekwencję znaków) jako identyfikatory. Istnieją wyzwania, takie jak normalizacja równoważnych znaków / sekwencji znaków, aby były one rozpoznawane jako to samo - ale jest to możliwe. UWAGA: istnieją cztery standardowe typy normalizacji Unicode .

Berin Loritsch
źródło
1
Potrzeba struktury nie wymaga gramatyki. Rozważmy Piet, gdzie struktura znajduje się w pozycji znaku (lub koloru) w siatce, a nie w stosunku do innych znaków w morfemie.
Mike Samuel,
1
Naruszać strukturę i co się dzieje?
Berin Loritsch,