Вход

Просмотр полной версии : Нормальный транслятор ECMA6


kobezzza
05.07.2013, 14:34
Очень хочется уже юзать фичи из ECMA6, тем более уже есть поддержка в IDE (webstorm), но перерыв инет я нашёл не так много трансляторов, а из тех что нашёл только два имхо хоть как то подходят для использования в реальной жизни: six (https://github.com/matthewrobb/six) и typescript (т.е. мы не юзаем его специфичные штуки, а только то что будет в ECMA6).

К сожалению представленные выше кандидаты тоже далеки от идеала, т.к. делают весьма скромную поддежку + обладают своими косяками, например six реализует arrow function через бинды (которые оч тормозят в циклах), не умеет делать rest параметры в arrow function и всегда вырезает комменты. TypeScript сложно юзать в роли транслятора, т.к. его статическая структура бесит вносит свои сложности.

Сегодня сел писать свой велосипед, но очень не хочется если честно...мб есть у кого похожие решения?

Рассмотрел:
Traceur - Баженное кривое гавно,
Continuum - реализиция VM на JS, увы как я понял не умеет делать статичную трансляцию
Harmonizr - баженная шняга
Six - писал выше
TypeScript - писал выше

iKillMaxmaxmaximus
05.07.2013, 15:28
от гугля же вроде был какой то реализующий все кроме проксей (а может уже и их), не?

kobezzza
05.07.2013, 15:33
от гугля же вроде был какой то реализующий все кроме проксей (а может уже и их), не?
Traceur - редкостное говно, подходит только поиграться.

UPD: в общем пока решил заюзать SIX, уповаю на нативную поддержку в браузерах :)

melky
05.07.2013, 15:41
Traceur - Баженное кривое гавно,
Continuum - реализиция VM на JS, увы как я понял не умеет делать статичную трансляцию
Harmonizr - баженная шняга
Six - писал выше
TypeScript - писал выше
намекаешь на новый Github'ный проект?

kobezzza
05.07.2013, 15:47
намекаешь на новый Github'ный проект?
Блин, вот еле себя сдерживаю, от того чтобы сесть и начать писать:) Времени жалко, а написание такой штуки с норм отладкой это месяц, а то и два.

monolithed
05.07.2013, 15:50
Планируем в ближайшее время использовать в качестве препроцессора:
https://github.com/termi/defs

iKillMaxmaxmaximus
05.07.2013, 16:06
планирую добавить поддержку ECMA 6 в код модулей UI)
буду парсить код функций на лету)

nerv_
10.07.2013, 14:02
kobezzza, дай ссылки почитать, что в es6 нового :)

kobezzza
10.07.2013, 14:21
kobezzza, дай ссылки почитать, что в es6 нового :)

http://habrahabr.ru/post/175371/

PS: Таки склепал на коленки себе черновой транслятор: https://github.com/kobezzza/NeJS. Поддерживает let и const (defs.js) + arrow function (реализация без bind, а через замену this на переменную замыкания), rest параметры и параметры по умолчанию, наверно добавлю деструкторизацию параметров. От six отказался, т.к. глючит постоянно и вырезает комменты.

Юзать:

npm install -g nejs
nejs -s исходный файл -o куда сохранить новый

iKillMaxmaxmaximus
10.07.2013, 14:38
наверно добавлю деструкторизацию параметров.
годная штука добавляй конешн)

Именованные параметры функций сделай тоже.

iKillMaxmaxmaximus
10.07.2013, 14:54
А напишу ка я тоже эту херню ради прикола)) чисто на регулярках)

iKillMaxmaxmaximus
10.07.2013, 17:24
Я вот думаю сделать просто регулярками, или построить синтаксическое дерево и кукарекать от него но строить я их не умею придется опять лвл апать собственным опытом) так что сделаю просто регулярками и реплейсами

kobezzza
10.07.2013, 17:52
Судя по новым коммитам defs.js довольно скоро реализует хорошую поддержку ECMA6, уже добавлены тесты для: классов, деструктуризации и параметрам по умолчанию.

iKillMaxmaxmaximus
10.07.2013, 18:20
Как я понял ECMA это только синтаксис и родные обьекты? А кто тогда отвечает за внедрение объектов окружения?
Всяких Object.observe или Object.proxy например, ведь их стандартными средствами не реализовать?

Или это не обьект окружения а родной считается, тогда .proxy и .observe должны быть прописаны в ECMA каком-то?

iKillMaxmaxmaximus
10.07.2013, 19:00
Пасоны короче строю дерево, там есть такая штука как контекст он содержит список выражений список переменных и список функций объявленных в нем, внимание вопрос) как называются вот эти вот операции разделенные точками с запятой? как назвать их список?

expressions?


но там могут быть как выражения так и блоки же или итераторы всякие. по этому не православно называть так. так как быть?

может "конструкции"?

iKillMaxmaxmaximus
10.07.2013, 19:28
Все понял, сделаю так же как делал с UI я создам классы типа для токенов текстовых функция скобка и.т.п. и соберу массив из этих токенов а потом буду пробегаться оп этому массиву и собирать конструкции, в дерево. То есть надо вначале текст на кубика распарить а потом с ними уже работать, а то я весь мозг сломал как регуляркой функции выдирать) лол

iKillMaxmaxmaximus
10.07.2013, 19:37
https://pp.vk.me/c412829/v412829913/2e2c/yYCbsQ33EAQ.jpg


Это зашквар же


Ты там наверное используешь 20 мерные кубы из матриц таблиц, для ускорения выборки, не?
Я слышал так все нормальные масоны делают. Ибо памяти в наше время хоть жопой жри.

kobezzza
10.07.2013, 19:52
Добавил поддержку именованных параметров функций, исправил кое-какие баги и т.д. Обновил на гитхабе и в npm.

function foo({name, body: lastName}) {
name;
lastName;
}

Поддержку значений по умолчанию для именованных параметров не стал делать, т.к. не поддерживается штормом.

ЗЫ: запилил ридми на гитхабе

iKillMaxmaxmaximus
10.07.2013, 21:53
А я короче пишу минишаблонизатор для конструкций, типа регулярок тока выше уровнем) конструкции состоят из токенов, и я могу указывать какие токены могут идти а какие нет)

например шаблон конструкции "функция" выглядит так

'function \( (word,?)* \) \{ .* \}'

то есть как регулярки тока за место слов там названия токенов, некоторые названия , например открывающая скобка, приходится экранировать, а чтобы не экранировать можно было назвать типа открСкобка и шаблон выгладил бы так:

'function открСкобка (word,?)* закрСкобка открФигурнСкобка .* закрФигурнСкобка'

Ну короче пишу чо то типа языка для описания конструкций) чтобы потом не ебаца и добавлять разные плюшки в интерпритатор) крута да)?

Ну или например описать конструкцию "блок" научить его отсчитывать одинаковое количество открывающих скобочек и закрывающий а в шаблоне функции писать просто 'function \( (word,?)* \) \{ блок \}'

Короче есть где разгуляться)

kobezzza, короче сяп за вдохновение)

Riim
11.07.2013, 06:26
kobezzza, так ты ничего серьезного не сделаешь, погугли лучше по "esprima escodegen".

UPD: http://sssslide.com/speakerdeck.com/constellation/escodegen-and-esmangle-using-mozilla-javascript-ast-as-an-ir

kobezzza
11.07.2013, 10:29
kobezzza, так ты ничего серьезного не сделаешь, погугли лучше по "esprima escodegen".
Разумеется я в курсе про Esprima, Jison и т.д. более того, либа для let-ов которую я юзаю использует Esprima, но как я уже писал: у меня нет времени "делать по правильному" и я сделал "по быстрому": 2 вечера по пару часов и у меня есть уже неплохая поддержка фич и я уже юзаю их в реальном проекте. Какая разница что внутри, если это работает как надо :)

iKillMaxmaxmaximus
11.07.2013, 12:12
так ты ничего серьезного не сделаешь,
плюсу, парсь на токены, парсь их по шаблонам в дерево, я вот уже думаю как сделать шаблон "КОНТЕКСТ" при том чтобы он был настраиваемый, а не встроенный, то есть думаю как API создать для его создания он слишком сложный для описания шаблоном. А ты просто регулярками реплейсишь, я тоже так хотел но это жесть. оч неудобно


я про "function ( params ) { CONTEXT }" чтобы он понимал что когда находит конструкцию CONTEXT то должен был входить в рекурсию и парсить что внутр и в нужный момент выйти, и я думаю как сделать так чтобы делать эту конструкцию не встроенной а было API чтобы руками написать его это позволило бы разные языки на этой штуке описывать в будущем а не только сиподобные.

А ты берешь и регулярками реплейсишь, жесть)

Какая разница что внутри, если это работает как надо
Ну например ты не сделаешь деструктуризацию за 10 секунд как я, когда доделаю "парсер". но а вообще да, если не собираешься делать годноту то окей.

nerv_
16.07.2013, 23:49
Всяких Object.observe или Object.proxy
кстати, http://updates.html5rocks.com/2012/11/Respond-to-change-with-Object-observe