پیاده سازی try , catch و تغییر کلی در اعداد

تمامی اعداد باید به عنوان double ذخیره بشن، شبیه به js

این ساختار باید در برنامه به طور کامل تغییر کنه و عملیات روی اعداد هم همه باید با دستورات x87 انجام بشه

در حال انجام try, catch بودم که چون در حال ساخت یک دستگاه تجاری هستم فعلا اون رو توسعه نمیدم

بعد از بازگشت به پروژه باید switch رو هم انجام بدم و یک تغییر اساسی در توابع برای stack هم انجام بدم، به صورتی که تنها در پایان برنامه همه چیز به اصطلاح leave بشه

برنامه نویسی

تمام شدن پیاده سازی String و برطرف کردن خیلی از باگ ها

خب

string به طور کامل در دل کار پیاده سازی شد

البته برای Regex من از C str استفاده کردم که در آینده باید اصلاح بشه

ولی برای بقیه جاها پیاده سازی های substr و cmp و ... رو انجام دادم که در ادامه البته باید پیاده سازی replace رو هم انجام بدم

Perfomance عالی در Concat

خب با اجرا کردن

time ./dolang test/concat.do

و اجرا کردن نمونه مشابه اون در c با strcat و یا c++ string و یا quickjs متوجه تفاوت زیاد پرفورمنس میشه شد

برنامه درdolang با میانگین ۲۰۰ میلی ثانیه اجرا میشه. در حالی که با حالت های بالا از ۶ تا ۹ ثانیه اجرا میشه.

اضافه شدن Rope base string

این قسمت رو اضافه کردم

۹۰ درصد کار انجام شده

فقط یه سری قسمت های کوچیک از String مونده که تکمیل بشه

قسمت مربوط به Regex با String جدید باید بازنویسی بشه

خیلی از قسمت ها به خصوص قسمت های مربوط به String بازنویسی شد

یه سری Operator ها از جمله Plus Equal و چند Operator دیگه رو باید تکمیل کنم. عملیات مربوط به float به غیر از plus رو هم باید انجام بدم ( plus انجام شده ) BigNum رو هم باید اضافه کنم. بعد از اون پروژه برای x86 بسته میشه و من شروع به توسعه x64 میکنم

از اوایل خرداد امسال در حال توسعه dolang هستم

Rope based string

خب چیزی که من دنبالش بوده و ناخواسته پیاده سازیش کردم Rope based string هست

باید یک پیاده سازی خوب براش انجام بدم و داخل dolnag ازش استفاده کنم ...

پیاده سازی نهایی string

پیاده سازی نهایی به شکل زیر شد :

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    char **strings;
    int *types;
    int i;
} string;

string_init( string *str ) {
    str = malloc( sizeof( string ) );
    str->i = 0;
    str->strings = malloc( sizeof( char *) * (2) );
    str->types = malloc( sizeof( int *) * (2) );
    return str;
}

string_concat( string *a, string *b) {
    string *r;
    r = string_init( r );
    string_append1( r, a );
    string_append1( r, b );
    return r;
}

string_append( string *str, char *str1 ) {
    str->strings = realloc( str->strings, sizeof( char *) * ( str->i + 2 ) );
    str->types = realloc( str->types, sizeof( int *) * ( str->i + 2 ) );
    str->types[str->i] = 1;
    str->strings[str->i++] = str1;
}

string_append1( string *str, string *str1 ) {
    str->strings = realloc( str->strings, sizeof( char *) * ( str->i + 2 ) );
    str->types = realloc( str->types, sizeof( int *) * ( str->i + 2 ) );
    str->types[str->i] = 2;
    str->strings[str->i++] = str1;
}

string_print( string *str ) {
    for( int i = 0; i < str->i; i++ ) {
        if( str->types[i] == 1 ) {
            printf("%s", str->strings[i]);
        } else {
            string_print( str->strings[i] );
        }
    }
}

string_len( string *str ) {
    size_t len = 0;
    for( int i = 0; i < str->i; i++ ) {
        len += strlen(str->strings[i]);
    }
    return len;
}

main() {

    string *str;
    str = string_init( str );

    string *str1;
    str1 = string_init( str1 );
    string_append( str1, "abc");

    string *str2;
    str2 = string_init( str2 );
    string_append( str2, "defghijklmnñopqrstuvwxyz");

    for(int i = 0; i < 30000; i++) {
        str = string_concat( str1, str );
        str = string_concat( str, str2 );
    }

    string_print( str );
}

این خروجی با همون performance کامپایلر v8 هست.

strings

مبحث string و مباحث مربوط به اون ( به طور مثال concat ) خیلی مهم هست که پرفرمنس خوبی داشته باشه

بهینه سازی در این قسمت خیلی مهم هست و باید حتما انجام بشه

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    char ** strings;
    int i;
} string;

string_init( string *str ) {
    str->i = 0;
    str->strings = malloc( sizeof( char *) * (1002) );// = malloc( 999999999 );
}

string_append( string *str, char *str1 ) {
    if( str->i % 1000 == 0 ) {
        str->strings = realloc( str->strings, sizeof( char *) * ( str->i + 1002 ) );
    }

    str->strings[str->i++] = str1;
}

string_print( string *str ) {
    for( int i = 0; i < str->i; i++ ) {
        printf("%s", str->strings[i] );
    }
}

string_len( string *str ) {
    size_t len = 0;
    for( int i = 0; i < str->i; i++ ) {
        len += strlen(str->strings[i]);
    }
    return len;
}

main() {

    string *str;
    string_init( str );

    char *str1 = "abc";
    char *str2 = "defghijklmnñopqrstuvwxyz";

    char *nstr = malloc( strlen(str1)+strlen(str2)+1 );
    strcat(nstr, str1);
    strcat(nstr, str2);

    for(int i = 0; i < 30000; i++) {
        string_append(str, nstr);
    }

    string_print( str );
    printf("\\n");
    printf("%d\\n",  string_len( str ) );
}

در یکی از مباحثی که در quickjs در مورد اون بحث شده. مقایسه performance در nodejs و qjs برای یک مثال هست.

خب من خیلی این قسمت رو تست کردم تا به این پیاده سازی نهایی رسیدم تا پرفورمنسی برابر با nodejs داشته باشم.

این پیاده سازی رو برای dolang هم باید انجام بدم.

البته یک چیز دیگه ای هم من توی ذهنم دارم که اون رو هم باید تست کنم. ( ویرایش: بهترین راه حل همین راه حلی هست که بالا گفتم ...)

ادامه زبان

یکی از کارهایی که بعدا باید انجام بدم چون دسترسی به سیستم هم ندارم اینجا میگم

باید malloc رو تنها یکبار انجام بدم و مقداری رم رو رسرو کنم، چون با هر بار صدا زدن اون پرفورمنس کار خیلی پایین میاد،

اینکار رو باید برای متغیر های global هم انجام بدم

تاثیر اینکار در پرفورمنس وحشتناک زیاده

ترک ایران

تصمیم به ترک ایران رو دارم

تصمیم دارم توی این یکماهه ایران رو ترک کنم