قصة كيف طورت لغة برمجة

مرحباً هبر! اسمي Ildar. عمري 29 سنة. أبرمج منذ 2003. في حياته أنشأ 4 أطر ولغة برمجة. في هذا المنشور ، سأشارك تجربتي والإحصاءات التي تلقيتها أثناء تطوير لغة البرمجة BAYRELL Language. أعتذر مقدمًا عن الأخطاء النحوية وعلامات الترقيم المحتملة في النص ونقص الصور.


تاريخ الخلق


لقد بدأت في إنشاء لغة BAYRELL في صيف عام 2016. ثم اكتشفت عن الزاوية والتفاعل. لقد أبهروني بتقنيات اختراق. ثم طورت مواقع ويب في PHP واستخدمت Twig كمحرك قوالب. وأردت تجربة Angular. بدأت في البحث عن كيفية ربط Angular بـ Twig.


بشكل عام ، يعمل Twig + Angular ، ولكن كان هناك تأثير وامض. تم تقديم الصفحة من خلال Twig على الخادم ، وتم تمريرها إلى العميل ، وتم عرض Angular بالفعل هناك. والصفحة ، أثناء عرضها من قبل العميل ، تومض. ثم فكرت ، هل هناك محرك قالب خادم خادم ، ولكن محرك يعمل في PHP و JavaScript؟


لقد بحثت في الإنترنت ، أوصى الجميع باستخدام NodeJS كخادم ، أو محرك V8 في PHP ، أو بنية خدمة صغيرة: الواجهة الخلفية في PHP ، الواجهة الأمامية في NodeJS. هنا فقط هو سوء الحظ. لقد أنشأت مواقع على WordPress ، Yii2. وحول الاستضافة ، لم يكن هناك دعم لـ NodeJS أو V8. ثم جاءت الفكرة لكتابة محرك قالب متعدد اللغات.


لقد بدأت في القيام بذلك. كتب في شهر في PHP ، ثم في شهر آخر ، كتب في JS. وأدرك بسرعة أن دعم لغتين أمر صعب في نفس الوقت. إذا ظهر خطأ ، فيجب إصلاحه هناك وهناك. بسرعة كبيرة ، أصبحت إصدارات محركات القالب مختلفة ، وتباعدت في الوظائف. كان لدي رغبة في إضافة Python. أدركت أن تطوير محرك قالب بشكل منفصل لكل لغة أمر صعب للغاية. ثم ظهرت فكرة أخرى. ابحث عن مترجم للغات ، وقم بتحويل كود القالب إلى PHP في JS و Python.


لقد بحثت في الإنترنت عن PHP إلى JS. لقد وجدت العديد من الحلول واختبرتها. كانت النتيجة رائعة. هذه الحلول لا تغطي وظائف PHP و JS بالكامل. وعندما اتضح بسرعة ، كانت المصفوفات في PHP و JS مختلفة. في JS ، هذه مصفوفات ، بينما في PHP يمكن أن تكون كائنات. في JS console.log وفي PHP var_dump. تختلف بيئة التشغيل ، والعمل مع المصفوفات في اللغات عن بعضها البعض. ومع هذه المشكلة ، لا يمكن للحلول التي فكرت بها أن تفعل أي شيء.


لقد زرت الفكرة التالية. اكتب لغة برمجة تترجم الرمز إلى عدة لغات. على أي حال ، معظم الناس يستخدمون بالفعل TypeScript ، CoffeeScript ، Dart ، Babel ، الذي يترجم التعليمات البرمجية إلى JavaScript. لماذا لا تنشئ لغة يمكن أيضًا بثها ، ولكن ليس فقط في JS ، ولكن أيضًا في PHP ، Python ، إلخ.


لذلك ولدت فكرة إنشاء لغة BAYRELL.


, . 0.3 2018 . . , , .


, . , JS . 0.8.3.



  • BAYRELL Language PHP, NodeJS, JavaScript;
  • HTML ;
  • ;
  • api;
  • ;
  • ;
  • ;
  • (pipe);
  • async/await;
  • , memorize;
  • ;
  • ;

.


BAYRELL Language Runtime , Full Stack . , API, .



, . , .


:


npm install -g bayrell-lang-compiler

:


git clone https://github.com/bayrell-tutorials/clear-project
cd clear-project
git submodule init
git submodule update

:


bayrell-lang-nodejs make_all
bayrell-lang-nodejs make_symlinks

:


bayrell-lang-nodejs watch

, nginx document root web .


:




HTML


:


  • PHP JS.
  • .
  • Direct HTML DOM Virtual DOM.

, .


, LayoutModel, ( ). – . render, HTML . JS ( , ..) . , , , . , , RenderDriver.


RenderDriver LayoutModel, requestAnimationFrame. render , HTML DOM. render VirtualDOM, HTML.



(). , , . , , . , , Lisp, Haskell, F#, , , .


. , , , , Dependency injection, , . , . .


, , (), private , setName(), getName(). . . .


, . , . , .


, , .



BAYRELL Language. .


– , (). . , . , , . , , , , . . , .


. , . , . , .


: , memcached .. 12 .


, . ? , . - , . . , , , , , , , , , .. , , «» .


. , , , . , , , , . . . . , .


, . – , . , , .


:


  • , , . , , .
  • , , - , , . .
  • , , . . .

, . , , , , () .


, .


– :


  • , .
  • .
  • , .
  • .
  • .

, . , , . HTML , , .


. – , . , . . .


BAYRELL Language:


/**
 * Sum a + b
 */
lambda int sum(int a) => int (int b) use (a) => a + b;

:


fn sum = int (int a) => int (int b) use (a) => a + b;

map, reduce, array_filter (php), pipe.


, pipe. , . pipe Linux .


:


ls -la | grep .txt

pipe. txt. , , , txt.


BAYRELL Language pipe. :


User user = new User()
	|> User::setName('John')
	|> User::addEmail("john@example.com")
;

:


User user = new User()
	-> setName('John') 
	-> addEmail("john@example.com")
;

, addEmail, , , email «john@example.com» . , , . .


Pipe .


.


. FaaS – .



BAYRELL Language Frontend: JavaScript, , . Ajax Backend.


:


MessageRPC msg = await @->sendMessage
(
	new MessageRPC
	{
		"api_name": "App",
		"space_name": "ApiInterface",
		"method_name": "getDocument",
		"data":
		{
			"document": "/ru/" ~ prefix,
		},
	}
);
Document document = msg->isSuccess() ? msg.response : null;

, REST Api . REST CRUD. , , , , - , , . HTTP (GET,POST,PUT,DELETE) .


, , D-BUS . , . , .


. , CRUDInterface. , , , . API.


, : WebSocket, DBus, RabbitMQ. Ajax API.



, , ++, C#, Python, Java, PHP . , , .


, :


  • . . 4 , , .
  • , .
  • , . .
  • , ?
  • , .

, , . . .


BAYRELL Language


, , (Java, Python, C#, C++, NodeJS, JavaScript, Go, Lua). . BAYRELL Language, . , , . , . - .


, . Language Binding. dll, . , , .


, , , .


, FaaS .


. , . . , , . , . , , . . Git.


. , , 2-3 . , , , .


TODO List



, , - , .


.


, .


.


All Articles