L'histoire de la façon dont j'ai développé un langage de programmation

Salut Habr! Je m'appelle Ildar. J'ai 29 ans. Je programme depuis 2003. Dans sa vie, il a créé 4 frameworks et un langage de programmation. Dans cet article, je partagerai mon expérience, les idées que j'ai reçues lors du développement du langage de programmation BAYRELL Language. Je m'excuse à l'avance pour d'éventuelles erreurs de syntaxe et de ponctuation dans le texte et le manque d'images.


Histoire de la création


J'ai commencé à créer BAYRELL Language à l'été 2016. Puis j'ai découvert l'angulaire et réagi. Ils m'ont impressionné avec des technologies révolutionnaires. J'ai ensuite développé des sites Web en PHP et utilisé Twig comme moteur de modèle. Et je voulais essayer Angular. J'ai commencé à chercher comment lier Angular à Twig.


En général, Twig + Angular fonctionne, mais il y avait un effet clignotant. La page a été rendue via Twig sur le serveur, transmise au client et Angular y était déjà rendue. Et la page, tout en étant rendue par le client, elle cligna des yeux. Et puis j'ai pensé, y a-t-il un moteur de modèle client-serveur, mais qui fonctionne en PHP et JavaScript?


J'ai cherché sur Internet, tout le monde a recommandé d'utiliser NodeJS comme serveur, soit un moteur V8 en PHP soit une architecture de micro service: backend en PHP, frontend en NodeJS. Seulement ici, c'est la malchance. J'ai créé des sites Web sur WordPress, Yii2. Et sur l'hébergement, il n'y avait pas de support pour NodeJS ou V8. Puis l'idée est venue, d'écrire un moteur de modèle multilingue.


J'ai commencé à le faire. Écrit dans un mois en PHP, puis dans un autre mois, écrit en JS. Et il s'est vite rendu compte qu'il était difficile de prendre en charge deux langues en même temps. Si un bug apparaissait, il devait être corrigé là et là. Très rapidement, les versions des moteurs de modèles sont devenues différentes et ont divergé en fonctionnalités. J'avais envie d'ajouter Python. J'ai réalisé que développer un moteur de modèle séparément pour chaque langue est très difficile. Puis une autre idée est venue. Trouvez un traducteur de langues et convertissez le code du modèle en PHP en JS et Python.


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