Język programowania


Czym jest język programowania?

Procesor jest mózgiem komputera sterującym wszystkimi jego elementami.
Procesor to układ scalony składający się z milionów tranzystorów. Potrafi on pobierać rozkazy z pamięci operacyjnej i je wykonywać.
Zna kilkadziesiąt różnych instrukcji – zwykle bardzo prostych (na przykład typu: „skopiuj bajt z jednego adresu w pamięci pod inny”, „dodaj do siebie dwie liczby” lub „wyślij pewną wartość na odpowiedni port”).
Procesor, jak większość urządzeń cyfrowych, posługuje się tylko dwoma wartościami: 0 i 1.

Programowanie to pisanie ciągów instrukcji (programu), który ma wykonać właśnie procesor. 
Instrukcje te powinny być zapisane w postaci ciągów zer i jedynek, aby procesor był w stanie je poprawnie zinterpretować (zrozumiały dla procesora język zer i jedynek nazywamy językiem maszynowym).

Oczywiście nikt nie byłby w stanie napisać programu od razu w formie binarnej. Aby ułatwić życie programistom, wymyślono specjalny język i nazwano go Asemblerem.
Programowanie w Asemblerze polega na pisaniu ciągu instrukcji w bardziej przyjazny dla człowieka sposób.
Nie trzeba posługiwać się liczbami dwójkowymi, lecz krótkimi, z reguły trzyliterowymi poleceniami. Procesor nie potrafi jednak wykonać programu napisanego w Asemblerze.
Dlatego razem z opracowaniem tego języka stworzono też specjalny program tłumaczący, który nazywamy kompilatorem.

Kompilator to program, który tłumaczy kod pewnego języka programowania na język maszynowy (ciąg zer i jedynek), które potrafi wykonać procesor.
Proces ten nazywamy kompilacją.

Asembler jest językiem niskiego poziomu i nie jest już powszechnie wykorzystywany przez programistów tworzących popularne aplikacje.

Programista Asemblera nie musi już co prawda używać wyłącznie zer i jedynek, jednak programowanie w Asemblerze nadal jest trudne i wymaga dużej wiedzyi cierpliwości. 

Dlatego wymyślono tak zwane języki wysokiego poziomu. Jednym z nich jest Pascal. 

Programowanie w języku wysokiego poziomu polega na zapisaniu ciągu instrukcji za pomocą zbliżonych do ludzkiej mowy wyrażeń – dzięki temu jest całkiem proste.
Aby móc taki program uruchomić, należy go najpierw skompilować (czyli przetłumaczyć na przykład z języka Pascal na język maszynowy).

Język programowania to sformalizowany (zgodny z pewnymi regułami), zbliżony do języka naturalnego sposób zapisu algorytmu, tak aby był możliwy (po przetłumaczeniu - kompilacji) do wykonania przez komputer.

Klasyfikacja języków programowania

Istnieją różne klasyfikacje uzależnione od przyjętego kryterium. Możemy na przykład podzielić języki na trzy grupy:

1. Języki niskiego poziomu tzw. asemblery

2. Języki wysokiego poziomu, języki uniwersalne służące do rozwiązywania szerokiego zakresu problemów (Pascal, C, Logo, Basic, itd.)

3. Języki zorientowane problemowo, nastawione na wąski zakres problemów (HTML, PHP, VBA, dBase) 

Inna klasyfikacja to:
  1. Języki niestrukturalne
  2. Języki strukturalne (program budowany jest z mniejszych elementów: procedur, funkcji itp.), np. Pascal
  3. Języki obiektowe (program składa się z obiektów, które posiadają właściwości i potrafią wykonywać operacje), np. C+

Języki programowania dzielimy na:

Grupy języków programowania


Implementacja (kodowanie)

W fazie implementacji następuje proces kodowania (pisania oprogramowania w konkretnym języku), projekt zostaje zaimplementowany w konkretnym środowisku programistycznym
oraz wykonywane są testy poszczególnych modułów.
Wydzielenie modułów funkcji
Wstepne testowanie (debugger)
Dokumentacja techniczna dla programisty. Komentuje algorytm a nie instrukcje. Opis procedur, funkcji, danych we/wy
Kompilacja, usunięcie błędów (kod max zbliżony do ANSII, nie ignorować ostrzeżeń)

Generatory - generują aplikacje. Duża szybkość ale produkty niedotestowane


P r o g r a m   - zapis algorytmu.

Program  miec postać:

   1) źrodlowa   - w pewnym jezyku programowania

   2) kodu pośredniego - ciag instrukcji wykonywanych przez interpreter

   3) binarna - skompilowana - ciag instrukcji do wykonania bezposredniego       przez procesor

Wiele lat temu programista nie miał dużego wyboru języków programowania.

Wybierać można było między językami mało efektownymi (jak np. BASIC), lecz w miarę prostymi w obsłudze, a językami bardzo zaawansowanymi, lecz zarazem trudnymi do nauczenia się, jak np. Asembler.
Kod pisany w Asemblerze jest bardzo trudny do odczytania, lecz za jego pomocą programista może wykorzystywać dowolne instrukcje procesora - daje to bardzo wiele możliwości.
Zaletą tego języka programowania jest niezwykła szybkość; programy w nim napisane działają wyjątkowo szybko, a rozmiar aplikacji wykonywalnej jest bardzo mały.

Rewolucję w programowaniu stanowiło pojawienie się języka C. Język ten, wraz z jego "młodszym bratem" - językiem C++ - jest po dziś dzień najpopularniejszym językiem programowania.
Programując w tym języku, projektant ma dość duże pole manewru - język ten jest dość efektywny.
Ma jednak pewną wadę - jest dość skomplikowany (co prawda nie w takim stopniu, jak Asembler, ale jego nauka nie jest zalecana dla osób, które w ogóle nie miały styczności z programowaniem).

Drugim bardzo ważnym językiem programowania, który zdobył nie mniejszą popularność niż C++, jest język Pascal.
Stało się to za sprawą Andersa Hejlsberga, który w 1984 roku napisał pierwszą wersję Turbo Pascala.
Język ten charakteryzował się przede wszystkim prostotą połączoną z efektywnością pracy; programista piszący w Pascalu mógł wykorzystywać dużą ilość poleceń, które usprawniały pracę, a szybko działający kompilator sprawnie wskazywał popełniane przez projektanta błędy.





(na podstawie Wikipedii)

Język programowania – zbiór zasad określających, kiedy ciąg symboli tworzy program (czyli ciąg symboli opisujący obliczenia) oraz jakie obliczenia opisuje.

Podobnie jak języki naturalne, język programowania składa się ze zbiorów reguł syntaktycznych oraz semantycznych,
które opisują, jak należy budować poprawne wyrażenia oraz jak komputer ma je rozumieć.
Wiele języków programowania posiada pisemną specyfikację swojej składni oraz semantyki, lecz inne zdefiniowane są jedynie przez oficjalne implementacje.

Język programowania pozwala na precyzyjny zapis algorytmów oraz innych zadań, jakie komputer ma wykonać.
W niektórych pracach pojęcie języka programowania jest ograniczane wyłącznie do tych języków, w których można zapisać wszystkie istniejące algorytmy
– od strony matematycznej oznacza to, że język musi być przynajmniej zupełny w sensie Turinga,
jednak można się także spotkać z wykorzystaniem tego pojęcia na określenie również bardziej ograniczonych języków.

Definicje

Język programowania może być zdefiniowany ze względu na kilka cech:

Języki, w których nie da się realizować obliczeń (języki znaczników, jak HTML czy XML oraz gramatyki formalne, np. BNF), nie są zazwyczaj uznawane za języki programowania



Przeznaczenie


Memetyczna ewolucja niektórych języków programowania wg deklaracji autorów lub oficjalnych specyfikacji


Obecnie na świecie istnieją tysiące języków programowania i każdego roku powstają nowe.
Od języków naturalnych odróżniają się wysoką precyzją oraz jednoznacznością.
Człowiek podczas komunikacji między sobą stale popełnia niewielkie błędy lub pozostawia niedomówienia wiedząc, że drugi rozmówca najczęściej go zrozumie.
Maszyny wykonują zadania dokładnie, dlatego każdą czynność trzeba opisać ściśle krok po kroku, ponieważ komputer nie potrafi domyślić się, co programista miał na myśli.

Wiele języków zostało zaprojektowanych od zera, lecz powszechna jest praktyka rozwijania już istniejących rozwiązań oraz celowego upodabniania jednego języka do innego.
Pozwala to na szybsze opanowanie nowego języka przez programistów mających już doświadczenie w tworzeniu aplikacji. 

Potrzeba istnienia wielu różnorodnych języków wynika z dużej liczby sytuacji, w których są one wykorzystywane – każda posiada pewne specyficzne wymagania:

Z tych powodów nie powiodły się do dziś próby stworzenia języka uniwersalnego.

Obecnie panuje tendencja do tworzenia języków umożliwiających rozwiązywanie problemów na wyższym poziomie abstrakcji.
Pierwsze języki programowania były mocno związane z konkretnym sprzętem.
Z biegiem czasu wynalezione zostały nowe techniki tworzenia oprogramowania znacznie poprawiające przenośność i oraz opracowane algorytmy pozwalające automatycznie realizować zadania, którymi dotąd musiał zajmować się programista.
Skraca to czas tworzenia aplikacji i zmniejsza ilość okazji do popełnienia błędu, lecz w niektórych sytuacjach odbija się to negatywnie na wydajności (np. język Java).


Elementy języka

Kolorowanie składni jest często wykorzystywane w edytorach kodu do wizualnego różnicowania poszczególnych elementów składni, co ułatwia czytanie kodu.

Postać programu wyrażona w języku programowania określana jest jako kod źródłowy

Na język programowania składa się kilka elementów:

Składnia 

Aby dany ciąg znaków mógł być rozpoznany jako program napisany w danym języku, musi spełniać reguły składni.

Składnia opisuje:

Składnia najczęściej opisywana jest w formalnym zapisie będącym połączeniem wyrażeń regularnych oraz notacji BNF lub EBNF.

Poniżej przedstawiony jest przykład prostej gramatyki wzorowanej na języku Lisp:

wyrazenie ::= atom | lista
atom ::= liczba | symbol
liczba ::= [+-]?['0'-'9']+
symbol ::= ['A'-'Za'-'z'].*
lista ::= '(' wyrazenie* ')'

Zapis ten określa wygląd i budowę kolejnych symboli:

Przykładowe ciągi, które spełniają podane reguły składni to: "12345", "()", "(a b c232 (1))".

Zauważmy, że na etapie przetwarzania składni w ogóle nie jest brane pod uwagę znaczenie poszczególnych symboli.
W praktyce kod poprawny składniowo nie musi być poprawny semantycznie. Występuje tu analogia do języków naturalnych.
Zdanie "Bźdźiągwy się mucioszą" jest poprawne pod względem gramatycznym, lecz nie posiada żadnego znaczenia, ponieważ zostały w nim użyte nieistniejące słowa.

Semantyka

Semantyka języka programowania definiuje precyzyjnie znaczenie poszczególnych symboli oraz ich funkcję w programie.
Semantykę najczęściej definiuje się słownie, ponieważ większość z jej zagadnień jest trudna lub wręcz niemożliwa do ujęcia w jakikolwiek formalizm.
Część błędów semantycznych można wychwycić już w momencie wstępnego przetwarzania kodu programu, np. próbę odwołania się do nieistniejącej funkcji, lecz inne mogą ujawnić się dopiero w trakcie wykonywania.

Typy danych 

Każdy język operuje na jakimś zestawie danych, dlatego niezbędne jest podzielenie danych na odpowiednie typy, zdefiniowane ich właściwości oraz operacji, jakie można na nich realizować.

Większość języków posiada typy danych do reprezentowania:

Od strony sprzętowej wszystkie te informacje wyrażane są za pomocą sekwencji zer i jedynek. Język programowania nakłada jedynie odpowiednie ograniczenia i zasady ich przetwarzania.
Zjawisko konwersji wartości jednego typu na inną nazywa się rzutowaniem.

Biblioteki standardowe 

Dla większości języków zdefiniowana jest także biblioteka standardowa zawierająca podstawowy zestaw funkcji pozwalających realizować wszystkie najważniejsze operacje, np.:

Użytkownicy traktują bibliotekę standardową często jako część języka, lecz od strony twórców są to osobne twory.
Przykładowo, programiści piszący w języku D mają do dyspozycji zarówno oficjalną bibliotekę Phobos, jak i alternatywny projekt Tango.

Wykonywanie kodu

Aby program napisany w danym języku mógł być wykonany, niezbędne jest odpowiednie przetworzenie jego kodu źródłowego:

Kompilacja do kodu maszynowego zapewnia najwyższą wydajność programom, lecz wygenerowany kod jest ściśle powiązany z platformą sprzętową.
Ponadto kompilowane języki są bardziej zbliżone do sposobu funkcjonowania sprzętu, przez co programowanie w nich jest trudniejsze.
Języki interpretowane zapewniają większą przenośność programów, które często są niezależne od platformy i systemu operacyjnego.
Aby programy wyrażone w języku interpretowanym można było uruchomić na innej platformie, wystarczy napisać dla niej interpreter.
Jednak taki sposób wykonywania odbija się negatywnie na wydajności. Alternatywnym rozwiązaniem jest kompilacja programów do postaci pośredniej, tzw. kodu bajtowego.
Jest ona wykonywana przez wirtualne maszyny tłumaczące elementarne rozkazy kodu bajtowego na rozkazy procesora.

 Klasyfikacja języków programowania

Języki programowania mogą być podzielone ze względu na:

 Najpopularniejsze języki programowania

Lista dziesięciu najpopularniejszych języków programowania 

  1. Java
  2. C
  3. C++
  4. PHP
  5. Visual Basic
  6. Python
  7. C#
  8. JavaScript
  9. Perl
  10. Ruby


Języki programowania

wieloparadygmatowe   
Ada • Clojure • Common Lisp • D • Icon • Lua • Nemerle • PHP • Python • Ruby • Scala • Snobol
   
proceduralne i strukturalne   
AWK • C COBOLForthFortran • Modula-2 • Oberon • PascalPerl • PLEX • PL/SQL • REXX  

obiektowe   
ActionScript • C++ • C++/CLI • C# • Delphi • Delphi.NET • Delphi Prism • Eiffel • JavaJavaScript • Object Pascal • Objective-C • Oxygene • Smalltalk • VB.NET
   
funkcyjne   
Clojure • Erlang • F# • Haskell • Lisp • ML • OCaml • Scheme
   
logiczne   
Prolog
   
edukacyjne   
Comal • Logo • Small Basic
   
ezoteryczne   
Brainfuck • BeFunge • HQ9+ • INTERCAL • LOLCODE • Malbolge • Ook • Shakespeare • Unlambda • Whirl • Whitespace
   
historyczne   
ALGOL • APL • BASIC • Clascal • Clipper • JAS • Lisp • MUMPS • PLAN • PL/I • PL/M • SAKO • SAS (asembler) • Simula
   
inne   
ABAP • Asembler • C-- • GAUSS • Lustre • MCPL • occam • QCL • SAS 4GL • SQLVisual Basic



Na podstawie strony : Jaki język programowania wybraćhttp://www.eioba.pl/a69937/jaki_jezyk_programowania_wybrac

Krok 1: Cel


Określenie celu jest podstawowym pytaniem, od którego należy rozpocząć wybór języka. Z bardzo dużym prawdopodobieństwem zaliczasz się do przynajmniej jednej z kategorii:
Chcesz się uczyć programowania z własnej, nieprzymuszonej woli.
Masz ochotę zrealizować określony projekt.
Interesują cię nowe technologie lub zagadnienia
Chciałbyś zaimponować kolegom, znajomym, wykładowcom.
Potrzebujesz się nauczyć programowania do szkoły, na studia, na egzamin, etc.

Jeśli nie zaliczasz się do 5 z wyżej wymienionych grup, polecam zapoznanie się z całą treścią porady. W przeciwnym wypadku, został Tobie prawdopodobnie narzucony język programowania oraz środowisko, a niejednokrotnie nawet i styl programowania. W takiej sytuacji raczej postaraj się zapoznać ze stawianymi wymaganiami, zamiast samemu podejmować decyzję. Oczywiście, jeśli mimo wszystko chcesz wybrać język programowania samemu zapraszam do dalszej lektury.

Krok 2: Przeznaczenie

Języków programowania jest bardzo dużo. Ich zastosowanie jest również niebywale szerokie.
Na poniższym plakacie można poznać najpopularniejsze z języków oraz czas ich opracowania:
Plakat: O'Reilly - History Of Programming Languages

Języki programowania - szeroko rozumiane - można podzielić na następujące kategorie:
Krok 3: Platforma

Jako platformę przyjmijmy ogół programowania systemowego oraz dodatkowego, wraz ze sprzętem, na których bazował będzie stworzony przez Ciebie program.
Platformą może być sam sprzęt (np.: Assembler na procesory 8051), system operacyjny (większość języków ogólnego przeznaczenia), specjalne oprogramowanie tworzące 'maszynę wirtualną'
(np.: Java), oprogramowanie dedykowane (języki skryptowe, języki obsługi stron internetowych, języki programowania baz danych), system operacyjny z określonymi dodatkowymi bibliotekami
(np.: języki z rodziny .NET).

Możesz skupić się na określonym rozwiązaniu, na przykład wybierając programowanie wyłącznie pod systemy Windows lub pisanie skryptów pod powłoki dla systemów Linux, albo możesz skierować swoje działania w stronę rozwiązań przenośnych (crossplatform - wieloplatformowych) (np.: Java, języki opisu danych, języki obsługi stron internetowych), albo wręcz rozwiązań mobilnych (np.: Java - JME).

Krok 4: Środowisko programistyczne

O tym, jakie wybierzesz środowisko programistyczne, w dużej mierze zadecydują nie tylko twoje chęci, ale również zasobność portfela. Jeśli chcesz pisać skrypty dla aplikacji, musisz liczyć się z tym,
że twoja platforma docelowa nie będzie darmowa. Tak samo jest w przypadku języków ogólnego przeznaczenia - środowisko programistyczne, kompilator oraz debuger mogą być kosztowne.

Jeśli chcesz się tylko pobawić w programowanie lub nauczyć wyłącznie dla siebie, rozejrzyj się za darmowymi środowiskami, a nawet oprogramowaniem open-source.
Wiele dużych korporacji również wydaje wersje darmowe swoich produktów. Często są one ograniczone pod względem funkcjonalności, ale czy naprawdę potrzebujesz zaawansowanych modułów lub bibliotek, kiedy uczysz się podstaw? Sądzę, że nie. Jednak warto zwrócić uwagę na treść licencji - czy zezwala na wykorzystanie komercyjne lub rozpowszechnianie.

Pewne języki programowania mogą nie być dostępne pod niektóre platformy, lub nie mieć darmowych środowisk programistycznych.
Wybierając narzędzie dostosowane dla swoich potrzeb, weź to pod uwagę.

Wybór na podstawie przedsięwzięcia


Krok 1: Wyznaczone zadanie

Często zdarza się tak, że zdecydowałeś już, co chcesz robić, a jedynym znakiem zapytania jest język programowania.
Zanim zaczniejsz realizować zadanie, zastanów się, czy wybrane narzędzie jest dla ciebie najlepszym. Poniżej znajdziesz kilka porad, zastanów się nad każdą z nich:
Wybierz język, który jest podobny do czegoś, co znasz. Jeśli znasz doskonale język C, może lepiej będzie zrealizować projekt w C++ zamiast w Delphi, albo w PHP zamiast CGI - zależnie jaki projekt realizujesz.
Wybierz język, do którego środowisko jest popularne i dostępne - będziesz miał większą szansę, że ktoś odpowie na twoje pytania lub znajdziesz dla siebie odpowiednią publikację.
Wybierz język, do którego dostępne są biblioteki, przykłady lub moduły, mogące pomóc w realizacji zadania. Zwróć uwagę na ich dostępność, zgodność, poprawność działania i licencję.
Zastanów się, czy przy wykonaniu projektu nie będzie potrzebna dodatkowa nauka, której początkowo nie przewidziałeś. Jeśli znasz jakiś język z rodziny .NET, z bardzo dużym prawdopodobieństwem w innym języku .NET określone zadanie realizuje się w podobny lub taki sam sposób.
Wybierz język, który oszczędzi Ci pracy - po co pisać w assemblerze, skoro skrypt (*.bat) dla systemu Windows wykona zadanie równie dobrze, a jego kod będzie krótszy i mniej skomplikowany - co ułatwi ewentualną modyfikację.


Krok 2: Programowanie wspólnie z inną osobą

Gdy pisanie programu będzie wspierane fragmentami kodu, stworzonymi przez inną osobę, lub będzie ona współtworzyła program na bieżąco, warto zainteresować się trzema rozwiązaniami:
Wybrać wspólny język, który jedna z osób zna najlepiej.
Wybrać języki pozwalające na tworzenie bibliotek lub modułówi i wykorzystanie tych, stworzonych w innych językach.
Wybrać języki, które potrafią ze sobą współpracować (np.: PHP + JavaScript)

Powyższe rozwiązania mogą być przydatne nawet wtedy, gdy aplikację tworzy tylko jedna osoba. Pewne elementy łatwiej tworzyć w określonych językach i środowiskach, inne w innych.

Krok 3: Metodyka tworzenia oprogramowania

Jeśli już znasz jakieś języki programowania, może przywykłeś do jakiejś metodyki programowania. Jeśli jesteś początkującym, łatwiej będzie się Tobie dostosować do narzuconego podejścia, a możliwości są następujące:

Określone języki programowania nie zezwalają lub po prostu nie dają możliwości użycia niektórych z powyższych podejść, faworyzując inne. Ucząc się kolejnego języka, zwróć uwagę, czy nowy język programowania wspiera podejście, do którego jesteś przyzwyczajony.

Cechy popularnych języków programowania


Języki ogólnego przeznaczenia


Assembler

- kompilatory i środowiska:
NASM (DOS, Windows, Linux)
FASM (DOS, Windows, Linux, Unix libc, MenuetOS)
MASM32 (DOS, Windows)
TASM (DOS, Windows)
ASM'51 dla Linux (Linux ? ?C 8051)
MacroAssembler 8051 dla DOS (DOS ? ?C 8051)

- metodologie:
Najpopularniejsze: Liniowa, proceduralna
niedostępne: funkcyjna, deklaratywna, generyczna, zdarzeniowa, agentowa

- wsparcie programowania multimediów:
Grafika 2D: brak
Grafika 3D: brak
Dźwięk: brak
Filmy: brak
Kontrolery gier: brak

- programowanie systemów operacyjnych i urządzeń peryferyjnych:
Możliwe
Wygodne
Zalecane
Popularne i szeroko propagowane
Popularne programowanie sterowników sprzętowych i mikrokomputerów

- komentarze:
Często nauczany
Trudny do nauki podstaw programowania
Łatwy do nauki podstaw architektury komputerów
Dobrze napisany program może działać bardzo szybko i mieć małe rozmiary
Kod jest na ogół obszerny i mniej czytelny niż kod języków wyższego poziomu
Istnieje możliwość odtworzenia każdego kodu maszynowego do kodu assemblera
W innych językach istnieje możliwość tworzenia wstawek kodu assemblera
Popularny


Pascal, ObjectPascal

- kompilatory i środowiska:
Borland Pascal (DOS, Windows)
FreePascal (DOS, Windows, Linux, FreeBSD, Mac OS classic, Mac OS X/Darwin, OS/2, Netware classic, Netware libc, MorphOS, SkyOS)

- metodologie:
Najpopularniejsze: Liniowa, proceduralna, strukturalna
niedostępne: Logiczna, deklaratywna, generyczna, zdarzeniowa, agentowa

- wsparcie programowania multimediów:
Grafika 2D: [Borland] (DOS) BGI, (Windows) OWL
Grafika 3D: brak
Dźwięk: brak
Filmy: brak
Kontrolery gier: brak

- programowanie systemów operacyjnych i urządzeń peryferyjnych:
Możliwe
Niewygodne
Mało popularne

- komentarze:
Często nauczany
Łatwy do nauki podstaw
Popularny


Delphi, Delphi .NET

- kompilatory i środowiska:
Borland Delphi (Windows), Borland Kylix (Linux)
Lazarus oparty na kompilatorze FreePascal - wykorzystanie środowiska Lazarus pozwala wprowadzić do użycia metodologię zdarzeniową i agentową,
przez co programowanie w nim jest bliższe Delphi niż ObjectPascal

- metodologie:
Najpopularniejsze: Proceduralna, obiektowa, zdarzeniowa, agentowa
niedostępne: Logiczna, deklaratywna, generyczna

- wsparcie programowania multimediów:
Grafika 2D: [Borland] VCL, liczne biblioteki dodatkowe
Grafika 3D: liczne biblioteki dodatkowe
Dźwięk: liczne biblioteki dodatkowe
Filmy: liczne biblioteki dodatkowe
Kontrolery gier: liczne biblioteki dodatkowe

- programowanie systemów operacyjnych i urządzeń peryferyjnych:
Nie możliwe

- komentarze:
W niektórych wersjach obsługuje platformę .NET
Wiele nagłówków bibliotek dodatkowych musi być przepisanych spacjalnie dla Delphi, przez co często najnowsze wersje bibliotek nie są szybko dostępne
Często nauczany
Łatwy do nauki podstaw
Łatwy w użyciu
Środowiska są narzędziami RAD
Popularny


C/C++

- kompilatory i środowiska:
Microsoft Visual C++ Toolkit (Windows), Microsoft Visual C++ (Windows) [również jako część Microsoft Visual Studio]
GNU Compiler Collection [gcc] (Windows, DOS, Unix, Linux, FreeBSD, OS/2, ELF, ...) - zawiera w sobie g++
Borland C++ Builder (Windows), Borland BuilderX (Windows, Linux, Solaris)
Bloodshed Dev C++ - oparty na gcc
Intel C++ Compiler (Windows, Linux, embedded)
Macintosh Programmer's Workshop (MacOS)
LCC (Windows)

- metodologie:
Najpopularniejsze: proceduralna, obiektowa, zdarzeniowa, agentowa, generyczna (poprzez wzorce)
niedostępne: deklaratywna, logiczna

- wsparcie programowania multimediów:
Grafika 2D: [Borland] VCL, [DJGPP]Allegro, [Microsoft] DirectDraw, liczne biblioteki dodatkowe
Grafika 3D: [Microsoft] Direct3D, [SGI] OpenGL, GLUT, liczne biblioteki dodatkowe
Dźwięk: [Microsoft] DirectSound i DirectMusic, OpenAL, ALUT, [Creative] EAX, ALSA, liczne biblioteki dodatkowe
Filmy: [Microsoft] DirectShow, liczne biblioteki dodatkowe
Kontrolery gier: [Microsoft] DirectInput, liczbe biblioteki dodatkowe

- programowanie systemów operacyjnych i urządzeń peryferyjnych:
Możliwe
Wygodne
Zalecane
Popularne i szeroko propagowane (często we współpracy z assemblerem)
Popularne programowanie sterowników sprzętowych i mikrokomputerów

- komentarze:
W niektórych wersjach obsługuje platformę .NET
Wiele nagłówków bibliotek jest początkowo pisanych dla C/C++, przez co są bardzo szybko dostępne.
W dużej mierze programowanie systemów Linux/Unix opiera się na języku C, podobnie jak WinAPI (które można oczywiście wykorzystać w wielu językach, na przykład w Delphi)
Bardzo często nauczany
Łatwy do nauki podstaw
Łatwy w użyciu
W większości środowiska są narzędziami RAD
Popularny


Java

- kompilatory i środowiska:
Sun Java 2 Platform (Windows, Linux, Solaris)
GNU Compiler Collection [gcc] (Windows, DOS, Unix, Linux, FreeBSD, OS/2, ELF, ...) - zawiera w sobie gcj
Eclipse (wymagana maszyna wirtualna Javy)

- metodologie:
Najpopularniejsze: Obiektowa, zdarzeniowa, a od wersji 5: deklaratywna, generyczna
niedostępne: Liniowa, logiczna

- wsparcie programowania multimediów:
Grafika 2D: wbudowane w środowisko, AWT, JFC/Swing, Java2D, wiele innych
Grafika 3D: wbudowane w środowisko, Java3D, Java OpenGL, Xith3D, wiele innych
Dźwięk: wbudowane w środowisko, Java Media Framework, wiele innych
Filmy: Java Media Framework
Kontrolery gier: JInput, wiele innych

- programowanie systemów operacyjnych i urządzeń peryferyjnych:
Niemożliwe tworzenie systemów operacyjnych
Bardzo popularne programowanie urządzeń mobilnych (w tym telefonów komórkowych)

- komentarze:
Często nauczany
Bardzo popularny
Aplikacje, dedykowane pod maszynę wirtualną, bez ponownej kompilacji uruchamiają się na każdym systemie z zainstalowaną maszyną wirtualną Javy
Programy w trybie maszyny wirtualnej uruchamiają się wolniej niż programy kompilowane pod specyficzny system
Język wykorzystywany do tworzenia apletów, midletów, serwletów oraz złożonych aplikacji korporacyjnych (Java Enterprise Edition).
Maszyna wirtualna Javy zapewnia wysoki poziom bezpieczeństwa, pozwala dokładnie określić przywileje aplikacji
W niektórych wersjach obsługuje platformę .NET


Python

- kompilatory/interpretery:
CPython(DOS, Windows, Unix)
MacPython(MacOS X)
ActivePython (Windows, Unix, MacOS)
Jython (Java Virtal Machine)
IronPython (.NET/Mono)
Ponadto z oficjalnej strony Python Software Fundation można pobrać wersje dla:
AIX (IBM),
AROS (Amiga),
AS400,
BeOS,
OS/2,
OS/390,
Palm OS,
PlayStation,
Psion,
QNX,
RISC OS,
Symian OS series 60,
Sparc Solaris,
VMS,
VxWorks,
Windows CE (Pocket PC),
Sharp Zaurus

- metodologie:
najpopularniejsze:
proceduralna,
strukturalna,
obiektowa,
generyczna,
zdarzeniowa,
agentow a,
funkcyjna
niedostępne:
logiczna,
deklaratywna

- wsparcie programowania multimediów:
Grafika 2D (GUI):
przenośne:
TkInter,
PyGTK/PyGNOME,
PyQT,
wxPython,
GWiz,
Jython (Java Swing),
IronPython(.NET),
TkZinc,
Wax,
PythonCard,
PyKDE,
PyFltk,
FxPy,
PyPicoGUI,
AnyGUI,
PyUi,
PyGUI,
EasyGUI,
PySWT,
WTK,
Nufox (XUL)
nieprzenośne:
BeThon (BeOS),
MacPython (Cocoa dla MacOS X),
PyObjC (Cocoa),
Win32All (Microsoft Windows API),
venster (Microsoft Windows API)
Grafika 2D (ogólnego przeznaczenia):
Python Imaging Library,
Python Computer Graphics Kit,
PySDL,
PyGame
Grafika 3D:
PyOpenGL,
PySDL,
PyGame
PyQt4
Dźwięk:
PyGame,
PySDL,
mxdublin,
pysonic,
loris,
snack,
pyper,
Music Kit,
PyMedia,
HyperSonic,
PythonSound
Kontrolery gier:
PyGame,
PySDL

- programowanie systemów operacyjnych i urządzeń peryferyjnych:
Niezalecane (chociaż możliwe)

- inne zastosowania:
programowanie stron internetowych:
mod_python,
TwistedMatrix,
Zope,
CherryPy,
TurboGears,
Webware,
CGI
język osadzony: np. gimp, firefox2, dia
symulacje komputerowe: SimPy
Analiza gramatyczna (parsing):
PLY,
PyLR,
PyGgy,
shlex,
PyBison,
ToyParserGenerator,
plex
< /ul>
obliczenia naukowe/numeryczne:
NumericalPython,
ScientificPython

- komentarze:
W niektórych wersjach obsługuje platformę .NET (IronPython)
W niektórych wersjach obsługuje Java Virtual Machine (Jython)
Łatwy do nauki podstaw
Łatwy w użyciu
Zawiera dużą bibliotekę modułów
Umożliwia szybkie tworzenie oprogramowania
Doskonale nadaje się jako język do tworzenia prototypów
Umożliwia łatwą współpracę z modułami napisanymi w C/C++, dzięki czemu może być wykorzystywany również w systemach wymagających dużej wydajności (pomimo, że program wykonywany jest na maszynie wirtualnej)
Zapewniona duża przenośność


C#

- kompilatory i środowiska:
Csc darmowy kompilator sterowany z wiersza poleceń, dostępny po zainstalowaniu Microsoft .NET Framework
Microsoft Visual C# 2005 (również jako składnik Visual Studio 2005)
Borland C# Builder (w pakiecie Developer Studio 2006 lub Delphi 2005)
SharpDevelop - open-sourcowe IDE na platformę .NET
MonoDevelop - open-sourcowe IDE na platformę Mono (stworzony na podstawie SharpDevelop)

- metodologie:

- wsparcie programowania multimediów:
Grafika 2D: Managed DirectX, liczne biblioteki dodatkowe
Grafika 3D: Managed DirectX, OpenGL, liczne biblioteki dodatkowe
Dźwięk: Managed DirectX, liczne biblioteki dodatkowe
Filmy: Managed DirectX, liczne biblioteki dodatkowe
Kontrolery gier: Managed DirectX, liczbe biblioteki dodatkowe

- programowanie systemów operacyjnych i urządzeń peryferyjnych:
Niemożliwe tworzenie systemów operacyjnych (aczkolwiek ciekawostkę stanowi nowy system Microsoftu, w większości tworzony w C# - Singularity)

- komentarze:
Przeznaczony do pisania pod platformą .NET i w jej obrębie całkowicie przenośny
Dostępne środowiska są narzędziami RAD
Coraz bardziej popularny
Bardzo dobrze wyposarzona biblioteka standardowa (przestrzeń nazw System)


Języki do obsługi stron internetowych - po stronie serwera


PHP: Hypertext Preprocessor


- środowiska:
Serwer HTTP (np. Apache) ze skonfigurowanym silnikiem PHP
Zend Studio - IDE dla Windows, Linux, Macintosh
WinBinder - tworzenie aplikacji z GUI dla Windows


- metodologie:
Najpopularniejsze: proceduralna, strukturalna, obiektowa
Niedostępne: zdarzeniowa


- wsparcie programowania technologii:
Grafika 2D: PHP-GTK
Bazy danych: liczne biblioteki dedykowane oraz ogólne biblioteka PDO
Usługi sieciowe: liczne biblioteki dedykowane usługom


- programowanie urządzeń peryferyjnych:
Możliwe generowanie stron dostępnych przez urządzenia przenośne i mobline (na przykład stron WAP)


- komentarze:
Darmowy silnik rozpowszechniany na zasadach Open-Source
Przejrzysta i łatwa do opanowania składnia z rodziny języków "C-podobnych"
Bardzo popularny, jako język bazowy, do tworzenia dynamicznych serwisów www
Posiada szerokie wsparcie komunikacji z serwerami baz danych i usług sieciowych


Języki przetwarzania tekstu i danych

Wyrażenia regularne - Regex

- kompilatory/interpretery - minijęzyk osadzany w wielu innych językach i programach m. in. edytorach tekstu (np. VIM, EditPlus), narzędziach systemowych (np. grep, find, sed)
- metodologie: deklaratywna
- komentarze:
Występuje w wielu odmianach m. in. Unix, POSIX, Emacs i Perl. Składnia Perl jest jedną z najbardziej rozbudowanych i czytelnych z tego względu jest stosowana (czasem z niewielkimi zmianami) w wielu językach programowania (m. in. PHP, Python, C#)

XSL (XSLT, XPath, XQuery, XSL)

- kompilatory/interpretery:
osadzone w przeglądarkach m. in. Mozilla Firefox, Microsoft Internet Explorer, Opera (XSLT, XPath, XSL-FO)
jako minijęzyk dostępny poprzez biblioteki m. in. w Perl, Python, C, PHP
samodzielne procesory:
Apache Xalan,
Sablotron,
Apache FOP,
Saxon

- metodologie:
deklaratywna,
funkcyjna
Źródło: 4programmers.net. Treść udostępniona na zasadach licencji Creative Commons Attributio



Opracowania z Internetu

Asembler  (Assembler)

Asembler (z (ang.) assembler) – termin informatyczny związany z programowaniem i tworzeniem kodu maszynowego dla procesorów.
W języku polskim oznacza on program tworzący kod maszynowy na podstawie kodu źródłowego (tzw. asemblacja) wykonanego w niskopoziomowym języku programowania bazującym na podstawowych operacjach procesora zwanym językiem asemblera, popularnie nazywanym również asemblerem.
Język programowania nazywany jest zwykle językiem asemblera, a program tłumaczący – asemblerem.

Języki asemblera (zwyczajowo asemblery) to rodzina języków programowania niskiego poziomu, których jedno polecenie odpowiada zasadniczo jednemu rozkazowi procesora.
Języki te powstały na bazie języków maszynowych danego procesora poprzez zastąpienie kodów operacji ich mnemonikami.
Dzięki stosowaniu kilkuliterowych skrótów poleceń zrozumiałych dla człowieka pozwala to z jednej strony na tworzenie oprogramowania, z drugiej strony bezpośrednia odpowiedniość mnemoników oraz kodu maszynowego umożliwia zachowanie wysokiego stopnia kontroli programisty nad działaniem procesora.
Składnia języka asemblera zależy od architektury procesora, ale i używanego asemblera, jednak zwykle autorzy asemblerów dla danego procesora trzymają się oznaczeń danych przez producenta.

Pierwotnie był to podstawowy język programowania procesorów.
W wyniku poszukiwania efektywniejszych metod programowania i pojawianiem się kolejnych języków interpretowanych i kompilowanych języki asemblerów straciły na znaczeniu.
Z tego powodu współcześnie nie korzysta się z nich do pisania całych programów na komputery osobiste.
Jednak istnieją zastosowania, np. w przypadku programowania mikrokontrolerów, systemów wbudowanych, sterowników sprzętu, gdzie nadal znajdują one swoje miejsce.
Korzysta się z nich także do pisania kluczowych fragmentów kodu wymagających najwyższej wydajności, wyjątkowo małych rozmiarów kodu wynikowego lub również niewielkich fragmentów systemów operacyjnych.

Asembler (ang. assemble – składać) to program dokonujący tłumaczenia języka asemblera na język maszynowy, czyli tzw. asemblacji.
Jest to swoisty odpowiednik kompilacji dla języków wyższych poziomów.
Program tworzony w innych językach programowania niż asembler jest zwykle kompilowany do języka maszynowego (wyniku pracy asemblera), a następnie zamieniany na kod binarny przez program asemblera.

Powtarzające się często schematy programistyczne oraz wstawiane fragmenty kodu doprowadziły do powstania tzw. makroasemblerów, które rozszerzają asemblery o obsługę makr przed właściwą asemblacją, co zbliża je nieco do pierwszych wersji języka C.

Do najpopularniejszych odmian języka asemblera, ze względu na popularność architektury Intela znanej pod nazwą x86, zaliczyć można Asembler x86.
Do najpopularniejszych asemblerów zalicza się NASM, TASM oraz MASM, jak również FASM i GASM.

Kod - przykład

Przykładowe polecenia (mnemoniki) w języku Asembler x86:

mov ax, 0D625h
mov es, ax       ; wprowadź do rejestru segmentowego ES wartość z AX wynoszącą D625 szesnastkowo (54821 dziesiętnie)
mov al, 24
mov ah, 0        ; załaduj do rejestru AX wartość 24 (wyzeruj AH – starszą połówkę rejestru AX i zapisz wartość 24 w młodszej AL)
int 21h          ; wywołaj przerwanie nr 33 (21 szesnastkowo)




Assembler należy do najbardziej skomplikowanych języków wysokiego poziomu.
Bazuje on na tzw. przerwaniach DOSa i mapie pamięci komputera PC więc by zacząć programować w Assemblerze należy zaopatrzyć się w odpowiednią dokumentację i na pewno przyda się doświadczenie w programowaniu.

Poniżej jest  przykład kodu tego samego ale w dwóch różnych językach, powszechnie znanego początkującym programistom programu, który wyświetla na monitorze napis Hello World:

Turbo Pascal

Program hello;
begin
write('Hello world');
end.



Assembler

Hello segment
org 100h
start:

lea dx,napis
mov ah,9h
int 21h
int 20h

napis db 'Hello world$'

Hello ends
end start


Tak skomplikowany zapis w Assemblerze wynika z tego, że program jest rozbity na najmniejsze części- to daje największe możliwości kontroli nad programem (a programu nad komputerem).
W efekcie program potrafi wykorzystać w pełni podzespoły komputera (procesor, pamięć, BIOS, ChipSet itp.) i kart rozszerzeń np.: dźwięku czy video gdyż musimy w kodzie dokładnie określić
np.: w jakim stosie (jednostce pamięci operacyjnej komputera) ma się dana informacja znaleźć czy z jakiego musi być pobrana.
Język ten służy do pisania bardzo skomplikowanych programów, w których każda część programu musi być dokładnie kawałek po kawałku opisana w kodzie, a w przypadku innych języków pewne procesy są dla uproszczenia zautomatyzowane - wystarczy jedna funkcja żeby program zapisał w odpowiednim stosie pamięci jakąś informację, a w Assemblerze należy to dokładnie zaadresować).
W tym języku mamy kontrolę nawet nad bitami czyli najmniejszymi jednostkami jakimi posługuje się komputer


Assembler mimo iż jest językiem niskiego poziomu potrzebuje kompilatora, który przetłumaczy kod zrozumiały przez nas, na kod maszynowy, czyli taki, jaki rozumie komputer, a dokładnie procesor.
Są takie programy, jak , które potrafią tłumaczyć kod asemblerowy na maszynowy podczas wprowadzania programu, jednak nie nadają się one dla początkujących.
Programy można kompilować przy pomocy programu TASM i konsolidować programem TLINK.

Kompilator TASM jest kompilatorem bardzo rozbudowanym. Posiada bardzo wiele funkcji. Można nim tworzyć programy z rozszerzeniem OBJ.
Takich programów nie da się jeszcze uruchomić. Trzeba je później skonsolidować używając programu TLINK.
Jeśli więc napiszemy program w dowolnym edytorze ASCII (może to być notatnik,lub edytor w NC) i zapiszesz pod 8 literową nazwą z rozszerzeniem *.ASM, to by go skompilować piszesz:

TASM nazwa.ASM

Zostanie wygenerowany plik PRG.OBJ. Teraz trzeba go skonsolidować. Piszemy:

TLINK nazwa.OBJ

Powstaje plik o rozszerzeniu EXE, który już możemy normalnie uruchomić. Jeśli chcemy wygenerować plik COM, to piszemy:

TLINK /t PRG.OBJ

Teraz powstanie plik PRG.COM
Istnieje jeszcze bardzo wiele innych kompilatorów. Bardzo znanym jest A86 (do ściągnięcia z tej strony). Potrafi on kompilować zbiory ASM od razu na COM-y lub OBJ. Piszemy wówczas:

A86 nazwa.ASM

Powstanie plik COM

Każda linijka programu napisanego w Asemblerze ma następującą budowę:


[ETYKIETA:] [KOD OPERACJI] [ARGUMENTY] [;KOMENTARZ]


Wszystkie elementy instrukcji mogą występować w dowolnym miejscu linii, ale w podobnej kolejności i każdy musi być oddzielony od sąsiednich przynajmniej jedną spacją (odstępem).
Ogólna długość instrukcji nie może być dłuższa niż 128 znaków. Nie można również kontynuować jednej instrukcji w następnym wierszu. Każda linia, to jedno polecenie.

np.:

PRZESLIJ: MOV AX,LICZNIK ;odtwarza licznik

W powyższym przykładzie kodem operacji jest MOV, argumentami są: rejestr AX i adres pola o nazwie LICZNIK.
Pierwszy argument nazywamy argumentem docelowym, zaś drugi źródłowym. Argument źródłowy nigdy nie zmienia swojej wartości, natomiast docelowy prawie zawsze.
Instrukcja z przykładu ma etykietę o nazwie PRZESLIJ i komentarz opisujący jej sens.
Początek komentarza zaczyna się zawsze średnikiem. Wszystko, co jest napisane za średnikiem nazywamy więc komentarzem i nie jest to brane pod uwagę podczas generowania kodu wynikowego.

Etykieta jest opcjonalna, tzn. jej obecność nie jest obowiązkowa. Służy ona do tego, by móc przekazywać sterowanie (skok) do danej instrukcji.
Etykieta może zajmować również oddzielną linię, np.:

PRZESLIJ:
MOV AX,LICZNIK

Każda etykieta zakończona jest dwukropkiem. W jej nazwie można używać liter, cyfr i znaków specjalnych. Nie można natomiast zacząć nazwę etykiety cyfrą. Trzeba ją poprzedzić innym znakiem.
Każdą liczbę heksadecymalną w Asemblerze zapisujemy kończąc literką H i jeśli dana liczba zaczyna się literą poprzedzamy ją cyfrą 0, np.:

MOV AH,34H
MOV DX,0C2H
MOV CX,3FH


ASEMBLER - wprowadznie

Program .asm można pisać w każdym edytorze tekstowym pod warunkiem, że produkuje on plik w czystym ascii 

"Struktura programu

Standardowy program:

.model tiny
.code
org 100h
start:
...
end start

 
.model tiny -     oznacza model pamięci, w którym zarówno kod (cs) jak i dane (ds) programu muszą się zmieścić w 64k - to jest jedna z cech programów typu .com.
.code -     oznacza code segment - segment kodu programu - właśnie tu się zaczyna.
org 100h -     program będzie się zaczynać od CS:0100H - to jest kolejna cecha programów typu .com.
Start: -     etykieta "początek" - możnaby ją z grubsza porównać do pascalowskiego begin...

Innym "szablonem", który również zda egzamin, jest szablon następujący: CSEG SEGMENT ;
Ustalenie symbolu ASSUME CS:CSEG, DS:CSEG, ES:CSEG ; przyporządkowanie wartości CS, DS i ES do symbolu CSEG ORG 100H Start: ... CSEG ENDS END START
Ten sposób polecany  może nawet bardziej niż poprzedni, umożliwi  kompilację programu bez błędów zarówno pod TASM, i prawdopodobnie pod MASM
a poza tym jest chyba nawet prostszy niż schemat poprzedni.

 "Mov"

Mov jest jedną z częściej używanych a może nawet najczęściej używaną instrukcją, toteż poznamy ją już na samym początku.

Nazwa instrukcji (mov - move - przesuń) jest dość myląca, gdyż mov służy do kopiowania wartości między pamięcią a rejestrami, lub między rejestrami wyłącznie.
W praktyce oznacza to często, że mov używa się do nadawania rejestrom określonych wartości np. ustawienie rejestru AX na wartość 09H (AX=09H).

Składnia:
MOV cel, zrodlo

Zarówno zrodlo jak i cel mogą być rejestrem, lub komórką pamięci, ale równocześnie tylko jeden z operatorów może być pamięcią tzn. nie możemy przesyłać danych bezpośrednio na linii pamięć-pamięć, trzeba to zrobić za pomocą dwóch transferów - pamięć-rejestr i rejestr-pamięć.
Bez trudu natomiast można kopiować wartość jednego rejestru do innego np.:

Mov AX,BX

Mov kopiuje a nie przenosi wartości, czyli po wykonaniu polecenia wartość "zrodlo" nie zostaje zmieniona ani wyzerowana.
W składni mov najpierw podajemy cel, później źródło - nie jest to pomyłka, aczkolwiek do pomyłek niekiedy prowadzi, gdyż jest niezgodne z ludzkim tokiem rozumowania:).

 

"Stos - instrukcje push, pop, pusha, popa, pushf i popf"

Istnieją 2 instrukcje, które służą do obsługi stosu - PUSH i POP.
Push - powoduje wrzucenie wartości lub zawartości rejestru na stos a POP - pobranie wartości ze stosu i wrzucenie jej do rejestru.

Składnia:
PUSH REJ16
PUSH WAR16
POP REJ16

"REJ16" i "WAR16" - oznaczają odpowiednio rejestr i wartość 16-bitową - tzn. nie można wrzucać ani pobierać ze stosu wartości 8-bitowych np. AL, AH...; i
naczej: instrukcje PUSH i POP operują jedynie na słowach czyli danych 2-bajtowych.

Instrukcja PUSHA i POPA powodują wrzucenie na stos wszystkich rejestrów - nie trzeba wywoływać kilkakrotnie instrukcji PUSH i POP - wpływa to więc na skrócenie programu.
Niestety - instrukcje te nie są dostępne we wszystkich wersjach procesora, czyli ich używanie w programie wpływa na kompatybilność.
PUSHA - wrzuca wartości wszystkich rejestrów na stos,
POPA - pobiera wartości wszystkich rejestrów ze stosu.
Nie dotyczy to rejestrów IP i kilku innych, gdyż pobranie ze stosu wartości rejestru IP (instruction pointer - wskaźnik instrukcji -
wskaźnik aktualnie wykonywanej instrukcji) spowodowałoby przeskok do miejsca w programie, już wykonanego, tj. przed instrukcję PUSHA, doprowadziłoby to do powstania "pętli nieskończonej".

Składnia:
PUSHA
POPA

Ostatnią już parą instrukcji jest PUSHF i POPF, których działanie jest identyczne do PUSHA i POPA, lecz ogranicza się wyłącznie do flag - push flags...

Składnia:
PUSHF
POPF

 

"INT - wywołanie przerwania"


INT jest instrukcją uruchamiającą przerwanie programowe.

Składnia instrukcji:
INT numer_przerwania

Numer_przerwania to liczba z zakresu 0-255, musi być podana konkretna wartość; nie można używać rejestrów np.

INT AH - spowoduje komunikat o błędzie.

Mając dostęp do listy funkcji choćby nawet podstawowych przerwań - int 21H, int 16h, int 10H - otrzymuje się sporą gamę gotowych procedur, które mozna wykorzystać w swoich programach bez potrzeby ich (procedur) dołączania do kodu programu.

Polega to na tym, że odpowiednie ustawienie rejestrów (głównie ax, bx...) i wywołanie danego przerwania powoduje wykonanie określonej procedury lub funkcji -
jeśli jest to funkcja, to po powrocie z danego przerwania odpowiednie rejestry będą miały odpowiednie wartości - np:

Przerwanie 21H funkcja 2CH - pobierz czas

AH = 2CH Przerwanie zwraca:
CH =     godzina (0-23)
CL =    minuta (0-59)
DH =     sekunda (0-59)
DL =     setne sekundy (0-99)


Znaczy to tyle, że aby otrzymać czas korzystając z usługi przerwania 21H, należy:
1. Ustawić rejestr AH na wartość 2CH (MOV AH,2CH) 2. Wywołać przerwanie 21H (INT 21H). I już - rejestry CH, CL, DH i DL zawierać będą aktualny czas.

Innym przykładem - dość często używanym - jest funkcja 4CH przerwania 21H.
Przerwanie 21H funkcja 4CH - zakończ program i zwróć kod errorlevel

AH=4CH
AL = kod wyjścia (errorlevel dla plików .bat)

Nie zwraca nic.

Tutaj postępujemy analogicznie jak w poprzednim przypadku - ustawiamy rejestry AH i AL a następnie wywołujemy przerwanie.

Znając choćby te dwie funkcje - można się pokusić o napisanie prostego programu, który można będzie używać w plikach sadowych (.bat) - program, który po uruchomieniu w errorlevel zwróci aktualną godzinę.

 

"Deklaracja danych"

 
Sama deklaracja danych jest bardzo prosta - podobnie jak w pascalu możemy nadać zadeklarowanej danej nazwę; nie wyróżnia się tu jednak typów danych tak złożonych jak w pascalu
- istnieją generalnie tylko 3: byte (bajt), word (słowo - 2 bajty) i double word (podwójne słowo - 4 bajty).

Istnieje też możliwość deklaracji łańcucha znaków - tekstu, co przyda się nam za chwilę, lub obszaru dowolnej długości wypełnionego jakąś określoną wartością - tego sposobu używa się np. do zadeklarowania "bufora", który będzie modyfikowany w trakcie działania programu.

Skoro już umiemy deklarować dane łańcuchowe, możemy ponownie otworzyć spis funkcji przerwania 21H i spróbować naszych sił pisząc program bazujący na funkcji 09H tego przerwania.

Przerwanie 21H, funkcja 09H - wyświetlenie napisu: 

AH = 09H DS:DX = wskaźnik pierwszego znaku napisu,
Przerwanie nie zwraca nic.
Napis musi być zakończony znakiem '$'.

Prawie wszystko jasne, jedyną zagadkę stanowi słówko "wskaźnik" w opisie tej funkcji.
Wbrew pozorom jest to proste - DS musi być ustawione na segment pamięci, w którym znajduje się nasz napis a DX na przesunięcie tego napisu w segmencie.

Kolejną cechą programów .com, która przychodzi nam tu z pomocą jest fakt, że w tych programach CS = DS - kod programu jest zapisany w tym samym segmencie co dane programu i już przy ładowaniu pliku .com do pamięci CS jest ustawiane na tą samą wartość co DS.
Pozostaje więc problem fatalnego przesunięcia - tutaj z kolei przyda się funkcja wewnętrzna Turbo Assemblera - OFFSET.
Funkcja ta zwraca przesunięcie danej, której nazwę podamy w nawiasach, tak, że najpierw jest obliczane przesunięcie tej danej po kompilacji i ta wartość jest podstawiana w miejscu, gdzie wywołano funkcję - np:
MOV DX, OFFSET(NAPIS) spowoduje, że podczas kompilacji zostanie obliczone przesunięcie danej napis i wyliczona wartość zostanie podstawiona za offset - przy dekompilacji lub debugowaniu programu w miejscu naszej instrukcji byłaby:
MOV DX,121H
Oczywiście przy założeniu, że akurat 121H to przesunięcie zmiennej napis.

Ktoś mógłby stwierdzić, że zamiast offset(napis) mogliśmy z góry wpisać 121H - miałby rację tzn. program prawdopodobnie by zadziałał, ale po co trudzić się skomplikowanymi wyliczeniami, skoro po pierwsze - kompilator zrobi to szybciej i dokładniej a po drugie jeśli zmienimy coś w programie, to cała matematyka na nic - wszystko trzebaby zrobić od nowa.

 
" JMP - jump - skok "

Instrukcja jmp jest prosta - zarówno w składni jak i działaniu - powoduje bezwarunkowy przeskok do innej części programu - analogicznie jak "goto" w pascalu czy basicu.
Składnia:
JMP etykieta

Etykieta - to podobnie jak w pascalu - ciąg znaków zakończony dwukropkiem - identyfikujący miejsce w programie np.: "Start:", "Petla:" itp.

Instrukcji jmp używa się w zasadzie w połączeniu z instrukcjami skoku warunkowego, ale ma oczywiście również inne poważne zastosowania:).
Czasem można się spotkać z instrukcjami "JMP FAR" czy "JMP SHORT" - są to odmiany jmp nie różniące się składnią - różnica polega na tym, że "FAR" (daleki) odnosi się do skoków dłuższych niż +-128 bajtów a "SHORT" (krótki) - dotyczy skoków nie większych niż +-128 bajtów.

"Podprocedury
- instrukcje CALL i RET"

 
Jak wskazuje na to temat instrukcje CALL (wołaj) i RET (return - powrót) służą do tworzenia podprocedur:) - części programu, które będą używane częściej niż raz - tak jak procedury np. w pascalu.

Ponieważ wierzę w moc przykładów - znowu nie będę się zbyt długo rozwodził nad tematem... A więc do rzeczy:

Składnia:

CALL ETYKIETA
ret

CALL- zapamiętuje na stosie adres następnej instrukcji programu a następnie przeskakuje do etykiety "etykieta" tak, jak to robiła instrukcja JMP.

Po napotkaniu instrukcji RET procesor pobiera ze stosu adres zapamiętany tam przez CALL i przeskakuje pod ten właśnie adres czyli "wraca" do programu nadrzędnego.

Schemat użycia instrukcji CALL i RET wygląda więc następująco:

Nazwa_procedury: ; etykieta określająca nazwę procedury
;Kod podprocedury
;...
;...
;...
RET ; Powrót do programu nadrzędnego.

Gdzieś w programie natomiast - należy użyć następującego wywołania:

CALL nazwa_procedury

To tak dla wszystkich lubiących schematy i teorię.

 

" Instrukcje CMP i J** "

 
Rzecz,  jest prawie tak samo a może nawet bardziej ważna i przydatna jak omawiane już przerwania.
Dotychczas ani razu nie mówiliśmy o instrukcjach warunkowych (if .. then) ani o sposobie porównywania dwóch wartości.

Do porównania dwóch wartości służy instrukcja CMP (compare - porównaj), której składnia jest następująca: 

CMP A, B

A i B to dwie dowolne wartości, które porównujemy.
Wykonanie instrukcji CMP powoduje ustawienie odpowiednich flag procesora (OF, SF, ZF), a to właśnie na tej podstawie są wykonywane instrukcje skoku,
o których za chwilę - tematu które flagi są kiedy ustawiane i dlaczego tak a nie inaczej - nie chciałbym na razie zgłębiać bo może to tylko zamieszać i nie wnieść nic do sprawy...

Na etapie początkowym nauki assemblera wystarczy wiedzieć, że jeśli chcemy wykonać skok warunkowy ("If a>4 then" itp.) to najpierw wykonujemy instrukcję CMP A,4 a następnie jedną z poniższych...

Składnia instrukcji J**:
J** etykieta

"Etykieta" to oczywiście (tak jak w przypadku JMP, CALL) nazwa etykiety, do której program przeskoczy jeśli... No właśnie.

Przydatniejszych instrukcji J** jest kilka, ale są one nazwane wg pewnych reguł, których znajomość może zaoszczędzić sporo wkuwania więc w efekcie "nie taki diabeł straszny".

Pierwszą literę tych instrukcji stanowi zawsze J (jump if - skok jeśli), później może wystąpić N (not - nie) a na końcu A (above - ponad), lub E (equal - równe), lub B (below - poniżej).

Weźmy na przykład równość:
"J"+"E" czyli JE. W ten sposób możemy też zapisać nie-równość pisząc JNE... i tak dalej.

Jednej rzeczy należy się jednak nauczyć - jak już miałeś okazję zauważyć z tym assemblerem to tak nie zawsze i nie do końca "po ludzku" bywa, więc jeśli mielibyśmy instrukcje:

CMP A,B
JA et_wieksze

to ktoś mógłby zapytać, czy skok nastąpi jeśli A > B, czy jeśli B > A? Ktoś inny sprawdziłby to doświadczalnie, ale ja - z góry wyjaśniam. Tu akurat jest normalnie tzn. w powyższym przykładzie instrukcja JA wykona skok jeśli A > B - pisząc dla wyobraźni - A above B.

Myślę, że to w miarę bezboleśnie wyjaśniłem - Jak zapisać >=?
W assemblerze istnieje instrukcja JAE (Above or Equal), której oczywiście można używać (istnieje też JBE (below or equal)) - nie są to jednak instrukcje "pierwszej potrzeby" zwłaszcza, gdy ktoś nie chce się zbyt wiele uczyć (a ktoś chce?:))), bo tak "na chłopski rozum" sprawa jest prosta:
Większe lub równe znaczy tyle samo co "nie mniejsze" a więc - JNB... I mamy to samo przy użyciu naszego pierwotnego szablonu bez żadnych JAE....

Przeglądając zestaw instrukcji przerwania 21H można natrafić (w opisie np. otwierania pliku) na zapis, że funkcja zwraca:

CF = 0 - wykonano bez błędów,
CF = 1 - wystąpił błąd (nr błędu jest w AX).

W praktyce więc chodzi o to, żeby sprawdzić czy dana flaga jest czy nie jest aktywna... a pisałem wcześniej, że właśnie J** bazuje na flagach czym się nie należy przejmować.
Jeśli więc porównujemy dwie wartości, to istotnie nie ma to znaczenia, ale jeśli interesuje nas stan jakiejś konkretnej flagi, to istnieje kilka użytecznych instrukcji J** przeznaczonych właśnie do tego. Są to:

JC - skok, gdy CF = 1;
JO - skok, gdy OF = 1;
JP - skok, gdy PF = 1;
JS - skok, gdy SF = 1;
JZ - skok, gdy ZF = 1;

Również tutaj stosuje się nieśmiertelna zasada not, czyli można stosować zapis np. JNC, który oznacza, że CF nie jest ustawiona - CF = 0; tyczy się to oczywiście pozostałych flag także (JNO, JNP, JNS i JNZ).

"Operacje matematyczne"


INC i DEC

Są to instrukcje analogiczne jak w Pascalu, z małym wszakże wyjątkiem - powodują zwiększenie lub zmniejszenie jakiejś wartości.

Składnia:
INC A
DEC A

No więc cała różnica polega na tym, że - jak widać - nie ma tu drugiego parametru, który określałby o ile ma być zwiększona lub zmniejszona dana wartość.
Parametru tego nie ma, gdyż zawsze jest ona zmniejszana/zwiększana o 1 - słownie jeden.
Rozwiewając więc resztki wątpliwości wszystkich, którzy takie wątpliwości jeszcze zachowali powiem, że INC zwiększa a DEC zmniejsza daną wartość...
Przykładowo, jeśli w AX mamy wartość 03H, to wykonanie instrukcji

INC AX - zwiększy AX o 1 - AX będzie się równać 04H.

Jeśli więc w tym stanie rzeczy wykonamy instrukcję

DEC AX - to wartość AX zostanie zmniejszona o 1 - z wartości 04H na 03H.

 
Dodawanie i odejmowanie

Do tych operacji można oczywiście używać DEC i INC, ale - oczywiście - byłoby prawie nie do pomyślenia, że Assembler nie udostępnia żadnej instrukcji umożliwiającej wykonanie powyższych działań "za jednym zamachem" tzn. bez konieczności zmieniania wartości o 1. Instrukcje, które umożliwiają wykonanie dodawania lub odejmowania to ADD (dodaj) i SUB (substract - odejmij).

Składnia:
ADD A, B
SUB A, B

Wykonanie powyższych instrukcji powoduje dodanie (lub odjęcie w przypadku SUB) wartości A i B i wrzucenie wyniku do A - np.: Jeśli AX=5 i wykonamy ADD AX, 08H - to procesor najpierw doda 5+8 a następnie wrzuci wynik do aX - po wykonaniu powyższego polecenia AX będzie równe 13 (dziesiętnie) czyli 0DH. Analogicznie - wykonanie w tym stanie rzeczy instrukcji SUB AX,3 spowoduje odjęcie trójki od aktualnej wartości AX i wrzucenie wyniku do AX (13 - 3 =10) - AX=10D czyli 0AH.

 
Mnożenie

Tutaj sprawa nie jest już tak prosta jak w przypadku dodawania i odejmowania, dlatego też mnożenie i dzielenie zostaną omówione oddzielnie.
Do mnożenia służy w Assemblerze instrukcja MUL (multiply - mnóż).

Składnia:
MUL A

Niewątpliwie wymaga to pewnych wyjaśnień - wyjaśniam więc: MUL powoduje pomnożenie wartości A razy zawartość rejestru AX, lecz sprawa wygląda nieco inaczej, gdy A jest wartością typu word (słowo - 2 bajty) lub byte (bajt).
Gdy więc A jest to 1 bajt, wówczas wykonywane jest mnożenie a*AL (przypomnę, że AL jest to młodszy bajt rejestru AX) i wynik mnożenia zostaje wrzucany do AX. Załóżmy, że AL=2 a BL=3 - wówczas wykonanie instrukcji

MUL BL - powoduje wymnożenie 2*3 i wrzucenie wyniku do AX - AX=6.

Jeśli jednak A jest wartością dwubajtową, to A jest mnożone razy AX a wynik zostaje wrzucany do rejestrów DX:AX tzn. DX zawiera 2 starsze a AX młodsze bajty - np:. Jeśli AX = 0FFFFH (65535) i BX=0FFFFH (65535 również), to wykonanie
MUL BX wymnoży BX*AX a wynik (w tym przypadku czterobajtowy 0FFFFFFFFH czyli 4294836225D) znajdzie się w DX (2 bajty) i AX (również 2 bajty).

 
Dzielenie

Instrukcją dzielącą jest w Assemblerze DIV (divide - dziel).

Składnia:
DIV A

Tutaj znowu - jak w przypadku mnożenia - ma znaczenie czy A jest bajtem (np. BH, BL), czy słowem (NP. BX).

Jeśli A jest bajtem, AX jest dzielony przez A; iloraz zostaje wrzucony do AL, reszta do AH.
Jeśli więc AL zawiera 10D (0AH), BH=3, to po
DIV BH
AL=3, AH=1 - bo oczywiście 10/3 =3 i reszty 1.

Gdy A jest słowem (2 bajty), DX:AX zostaje podzielony przez A; po dzieleniu AX zawiera iloraz a DX resztę z dzielenia - np.:
Jeśli - posługując się analogicznym przykładem co przy mnożeniu - ustawimy DX=0FFFFH, AX=0FFFFH (dzielna =0FFFFFFFFH) i BX=0FFFFH (dzielnik), to
DIV BX
ustawi AX=0FFFFH (iloraz) DX=0000H (reszta).

 
"LOOP, LOOPE, LOOPZ, LOOPNE, LOOPNZ"

 
Przy naszych obecnych umiejętnościach spokojnie można zrobić pętlę "for .. to ..."

Oczywiście - pętla działa co można bez trudu stwierdzić - poprawnie, lecz to jest pretekstem do wprowadzenia właśnie instrukcji LOOP.
Składnia:
LOOP ETYKIETA

Tu warto od razu wyjaśnić, że loop - z angielskiego oczywiście - znaczy "pętla".
No ale co właściwie robi LOOP? Mówiąc krótko - zaledwie dwie rzeczy:
Po pierwsze - zmniejsza wartość CX o jeden (DEC CX), po drugie - jeśli CX jest większe 0 powoduje bezwarunkowy przeskok do "ETYKIETA".

Jeśli chcielibyśmy powiedzieć to językiem procesora - LOOP ETYKIETA jest skrutem poniższych komend:

DEC CX
CMP CX,0
JNE ETYKIETA


Nie trzeba tu filozofa by stwierdzić, że LOOP umożliwia tylko budowę pętli typu "downto" czy - jak w basicu - "step -1" - a po ludzku pętli, w której licznik maleje a nie rośnie.
Oczywiście jest to prawda, ale prawdą jest też, że nie warto się męczyć wykonywaniem powyżej pokazanej pętli, gdy można to rozwiązać LOOP'em.
  
LOOPE/LOPZ, LOOPNE/LOOPNZ

Instrukcje LOOP
Składnia:
LOOPE ETYKIETA
LOOPZ ETYKIETA
LOOPNE ETYKIETA
LOOPNZ ETYKIETA

LOOP dotyczą w jakiś sposób instrukcji skoku warunkowego...
Działanie instrukcji LOOP** jest następujące:
Zmniejszyć CX o jeden (DEC CX - tak jak przy LOOP)
Jeśli CX>0 wykonać skok warunkowy do "ETYKIETA" w zależności od typu instrukcji: LOOPE - JE, LOOPNE - JNE, LOOPZ - JZ, LOOPNZ - JNZ.
Jeśli CX=0, lub nie spełniono warunku skoku warunkowego, zakończyć pętle

Programista teraz ma on możliwość wykonania działania w pętli, które nie tylko będzie uzależnione od wartości CX, ale nawet może on przeprowadzić porówn anie dwóch innych wartości
(np. CMP AX,BX) i również na tej podstawie wykonać pętlę lub jej nie wykonać... np. procedurka upewniająca się - zadająca użytkownikowi ważne pytanie, które musi on potwierdzić 3 razy.



C/C++

Zdecydowanie najbardziej zaawansowany język programowania, który powstał w wyniku pracy nad uniwersalnym językiem dającym możliwość pisania programów na różne platformy.
Z założenia, programy napisane w C mają być małe, szybkie i zajmować mało pamięci, co ma swoje odbicie w wygodzie pisania programów i nauce programowania.
Kod programu, w stosunku do innych języków, zawiera znacznie mniejszą ilość znaków poprzez stosowanie krótszego zapisu, który (w przeciwieństwie do np.: Pascala czy Basica) z reguły nie jest logiczny. 

Oto porównanie zapisów tej samej informacji w trzech językach:

Pascal: i:=i+1; (7 znaków)
QBasic:  I=I+1 (5 znaków)
C++: i++; lub ++i; (4 znaki)

Oznacza to tyle samo co „następne I” (C++ znaczy „następne C”- czyli oznacza kolejną wersję).
Różnica w ilości znaków sprawia, że programy są od kilku do kilkuset razy szybsze i lżejsze, a forma jest bardziej czytelna dla komputera, oferuje programiście większą kontrolę nad programem i daje możliwość pisania programów bardziej zaawansowanych.
Od czasu utworzenia pierwszej wersji C powstało wiele implementacji, mutacji i wersji tego języka różniących się od siebie przede wszystkim funkcjami oraz sposobem zapisu kodu.
Architektura 32-bitowa znacznie upraszcza tworzenie aplikacji, a jednocześnie pozostawia wiele miejsca na kreatywność programisty.
C++ umożliwia wykorzystywanie funkcji i bibliotek innych języków (np.: wykorzystanie funkcji assemblera).
Bardziej popularne programy do pisania aplikacji w C++ dla Windows to np.: Borland C++ i Visual C++.
Rozszerzenia plików źródłowych to [*.c] lub [*.cpp] w zależności od wersji.


Turbo Pascal

Pascal to bardzo popularny język programowania, opracowany w 1971 roku przez Niklausa Wirtha. Mimo upływu lat jest to język nadal aktualny.
Pascal jest uniwersalnym językiem strukturalnym wysokiego poziomu.
Stworzony został z myślą o nauce programowania, dlatego (ze względu na swoje zalety) wykorzystywany jest po dziś dzień na wielu uczelniach oraz w szkołach średnich w ramach nauki programowania.

Bardzo duży wpływ na popularność Pascala miało wprowadzenie przez firmę Borland wersji o nazwie Turbo Pascal .
Turbo Pascal to zintegrowane środowisko programowania zawierające edytor, kompilator oraz moduł znajdowania i usuwania błędów, tzw. debuger.
Sam język stanowi rozszerzenie standardu o nowe funkcje wynikające z rozwijającej się technologii (np. obsługa grafiki, dźwięku).
 
Pascal jest nadal rozwijany, obecnie jest to język obiektowy a jego najnowsza implementacja nosi nazwę Delphi.


Język ten, ze względu na mały stopień trudności w opanowaniu, wykorzystywany jest przede wszystkim w nauczaniu programowania.
Opanowanie Pascala przybliża do języków bardziej zaawansowanych i ułatwia ich późniejszą naukę, bo wprowadza w programowanie sekwencyjno- proceduralno-modularne.

Budowa programu  w  Pascalu

    Program Nazwa;

    blok deklaracji i definicji;

     Begin

     treść programu

    End.



Na program utworzony w Pascalu składają się następujące symbole i słowa kluczowe:
Znakami języka Pascal są litery alfabetu angielskiego (wielkie i małe), spacja, cyfry dziesiętne oraz znak podkreślenie: _

Symbolami są:
· operatory arytmetyczne: + - * /
· operatory relacji: = < > <= >= <>
· nawiasy: okrągłe (w wyrażeniach), klamrowe {w komentarzach} i kwadratowe [w tablicach]
· inne symbole: . , ; : ' @ # $ " ? ! % & ~ \ ^

Słowa kluczowe są stosowane do formułowania poleceń i do definiowania zmiennych np.:
PROGRAM, BEGIN, END, DIV, MOD, AND, NOT, OR, IF, THEN, ELSE, FOR, TO, DOWNTO, DO, CASE, REPEAT, UNTIL, WHILE, VAR, TYPE, CONST, STRING, FILE, USES.

Program w języku Pascal ma następującą strukturę:

Każda instrukcja zakończona jest średnikiem za wyjątkiem BEGIN.
Na końcu programu zawsze powinna być kropka – END.
Borland Turbo Pascal jest językiem 16-bitowym mającym zastosowanie w systemie DOS i trybie MS-DOS pod kontrolą systemu Windows,
a w przypadku systemów typu Unix tylko w konsoli ale te drugie rzadko posiadają kompilatory i interpretery poleceń Pascala ze względu na małą przydatność w tych systemach.
Używa się innych bardziej złożonych i lepiej przystosowanych języków do pracy z jądrami tych systemów (np.: C++, Python itp.).
Za pomocą Turbo Pascala możemy operować na plikach, czego najlepszym przykładem były pierwsze wersje systemów antywirusowych Nortona napisanych właśnie w Pascalu
(na owe czasy Pascal dawał duże możliwości)- dziś te aplikacje jak i większość innych dobrych programów (np.: MS Word) pisana jest w C++.
Możemy na przykład pisać programy przeliczeniowe, w TP można wykonywać dość skomplikowane zadania matematyczne,.

Delphi

Delphi jest kontynuacją pomysłu Andersa Hejlsberga, ojca Turbo Pascala.
Jest to narzędzie typu RAD (Rapid Application Development), przeznaczone do błyskawicznego pisania aplikacji.
Delphi wykorzystuje obiekty, dzięki czemu wstawienie określonych elementów programu nie wymaga pisania kodu tylko edytowania ich właściwości.
Oparty jest na Pascalu (a właściwie Object Pascalu), który jak już wspomniałam wcześniej, nie jest tak bardzo skomplikowany jak inne języki.
Delphi wydaje się być idealnym środowiskiem dla początkujących programistów chcących tworzyć aplikacje dla Windows.
Interfejs programu Delphi jest opracowany tak, by maksymalnie przyspieszyć tworzenie aplikacji.
Na górze głównego okna umieszczono pasek komponentów, na który składa się kilka zakładek podzielonych według określonych kategorii elementów umieszczanych w programach, a panel właściwości i zdarzeń obiektów jest wygodnym narzędziem do opisywania parametrów poszczególnych elementów kodu.