Zkušenosti s jazykem D

RAII

Re:Zkušenosti s jazykem D
« Odpověď #60 kdy: 25. 02. 2014, 22:26:27 »
To vitamin: Opravuju se, teď sem to vyzkoušel a nefunguje ti to. Chyba bude asi jako u mne, a totiž napřed musíš objekt staticky inicializovat : jménotřídy.classinfo.init


RAII

Re:Zkušenosti s jazykem D
« Odpověď #61 kdy: 25. 02. 2014, 22:38:13 »
No, takže, snažil sem se zase o kus vylepšit svůj výtvor a tady je výsledek. Zase SIGSEGV, a tentokrát vím kůli čemu. Selhává mi tam kopírování bufferu. Ale netuším čím to je...ve výsledku je v bufferu změť kravin, a jen dva (z 10) validní objekty. *chjo

Kód: [Vybrat]
module test.main;
import std.stdio;
import std.random;

import std.c.stdlib;
import std.traits;

class example
{
int num;
this(int _num)
{
writeln("example ctor");
num = _num*10;
}
~this()
{
writeln("example dtor");
}
int callee()
{
return num*2;
}
}

struct objectPool(T) if (is(T==class))
{
private byte * buffer;
private long top;
private long size;
enum sizeOfEl = __traits(classInstanceSize,T);
enum elPadding = sizeOfEl % classInstanceAlignment!T;
enum finalElSize = sizeOfEl + elPadding;
this(int dummy)
{
buffer = null;
top = 0;
size = 0;
}
~this()
{
callDtors();
freeBuff();
size = 0;
}
long retSize()
{
return top;
}
T opIndex(long index)
{
return cast(T)(buffer+index*finalElSize);
}
void createInstance(Args...)(Args args)
{
if (top == size)
{
if (top == 0 && size ==0)
{
size = 1;
allocBuff();
ctor(cast(T)buffer,args);
++top;
}
else
{
size *= 2;
byte * temp = cast(byte*)malloc(size*finalElSize);
temp[0..size/2] = buffer[0..size/2];
free(buffer);
buffer = temp;
ctor(cast(T)(buffer+top*finalElSize),args);
++top;
}
}
else
{
ctor(cast(T)(buffer+top*finalElSize),args);
++top;
}
}
void allocBuff()
{
buffer = cast(byte*)malloc(finalElSize*size);
}
void freeBuff()
{
free(buffer);
buffer = null;
}
void callCtors()
{
for (int i=0; i<size;++i)
{
// To samé co dtor
ctor(cast(T)(buffer+i*finalElSize),0);
}
}
void callDtors()
{
for (int i=0; i<top;++i)
{
// každý objekt je reference (degradovaný pointer), tím pádem můžeme jakoukoli adresu
//přetypovat na referenci ukazující na objekt libovolného typu a opačně referenci na pointer
dtor(cast(T)(buffer+i*finalElSize));
}
}
void dtor(T ob)
{
ob.__dtor();
}
void ctor(Args...)(T ob,Args args)
{
// Statická inicializace objektu [vtable + metadata]
byte * chunk = cast(byte*)ob;
chunk[0..sizeOfEl] = T.classinfo.init[0..sizeOfEl];
// Samotné volání konstruktoru
ob.__ctor(args);
}
};

void main()
{
objectPool!example oPool = objectPool!example(0);
foreach (int i;0..10)
oPool.createInstance(i);
writeln("FINALLLLL STAGEE");
foreach (long i;0..40)
writeln(oPool[i].num);
}

RAII

Re:Zkušenosti s jazykem D
« Odpověď #62 kdy: 25. 02. 2014, 22:43:21 »
Jo fajn, tak sem za debila ... místo
Kód: [Vybrat]
chunk[0..sizeOfEl] = T.classinfo.init[0..sizeOfEl];
má být
Kód: [Vybrat]
temp[0..(size*finalElSize)/2] = buffer[0..(size*finalElSize)/2];

Jaksi sem zapomněl že když to kopíruji po bajtech, nestačí mi zkopírovat jeden bajt na jeden element ... xD

RAII

Re:Zkušenosti s jazykem D
« Odpověď #63 kdy: 25. 02. 2014, 22:44:31 »
zase vedle ...
Kód: [Vybrat]
temp[0..size/2] = buffer[0..size/2];
... *chjo

vitamin_

Re:Zkušenosti s jazykem D
« Odpověď #64 kdy: 26. 02. 2014, 07:40:21 »
Na inicializáciu som zabudol. Prečo vlastne nepoužieš emplace? Robí to presne čo chceš:
Kód: [Vybrat]
T emplace(T, Args...)(void[] chunk, auto ref Args args) if (is(T == class))
{
    enum classSize = __traits(classInstanceSize, T);
    testEmplaceChunk(chunk, classSize, classInstanceAlignment!T, T.stringof);
    auto result = cast(T) chunk.ptr;

    // Initialize the object in its pre-ctor state
    (cast(byte[]) chunk)[0 .. classSize] = typeid(T).init[];

    // Call the ctor if any
    static if (is(typeof(result.__ctor(args))))
    {
        // T defines a genuine constructor accepting args
        // Go the classic route: write .init first, then call ctor
        result.__ctor(args);
    }
    else
    {
        static assert(args.length == 0 && !is(typeof(&T.__ctor)),
                "Don't know how to initialize an object of type "
                ~ T.stringof ~ " with arguments " ~ Args.stringof);
    }
    return result;
}


Kozzi

Re:Zkušenosti s jazykem D
« Odpověď #65 kdy: 26. 02. 2014, 08:08:05 »
Na inicializáciu som zabudol. Prečo vlastne nepoužieš emplace? Robí to presne čo chceš:
Kód: [Vybrat]
T emplace(T, Args...)(void[] chunk, auto ref Args args) if (is(T == class))
{
    enum classSize = __traits(classInstanceSize, T);
    testEmplaceChunk(chunk, classSize, classInstanceAlignment!T, T.stringof);
    auto result = cast(T) chunk.ptr;

    // Initialize the object in its pre-ctor state
    (cast(byte[]) chunk)[0 .. classSize] = typeid(T).init[];

    // Call the ctor if any
    static if (is(typeof(result.__ctor(args))))
    {
        // T defines a genuine constructor accepting args
        // Go the classic route: write .init first, then call ctor
        result.__ctor(args);
    }
    else
    {
        static assert(args.length == 0 && !is(typeof(&T.__ctor)),
                "Don't know how to initialize an object of type "
                ~ T.stringof ~ " with arguments " ~ Args.stringof);
    }
    return result;
}

Jelikoz se ptal na to jak se zbavit standardni knihovny a podobne, tak predpokladam ze prave proto.

RAII

Re:Zkušenosti s jazykem D
« Odpověď #66 kdy: 26. 02. 2014, 12:28:51 »
Měl bych otázku. Jak napsat bootloader a nebo OS v déčku už víceméně vím (OSDEV -> D bare bones). Jediný problém je DRUNTIME. Bez něj neudělám ani strukturu či nevstoupím do pole -> arr
  • . A tady je právě jádro pudla, neznáte někdo nějakou platform independant DRUNTIME? Tím platform independant myslím nezávislost na použité platformě (technicky vzato i na architektuře procesoru). Pokud žádná taková implementace DRUNTIME neexistuje, nezbývá než zahodit D (nemám trpělivost si to implementovat sám). Na OSDEV sem na fóru viděl že ho někdo napsal, ale už to bylo starý a nešlo zpřístupnit zdrojáky :((

RAII

Re:Zkušenosti s jazykem D
« Odpověď #67 kdy: 26. 02. 2014, 12:44:31 »

Mirage

Re:Zkušenosti s jazykem D
« Odpověď #68 kdy: 26. 02. 2014, 12:45:21 »
chunk[0..sizeOfEl] = T.classinfo.init[0..sizeOfEl];
temp[0..(size*finalElSize)/2] = buffer[0..(size*finalElSize)/2];
temp[0..size/2] = buffer[0..size/2];

To je nějaký dialekt Brainfucku? ;D

RAII

Re:Zkušenosti s jazykem D
« Odpověď #69 kdy: 26. 02. 2014, 13:06:47 »
xDD, dalo by se říct. Ta syntaxe na tom není to nejhorší. Takže DRUNTIME mám vyřešen, zbývá kompiler, DMD pokud vím tak neumožňuje zakázání přilinkování implicitní DRUNTIME, takže ho nemohu použít. GDC to však umožňuje. Nenašel jsem však žádnou binary relase, pouze zdrojáky na který sem chvilku koukal a pak je smazal protože sem nepřišel na to jak je zkompilovat. Bohužel fedora nemá v repozitáři GDC takže ho nemůžu získat od tud, je tam jen LDC ale to je naprd páč znám jen GNU toolchain (nechce se mi učit další). Byl by někdo tak hodný a dal sem link na nějaký build GDC jež podporuje D2? (D1 build už sem měl...).

Kozzi

Re:Zkušenosti s jazykem D
« Odpověď #70 kdy: 26. 02. 2014, 13:20:50 »
xDD, dalo by se říct. Ta syntaxe na tom není to nejhorší. Takže DRUNTIME mám vyřešen, zbývá kompiler, DMD pokud vím tak neumožňuje zakázání přilinkování implicitní DRUNTIME, takže ho nemohu použít. GDC to však umožňuje. Nenašel jsem však žádnou binary relase, pouze zdrojáky na který sem chvilku koukal a pak je smazal protože sem nepřišel na to jak je zkompilovat. Bohužel fedora nemá v repozitáři GDC takže ho nemůžu získat od tud, je tam jen LDC ale to je naprd páč znám jen GNU toolchain (nechce se mi učit další). Byl by někdo tak hodný a dal sem link na nějaký build GDC jež podporuje D2? (D1 build už sem měl...).

tak v Archlinuxu se da gdc velmi snadno nainstalovat, pro fedoru je to problem musel by sis to skompilovat sam. Takze bud doporucuji pouzit archlinux, nebo zkusit pouzit balicky z archlinuxu mozna to pojede.

RAII

Re:Zkušenosti s jazykem D
« Odpověď #71 kdy: 26. 02. 2014, 13:28:48 »
Proboha proč kua ... takže měním otázku. Jak to zkompilovat ze source code? Koukal sem na něj a fakt mě nic nenapadlo. Kůli blbýmu kompileru nebudu virtualizovat OS dozadeke ...

Kozzi

Re:Zkušenosti s jazykem D
« Odpověď #72 kdy: 26. 02. 2014, 13:39:49 »
Proboha proč kua ... takže měním otázku. Jak to zkompilovat ze source code? Koukal sem na něj a fakt mě nic nenapadlo. Kůli blbýmu kompileru nebudu virtualizovat OS dozadeke ...

druha moznost je jak jsem rikal stahnout balicky z archu (pozor jestli mas 386 tak upravit odkazy)
http://mirror.vpsfree.cz/archlinux/community/os/x86_64/gdc-4.8.2-5-x86_64.pkg.tar.xz
http://mirror.vpsfree.cz/archlinux/community/os/x86_64/libgphobos-devel-4.8.2-5-x86_64.pkg.tar.xz

rozbalit je a narvat si je naprase do systemu, mam to odzkouseno ted na fedora20 a podarilo se mi zkompilovat hello world

Jinak pokud si to checs zkompilovat sam, tak tady je jak si to dela arch: https://projects.archlinux.org/svntogit/community.git/tree/trunk/PKGBUILD?h=packages/gdc

RAII

Re:Zkušenosti s jazykem D
« Odpověď #73 kdy: 26. 02. 2014, 14:03:04 »
No, tak sem to rozházel. A háže mi to error : gdc: fatal error: -fuse-linker-plugin, but liblto_plugin.so not found
compilation terminated.

Kozzi

Re:Zkušenosti s jazykem D
« Odpověď #74 kdy: 26. 02. 2014, 14:10:47 »
No, tak sem to rozházel. A háže mi to error : gdc: fatal error: -fuse-linker-plugin, but liblto_plugin.so not found
compilation terminated.

jj linkovani ti nepujde, jelikoz by sis musel jeste dohrat ty soubory z balicku gcc pro arch, ja to resil tak ze jsem dal gdc -c -o program.o program.d takze se neprovadi linkovani, a linkovani jsme pak dleal zvlast:
gcc -o program program.o -lgphobos2 -pthread -m