PEJI.IR

تغییر اساسی در پیاده سازی

۱۴۰۱ شهریور ۶, یکشنبه ساعت ۱۱:۰۷

یه سری قسمت ها رو خیلی بد پیاده سازی کردم که باید حتما اصلاح کنم.

مثلا وقتی یک متغییر میخواد روش عملیاتی انجام بشه. اون متغییر میتونه هر چیزی باشه و فقط بار اول هست که باید مقدار اون رو بگیرم. در دفعات بعد نیازی به گرفتن مقدار اون نیست و مثلا پلاس پلاس کردن و ... رو باید بدون توجه به اینکه چی رو میخام پلاس پلاس کنم انجام بدم ...

prototype

۱۴۰۱ شهریور ۵, شنبه ساعت ۱۳:۰۳

خب یک تغییر اساسی در کلاس ها انجام دادم. از این به بعد متد ها به پراپرتی prototype به آبجکت اصلی کلاس اضافه میشن. و خواندن اون هم از prototype انجام میشه. مزیت اینکار استفاده کمتر از رم میشه که با ایجاد هر آبجکت جدید از کلاس ( new کردن کلاس ) دیگه کپی انجام نمیشه و رفرنس میشه به کلاس اصلی و با اضافه شدن متد به کلاس اصلی به تمامی آبجکت هایی که حتی از قبل هم ایجاد شدن اون متد اضافه میشه.

مثال :

class Test {
	a() {
		print("in a\n")
	}
}

main() {

	let y = {}
	y.o = func() {
		print("y o \n")
	}

	y.o();

	print( String )
	print( Array )
	print( Object )

	String.prototype.test = func() {
		return 2;
	}

	String.prototype.test1 = func() {
		return "test1";
	}

	let a = "Hello World"

	print( a.substr(1,4)+"\n" )

	print( a.length() )

	print("\n")

	print( a.test() )
	print("\n")
	print( a.test1() )
	print("\n")


	let g = new Test
	Test.prototype.b = func() {
		print("in b\n");
	}

	print( g );

	g.a();
	g.b();
}

حذف sym_stk و استفاده از var_stk در همه جا

۱۴۰۱ شهریور ۴, جمعه ساعت ۹:۱۶

تا قبل از اینجا توابع داخل sym_stk نگه داری میشدن ولی از این به بعد تصمیم دارم که همه چیز داخل var_stk نگه داری بشن. الان دیگه نمیشه کلاس و تابع هم نام داشت. ( قبلا میشد )

ترکیب php syntax و js syntax

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

یکی از قسمت های خوب زبان php باز و بسته شدن تگ هست. اما ایرادهایی مثل تعریف متغییر با $ sign و یا -> به جای . در زبان php و یا . به جای + برای concat string هست که به نظرم js syntax خیلی بهتر از اون هست.

شاید dolant تلفیقی ازا ین دو زبان بشه.

این رو به عنوان یک ایده بیان کردم

تغییر در ساختار کلاس ها

۱۴۰۱ شهریور ۲, چهارشنبه ساعت ۱۸:۰۱

برای اسم هر کلاس باید یک object بسازم و به property prototype اون توابع و متغییر ها رو اضافه کنم.

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

اضافه کردن تابع به prototype هم شبیه به js میشه.

dolang داره شباهت خیلی زیادی به js پیدا میکنه ... اما سعیم بر این هست که مستقل از js یک زبان جدا باشه و بتونم js رو هم اجرا کنم.

انتقال کلاس ها از sym_stk به prototype

۱۴۰۱ شهریور ۲, چهارشنبه ساعت ۱۱:۵۷

خب

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

let out of scope

۱۴۰۱ مرداد ۳۱, دوشنبه ساعت ۱۸:۵۱

یکی از قسمت هایی که باید اون رو انجام بدم let out of scope هست. یعنی زمانی که متغییری که با let تعریف میشه خارج از scope رفت خودش و مثلا کلاس مربوط به خودش destruct بشه.

dolang بر خلاف js دارای destruct هم هست.

خاصیت destruct و let در کنار هم خیلی کاربردی میشن ...

dolang رو فعلا به شیوه ای که خودم دوست دارم توسعه میدم و بعدا js رو با dolib بازنویسی میکنم.

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

تمام شدن قسمت mysql و پیاده سازی socket برای یک http server ساده با epoll

۱۴۰۱ مرداد ۳۱, دوشنبه ساعت ۱۸:۴۶

خب

قسمت مربوط به mysql رو تا جایی که میتونستم انجام دادم. توسعه اون خیلی راحت هست. الان میشه insert , update , select انجام داد اون هم با statment

متاسفانه هیچ مثال خوبی برای این قسمت ها با زبان سی در اینترنت نبود. مجبور شدم خودم بنویسم و دیباگ کنم.

الان تصمیم دارم که قسمت مربوط به socket و epoll رو پیاده سازی کنم که بتونم یک http server خیلی ساده بنویسم

تا اینجا خیلی از قسمت های زبان دیباگ شده و زبان داره به شکل خوبی کار میکنه. بعضی قسمت های اون که هنوز تکمیل نکردم رو تکمیل میکنم و به سراغ x64 میرم.

البته قبلش socket رو هم پیاده سازی میکنم و یک http server خیلی ساده مینویسم که زبان رو بتونم به بهترین شکل دیباگ کنم.

mysql extenstion

۱۴۰۱ مرداد ۳۰, یکشنبه ساعت ۱۰:۰۳

خیلی از قسمت های مربوط به mysql و select و statement رو انجام دادم

import lib.mysql

main() {


	let db = new mysql("localhost", "root", "12c", "test")
	var a = 10

	let stmt = db.prepare("select * from test1 where tid = ? ").execute( [ a ] )
	while( let fetch = stmt.next() ) {
		print(fetch)


		let stmt1 = db.prepare("select * from test2 where test1id = ? ").execute( [ fetch.id ] )

		let fetch1 = stmt1.next()
		if( fetch1 ) {
			print(fetch1)
		}
		
		stmt1.close()


	}

	stmt.close()

	db.close()
}

اینجا یک مثال از استفاده از mysql هست.

تعریف کلاس اون هم به شکل زیر هست :


class mysqlStmt {
	construct( sql, con ) {

		this.stmt = mysql_stmt( con, sql );
		return this;
	}

	bind( b ) {
		//print( this )

		mysql_stmt_bind( this.stmt, b);
		mysql_stmt_exec( this.stmt );
		
		this.res = mysql_stmt_prepare_result( this.stmt );

		return this;
	}

	fetchAll() {
		let ret = [];
		let i = 0;
		while( let fetch = this.next() ) {
			ret[i++] = fetch;
		}

		return ret;
	}

	next() {
		return mysql_stmt_fetch( this.stmt, this.res );
		//return [ { id : 1, name : 'test'} ];
	}

	close() {
		mysql_stmt_close( this.stmt, this.res );
	}
}

class mysql {
	construct( host, user, pass, db ) {
		this.connect( host, user, pass, db );
		return this;
	}

	connect( host, user, pass, db ) {
		this.con = mysql_connect(host, user, pass, db);
	}

	prepare( sql ) {
		this.sql = sql;
		return this;
	}

	execute( b ) {
		let stmt = new mysqlStmt( this.sql, this.con );
		stmt.bind( b );
		return stmt;
	}

	close() {
		mysql_close( this.con );
	}
}

تغییرات آتی

۱۴۰۱ مرداد ۲۸, جمعه ساعت ۱۲:۳۳

تغییر در ساختار var و پیاده سازی let و const و همچنین nested function کمی زمانبر هست.

در حال انجام این قسمت ها هستم.