A história de como desenvolvi uma linguagem de programação

Oi Habr! Meu nome é Ildar. Eu tenho 29 anos. Venho programando desde 2003. Em sua vida, ele criou 4 frameworks e uma linguagem de programação. Neste post, compartilharei minha experiência, idéias que recebi ao desenvolver a linguagem de programação BAYRELL Language. Peço desculpas antecipadamente por possíveis erros sintáticos e de pontuação no texto e pela falta de imagens.


História da criação


Comecei a criar o BAYRELL Language no verão de 2016. Então eu descobri o angular e reagi. Eles me impressionaram com tecnologias inovadoras. Então desenvolvi sites em PHP e usei o Twig como um mecanismo de modelo. E eu queria tentar Angular. Comecei a procurar como você pode amarrar Angular a Twig.


Em geral, o Twig + Angular funciona, mas houve um efeito piscante. A página foi renderizada através do Twig no servidor, passada para o cliente e o Angular já foi renderizado lá. E a página, enquanto era renderizada pelo cliente, piscou. E então pensei: existe um mecanismo de modelo cliente-servidor, mas que funcione em PHP e JavaScript?


Pesquisei na Internet, todos recomendaram usar o NodeJS como servidor, ou um mecanismo V8 em PHP ou uma arquitetura de microsserviço: back-end em PHP, front-end em NodeJS. Só aqui está a má sorte. Criei sites no WordPress, Yii2. E na hospedagem, não havia suporte para NodeJS ou V8. Então surgiu a idéia de escrever um mecanismo de modelo em vários idiomas.


Eu comecei a fazer isso. Escreveu em um mês em PHP, e em outro mês, escreveu em JS. E ele rapidamente percebeu que o suporte a dois idiomas era difícil ao mesmo tempo. Se um bug aparecesse, tinha que ser corrigido lá e ali. Muito rapidamente, as versões dos mecanismos de modelo tornaram-se diferentes e divergiram em funcionalidade. Eu queria adicionar Python. Percebi que o desenvolvimento de um mecanismo de modelo separadamente para cada idioma é muito difícil. Então outra idéia surgiu. Encontre um tradutor de idiomas e converta o código do modelo em PHP em JS e 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