我如何开发编程语言的故事

哈勃!我叫伊达尔。我今年29岁。我从2003年开始从事编程工作。在他的一生中,他创建了4个框架和一种编程语言。在这篇文章中,我将分享我的经验,以及在开发编程语言BAYRELL语言时获得的见解。对于文本中可能存在的句法和标点错误以及图片不足,我深表歉意。


创作史


我从2016年夏天开始创建BAYRELL语言。然后我发现了角度并做出反应。他们的突破性技术给我留下了深刻的印象。然后,我用PHP开发了网站,并使用Twig作为模板引擎。我想尝试Angular。我开始寻找如何将Angular与Twig捆绑在一起。


通常,Twig + Angular可以工作,但有眨眼的效果。该页面是通过服务器上的Twig呈现的,传递给客户端的,而Angular已经呈现在那里。该页面在被客户端渲染时闪烁。然后我想知道是否有一个客户端-服务器模板引擎,但是可以在PHP和JavaScript中运行的引擎?


我搜索了Internet,每个人都建议将NodeJS用作服务器,或者将PHP用作V8引擎,或者使用微服务架构:PHP的后端,NodeJS的前端。只有运气不好。我在WordPress Yii2上制作了网站。在托管上,不支持NodeJS或V8。然后这个想法浮出水面,写了一个跨语言模板引擎。


我开始做。用PHP写了一个月,然后用JS写了一个月。而且他很快意识到,同时支持两种语言很困难。如果出现错误,则必须在那里进行修复。很快,模板引擎的版本就变得不同,并且功能有所不同。我渴望添加Python。我意识到为每种语言分别开发模板引擎非常困难。然后另一个想法出现了。查找语言翻译人员,然后将模板代码转换为JS和Python中的PHP。


我在互联网上搜索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