La historia de cómo desarrollé un lenguaje de programación.

Hola habr Me llamo Ildar Tengo 29 años. He estado programando desde 2003. En su vida creó 4 marcos y un lenguaje de programación. En esta publicación compartiré mi experiencia, las percepciones que recibí al desarrollar el lenguaje de programación BAYRELL Language. Pido disculpas de antemano por posibles errores sintácticos y de puntuación en el texto y la falta de imágenes.


Historia de la creacion


Comencé a crear BAYRELL Language en el verano de 2016. Entonces descubrí lo angular y reaccioné. Me impresionaron con tecnologías innovadoras. Luego desarrollé sitios web en PHP y usé Twig como motor de plantillas. Y quería probar Angular. Empecé a buscar cómo puedes atar Angular a Twig.


En general, Twig + Angular funciona, pero hubo un efecto de parpadeo. La página se procesó a través de Twig en el servidor, se pasó al cliente y Angular ya se procesó allí. Y la página, mientras la mostraba el cliente, parpadeó. Y luego pensé, ¿hay un motor de plantillas cliente-servidor, pero que funcione en PHP y JavaScript?


Busqué en Internet, todos recomendaron usar NodeJS como servidor, o un motor V8 en PHP, o una arquitectura de micro servicio: backend en PHP, frontend en NodeJS. Solo que aquí hay mala suerte. Hice sitios web en WordPress, Yii2. Y en el alojamiento, no había soporte para NodeJS o V8. Entonces surgió la idea de escribir un motor de plantillas en varios idiomas.


Empecé a hacerlo Escribió en un mes en PHP, luego en otro mes, escribió en JS. Y rápidamente se dio cuenta de que soportar dos idiomas era difícil al mismo tiempo. Si aparecía un error, entonces tenía que ser reparado tanto allí como allí. Muy rápidamente, las versiones de los motores de plantilla se volvieron diferentes y divergieron en funcionalidad. Tenía el deseo de agregar Python. Me di cuenta de que desarrollar un motor de plantillas por separado para cada idioma es muy difícil. Entonces surgió otra idea. Encuentre un traductor de idiomas y convierta el código de la plantilla en PHP en JS y 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