Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Нормальный транслятор ECMA6 (https://javascript.ru/forum/offtopic/39614-normalnyjj-translyator-ecma6.html)

kobezzza 05.07.2013 14:34

Нормальный транслятор ECMA6
 
Очень хочется уже юзать фичи из ECMA6, тем более уже есть поддержка в IDE (webstorm), но перерыв инет я нашёл не так много трансляторов, а из тех что нашёл только два имхо хоть как то подходят для использования в реальной жизни: 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

Цитата:

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

Traceur - редкостное говно, подходит только поиграться.

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

melky 05.07.2013 15:41

Цитата:

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

намекаешь на новый Github'ный проект?

kobezzza 05.07.2013 15:47

Цитата:

Сообщение от melky (Сообщение 260395)
намекаешь на новый 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

Цитата:

Сообщение от nerv_ (Сообщение 261562)
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

Цитата:

Сообщение от kobezzza
наверно добавлю деструкторизацию параметров.

годная штука добавляй конешн)

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

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




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


Ты там наверное используешь 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/...t-ast-as-an-ir

kobezzza 11.07.2013 10:29

Цитата:

Сообщение от Riim (Сообщение 261699)
kobezzza, так ты ничего серьезного не сделаешь, погугли лучше по "esprima escodegen".

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

iKillMaxmaxmaximus 11.07.2013 12:12

Цитата:

Сообщение от Riim
так ты ничего серьезного не сделаешь,

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


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

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

Цитата:

Сообщение от kobezzza
Какая разница что внутри, если это работает как надо

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

nerv_ 16.07.2013 23:49

Цитата:

Сообщение от iKillMaxmaxmaximus
Всяких Object.observe или Object.proxy

кстати, http://updates.html5rocks.com/2012/1...Object-observe


Часовой пояс GMT +3, время: 14:16.