Die Geschichte, wie ich eine Programmiersprache entwickelt habe

Hallo Habr! Ich heiße Ildar. Ich bin 29 Jahre alt. Ich programmiere seit 2003. In seinem Leben schuf er 4 Frameworks und eine Programmiersprache. In diesem Beitrag werde ich meine Erfahrungen und Erkenntnisse teilen, die ich bei der Entwicklung der Programmiersprache BAYRELL Language erhalten habe. Ich entschuldige mich im Voraus für mögliche Syntaktik- und Interpunktionsfehler im Text und das Fehlen von Bildern.


Schöpfungsgeschichte


Ich habe im Sommer 2016 angefangen, BAYRELL Language zu erstellen. Dann habe ich etwas über den Winkel herausgefunden und reagiert. Sie haben mich mit bahnbrechenden Technologien beeindruckt. Ich habe dann Websites in PHP entwickelt und Twig als Template-Engine verwendet. Und ich wollte Angular ausprobieren. Ich begann zu suchen, wie man Angular an Twig binden kann.


Im Allgemeinen funktioniert Twig + Angular, aber es gab einen Blinkeffekt. Die Seite wurde über Twig auf dem Server gerendert, an den Client übergeben und Angular wurde dort bereits gerendert. Während die Seite vom Client gerendert wurde, blinkte sie. Und dann dachte ich, gibt es eine Client-Server-Template-Engine, die aber in PHP und JavaScript funktioniert?


Ich suchte im Internet, jeder empfahl, NodeJS als Server zu verwenden, entweder eine V8-Engine in PHP oder eine Mikrodienstarchitektur: Backend in PHP, Frontend in NodeJS. Nur hier ist Pech. Ich habe Websites auf WordPress, Yii2 erstellt. Und auf dem Hosting gab es keine Unterstützung für NodeJS oder V8. Dann kam die Idee auf, eine sprachübergreifende Template-Engine zu schreiben.


Ich fing an es zu tun. Schrieb in einem Monat in PHP, dann in einem anderen Monat in JS. Und er erkannte schnell, dass es schwierig war, zwei Sprachen gleichzeitig zu unterstützen. Wenn ein Fehler auftrat, musste er sowohl dort als auch dort behoben werden. Sehr schnell wurden die Versionen der Template-Engines unterschiedlich und unterschieden sich in der Funktionalität. Ich hatte den Wunsch, Python hinzuzufügen. Ich erkannte, dass es sehr schwierig ist, eine Vorlagen-Engine für jede Sprache separat zu entwickeln. Dann kam eine andere Idee auf. Suchen Sie einen Übersetzer für Sprachen und konvertieren Sie den Vorlagencode in JS und Python in PHP.


PHP to JS. . . PHP JS. , PHP JS . JS , PHP . JS console.log, PHP var_dump. Runtime , . , , , .


. , . TypeScript, CoffeeScript, Dart, Babel, JavaScript. , , JS, PHP, Python ..


BAYRELL Language.


, . 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