[23.06.2009] Pulpit

zrzut_ekranu-9System to bez zmian Linux Ubuntu,  jeszcze w wersji 9.04. Środowisko to Gnome + Compiz. Zrezygnowałem z Emeralda  i powróciłem do domyślnego menadżera okien. Motyw Gtk to Clearlooks, pobnie jak krawędź okna. Tapeta odnaleziona na freeisoft, (choć troche ona jesienna, a nie wakacyjna). Co do gadżetów na pulpicie, to również bez zmian. A gdyby ktoś pytał, ten Mackowy dock na dole to Avant Windows Navigator ;)

Ana: Kod źródłowy

Słowo się rzekło, oto w ręce ludu oddaje kod źródłowy pierwszego stworzonego przeze mnie języka programowania, noszącego imię Ana.

Do kompilacji wymagane są pakiety flex i bisonc++ (nie mylić z bison++).  Kompilujemy przechodząc w terminalu do katalogu z wypakowanym kodem, po czym wykonujemy polecenie make. Wszelkie uwagi, opinie bardzo mile widziane.

Własny język programowania…

Ostatnio większość wolnego czasu spędzam na tworzeniu własnego języka programowania, ucząc się tej sztuki poprzez praktykę. Teorie czerpie z ostatnio zakupionej książki, wykładów na MIMUW oraz innych części sieci.

Założeniem co do funkcjonalności języka jest obliczanie wyrażeń, w skład których wchodzą operatory arytmetyczne, logiczne, relacyjne itp. oraz   deklaracja zmiennych, instrukcja skoku bezwarunkowego i warunkowego, instrukcja w stylu echo (czy printf, writeln lub podobnej służącej do napisania “Hello World”). Składnia w stylu C.

Niby założenia nie wygórowane: minimalny zestaw instrukcji potrzebny do napisania czegoś bardziej zaawansowanego niż kalkulator na bazie Odwrotnej Notacji Polskiej, ale nie od razu Rzym zbudowano, od czegoś trzeba zacząć.

Po wielu godzinach rozmyślań (głównie w czasie zajęć dydaktycznych w mojej szkole),  wielu zapełnionych kartkach mojego hińskiego notesu (to nie błąd ortograficzny! Notes został tak podpisany przez mojego kolegę z ławki i taka nazwa się przyjęła) i wielu godzinach przy czytaniu i kodzeniu…   UDAŁO SIĘ! Wszystkie przedstawione powyżej założenia języka udało mi się zrealizować.

Język jest interpretowany przez niewielką, pod względem ilości rozpoznawanych instrukcji w porównaniu do przeciętnego procesora, maszynę stosową. Całość została napisana w C++ z użyciem narzędzi Flex++ oraz Bisonc++ (kolejno do wygenerowania leksera i parsera).

Długo szukałem pomysłu na nazwanie języka, lecz doszedłem do wniosku że najwłaściwszą nazwą dla niego będzie “Ana“. Na cześć i chwałe koleżanki z mojej klasy, Ani, która dzielnie słuchała o napotkanych problemach i postępach w pracach.  Dla wyjaśnienia, brak jednego “n”  przypadkowy też nie jest:  to konstrukcje używane powszechnie w innych językach (pętle, funkcje, insturukcja złożona itp).

Kod źródłowy, gdy tylko zostanie uporządkowany, opublikuje w tym miejscu :)

PS. “Hello World” w Anie:

{
echo “Hello World\n”;
}

Czytelność pliku gramatyki Yacca

Długo szukałem sposobu formatowania  gramatyki w pliku wejściowym dla Yacca (a właściwie dla jego klonu na wolnej licencji, bisona) , zapisanej w notacji BNF w sposób, pozwalający zachować jego czytelność przy rozrastającej się liczbie produkcji oraz akcji. Dopiero czytając przykłady w dokumentacji znalazłem odpowiednią konwencje, oto jak ona wygląda:

LEWA STRONA PRODUKCJI
→:
→→ POJEDYNCZY TERMINAL LUB NIE TERMINAL
→→→{ /* Akcja */ }

Każde pojedynczy terminal lub nie terminal prawej strony produkcji znajduje się w osobnym wierszu (odpowiednio wcięty), wyjątkiem od tej reguły może być produkcja z akcją umieszczoną tylko po ostatnim terminalu lub nie terminalu, lub produkcja nie zawierająca akcji. Alternatywny produkcji zapisujemy wg podobnego schematu:

→|
→→POJEDYNCZY TERMINAL LUB NIE TERMINAL
→→→ { /* Akcja */ }

Produkcje kończymy średnikiem poprzedzonym jednym tabulatorem. Trochę rozwlekłe formatowe, ale zapewniające dużą czytelność gramatyki. Screenshot z wejścia Yacca formatowanego za pomocą przedstawionej konwencji:

zrzut_ekranu-8

Bill Gates – Film dokumentalny

Film dokumentalny o współtwórcy i kluczowej postaci Microsoftu, firmy której nikomu nie trzeba przedstawiać. Choć jest w nim drobne potknięcie tłumacza/lektora, mówiące  o “Wyszukiwarce internetowej” zamiast o “Przeglądarce internetowej”.

Czytaj dalej ‘Bill Gates – Film dokumentalny’

Kompilatory – reguły, metody i narzędzia

Muszę się pochwalić,  że dnia wczorajszego stałem się posiadaczem tej książki autorstwa Aho Alfred V., Sethi Ravi, Ullman Jeffrey D. wchodzącej w skład serii “Klasyka Informatyki”. Kupiłem ją za jedyne 90 złotych na allegro, za defekt w postaci braku okładki, zapłaciłem ok 60 złotych mniej w porównaniu do ceny rynkowej. Ale wiedza w niej zawarta (poniekąd poszukiwana przezemnie),  jest warta swojej ceny :)

Dla nieznających tego tytułu, powiem że tematem książki jest pisanie kompilatorów, tworzenie własnych języków programowania oraz sprawy z tym związane.

“Drzewo genealogiczne” języków programowania

Przy poszukiwaniu pomysłu na zrealizowanie deklaracji etykiet, idąc po hiperłączach pajęczyny natknąłem się na stronie domowej Éric Lévénez’s na wykres prezentujący rozwój  języków programowania od roku 1954 (od Fortrana) do aż do obecnego 2009. Na wykresie jest wyszczególnione 50 języków programowania. Wykres w PDFie jest dostępny w formie plakatu lub podzielony na strony A4.  Polecem ;)

Tworzenie ozdobnych pendrivów

Prezentacja polskiej, przydomowej firmy produkującej pendriv’y w drewnianej, zdobionej ozdobie. Brawo za pomysł na własny biznes :)

Maszyny cyfrowe zwane komputerami

Na ulicy polnej w Warszawie każdy może wybrać potrzebne mu usługi, jest tu i taka niebywała firma która świadczy usługi w tempie 30 000 na sekundę! Zakład elektronicznej techniki obliczeniowej…

To cytat z poniższego fragmentu filmu pochodzącego z kroniki filmowej PRL, dotyczącego maszyn cyfrowych zwanych komputerami. Dziwnie się patrzy na to z perspektywy tego kto nie miał nieszczęścia żyć w tamtych czasach ;p

ROT13

Chyba każdenu programującemu znany jest ten trywialny algorytm szyfrujący, ale na wszelki wypadek poniżej kod w C gdyby ktoś nie…

#include <stdio.h>
#include <string.h>

int main (int argc, char* argv[]) {
 int i = 0;
 for (i = 0; i != strlen (argv[1]); ++i) {
 char *c = &argv[1][i];
 if (!isalpha(*c))
 continue;

 if (*c  'Z'|| (*c) + 13 > 'z')
 (*c) -= 26;
 (*c) += 13;
 }
 printf ("%s\n", argv[1]);    
 return 0;
}

lub ciekawsza implementacja, nie mojego autorstwa, pochodząca całego zbioru implementacji tego algorytmu w różnych językach:

int main ()
{
 register char byte, cap;
 for(;read (0, &byte, 1);)
 {
 cap = byte & 32;
 byte &= ~cap;
 byte = ((byte >= 'A') && (byte <= 'Z') ? ((byte - 'A' + 13) % 26 + 'A') : byte) | cap;
 write (1, &byte, 1);
 }
}

Następna strona »