Realizacja programu jest możliwa tylko wtedy, gdy:
- program przedstawiony jest w postaci ciągu wektorów informacji cyfrowej,
- program w wyżej opisanej formie znajduje się w pamięci operacyjnej.
Mówimy wtedy, że program zakodowany jest w języku wewnętrznym
komputera (maszynowym), i charakteryzuje się:
- stosowaniem binarnych kodów operacji reprezentujących rozkazy z listy
rozkazów procesora,
- stosowaniem binarnych adresów komórek pamięci (adr. fizycznych).
Ze względu na stopień zorganizowania dzielimy języki na:
1) najniższego poziomu - język wewnętrzny
2) niskiego poziomu
-
tzw. języki symboliczne systemowo
zorientowane (asemblery i makroasemblery)
3) wysokiego poziomu
-
języki symboliczne
proceduralnie
zorientowane i języki symboliczne problemowo zorientowane.
Języki programowania należą do grupy języków formalnych.
JĘZYKIEM FORMALNYM nazywamy każdy system, w którym stosując określone z góry reguły możemy uzyskać wszystkie zdania (napisy) uznawane za komunikaty
w tym języku. Zbiór reguł tworzenia zdań języka formalnego odgrywa rolę
normatywną: stanowi o tym co jest, a co nie jest zdaniem należącym do języka.
Formalizacja reguł danego języka obejmuje
- syntaktykę (składnia) języka zwaną także gramatyką języka, która pozwala na tworzenie poprawnych składniowo zdań języka
- semantykę - czyli reguły określające sens komunikatów w danym
języku.
W białodrzewiu jaśnie dźni słoneczno,
Miodzie złoci białopałem żyśnie,
Drzewia pełni pszczelą i pasieczną,
A przez liście kraśnie pęk słowiśnie.
( Julian Tuwim)
Niejednoznaczność języka etnicznego stanowi oczywistą przeszkodę w używaniu go jako środka przekazu algorytmów, zarówno między ludźmi, jak i między człowiekiem a komputerem.
JĘZYK PROGRAMOWANIA
jest to język przeznaczony do zapisu
algorytmów, wykonywanych następnie przez komputer. Algorytm
doprowadzony do postaci zawierającej wyłącznie operacje arytmetyczno-
logiczne na zawartościach komórek pamięci o zdefiniowanych adresach
symbolicznych należy wrazić w języku programowania.
ADRESEM SYMBOLICZNYM nazywamy skrótowy kod mnemotechniczny
adresu komórki w pamięci. Kod mnemotechniczny adresu musi spełniać
pewne reguły wynikające z definicji języka programowania (np. być
zbudowany z symboli należących do pewnego ograniczonego zbioru
symboli, często długość kodu jest ograniczona, itp.) oraz zasadę
wzajemnej jednoznaczności przyporządkowania adresu symbolicznego i
adresu fizycznego.
Adres symboliczny
Adres fizyczny
ala
adres 100
kot
adres 185
Języki symboliczne systemowo
zorientowane (asemblery i makroasemblery)
Ję zyki symb. systemowo zorientowane charakteryzują się :
- stosowaniem symbolicznych kodów mnemotechnicznych w miejsce
kodów binarnych z listy rozkazów procesora
- stosowaniem adresów symbolicznych komórek pamię ci operacyjnej
- jednemu rozkazowi ję zyka wewnę trznego odpowiada jeden rozkaz
symboliczny
- operandami rozkazów są zawartoś ci rejestrów lub komórek pamię ci
- w ję zyku asemblera uż ywa się takż e tzw. pseudorozkazy, które
przedstawiają informacje niezbę dne przy tłumaczeniu programu na
ję zyk wewnę trzny (zestaw pseudorozkazów zależ y od programu
tłumaczą cego zwanego asemblerem). Należą do nich pseudorozkazy
okreś lają ce typy zmiennych, rezerwacji bloku pamię ci, równoważ ność
zmiennych, etc.
MAKROASEMBLERAMI
nazywa się takie języki symboliczne systemowo
zorientowane, które mając właściwości i możliwości języków asemblerowych umożliwiają ponadto zastąpienie często występujących sekwencji rozkazów jednym makrorozkazem w postaci zdefiniowanego (zarezerwowanego) skrótu
mnemo- technicznego (posiadającego lub nie listę argumentów).
W trakcie tłumaczenia programu na język wewnętrzny, makrorozkazy
zastępowane są odpowiadającą im sekwencją rozkazów z uwzględnieniem aktualnych wartości parametrów ( o ile takie występują).
PRZYKŁAD
Stosując adresy symboliczne dla hipotetycznego procesora, który był użyty w przykładnie z poprzedniego wykładu, program realizujący dodanie dwóch
wielkości X i Y możemy zapisać następująco:
Kod mnemotechniczny Numer rozkazu Kod binarny rozkazu
CLA
2
0010
STO
3
0011
ADA
4
0100
JMP
10
1010
Język Kody z adresami Język adresów Opis rozkazów
wewnętrzny
fizycznymi symbolicznych
0010 0000000
CLA
CLA
A¬0
0100 1101100
ADA 108
ADA X
A¬A+X
0100 1111000
ADA 120
ADA Y
A¬A+Y
0011 1011111
STO 95
STO Z
Z¬A
PRZYKŁAD.
Wcześniej zapisany fragment programu dodającego X do Y i zapamiętanego w pamięci operacyjnej pod adresem symbolicznym Z, zapiszmy w formie
makrorozkazu
MACRO DODAJ A,B,C
CLA
ADA A
ADA B
STO C
END MACRO
Użycie makrorozkazu
DODAJ X,Y,Z
DODAJ X,Z,W
Odpowiedz na pytanie : jaka wartość zostanie zapamiętana pod adresem
symbolicznym W ? Wykonaj samodzielnie translację tego fragmentu programu do
postaci asemblerowej.
Podprogram stanowi ciąg rozkazów, który mimo. iż realizowany jest w różnych miejscach programu, przechowywany jest w pamięci tylko w jednej kopii ( w
przeciwieństwie do makroinstrukcji).
Uruchomienie (wywołanie) podprogramu przez inny podprogram (lub
program główny) zawsze wiąże się z naruszeniem sekwencji rozkazów
pochodzących z kolejnych komórek pamięci. Możliwość właściwej realizacji sekwencji rozkazów , w której występuje odwołanie do
podprogramu zapewnia tzw. skok z zapamiętaniem adresu powrotnego.
Tłumaczenie na język wewnętrzny programu źródłowego napisanego w języku asemblera
lub
makroasemblera,
nazywa
się
asemblowaniem
(to
assembly=montować).
Automatyczna asemblacja (realizowana przez program zwany też asemblerem)
wykonywana jest na ogół w 2 krokach:
- w pierwszym kroku program asemblujący sporządza kartotekę adresów
symbolicznych i ich przesunięć w stosunku do adresu pierwszego
rozkazu, oraz kartotekę stosowanych makrorozkazów
- w drugim następuje tłumaczenie programu źródłowego wykorzystujące przygotowane kartoteki.
W wyniku działania programu asemblującego otrzymujemy program w
języku wewnętrznym z adresami relokowanymi (względnymi), tzn. takimi które odniesione są do adresu pierwszego rozkazu programu. Rzeczywisty
adres w pamięci, pod który będzie wprowadzony pierwszy rozkaz
programu nazywa się adresem bazowym relokacji.
Specjalne programy łącząco-ładujące (zwane także konsolidatorami i ładowaczami) ustalają adres bazowy relokacji a następnie przekształcają
wszystkie zrelokowane adresy programu na adresy docelowe (fizyczne), i
ładują do pamięci pozwalając na właściwe działanie programu.
Stosowanie zrelokowanych programów ułatwia ich umieszczanie w
dowolnym obszarze pamięci operacyjnej oraz dołączanie do nich innych
programów, a także uzasadnia celowość modularyzacji programów i
tworzenie bibliotek programów.
Wady programowania przy użyciu języków
symbolicznych systemowo zorientowanych
(asembler i makroasembler):
- utrata przejrzystości algorytmów wskutek konieczności rozbijania
prostych operacji arytmetycznych i logicznych na ciągi elementarnych
operacji dostępnych w liście rozkazów,
- listy rozkazów różnych procesorów różnią się - brak możliwości natychmiastowego przeniesienia programu z jednego komputera na drugi,
- skupienie uwagi programisty na sprawy nie związane z treścią algorytmu (a raczej z konstrukcją komputera)
- zwiększona możliwość wprowadzenia błędów, trudnych do wykrycia
-
duży koszt wytworzenia oprogramowania związany z wysoką
pracochłonnością procesu programowania
- program w asemblerze wymaga bardzo detalicznego opisu w postaci
komentarzy, dla umożliwienia interpretacji stworzonego kodu przez innych
programistów i w trakcie nanoszenia poprawek.
JĘZYKI SYMBOLICZNE PROCEDURALNIE ZORIENTOWANE (wysokiego
poziomu) są językami programowania, które umożliwiają sformułowanie programu źródłowego przy użyciu symboli nie wynikających z listy rozkazów procesora, lecz z procedury przetwarzania charakteryzującej
klasę algorytmów, dla programowania których języki takie są przeznaczone.
Programowanie w tych językach jest całkowicie uniezależnione od mechanizmu realizacji przetwarzania przez procesor, pozwalając na określenie przetwarzania za pomocą symboliki stosowanej w arytmetyce i algebrze. Programista nie musi znać architektury procesora realizującego program, a opracowane programy źródłowe (przy niewielkich modyfikacjach) można realizować przy użyciu różnych procesorów, pod warunkiem posiadania odpowiednich programów tłumaczących.
Odpowiednikami rozkazów są tzw. instrukcje, każdej instrukcji odpowiada odpowiednia sekwencja rozkazów w języku wewnętrznym.
Przykłady
języków
symbolicznych
proceduralnie
zorientowanych:
FORTRAN, ALGOL, BASIC, PASCAL, PL/I, C.
JĘZYKI
SYMBOLICZNE
PROBLEMOWO
ZORIENTOWANE
to
języki
programowania, które umożliwiają formułowanie programu źródłowego przy
użyciu symboliki odzwierciedlającej sposób rozwiązywania problemów, dla których języki te są przeznaczone.
Posługiwanie się takimi językami nie wymaga z reguły żadnych wiadomości z zakresu programowania w językach systemowo i
proceduralnie
zorientowanych, co ułatwia koncentrację na problemach stanowiących
istotę zadania.
Tłumaczenie automatyczne programów źródłowych
Metoda kompilacji
polega na jednorazowym przetłumaczeniu całego
programu źródłowego na język wewnętrzny przy użyciu programu zwanego kompilatorem. Kompilator tworzy z programu źródłowego program docelowy.
Metoda interpretacji polega na tym, że:
- dla każdej instrukcji jest przechowywany w pamięci odpowiadający jej podprogram
- wykonanie instrukcji wymaga wykonania rozkazu skoku odpowiadającego
jej podprogramu, przekazania mu danych (argumentów instrukcji) i realizacji
podprogramu. Interpretacja realizowana jest przez program zwany
interpreterem. Interpretery pozwalają na interakcyjne współdziałanie
komputera i programisty.
BASIC - Beginners All-purpose Symbolic Instruction Code - uniwersalny ję zyk
symboliczny dla począ tkują cych (1964 Kemeny-Kurz)