уторак, 13. март 2012.

C++ 2011

Управо читам шта је ново у C++ стандарду 2011.

http://en.wikipedia.org/wiki/C%2B%2B11#Changes_from_the_previous_version_of_the_standard

Време лети, а нисам пратио ни мало шта се дешава. Сада се одједном осећам застарело.

Чини ми се да је направљен огроман помак. Проширење синтаксе да подржи програмирање шаблонима је интересантно (али и очекивано).

Међути, изгледа ми да је најсмелији и највећи помак направљен на подршци конкурентном програмирању. На пример, "futures and promises" (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf)

Сада назад на читање, има доста тога.




среда, 15. фебруар 2012.

Детерминистички коначни аутомат

Наишао сам на интересантан практичан проблем.

Уколико имам низ познатих стрингова, хоћу да конструишем ДКА који ће препознавати да ли је дати стринг дат на улазу унутар низа.

Интересује ме само најбржа могућа варијанта. За вежбу сам направио мали генератор switch исказа али то даје веома велики бинарни код, а вероватно и даље није оптималан (на пример, поређење се врши на појединачним бајтовима иако би на 32-битним процесорима 32-битно поређење било далеко брже).

Ручно, вероватно бих пришао проблему овако:

(конструкција машине - генерисање кода):
а) Одреди најмању и највећу дужину стринга из фиксног скупа
б) Сортирај и рангирај према дужини, а у поређењу са ширином регистра на циљној машини (на пример, за 32 битне, 4 бајта).

Генерисани код би реадио отприлике овако:
1) Одреди дужину улазног стринга.
2) Изврши елиминацију на основу мин. макс. дужине.
3) на основу ранга (дужине) стринга а у функцији мин. дужине, врши одговарајућу претрагу сортираног ранга (на пример: дужина улазног стринга је 5, а најмања дужина константи је 4 а највећа 10, изабери ранг константи дужине веће од 4 а мање од 9, и врши претрагу поређењем првих 4 бајта дужине):

extern const char *const ulaz;
switch (*(uint32_t*)ulaz) {
case konst1:
...
case konst2:
...
}

где су konst1 и konst2 израчунате приликом генерисања кода на основу циљне машине и ендијана.


Ипак, претпоставио бих да ово већ негде постоји, само треба наћи.

четвртак, 22. септембар 2011.

vim - форматирање изворног кода

"Открио" сам још један начин за генерисање синаксно обојеног ХТМЛ кода за бебник.

Онај тежи начин сам описао овде: http://aleksandarristovski.blogspot.com/2009/04/blog-post.html

А далеко лакши је једноставно генерисати код из Вим едитора командом ":TOhtml".

Пример:



int main()
{
    int bar = 0;
    char foo;

    for (foo = 7; foo >= 0; foo--) {
        bar++;
    }

    return bar;
}


Невероватно једноставно.

субота, 17. септембар 2011.

Ubuntu 11.04 - io scheduler

Недавно сам прешао на новији компјутер и са тим и новији Убунту 11.04. Приметио сам да је одзив апликација катастрофалан ако у позадини имам операцију која интензивно користи диск. На пример, урадим

svn up

и већина апликација које су активне блокирају по неколико секунди. Буквално онемогућује рад.

Тражећи решење, изгледа да је узрок нови "scheduler" у линукс кернелу: "CFP". Преправио сам почетне аргументе кернела у груб конфигурацији и додао

"elevation=deadline"

у линији

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash reboot=pci elevator=deadline"

фајла /etc/default/grub

затим sudo update-grub

Чини ми се да је разлика очигледна. За тест сам копирао фајл од неколико гигабајта и истовремено користио интернет претраживач - иако има веома краткотрајних застоја, може нормално да се користи.

субота, 26. фебруар 2011.

позивање виртуелне функције из деструктора базне класе

Данас сам имао краткотрајно помрачење ума. Покушао сам нешто што не може да ради. Чак сам се и збунио, а волим да верујем да познајем Ц++. Све је релативно, а знање нарочито.

Ради се о следећем:





class Base
{
public:
   virtual ~Base() { foo(); }

   virtual void foo() = 0;
};

class Derived
{
public:
   virtual void foo() { cout << "Derived::foo" << endl; }
};


Солидан компајлер ће дати упозорење. У зависности од верзије gcc и binutils прављење извршне датотеке може да успе, можда не. У сваком случају, ово је погрешно из простог разлога што у тренутку када деструктор класе Base позове функцију foo, изведена класа Derived је већ извршила свој деструктор и подаци у тој класи су већ уништени. Ако би компјалер дозволио позив виртуелне фунције из деструктора Base, довео би до ситуације да виртуелна функција изведене класе барата са подацима који су већ били уништени.

понедељак, 3. мај 2010.

byobu

Већ неколико година користим "GNU screen" и веома ми је користан. Тек данас сам сазнао за "byobu".

Програм byobu даје могућност конфигурисања screen програма и приказ интересантних података у додатној статусној линији.

Ипак, оно што ми се нарочито свиђа је да вертикална подела екрана сада ради без грешке. Када сам пре неког времена то покушао са screen није све радило како треба па то нисам ни користио.

Дакле, од сада - byobu!

четвртак, 15. април 2010.

Занимљиво питање

Питање је стигло од корисника:

Зашто на powerpc платформи овај код завршава у бесконачној петљи:


int main()
{
   int bar = 0;
   char foo;

   for (foo = 7; foo >= 0; foo--) {
       bar++;
   }

   return bar;
}


Одговор:
зато што је на powerpc платформи char не-негативан целобројни тип (unsigned char)