Просмотр полной версии : Нормальный транслятор 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, уповаю на нативную поддержку в браузерах :)
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)
буду парсить код функций на лету)
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, короче сяп за вдохновение)
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 секунд как я, когда доделаю "парсер". но а вообще да, если не собираешься делать годноту то окей.
Всяких Object.observe или Object.proxy
кстати, http://updates.html5rocks.com/2012/11/Respond-to-change-with-Object-observe
vBulletin® v3.6.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot