Pokazywanie postów oznaczonych etykietą przemyślenia. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą przemyślenia. Pokaż wszystkie posty

sobota, 3 marca 2012

Lynx for Forth

Witam wszystkich!
Oto nadeszła pamiętna chwila! Lynx obudzony ze snu, po 8 godzinach pracy ożywa!
Czym był Lynx?
Lynx był kiedyś moim niespełnionym marzeniem. Od kiedy zacząłem "skrobać" swoje pierwsze programy, marzyłem o własnym języku. Dziś marzenia stają się rzeczywistością! Lynx był projektem rozwijanym zrywami, często zarzucanym, niszczonym(ostatnie kilka reinstali bez dostępu do środków zapisu...), no i ogólnie miał trudno. Niektórzy(zapewne większość nadal nie wie co to ten Lynx), a więc:
Czym jest Lynx?
Lynx to wirtualna maszyna oparta o 2 stosy: stos parametrów i stos powrotu. Tego drugiego na razie nie tykam :P. Dlaczego stos? Bo czemu nie ;) Stos to najprzyjemniejsza struktura danych jednocześnie najbliższa człowiekowi ;) Językiem pośrednim, a jednocześnie wysoko poziomowym jest Forth. Wybrałem go ze względu na łatwą implementację i stosunkową bliskość z maszyną. Forth jest zaimplementowany jakoś w 50-60% : brakuje jedynie implementacji flow-control i słów(takie jakby funkcje\podprogramy w Forth'cie). Co mi pozostało do roboty po za maszyną? Cóż, nie wiele ;) Nie potrzebny mi chyba będzie dekompilator, choć pewnie go napiszę. Przyda się za to kompilator. Próbowałem z ANTLR3, ale chyba coś poknociłem więc odstawiam to na dłuższy termin i wzamian używam nasm'owych makr(dzięki Gyn za ten trik!).
Czym będzie Lynx?
Środowiskiem uruchomieniowym z lekka podobnym do NekoVM, jednak stworzonym przez człowieka(może ludzi? ;)) dla ludzi(wystarczy porównać source mojej maszyny z Neko...). Po za domyślnym Forth'em planuję jeszcze szereg innych języków. Po jakimś tam wstępie myśle nad JIT'em i bajerami.


Source można pobrać z mojego Dropboxa.
(Polecam obejrzeć przykładowy plik z makrami).


@EDIT: Stwierdziłem, że Lynx'a na ten czas zawieszę i do życia powołam SimpleVM - prostą VMkę, którą będe opisywał krok po kroku we wpisach na blogu, yo!

czwartek, 29 grudnia 2011

Jak uratować Polskę?

Witam!
Jest to mój pierwszy post "polityczny". Możliwe że takowych pojawi się więcej :)
DISCLAIMER:
 Ten post i każdy następny z tej serii reprezentuje jedynie moje własne i przez nikogo nie modyfikowane poglądy.
Nie ma on także na celu nikogo obrazić etc. i nie jest żadną próbą ataku, która może wynikać jedynie z mojego stylu pisania.
END DISCLAIMER;
Przepraszam za ten wstęp, ale zawsze lepiej się zabezpieczyć przed niekonstruktywną krytyką.
Przejdźmy dalej:
Czy trzeba ratować Polskę?
Zacznijmy od samego przedstawienia problemu - co i dlaczego powinniśmy ratować?
Co? To już wiemy. Polska to dla większości z nas ojczyzna. Ale czy wiemy co wiąże się z tym imieniem? Są to ludzie, ziemia, zwierzęta etc. ale i również jej dobre imię czy gospodarka jeżeli potraktujemy tę naszą Polskę jako kraj. I właśnie chciałbym poruszyć te problemy związane bardziej z dobrym imieniem czy gospodarką. Ale dlaczego powinniśmy ratować nasz kraj? Dlatego choćby że jest to nasza ojczyzna, że jesteśmy obywatelami tego kraju etc. Ale czy trzeba ją ratować? Czy grozi nam jakieś niebezpieczeństwo? Ostatnie lata były raczej łaskawe dla nas - przynajmniej tak twierdzą media. Propaganda jest była i będzie. Zawsze jest to nieodłączny element "sterujący" władzy. Ale teraz na jaw wychodzą różne dziwne problemy - choćby te z KRUS.
Czy warto?
Na pewno. Tu raczej nie powinniśmy mieć wątpliwości. Ale czy wśród kłamstw rządu możemy się odnaleźć? Teraz dopiero wychodzi na jaw wiele dziwnych sprawek, a w dodatku  mamy stać się częścią dziwnego wytworu wyobraźni "specjalistów" z Unii.
Jak?
Doszliśmy do sedna tego postu - listy reform:
  1.  Stopniowa likwidacja KRUSu i ZUSu. ZUS okrada pracowników już od lat, tylko po to by na emeryturze wydawać nam niewielkie pieniądze, a sam mógł inwestować w "ZUSowe pałace". Czy nie lepiej byłoby oddawać ludziom te pieniądze które ZUS i KRUS zabierają, niech sami zadbają o swoją emeryturę. ZUS z pensji zabiera, uwaga, 45%! Przecież to kupa pieniędzy! Ile dostaniemy na emeryturze? Jeśli dobrze pójdzie i obejdzie się bez kryzysu będzie to nie cała połowa.
  2. Stopniowa likwidacja NFZ. Czemu? Bo to tzw. leczenie za darmo nie ma sensu, a leczenie prywatne jest za drogie. Po likwidacji NFZ powstawałaby konkurencja dla prywatnych lekarzy.
  3. Pilnowanie takich idiotów jak choćby ten pan co podpala koty(a może z nimi pali? ;))
  4. Obrona dobrego imienia przez każdego z nas. To reforma której wprowadzenie jest możliwe, ale egzekwowanie już raczej trudne do spełnienia. To prośba o dbanie przez każdego z nas. Imię naszej ojczyzny świadczy o jej mieszkańcach.
Jak wprowadzić do wszystko? Prosto! Wystarczy dokonać przewrotu i zostać dyktatorem na co najmniej 50 lat(plan likwidacji ZUS i KRUS oraz NFZ przy jednoczesnej wstecznej "kompatybilności") :).

sobota, 5 listopada 2011

Co mi się podoba w...Javie?

Hai all!

Piszę sobie od niedawna w Javie, praktycznie całkowicie się na nią przerzucając. I muszę przyznać jestem zadowolony. Nawet bardzo.

Po pierwsze:
W Javie mam zdefiniowane wszystko, absolutnie wszystko czego potrzebuję do programowania. Rzeczy których nie ma łatwo można samemu zaimplementować. Chwilami programowanie wygląda jak uzupełnianie formularza ;)
Po drugie:
Niby w Javie mamy mocne typowanie. A jednak. Nic nie broni by zrobić z niej język "dynamiczny". Wszystko dzięki typowi object. Zamiast robić 10 zmiennych różnych typów wystarczy jedna(choć to też marne tłumaczenie-zazwyczaj korzysta się ze stosów czy kolejek i linked list-a te już muszą mieć typ object :)). Jest to również lekarstwo na typy generyczne(jak ktoś jest uczulony) i chwilami na overrloading'i metod.
Po trzecie:
Pełna obiektowość. No może nie pełna, bo nie mamy możliwości zrobienia czegoś takiego jak w Ruby'm:
5.toStr
ale bardzo się przydaje. Np.wyrabia dobre nawyki etc.
Po czwarte:
Przenośność. Tutaj chyba nie trzeba zbyt dużo tłumaczyć.
Po piąte:
Prawie każdy obiekt posiada iterator, a to pozwala na znaczne ułatwienia.
Po szóste:
Prędkość. Wbrew powszechnej opini, Java nie jest wolnym językiem. Potrafi wykonać niektóre operacje dużo szybciej niż gcc! Po za tym nie jesteśmy zmuszeni do kompilowania kodu non-stop, a dzięki projektowi gcj możemy tworzyć natywne dla systemu binarki. btw. jeszcze ta opinia o prędkości, którą wiele osób propaguje pochodzi z czasów pierwszych edycji Javy, czyli jeszcze bez JIT'a i hot-swapping'u.

Hm... to już chyba koniec iteracji...tfu, wyliczania :)
PS: Rozpoczyna się seria bardziej sensownych wpisów :) Niedługo opowiem jak skonstruować bardzo przejrzysty parser dowolnego języka oraz jak stworzyć maszynę witrualną. Niestety zanim to się stanie chcę ukończyć Lynx'a.

czwartek, 27 października 2011

Reklamy

Witam!
Dostałem dzisiaj bardzo śmiesznego maila. Hmm...może zamiast opisywać co takiego w nim było wrzuce tutaj ocenzurowaną wersję ;)
Pan Dmytro(lol, coś translator nawalił mu) pisze:
Witam!
Chcialbym tylko podziekowac ci za super blog assalog.blogspot.com.
Przeczytałem post "Lynx32 published!", i spędziłem na twoim blogu jeszcze godzinę z przyjemnością :) Piszesz dobre, ciekawo i łatwo do czytania. Bardzo ładny jest post "while i...when".
Generalnie pracuję w firmie XXX, wyszukiwarce ofert pracy na całym świecie.
Moim zadaniem jest przekonanie blogerów o umieszczenie linków do naszej strony.
Kocham swoją pracę, mamy przyjazny zespół i dobre kierownictwo, ale niestety nie mam pojęcia jak przekonać bloggera umieścić do nas link, obawiam się, mogę zostać wyrzucony za to z pracy :(
I teraz, zamiast wysyłania mailów do tysięcy różnych blogów, czytam twój.
Szczerze mówiąc, nie jestem bardzo pewien, że link do naszej strony w Polsce X(link do strony), będzie odpowiednia do twego bloga, ale jeśli jest to możliwe, masz ode mnie ogromne PODZIĘKOWANIA! Strona jest naprawdę super, bardzo pomaga w wyszukiwaniu pracy.
Życzę miłego dnia i dobry nastrój! Jeszcze raz dziękuję za fajny blog. Pisz więcej.
P.S. Twój znak Zodiaku jest Baran?! Tacy ludzi są zdolne!
My best,
Dmytro Ivanenko
Account Manager
Jak widać tekst wygląda co najmniej szablonowo. Nie wiem czy to jest jakiś blogger'owy spam czy co, ale powiem szczerze: gdyby nie drobne wpadki z translatorem to dałbym się nabrać i zamieścił ową reklamę.
No cóż trzeba pogratulować jenteligencji i sztuki operowania ludzkimi uczuciami-dałem się nabrać na tą litość!

sobota, 15 października 2011

while i...when

Witam!
Rzadko się spotyka języki tak zaprojektowane, że implementują funkcyjność bez szkody dla obiektowości. Takim językiem na pewno nie jest OCaml gdyż bardzo upośledza on sam siebie...(F# jest już ładniejszy).
Nemerle zaś bardzo dobrze radzi sobie z obiektowością(używając stałych!). Bardzo ciekawym przypadkiem rozwiązania pewnego problemu na 2 sposoby jest liczenie linii w pliku tekstowym:

class LineCounter
 {
   public static Main () : void
   {
     //  Open a file.
     def sr = System.IO.StreamReader ("SomeFile.txt");   
     mutable line_no = 0;                                
     mutable line = sr.ReadLine ();
     while (line != null) {            
       System.Console.WriteLine (line);
       line_no = line_no + 1;           
       line = sr.ReadLine ();
     };                                  
     System.Console.WriteLine ("Line count: {0}", line_no);
   }
 }
Jest to typowo imperatywne rozwiązanie problemu. Teraz zobaczmy sobie przykład wykorzystania when.

class LineCounterWithoutLoop
 {
   public static Main () : void
   {
     def sr = System.IO.StreamReader ("SomeFile.txt");
     mutable line_no = 0;
 
     def read_lines () : void {            
       def line = sr.ReadLine ();
       when (line != null) {               
         System.Console.WriteLine (line); 
         line_no = line_no + 1;           
         read_lines ()                    
       }
     };
 
     read_lines ();      
 
     System.Console.WriteLine ("Line count: {0}", line_no); 
   }
 }
Jak widać mamy bardzo ładny przykład :)
When działa podobnie jak while jednak bez skoku :) Wykonuje kod dopóki, jednak nie skacze na początek(po wykonaniu kodu) jeżeli warunek jest prawdziwy. To bardzo ciekawy lukier składniowy, sprawiający, że można praktycznie odejść od imperatywizmów i skupić się na rekurencji :)

poniedziałek, 26 września 2011

Trudne programowanie w C++

Witam!

Jako że ostatni przepisuję dosyć długaśśnyy kod z C# na C++ natknąłem się, a raczej spostrzegłem pewną hm... jak by to nazwać...odstępstwo(?). Chodzi mi tutaj o język C++ i programowanie obiektowe. W każdym chyba dziś bardziej poważanym języku mamy możliwość projektowania obiektowego. Wd. mnie w C++ jest ono NAJBARDZIEJ SKOPANE. Dlaczego? Ponieważ brak mi tutaj jakiegoś uporządkowania, wygody... Gdy piszę jakiś projekt zazwyczaj rzadko zaglądam do manuali języka ponieważ no nie muszę. Jako że dosyć często piszę w C i Python nie jest mi obcy, raczej w tych językach się skupiam. W C do manuli nie zaglądam w sumie w ogóle(ew. jeżeli potrzebuję korzystać z bibliotek typu string etc.), w Pythonie coraz rzadziej...Natomiast w C++ przy manualu spędzam więcej czasu niż zajmuje mi pisanie! Problemy sprawiane przez dziwną dosyć składnię i niepełną obiektowość są poprostu przybijające! Dziwne wypełnianie   metod, wirtualny(!) destruktor, pliki nagłówkowe ze strażnikami, bezsensowne RTTI zwiększające wagę binarek...Można wymieniać latami. Szkoda że mam trochę zbyt dużo roboty bo całkiem rozbudowany jest mój system obiektowości oraz klasa string którą przy jej pomocy w C napisałem. Efekt przedstawię w miarę wolnej chwili :)

poniedziałek, 29 sierpnia 2011

Jak nie być script kiddem?

W społeczności "hackerskiej" określenie script kidd oznacza osobę korzystającą z programów używanych do różnego rodzaju ataków nie znając ich działania. Nie jest to zatem określenie hakera korzystającego z cudzego oprogramowania, zamiast je napisać. Nawet najsławniejsi w swym czasie Anonymous korzystali z Low Orbit Ion Cannon które przecież nie jest ich dziełem, a nikt nie nazywa ich script kiddami.
Pojęcie script kidda zatem mamy wytłumaczone. Teraz powiedzmy sobię jak takim script kiddem nie być:

  1. Po pierwsze-ucz się jak najwięcej. Żeby nie lamić musisz wiedzieć jak najwięcej. Nie ważne czy będzie to mniej lub bardziej związane z hackingiem.
  2. lrn google. Tam jest wszystko czego tylko sobie życzysz :)
  3. Programuj jak najwięcej. Script kidd nie potrafi napisać aplikacji podobnej do tej z której korzysta-dlatego jest lamerem.
  4. Jeżeli korzystasz z jakiejś aplikacji spytaj się jego twórcy lub sam pomyśl jak ona może działać :)
  5. Use source, Luke :)
No to byłoby na tyle :)

sobota, 6 sierpnia 2011

Jak dziala pop i push?


Jeżeli zawsze byłeś ciekawy jak działa pop i push oraz jak można je zastąpić, to zapraszam do czytania ;)

Jeżeli miałeś kiedykolwiek styczność z asm'em to wiesz czym są segmenty oraz stos. Myślę jednak że warto by choć trochę zainteresować. Czym jest stos można spokojnie poczytać na wikipedii. O segmentach nic chyba nie było. Powiem tyle że dla nas najważniejszy jest segment stosu(SS-Stack Segment). Wskazuje on na początek stosu. W naszym przypadku będzie to 100h.Przyjmijmy że każdy argument wrzucany na stos ma 2 bajty(wiem nie jest tak ale zbyt długo rysowałem schemat żeby tera zmieniać :P). Wszystko wrzucamy "od tyłu"(lub od góry, różnie można interpretować). Operowanie na stosie czyli push wrzucające coś na stos oraz pop ściągające z rejestru do stosu to po prostu odejmowanie i dodawanie adresów. Push można zamienić na:
;PUSH
sub esp, wielkosc
mov [ss:esp], co
Gdzie wielkość w naszym przypadku bedzie miała wartość 2. ss:esp to adres ostatniego elementu stosu.
Zobaczmy prosty przykład. Na stos wrzucamy zawartość AX i DX:
;push AX
sub esp,2
mov [ss:esp],ax 
;push DX
sub esp,2
mov [ss:esp],dx
Jak będzie wyglądał stos:

Uff...namęczyłem się trochę z tym rysunkiem ponieważ robiłem go w mtPaint :P
Dobrze. Jak widzimy adres maleje o wielkość(czyli 2)-0xFE(dec.254) do 0xFC(dec.252). Jako że wrzuciliśmy rejestry 16 bitowe wszystko powinno się zmieścić.
Jak działa pop?
Jak wiemy pop zdejmuje ze stosu ostatni element i wrzuca go do jakiegoś rejestru. Czyli działa odwrotnie do push. Dla przejrzystości pokażę przykład:
;POP 
mov gdzie, [ss:esp]
add esp, 2
Do gdzie przesuwamy ostatni element stosu. Potem dodajemy do ESP 2 czyli ustaloną przez nas wielkość. Sprawi to że stos przeskoczy na nasz "umówiony" adres 254 czyli na przedostatni element.

Czy język może się przedawnić?

To pytanie zadałem sobie przed chwilą. Odpowiedź jest bardzo prosta-nie. Język czyli semantyka, sam dialog z komputerem raczej trudno ulega przedawnieniu, a to dlatego, że jest pewna rzecz w komputerze niezmienna-bity. Są, były i będą w każdym komputerze. A więc jeżeli język nie obsługuje pewnych ficzerów jak np. obsługa wyjątktów, to leży to już w kwestii kompilatora. Ile to już dziwactw wymyślono dla C czy takiego bardzo przyjemnego Fortrana. Jeżeli wychodzi nowa wersja jakiegoś języka, to jest to po prostu ustandaryzowanie pewnych rozwiązań wobec stawianych problemów. Weźmy np. C. Mamy w nim dwa standardy: ANSI C(pierwotny) oraz C99. Standard drugi jest jedynie pewnego rodzaju próbą unowocześniania języka. Nie zawsze wychodzi to na dobre. C99 dorzucił kilka całkiem fajnych ficzerów w stylu komentarzy jednolinijkowych, czy chociażby typ logiczny, jednak nie oszukujmy się-to wszystko to tylko mydlenie oczu. Nie mówię tu że starsze języki są gorsze. Warto jednak pomyśleć w czym uchybiają tym nowszym...
PS: Całkiem chlubnym przykładem jest najnowszy(jeszcze opracowywany) standard języka C++. Wprowadza tyle udogodnień, że sama nauka tego standardu będzie trwała dłużej niż nauka C++ ;)

Popularne posty