Ada

Klucz programowanie ; 2007-07-07 19:28:27; komentarze (10) i trackbacki (0)

Ada - niepopularny język programowania. Według mojej opinii - najlepszy.

Ada została zatwierdzona w 1980 jako wojskowy standard zunifikowanego języka wysokiego poziomu spełniający wymagania Steelman-a przez Ministerstwo Obrony US. W 1983 została zatwierdzona jako standard ANSI, a w 1987 jako standard ISO.

W 1995 wyszedł standard ISO 'Ada95' dodający funkcjonalności programowania obiektowego. Rozszerzenia standardu pojawiały się także później, w 2000 i 2005.

Czym się charakteryzuje Ada? Jest to język silnie typowany, kompilowany. To, że został zaprojektowany odgórnie, czyli najpierw powstała jego specyfikacja, a dopiero później implementacje, spowodowało, że nie ma takich krzaków jakie można znaleźć np. w PHP. Owa specyfikacja jest otwarta, można przeglądać jej zawartość. Jest ona kompletna i jednoznaczna, można tylko na jej podstawie przewidzieć wyniki dowolnego programu.

Jest to język obiektowy, umożliwia stosowanie polimorfizmu i dziedziczenia, Ada 2005 dodatkowo pozwala na tworzenie interface-ów. Silne typowanie wymusza jawną konwersje nawet między typami tego samego rodzaju [np. dwa różne typy stało przecinkowe].

Ada posiada obsługę wielowątkowości wplecioną w język - deklaracje zadania są inne składniowo niż definicje obiektów. Umożliwia także różne modele komunikacji pomiędzy zadaniami - od najprostszych, jak zmienne globalne, przez obiekty chronione, aż po spotkania.

To były fakty. Teraz kilka moich własnych opinii.

Jako język, Ada posiada setki rzeczy niesamowicie ułatwiających pisanie w niej programów. Na przykład: Jak w C wstawić największą wartość do zmiennej typu int? Przyporządkować (2 ^ (size_of(int) - 1)) - 1. W Adzie? Przyporządkować Integer'Last.

Inną zaletą Ady jest kompilator. Tzn. jest wiele implementacji, jednak wszystkie spełniają ten sam standard, więc zachowują się tak samo. Kompilator Ady znajdujący się w GCC - GNAT [GNu Ada Translator] jest bardzo przyjemny w używaniu. Tak jak inne kompilatory oczywiście sam zajmuje się zależnościami, ale także świetnie przedstawia błędy kompilacji. Przykładowo o brakującym średniku przypomina stwierdzeniem, że brakuje średnika [i tutaj mrugam do programistów C/C++]. Podpowiada także, że zrobiliśmy literówke w nazwie podprogramu [funkcji lub procedury] lub w nazwie zmienne i mówi także co chcieliśmy prawdopodobnie napisać.

A teraz kilka mitów nt. Ady:

"Ada jest językiem tylko dla symulacji/systemów czasu rzeczywistego/systemów embedded." - Mit. Ada posiada szeroką palete funkcjonalności które w żadnym z powyższych nie są używane. Bardzo dobrym przykładem tego jest Unbounded_String - ciąg znaków oparty na liście z dynamicznie przydzielaną pamięcią, o długości maksymalnej takiej jak Integer'Last. Tego rodzaju funkcjonalności posiadają niedeterministyczne czasy przetwarzania, są tworzone na stercie [której niektóre systemy embedded w ogóle nie posiadają] itp.

"Ada jest klonem Pascala." - Mit. Ada coprawda używa składni Pascala, jednak posiada inną semantyke. Przykładem jest chociażby znaczenie średnika.

O Adzie będę jeszcze pisał, bo to mój ulubiony język programowania.

Tetravex solver

Klucz programowanie perl ; 2006-05-15 22:39:35; komentarze (8) i trackbacki (0)

TetraVex to jednoosobowa gra planszowa o wyjątkowo prostych zasadach. Jest plansza w postaci prostokąta, na której są kwadratowe pola. Są też klocki - jest ich tyle ile pól. Każdy klocek ma na brzegach cyfrę. Gra polega na tym, żeby poukładać klocki na polach tak, żeby stykające się klocki miały na dotykających się brzegach tę samą liczbę. Proste? Tak, dla planszy 2x2 albo 3x3. Ale przy 6x6 jest pewien problem.

Ja mam czasem takie przebłyski, że muszę coś napisać w PERLu. No i napisałem - solver do tetravexa.

Działa on na zasadzie przeszukiwania drzewa rozwiązań z odcinaniem. Ma ono głębokość n i każdy węzeł ma 'zagłębienie - n' gałęzi. Daje to n silnia możliwości. Jednak w każdym momencie można stwierdzić czy dalsze przeszukiwanie drzewa ma sens.

Solver działa to funkcja rekurencyjna operująca na jednej kolejce i jednym stosie. Funkcja sprawdza warunek czy może się dany klocek na danym miejscu znaleźć. Jeżeli tak, to wrzuca go na stos, usuwa z kolejki, i przekazuje kolejke i stos rekurencyjnie do siebie samej. Jeżeli dany klocek nie pasuje do miejsca, przewija kolejke i próbuje jeszcze raz. Jeżeli cała kolejka została przewinięta i żaden klocek nie pasował, to zwraca niemożliwość rozwiązania. Jeżeli wynik z wywołania rekurencyjnego to zero czyli brak rozwiązań, to zdejmuje element ze stosu i ładuje na koniec kolejki.

Skrypt przyjmuje dwa argumenty z linii poleceń - szerokość i wysokość planszy. Potem czyta odpowiednią ilość czteroznakowych ciągów oddzielonych spacją. Pierwszy z tych znaków to cyfra na górze klocka, i potem kolejno zgodnie ze wskazówkami zegara - cyfra prawa, dolna i lewa.

Sprawdzanie czy dany klocek może się znaleźć na odpowiedniej pozycji jest sprawdzane poprzez porównanie odpowiednich jednoznakowych podciągów.

Nie ma żadnego zarządzania błędami we wprowadzaniu danych. Jeżeli zestaw klocków jest niemożliwy do ułożenia na danej planszy to program to wypisze. Działa on koszmarnie wolno, dla planszy 6x6 jak jest się szczęśliwym to można czekać kilka minut [teoretycznie jednak może trafić w pierwszej próbie]. Jak każdy mój program - mało testowany.

Jest Open-Source do nauki PERLa. Jest dostępny jako tetravex-solver.


Menu

Klucze