Oświadczenie (informatyka) - Statement (computer science)
W programowaniu komputerowym , o stwierdzenie jest składniowym jednostka o bezwzględnej języka programowania , który wyraża pewne działania mają być przeprowadzone. Program napisany w taki język jest utworzony przez sekwencję jednego lub więcej sprawozdań. Instrukcja może zawierać składniki wewnętrzne (np. wyrażenia ).
Wiele języków programowania (np. Ada , Algol 60 , C , Java , Pascal ) rozróżnia instrukcje i definicje/deklaracje . Definicja lub deklaracja określa dane, na których ma działać program, natomiast instrukcja określa działania, jakie należy podjąć z tymi danymi.
Instrukcje, które nie mogą zawierać innych instrukcji, są proste ; te, które mogą zawierać inne wyrażenia, są złożone .
Wygląd instrukcji (a nawet programu) jest określony przez jego składnię lub gramatykę. O znaczeniu wypowiedzi decyduje jego semantyka .
Proste stwierdzenia
Proste stwierdzenia są kompletne same w sobie; obejmują one przypisania, wywołania podprogramów i kilka instrukcji, które mogą znacząco wpłynąć na przebieg sterowania programem (np. goto , return , stop/halt). W niektórych językach wejścia i wyjścia, asercje i wyjścia są obsługiwane przez specjalne instrukcje, podczas gdy inne używają wywołań predefiniowanych podprogramów.
-
zadanie
- Fortran:
variable = expression
- Pascal, Algol 60, Ada:
variable := expression;
- C, C#, C++, PHP, Java:
variable = expression;
- Fortran:
-
połączenie
- Fortran:
CALL subroutine name(parameters)
- C, C++, Java, PHP, Pascal, Ada:
subroutine name(parameters);
- Fortran:
-
twierdzenie
- C, C++, PHP:
assert(relational expression);
- Jawa:
assert relational expression;
- C, C++, PHP:
-
iść do
- Fortran:
GOTO numbered-label
- Algol 60:
goto label;
- C, C++, PHP, Pascal:
goto label;
- Fortran:
-
powrót
- Fortran:
RETURN value
- C, C++, Java, PHP:
return value;
- Fortran:
-
zatrzymaj się/zatrzymaj/wyjdź
- Fortran:
STOP number
- C, C++:
exit(expression)
- PHP:
exit number;
- Fortran:
Instrukcje złożone
Instrukcje złożone mogą zawierać (sekwencje) instrukcji, które można zagnieździć na dowolnej rozsądnej głębokości i zazwyczaj obejmują testy, aby zdecydować, czy przestrzegać lub powtarzać te zawarte instrukcje.
- Notacja dla następujących przykładów:
- <instrukcja> to dowolna pojedyncza instrukcja (może być prosta lub złożona).
- <sekwencja> to dowolna sekwencja zer lub więcej <wyrażeń>
- Niektóre języki programowania zapewniają ogólny sposób grupowania instrukcji, dzięki czemu każdą pojedynczą <instrukcję> można zastąpić grupą:
- Notacja dla następujących przykładów:
- Algol 60:
begin <sequence> end
- Pascal:
begin <sequence> end
- C, PHP, Java:
{ <sequence> }
- Algol 60:
- Inne języki programowania mają inny specjalny terminator na każdym rodzaju instrukcji złożonej, dzięki czemu jedna lub więcej instrukcji jest automatycznie traktowanych jako grupa:
- Ada:
if test then <sequence> end if;
- Ada:
- Inne języki programowania mają inny specjalny terminator na każdym rodzaju instrukcji złożonej, dzięki czemu jedna lub więcej instrukcji jest automatycznie traktowanych jako grupa:
Wiele instrukcji złożonych to polecenia pętli lub polecenia wyboru. Teoretycznie wymagane jest tylko jedno z każdego z tych typów poleceń. W praktyce istnieją różne przypadki szczególne, które zdarzają się dość często; mogą one uczynić program łatwiejszym do zrozumienia, mogą ułatwić programowanie i często mogą być wdrażane znacznie wydajniej. Istnieje wiele subtelności, o których tutaj nie wspomniano; zobacz powiązane artykuły, aby uzyskać szczegółowe informacje.
-
pętla sterowana licznikiem :
- Algol 60:
for index := 1 step 1 until limit do <statement> ;
- Pascal:
for index := 1 to limit do <statement> ;
- C, Jawa:
for ( index = 1; index <= limit; index += 1) <statement> ;
- Ada:
for index in 1..limit loop <sequence> end loop
- Fortran 90:
- Algol 60:
- Indeks DO = 1,limit
- <sekwencja>
- KONIEC
- Indeks DO = 1,limit
-
pętla sterowana warunkami z testem na początku pętli:
- Algol 60:
for index := expression while test do <statement> ;
- Pascal:
while test do <statement> ;
- C, Jawa:
while (test) <statement> ;
- Ada:
while test loop <sequence> end loop
- Fortran 90:
- Algol 60:
- ZRÓB PODCZAS (test)
- <sekwencja>
- KONIEC
- ZRÓB PODCZAS (test)
-
pętla sterowana warunkami z testem na końcu pętli:
- Pascal:
repeat <sequence> until test; { note reversed test}
- C, Jawa:
do { <sequence> } while (test) ;
- Ada:
loop <sequence> exit when test; end loop;
- Pascal:
- pętla sterowana stanem z testem w środku pętli:
- C:
do { <sequence> if (test) break; <sequence> } while (true) ;
- Ada:
loop <sequence> exit when test; <sequence> end loop;
- C:
-
instrukcja if prosta sytuacja:
- Algol 60:
if test then <unconditional statement> ;
- Pascal:
if test then <statement> ;
- C, Jawa:
if (test) <statement> ;
- Ada:
if test then <sequence> end if;
- Fortran 77+:
- Algol 60:
- JEŚLI (test) TO
- <sekwencja>
- KONIEC JEŚLI
- JEŚLI (test) TO
-
dwukierunkowy wybór instrukcji if :
- Algol 60:
if test then <unconditional statement> else <statement> ;
- Pascal:
if test then <statement> else <statement> ;
- C, Jawa:
it (test) <statement> else <statement> ;
- Ada:
if test then <sequence> else <sequence> end if;
- Fortran 77+:
- Algol 60:
- JEŚLI (test) TO
- <sekwencja>
- W PRZECIWNYM RAZIE
- <sekwencja>
- KONIEC JEŚLI
- JEŚLI (test) TO
-
instrukcja case/switch wybór wielokierunkowy:
- Pascal:
case c of 'a': alert(); 'q': quit(); end;
- Ada:
case c is when 'a' => alert(); when 'q' => quit(); end case;
- C, Jawa:
switch (c) { case 'a': alert(); break; case 'q': quit(); break; }
- Pascal:
-
Obsługa wyjątków :
- Ada:
begin protected code except when exception specification => exception handler
- Jawa:
try { protected code } catch (exception specification) { exception handler } finally { cleanup }
- Pyton:
try: protected code except exception specification: exception handler else: no exceptions finally: cleanup
- Ada:
Składnia
Poza przypisaniami i wywołaniami podprogramów, większość języków rozpoczyna każdą instrukcję od specjalnego słowa (np. goto, if, while, itd.), jak pokazano w powyższych przykładach. Do opisu formy wypowiedzi w różnych językach zastosowano różne metody; bardziej formalne metody bywają bardziej precyzyjne:
- Algol 60 wykorzystał formę Backus-Naur (BNF), która wyznaczyła nowy poziom specyfikacji gramatyki języka.
- Aż do Fortran 77 język był opisywany prozą angielską z przykładami, od Fortran 90 język był opisywany za pomocą wariantu BNF.
- Cobol używał dwuwymiarowego metajęzyka.
- Pascal używał zarówno diagramów składniowych, jak i równoważnego BNF.
BNF używa rekurencji do wyrażania powtórzeń, dlatego zaproponowano różne rozszerzenia , aby umożliwić bezpośrednie wskazanie powtórzeń.
Oświadczenia i słowa kluczowe
Niektóre gramatyki języka programowania rezerwują słowa kluczowe lub zaznaczają je specjalnie i nie pozwalają na używanie ich jako identyfikatorów . To często prowadzi do gramatyk, które są łatwiejsze do przeanalizowania i wymagają mniej przewidywania .
Brak wyróżniających się słów kluczowych
Fortran i PL/1 nie mają zastrzeżonych słów kluczowych, co pozwala na stwierdzenia takie jak:
- w PL/1:
-
IF IF = THEN THEN ...
(drugaIF
i pierwszaTHEN
to zmienne).
-
- w Fortranie:
-
IF (A) X = 10...
instrukcja warunkowa (z innymi wariantami) -
IF (A) = 2
przypisanie do zmiennej indeksowanej o nazwieIF
-
-
- Ponieważ spacje były opcjonalne aż do Fortran 95, literówka może całkowicie zmienić znaczenie wypowiedzi:
-
DO 10 I = 1,5
początek pętli, w której biegnę od 1 do 5 -
DO 10 I = 1.5
przypisanie zmiennej wartości 1,5DO10I
Oflagowane słowa
W Algolu 60 i Algolu 68 wyraźnie wyróżniono specjalne tokeny: do publikacji, pogrubioną czcionką np. begin
; do programowania, z pewnymi specjalnymi oznaczeniami, np. flagą ( 'begin
), cudzysłowami ( 'begin'
) lub podkreśleniem ( begin
w Elliott 503 ). Nazywa się to „stroppingiem”.
Tokeny, które są częścią składni języka, nie powodują zatem konfliktu z nazwami zdefiniowanymi przez programistę.
Zarezerwowane słowa kluczowe
Niektóre nazwy są zastrzeżone jako część języka programowania i nie mogą być używane jako nazwy zdefiniowane przez programistę. Większość najpopularniejszych języków programowania wykorzystuje zastrzeżone słowa kluczowe. Wczesne przykłady to FLOW-MATIC (1953) i COBOL (1959). Od 1970 inne przykłady to Ada, C, C++, Java i Pascal. Liczba słów zastrzeżonych zależy od języka: C ma około 30, a COBOL ma około 400.
Semantyka
Semantyka dotyczy znaczenia programu. Dokumenty standardów dla wielu języków programowania wykorzystują BNF lub jakiś odpowiednik do wyrażenia składni/gramatyki w dość formalny i precyzyjny sposób, ale semantyka/znaczenie programu jest ogólnie opisywane za pomocą przykładów i prozy angielskiej. Może to spowodować niejednoznaczność. W niektórych opisach językowych znaczenie instrukcji złożonych jest definiowane przez użycie „prostszych” konstrukcji, np. pętlę while można zdefiniować za pomocą kombinacji testów, skoków i etykiet, używając if
i goto
.
Artykuł semantyczny opisuje kilka formalizmów matematyczno-logicznych, które zostały użyte do precyzyjnego określenia semantyki; są one na ogół bardziej skomplikowane niż BNF i żadne pojedyncze podejście nie jest ogólnie akceptowane jako droga do zrobienia. Niektóre podejścia skutecznie definiują interpreter języka, niektóre używają logiki formalnej do uzasadnienia programu, niektóre dołączają afiksy do jednostek składniowych w celu zapewnienia spójności itp.
Wyrażenia
Często dokonuje się rozróżnienia między instrukcjami, które są wykonywane, a wyrażeniami , które są oceniane. Wartość uzyskana z wyrażenia jest często używana jako część instrukcji, np. przypisanie variable := expression;
Niektóre języki programowania (np. C, C++) pozwalają niektórym wyrażeniom dostarczyć wynik (technicznie wszystkie instrukcje dają wynik, ale ten wynik jest często typu „nieważny” i nie może być użyty do niczego). Najbardziej użytecznym stwierdzeniem, które daje wynik, jest przypisanie, a wynikiem jest właśnie przypisana wartość.
Może to być przydatne przy wielokrotnej inicjalizacji:
-
i = j = 0;
który jest traktowany jakoi = (j = 0);
Może to również skutkować prostymi problemami z palcami, całkowicie zmieniającymi znaczenie jakiegoś kodu:
-
if (i == j) {. . . };
testy, aby sprawdzić, czyi
jest równej
-
if (i = j) { . . . };
przypisuje wartośćj
to,i
a następnie testuje, czy ta wartość jest niezerowa.
Niektóre języki (Algol 60, Pascal) pozwalają na wielokrotne przypisanie, ale nie pozwalają na przypisanie przypisania w wyrażeniach.
Rozciągliwość
Większość języków ma ustalony zestaw instrukcji zdefiniowanych przez język, ale przeprowadzono eksperymenty z rozszerzalnymi językami, które umożliwiają programiście definiowanie nowych instrukcji.