Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

Symta News

Name: Anonymous 2014-06-06 11:56

So I've finally solved the GC problem by abandoning the continuations, which allowed me to do compaction like RAII - on every stack pop. The only problem remains is efficiently implementing the double-headed stack, which would go like "0,2,4 ... 5,3,1" - i.e. compacting requires just one copy, instead of two.

I've optimized _let compilation to stack, which allowed following code to execute at 0.9 the the speed of C/C++

_let ((N 1024*1024*1024) (S 0))
(_label again)
(_set S (_add S N))
(_set N (_sub N 1))
(if _gt N 0 then _goto again else S)


so I have chances at using Symta as replacement for C/C++.

Moral: continuations are bad and make everything unpredictable and slow. So, please, don't use Haskell and other languages depending on continuations.

Name: Anonymous 2014-06-06 12:02

>>1
Anyways, here is what that code compiles to without continuations...


#include "../runtime.h"

#define f31807_size 0
DECL_LABEL(f31807)
#define f31813_size 0
static uint8_t b31847[] = {116,97,103,95,111,102,0};
static void *s31848;
static uint8_t b31850[] = {104,97,108,116,0};
static void *s31851;
static uint8_t b31853[] = {108,111,103,0};
static void *s31854;
static uint8_t b31856[] = {108,105,115,116,0};
static void *s31857;
static uint8_t b31859[] = {95,97,112,112,108,121,0};
static void *s31860;
static uint8_t b31862[] = {95,110,111,95,109,101,116,104,111,100,0};
static void *s31863;
static uint8_t b31865[] = {114,101,97,100,95,102,105,108,101,95,97,115,95,116,101,120,116,0};
static void *s31866;
DECL_LABEL(f31813)
static uint8_t b31835[] = {42,0};
static void *s31836;
static uint8_t b31840[] = {42,0};
static void *s31841;
BEGIN_CODE
ENTRY(entry)
VAR(result31804);
MOVE(NewBase, Top);
VAR(head31805);
LOCAL_ALLOC(head31805, t31869, f31807, 0);
VAR(env31867);
LOCAL_LIST(env31867, t31870, 1);
VAR(tmp31868);
MOVE(tmp31868, Host);
STORE(env31867, 0, tmp31868);
CALL_TAGGED(result31804, head31805, env31867);
RETURN(result31804);
ENTRY(setup)
TEXT(s31836, b31835);
TEXT(s31841, b31840);
TEXT(s31848, b31847);
TEXT(s31851, b31850);
TEXT(s31854, b31853);
TEXT(s31857, b31856);
TEXT(s31860, b31859);
TEXT(s31863, b31862);
TEXT(s31866, b31865);
RETURN_NO_GC(0);
LABEL(f31807)
CHECK_NARGS(1, f31807_size, Empty);
VAR(result31808);
MOVE(NewBase, Top);
VAR(head31809);
LOAD(head31809, E, 0);
VAR(env31810);
LOCAL_LIST(env31810, t31871, 8);
VAR(tmp31811);
LOCAL_ALLOC(tmp31811, t31872, f31813, 0);
STORE(env31810, 0, tmp31811);
VAR(tmp31846);
MOVE(tmp31846, s31848);
STORE(env31810, 1, tmp31846);
VAR(tmp31849);
MOVE(tmp31849, s31851);
STORE(env31810, 2, tmp31849);
VAR(tmp31852);
MOVE(tmp31852, s31854);
STORE(env31810, 3, tmp31852);
VAR(tmp31855);
MOVE(tmp31855, s31857);
STORE(env31810, 4, tmp31855);
VAR(tmp31858);
MOVE(tmp31858, s31860);
STORE(env31810, 5, tmp31858);
VAR(tmp31861);
MOVE(tmp31861, s31863);
STORE(env31810, 6, tmp31861);
VAR(tmp31864);
MOVE(tmp31864, s31866);
STORE(env31810, 7, tmp31864);
CALL_TAGGED(result31808, head31809, env31810);
RETURN(result31808);
LABEL(f31813)
CHECK_NARGS(7, f31813_size, Empty);
VAR(result31814);
VAR(p31828);
LOCAL_LIST(p31828, t31873, 0);
VAR(env31829);
LOCAL_LIST(env31829, t31874, 2);
VAR(tmp31830);
MOVE(NewBase, Top);
VAR(head31831);
MOVE(NewBase, Top);
VAR(head31832);
LOAD_FIXNUM(head31832, 1024);
VAR(env31833);
LOCAL_LIST(env31833, t31875, 2);
VAR(tmp31834);
MOVE(tmp31834, s31836);
STORE(env31833, 0, tmp31834);
VAR(tmp31837);
LOAD_FIXNUM(tmp31837, 1024);
STORE(env31833, 1, tmp31837);
CALL_TAGGED(head31831, head31832, env31833);
VAR(env31838);
LOCAL_LIST(env31838, t31876, 2);
VAR(tmp31839);
MOVE(tmp31839, s31841);
STORE(env31838, 0, tmp31839);
VAR(tmp31842);
LOAD_FIXNUM(tmp31842, 1024);
STORE(env31838, 1, tmp31842);
CALL_TAGGED(tmp31830, head31831, env31838);
STORE(env31829, 0, tmp31830);
VAR(tmp31843);
LOAD_FIXNUM(tmp31843, 0);
STORE(env31829, 1, tmp31843);
VAR(save_p31844);
MOVE(save_p31844, P);
VAR(save_e31845);
MOVE(save_e31845, E);
MOVE(E, env31829);
MOVE(P, p31828);
VAR(dummy31816);
LOCAL_LABEL(again);
VAR(r31817);
VAR(a31818);
VAR(b31819);
LOAD(a31818, E, 1);
LOAD(b31819, E, 0);
r31817 = FIXNUM_ADD(a31818, b31819);
STORE(E, 1, r31817);
MOVE(dummy31816, r31817);
VAR(r31820);
VAR(a31821);
VAR(b31822);
LOAD(a31821, E, 0);
LOAD_FIXNUM(b31822, 1);
r31820 = FIXNUM_SUB(a31821, b31822);
STORE(E, 0, r31820);
MOVE(dummy31816, r31820);
VAR(cnd31825);
VAR(a31826);
VAR(b31827);
LOAD(a31826, E, 0);
LOAD_FIXNUM(b31827, 0);
cnd31825 = FIXNUM_GT(a31826, b31827);
LOCAL_BRANCH(cnd31825, then31823);
LOAD(result31814, E, 1);
LOCAL_JMP(endif31824);
LOCAL_LABEL(then31823);
LOCAL_JMP(again);
LOCAL_LABEL(endif31824);
MOVE(E, save_e31845);
MOVE(P, save_p31844);
RETURN(result31814);END_CODE

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List