Oświadczenie (informatyka)
W programowaniu komputerowym instrukcja jest jednostką składniową imperatywnego języka programowania , która wyraża pewne działanie do wykonania. Program napisany w takim języku składa się z ciągu jednej lub więcej instrukcji . Instrukcja może mieć komponenty 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, podczas gdy instrukcja określa działania, które należy podjąć z tymi danymi.
Zdania, które nie mogą zawierać innych zdań, są proste ; te, które mogą zawierać inne stwierdzenia, są złożone .
Wygląd instrukcji (a właściwie programu) zależy od jej składni lub gramatyki. Znaczenie wypowiedzi jest określone przez jej semantykę .
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 programu sterowania (np. goto , return , stop/halt). W niektórych językach wejście i wyjście, asercje i wyjścia są obsługiwane przez specjalne instrukcje, podczas gdy inne używają wywołań predefiniowanych podprogramów.
-
zadanie
- Fortran:
zmienna = wyrażenie
- Pascal, Algol 60, Ada:
zmienna := wyrażenie ;
- C, C#, C++, PHP, Java:
zmienna = wyrażenie ;
- Fortran:
-
dzwonić
- Fortran:
nazwa podprogramu CALL ( parametry )
- C, C++, Java, PHP, Pascal, Ada:
nazwa podprogramu ( parametry );
- Fortran:
-
twierdzenie
- C, C++, PHP:
assert( wyrażenie relacyjne );
- Java:
potwierdzenie wyrażenia relacyjnego ;
- C, C++, PHP:
-
iść do
- Fortran:
GOTO numerowana etykieta
- Algol 60:
przejdź do etykiety ;
- C, C++, PHP, Pascal:
przejdź do etykiety ;
- Fortran:
-
powrót
- Fortran:
wartość ZWRACANA
- C, C++, Java, PHP:
wartość zwracana ;
- Fortran:
-
zatrzymaj się/zatrzymaj się/wyjdź
- Fortran:
numer STOP
- C, C++:
wyjście( wyrażenie )
- PHP:
numer wyjścia ;
- Fortran:
Zdania złożone
Instrukcje złożone mogą zawierać (sekwencje) instrukcji, które można zagnieżdżać do dowolnej rozsądnej głębokości i generalnie obejmują testy mające na celu podjęcie decyzji, czy należy przestrzegać lub powtórzyć te zawarte instrukcje.
- Notacja dla następujących przykładów:
- <statement>jest dowolną pojedynczą instrukcją (może być prosta lub złożona).
- <sequence>jest dowolnym ciągiem zerowym lub większym<statements>
- Niektóre języki programowania zapewniają ogólny sposób grupowania instrukcji, tak że każda pojedyncza można zastąpić grupą:
- Notacja dla następujących przykładów:
- Algol 60:
początek <sekwencja> koniec
- Pascal:
początek <sekwencja> koniec
- C, PHP, Java:
{ <sekwencja> }
- Algol 60:
- Inne języki programowania mają inny specjalny terminator dla każdego rodzaju instrukcji złożonej, tak że jedna lub więcej instrukcji jest automatycznie traktowana jako grupa:
- Ada:
if test then <sequence> end if;
- Ada:
- Inne języki programowania mają inny specjalny terminator dla każdego rodzaju instrukcji złożonej, tak że jedna lub więcej instrukcji jest automatycznie traktowana 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 występują dość często; mogą one ułatwić zrozumienie programu, ułatwić programowanie i często można je wdrożyć 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 krok 1 do limitu do <instrukcja> ;
- Pascal:
for index := 1 to limit do <instrukcja> ;
- C, Java:
for (indeks = 1; indeks <= limit; indeks += 1) <instrukcja> ;
- Ada:
dla indeksu w pętli 1..limit <sequence> end loop
- Fortran 90:
indeks DO = 1 , granica < sekwencja > KONIEC DO
- Algol 60:
-
pętla sterowana warunkami z testem na początku pętli:
- Algol 60:
for index := wyrażenie podczas testu do <instrukcja> ;
- Pascal:
while test do <instrukcja> ;
- C, Java:
while (test) <instrukcja> ;
- Ada:
pętla testowa while <sekwencja> kończy pętlę
- Fortran 90:
DO GDY ( test ) < sekwencja > KONIEC DO
- Algol 60:
-
pętla sterowana warunkami z testem na końcu pętli:
- Pascal:
powtarzaj <sekwencję> aż do testu; { uwaga odwrócony test}
- C, Java:
wykonaj { <sekwencja> } while (test);
- Ada:
wyjście z pętli <sekwencja> podczas testu; pętla końcowa;
- Pascal:
- pętla sterowana warunkami z testem w środku pętli:
- C:
wykonaj { <sekwencja> jeśli (test) przerwa; <sekwencja> } while (prawda) ;
- Ada:
wyjście z pętli <sekwencja> podczas testu; <sekwencja> koniec pętli;
- C:
-
instrukcja if prosta sytuacja:
- Algol 60:
if test then <instrukcja bezwarunkowa> ;
- Pascal:
jeśli test to <instrukcja> ;
- C, Java:
if (test) <instrukcja> ;
- Ada:
jeśli test to <sekwencja> zakończ jeśli;
- Fortran 77+:
JEŻELI ( test ) TO < sekwencja > KONIEC JEŻELI
- Algol 60:
-
dwukierunkowy wybór instrukcji if :
- Algol 60:
if test then <instrukcja bezwarunkowa> else <instrukcja> ;
- Pascal:
if test then <instrukcja> else <instrukcja> ;
- C, Java:
to (test) <instrukcja> else <instrukcja> ;
- Ada:
if test then <sequence> else <sequence> end if;
- Fortran 77+:
JEŻELI ( test ) TO < sekwencja > ELSE < sekwencja > KONIEC JEŻELI
- Algol 60:
-
instrukcja case/switch wielokierunkowy wybór:
- Pascal:
przypadek c dla „a” : alert () ; 'q' : wyjdź () ; koniec ;
- Ada:
przypadek c ma miejsce , gdy ' a ' => alert (); kiedy ' q ' => wyjdź (); obudowa końcowa ;
- C, Java:
switch ( c ) { case 'a' : alert (); przerwa ; przypadek „q” : wyjdź (); przerwa ; }
- Pascal:
-
Obsługa wyjątków :
- Ada:
rozpocznij chroniony kod, z wyjątkiem sytuacji, gdy specyfikacja wyjątku => obsługa wyjątków
- Java:
try { kod chroniony } catch ( specyfikacja wyjątku ) { procedura obsługi wyjątków } w końcu { cleanup }
- Python:
try: kod chroniony z wyjątkiem specyfikacji wyjątków : obsługa wyjątków else: brak wyjątków wreszcie: czyszczenie
- Ada:
Składnia
Poza przypisaniami i wywołaniami podprogramów większość języków zaczyna każdą instrukcję od specjalnego słowa (np. goto, if, while, itp.), jak pokazano w powyższych przykładach. Do opisu formy wypowiedzi w różnych językach stosowano różne metody; bardziej formalne metody są zwykle bardziej precyzyjne:
- Algol 60 wykorzystał formę Backusa – Naura (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 Fortrana 90 język był opisywany przy użyciu wariantu BNF.
- Cobol używał dwuwymiarowego metajęzyka.
- Pascal używał zarówno diagramów składniowych , jak i równoważnych BNF.
zaproponowano różne rozszerzenia , aby umożliwić bezpośrednie wskazanie powtórzenia.
Wyrażenia i słowa kluczowe
Niektóre gramatyki języków programowania rezerwują słowa kluczowe lub specjalnie je oznaczają i nie zezwalają na używanie ich jako identyfikatorów . Prowadzi to często do gramatyk , które są łatwiejsze do przeanalizowania i wymagają mniej przewidywania .
Brak wyróżnionych słów kluczowych
Fortran i PL/1 nie mają zastrzeżonych słów kluczowych, co pozwala na takie stwierdzenia jak:
- w PL/1:
-
JEŚLI JEŻELI = TO TO…
(drugieJEŻELI
i pierwszeTO
to zmienne).
-
- w Fortranie:
-
JEŻELI (A) X = 10...
instrukcja warunkowa (z innymi wariantami) -
JEŻELI (A) = 2
przypisanie do zmiennej z indeksem dolnym o nazwieJEŻELI
-
-
- Ponieważ spacje były opcjonalne aż do Fortran 95, literówka mogła całkowicie zmienić znaczenie stwierdzenia:
-
DO 10 I = 1,5
początek pętli z I biegnącą od 1 do 5 -
DO 10 I = 1,5
przypisanie wartości 1,5 do zmiennejDO10I
Oflagowane słowa
W Algolu 60 i Algolu 68 wyróżniono wyraźnie specjalne tokeny: do publikacji, pogrubioną czcionką np. begin
; do programowania, z jakimś specjalnym oznaczeniem, np. flagą ( 'begin
'), cudzysłowem ( 'begin'
) lub podkreśleniem ( start
na Elliott 503 ). Nazywa się to „stropowaniem”.
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ą zarezerwowane jako część języka programowania i nie mogą być używane jako nazwy zdefiniowane przez programistę. Większość najpopularniejszych języków programowania używa zastrzeżonych słów kluczowych. Wczesne przykłady to FLOW-MATIC (1953) i COBOL (1959). Od 1970 roku inne przykłady to Ada, C, C++, Java i Pascal. Liczba zarezerwowanych słów zależy od języka: C ma około 30, podczas gdy COBOL ma około 400.
Semantyka
Semantyka zajmuje się znaczeniem programu. Dokumenty standardów dla wielu języków programowania używają BNF lub jakiegoś odpowiednika do wyrażenia składni/gramatyki w dość formalny i precyzyjny sposób, ale semantyka/znaczenie programu jest ogólnie opisana za pomocą przykładów i angielskiej prozy. Może to prowadzić do niejasności. W niektórych opisach językowych znaczenie instrukcji złożonych jest definiowane przez użycie „prostszych” konstrukcji, np. pętla while może być zdefiniowana przez kombinację testów, skoków i etykiet, przy użyciu 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 właściwa droga. Niektóre podejścia skutecznie definiują tłumacza dla języka, inne wykorzystują logikę formalną do rozumowania programu, inne dołączają afiksy do jednostek składniowych, aby zapewnić spójność itp.
Wyrażenia
Często rozróżnia się instrukcje, które są wykonywane, i wyrażenia , które są oceniane. Wyrażenia zawsze zwracają wartość, której nie mają instrukcje. Jednak wyrażenia są często używane jako część większej instrukcji.
W większości języków programowania instrukcja może składać się z niewiele więcej niż wyrażenia, zazwyczaj poprzedzonego wyrażeniem terminatorem instrukcji (średnik). W takim przypadku, podczas gdy wyrażenie zwraca wartość, pełna instrukcja nie (wartość wyrażenia jest odrzucana). Na przykład w C, C++, C# i wielu podobnych językach x = y + 1
jest wyrażeniem, które ustawi x na wartość y plus jeden, a samo całe wyrażenie da taką samą wartość, jaką ustawiono x Do. Jednak x = y + 1;
(zwróć uwagę na średnik na końcu) to instrukcja, która nadal ustawi x na wartość y plus jeden, ponieważ wyrażenie w instrukcji jest nadal obliczane, ale wynik wyrażenia jest odrzucany, a sama instrukcja nie jest obliczana na dowolna wartość.
Wyrażenia mogą być również zawarte w innych wyrażeniach. Na przykład wyrażenie x = y + 1
zawiera wyrażenie y + 1
, które z kolei zawiera wartości y
i 1
, które również są technicznie wyrażeniami.
Chociaż poprzednie przykłady pokazują wyrażenia przypisania, niektóre języki nie implementują przypisania jako wyrażenia, ale raczej jako instrukcję. Godnym uwagi przykładem jest Python , gdzie = nie jest operatorem, a jedynie separatorem w instrukcji przypisania. Chociaż Python dopuszcza wiele przypisań, ponieważ każde przypisanie było wyrażeniem, jest to po prostu specjalny przypadek instrukcji przypisania wbudowanej w gramatykę języka, a nie prawdziwego wyrażenia.
Rozciągliwość
Większość języków ma ustalony zestaw instrukcji zdefiniowanych przez język, ale były eksperymenty z językami rozszerzalnymi , które pozwalają programiście definiować nowe instrukcje.