Archiwum kategorii 'Programowanie'

Vala

Vala to język programowania stworzony na potrzeby środowiska Gnome i mocno z nim związany. Powstał dla wszystkich programistów chcących pisać aplikacje przy użyciu bibliotek opartych o GObject z użyciem konstrukcji charakteryzujących nowe języki programowania.

Cechuje się między innymi składnią wzorowaną na C# (zmodyfikowaną na potrzeby GObject),  pełną obiektowością z wbudowaną obsługa sygnałów, właściwości,  wyrażeń lambda czy pętli foreach, zarządzaniem pamięcią.

Czy odróżnia się on od innych języków programowania ? Pliki źródłowe są kompilowane do C. Dzięki temu  twórcy uniknęli wynajdywania na nowo koła, jednocześnie ułatwiając do maksimum użycie kodu napisanego w tym języku w C i vice versa.

To tak krótko o samym języku, o którym obiecałem kiedyś że napisze coś więcej. Osobiście bardzo przyjemnie mi się w nim programuje, więc zachęcam do zapoznania się z nim.

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

“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 ;)

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);
 }
}

Gedit FullScreen mode

Napisałem sobie dziś w celach edukacyjnych prosty plugin do Gedita (domyślnego edytora tekstu w środowisku Gnome) przełączyć okno edytora w tryb pełnoekranowy.  W tym celu posłużyłem się już od dawna testowanym przeze mnie językiem Vala (od wersji ok. 0.4.0 kompilatora, obecnie najnowsza  wersja to 0.7.1), o którym być może napisze parę zdań następnym razem ;)

API udostępnionego przez Gedita uczłem się czytając jego źródło, dokumntacje, analizując kod innego plugina i czytając “C plugin howto“. Jeśli interesuje Cię plugin, to udostępniam paczke z jego skompilowaną wersją, źródłem plugina w języku Vala ( jak i jego wersje  skompilowaną do C). Aby zainstalować plugin wystarczy wydać polecenie

make install

Instalacja nie wymaga praw administratora, ponieważ pliki są libfullscreen.so i fullscreen.gedit-plugin kopiowane są do katalogu ~/.gnome2/gedit/plugins/ . Do własnoręcznej kompilacji wymagana jest w miare najnowsza wersja kompilatora Vali, plik z api Gedita dla języka Vala oraz pakiet gedit-dev (powinien być dostępny w twoim repozytorium).

Kurs Reverse Engineeringu

Ostatnio na stronie UW-Team pojawiła się bardzo ciekawa seria videoartów, dotycząca Reverse Engineeringu pt. “ReverseCraft”. Reverse Engineering to dziedzina informatyki zajmująca się analizowaniem skompilowanego kodu. Jej owocami są np. cracki do różnej maści programów, gier itp. Można dzięki niej np. dowiedzieć się jak działa program X, nie mając jego źródła. Zmodyfikować program X, przetłumaczyć program X. Możliwości jest masa.

Autorem serii videoartów jest Gynvael Coldwind. Jak do tej pory ukazały się dwa odcinki. Osobiście bardzo polecam ;)

Integracja aplikacji desktopowych z Google…

Natknąłem się ostatnio, przeglądając live.gnome.org, na ciekawą bibliotekę służącą właśnie do tego celu.

Biblioteka  nazywa się libgdata i bazuje na GLib (dzieki czemu świetnie integruje się z innymi bibliotekami, m. in. Gtk, opartymi na GLib). Projekt jest stosunkowo młody, ostatnia wydana wersja biblioteki to 0.1  (powiedzieć by można że raczkuje). Możliwości jak na razie też niewielkie: obsługa API youtube i kalendarza Google.

Praktyczne użycie tego pierwszego to np. plugin do Totema (domyślnego odtawarzacza filmów w Gnome). Plany w obec obsługi kalendarza Google to integracja z kalendarzem  Evolution. Jednak wg. mnie, wachlarz możliwości potencjalnego zastosowania biblioteki w aplikacjach biurkowych jest równie duży jak wachlarz usług oferowanych przez Google. Osobiście trzymam kciuki na projekt i będę śledził jego rozwój :)

GNOME 2.26 wydane, a co przynosi Gtk+ 2.16 ?

Wydano dzisiaj kolejną wersję środowiska graficznego Gnome, oznaczoną numerkiem 2.26. O nowościach widocznych dla użytkownika zapewne każdy zainteresowany już wie, a jakie nowości przynosi ściśle związana z nim biblioteka Gtk+ 2.16 ?

Oczyszczono kod, jak z każdym wydaniem naprawiono błędy (i zapewne popełniono nowe), poczyniono przygotowania do przejścia na gałąź oznaczoną numerkiem 3.0 (m. in. zrywający z bibliotekami uznanymi za przestarzałe). Oprócz tych kosmetycznych zmian pojawiło się kilka większych nowości:

  • Możliwość wyświetlania ikon w widgetcie GtkEntry
  • Możliwość wyświetlania paska postępu w widgetcie GtkEntry

Ponadto udostępniono API do nagrywania płyt,  libbrasero-media, oraz API do widgetu EvView, pozwalającego na wyświetlanie dokumentów w formacie PDF, PostScript, DVI (znany z standardowej przeglądarki wcześniej wymienionych dokumentów dla śródowiska Gnome – Evince)

PS. Osobiście nie mogę się już doczekać wydania pierwszego z gałęzi 3.0 …

Ester eggs w Komodo Edit

Takie małe wielkanocne jaja ze strony autorów… Jak chcesz zobaczyć utwórz makro i w jego treści wpisz:

ko.eggs.boing ();

i uruchom je ^^

Następna strona »