PEJI.IR

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

۱۴۰۰ آبان ۱۶, یکشنبه ساعت ۱۰:۰۳

تصمیم دارم از ۱۶ آبان تا ۱۶ آذر به هیچ عنوان از کامپیوتر استفاده نکنم.

دست راست من به شدت آسیب دیده و الان نزدیک ۲ سال هست که درد میکند. ۲ سال با درد تمام کار کردم. دردی که تحملش یک روزش هم خیلی سخته. خیلی تحمل کردم. خیلی اذیت شدم. به نقطه ای رسیدم که نیاز مطلق به آرامش دارم.

توسعه dolang رو به بعد از ۱۶ آذر موکول میکنم. سلامتیم از هر چیزی مهمتره.

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

۱۴۰۰ آبان ۱۳, پنجشنبه ساعت ۱۶:۰۳

قسمت if مربوط به شرطها رو نوشته بودم که قسمت else و else if اون رو هم نوشتم تا این قسمت تموم بشه. البته قسمت مربوط به and و or ( && و || ) رو هنوز ننوشتم ( چون زمان خیلی زیادی میگرفت و باعث توقف پروژه میشد )

بعد از تکمیل and و or به سراغ for in برای آرایه میرم و بعد از اون قسمت مربوط به struct و class و data type های مختلف رو تکمیل میکنم.

بعد از تکمیل این قسمت ها پروژه رو منتشر میکنم و در آخر به سراغ اضافه کردن پشتیبانی سی پیو x64 میرم ( نسخه الان x86 هست )

	var s = "dolang";
	if( s == "1dolang" ) {
		print("ha ha ha ha\n");

	} else if( s == "2dolang" ) {
		print("in else")
	} else {
		print(" end ")
	}

مقایسه بین اعداد و نوشته ها

۱۴۰۰ آبان ۱۳, پنجشنبه ساعت ۱۳:۴۰

هر دو مقایسه به صورت مجزا انجام میشه. در برنامه میشه نوع متغییر رو دونست و اون رو چاپ کرد. بر خلاف زبان c که نوع متغییر رو نمیشه تشخیص داد. اینجا مشابه زبان js و php میشه نوع متغییر رو تشخیص داد.

concat بین string و جمع بین اعداد از این طریق انجام میشود.

	var s = 20;
	if( s == 20 ) {
		print("ha ha ha ha");
	}
	var s = "dolang";
   if( s == "dolang" ) {
   	print("ha ha ha ha");
   }

ساخته دست انسان

۱۴۰۰ آبان ۱۳, پنجشنبه ساعت ۴:۲۷

وقایع با تقویم ساخته دست انسان اتفاق نمی افتند. هر وقت که زمانش برسد اتفاق می افتد. پاییز گاهی دیرتر آغاز میشود. بهار گاهی زودتر آغاز میشود.

روز ها با ساعت ساخته دست انسان شب نمیشوند. هر وقت که زمانش برسد شب میشود.

برای دیدن پاییز به تقویم نگاه نکن. به پنجره بیرون اتاقت نگاه کن. به رنگ برگ درخت ها نگاه کن. از خانه ات بیرون برو و وزش باد پاییزی را احساس کن.

برای گذر زمان به ساعتت نگاه نکن. به پنجره نگاه کن. به جهت خورشید. به گرمایی که در طول روز دارد.

تغییر مقدار آرایه بعد از تعریف

۱۴۰۰ آبان ۱۱, سه‌شنبه ساعت ۱۲:۴۱

یکی از چلنجهای کار تغییر مقدار آرایه بعد از تعریف اون بود که انجام شد

	var arr = [ 1 : [1 : "ddd" ]];
	arr[2] = "bbb";
	arr[1][1] = "ccc";

	printf("test %s \n", arr[2]);
	printf("test %s \n", arr[1][1] );

Safe Memory Allocate

۱۴۰۰ آبان ۸, شنبه ساعت ۸:۱۹

برای مدیریت ram چند تا تابع کوچیک نوشتم که با اون دیگه Memory Leak نخواهم داشت.

https://github.com/pejman-hkh/c-safe-allocation

متغیر ها

۱۴۰۰ آبان ۷, جمعه ساعت ۷:۴۵

برای اینکه بتونم type متغییر ها رو داشته باشم باید سایز متغییر ها رو از ۴ به ۵ تغییر بدم و اون رو داخل یک struct با ۵ بایت نگه دارم. با اینکار دیگه مستقیم نمیشه توابع c رو صدا زد و باید برای هر کاری یک extension به اصطلاح نوشته بشه و اون توابع رو صدا زد.

مثلا برای print یک تابع با ورودی از نوع متغییر خودم نوشتم که اون رو به جای printf صدا میکنم. با این روش ورودی هر چیزی که باشه تشخیص میدم و اون رو چاپ میکنم. مثلا ورودی میتونه یک آرایه باشه که اون آرایه رو میشه چاپ کرد.

این نیاز رو زمانی دیدم که میخواستم برای آرایه ورودی غیر string تعریف کنم.

اصلاح

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

test() {
	return 1;
}

main() {

	var i = 1;
	var arr = [test() : "test"];

	printf("%s\n", arr[test()]);
}

concat string

۱۴۰۰ آبان ۶, پنجشنبه ساعت ۱۹:۱۵

string ها رو به وسیله + با هم concat میکنم ...

	var d = "test "+"test1"+" test2";
	printf("%s\n", d);

برای اینکار یک تابع کوچیک c نوشتم که با assembly اون رو صدا میکنم و string ها رو به هم میچسبونم.

در ادامه باید مقایسه بین string ها رو با تابع strcmp انجام بدم ...

بعد از تکمیل این قسمت به ادامه کارم روی تعریف data type های مختلف که شمال int,char,void,float,long, ... میرم ... و همچنین تعریف استراکت و datatype جدید در خود برنامه

ادامه پیاده سازی آرایه

۱۴۰۰ آبان ۶, پنجشنبه ساعت ۱۴:۵۴

آرایه ها رو به صورت تو در تو میسازم و به صورت پشت سر هم میخونم ...

در ادامه تصمیم دارم کد c که در بکند کارم برای نوشتن آرایه نوشتم رو اجرا کنم. به این شکل پیاده سازی آرایه رو در خود کد میتونم انجام بدم و آرایه های c رو هم اجرا کنم.

برنامه ای که نوشتم به طور کامل از malloc و free پشتیبانی میکنه. اما ساختن struct و خوندن اون و تعریف اون به شکل آرایه چلنج بعدی من هست ...

	var arr = [ "test2" : [ "a" : "val2" ] ];

	printf("%s\n", 	arr["test2"]["a"] );

خروجی برنامه :

push %ebp
mov %esp,%ebp
sub $,%esp
sub $,%esp
leal -16(%ebp),%eax
mov %eax,0(%esp)
call array_init 0x648343cc
add $,%esp
sub $,%esp
leal -16(%ebp),%eax
mov %eax,0(%esp)
mov 0x5827f1ad,%eax
mov %eax,4(%esp)
sub $,%esp
leal -28(%ebp),%eax
mov %eax,0(%esp)
call array_init 0x6483438f
add $,%esp
sub $,%esp
leal -28(%ebp),%eax
mov %eax,0(%esp)
mov 0x5827f1b3,%eax
mov %eax,4(%esp)
mov 0x5827f1b5,%eax
mov %eax,8(%esp)
call array_set 0x648343ce
add $,%esp
leal -28(%ebp),%eax
mov %eax,8(%esp)
call array_set 0x648343b6
add $,%esp
leal -16(%ebp),%eax
mov %eax,-4(%ebp)
sub $,%esp
mov 0x5827f1c1,%eax
mov %eax,0(%esp)
mov -4(%ebp),%eax
sub $,%esp
mov -4(%ebp),%eax
mov %eax,0(%esp)
mov 0x5827f1c9,%eax
mov %eax,4(%esp)
call array_get 0x6483441a
add $,%esp
sub $,%esp
mov %eax,0(%esp)
mov 0x5827f1cf,%eax
mov %eax,4(%esp)
call array_get 0x648343f6
add $,%esp
mov %eax,4(%esp)
call printf 0x5fb3210
add $,%esp
leave
ret
val2

آرایه

۱۴۰۰ آبان ۶, پنجشنبه ساعت ۱۰:۵۳

ست کردن آٰرایه به صورت خطی رو انجام دادم. و به ازای هر آرایه ۱۲ بایت در stack اختصاص میدم( به خاطر سرعت بالاتر ) که بعدا میتونم اون رو به heap تغییر بدم. ( که باید یک ساز و کار هم برای free کردن اوتوماتیک اون در نظر بگیرم ) ۸۰ درصد اجرای آرایه به صورت تو در تو رو انجام دادم و فقط قسمت دیباگ کردن و اجرا کردنش مونده. در آخر آدرس آرایه رو در یک متغییر ۴ بایتی نگه میدارم و به شکل معمول خوندن آرایه میشه اون رو خوند ...

	var arr = [ "test2" : [ "a" : "val2" ] ];

	printf("%s\n", arr["test2"]["a"] );