SlideShare a Scribd company logo
1 of 35
Download to read offline
Excel на JavaScript!
Viktor Turskyi
CTO at WebbyLab

Kyiv.js 2013
Бизнес задача

Запускать XLS файлы со сложными
математическими моделями в браузере и
чтобы без сервера
Требования к
производительности:
1. Возможность запуска крупных моделей
(до 2-х миллионов ячеек, 400тыс
формул, 1млн Excel функций, 50
листов)
2. Поддержка цепей вычисления на сотни
тысяч ячеек
3. Высокая производительность
4. Небольшой размер файла
Требования к окружению
● Офлайн работа в браузере
● Работа на сервере
● Работа на планшетах(iOS, Android)
От заказчика получили
1. Дизайн интерфейса
2. 12 мб xls файл c формулами вида:

=IF($F$36 + $AF128 <= 101; SUMPRODUCT( ($S128:OFFSET
($S128;$F$36-1;0)) * ($AG$55:OFFSET($AG$55;$F$36-1;0)) *
('Sheet25'!BY84:OFFSET('Sheet25'!BY84;$F$36-1;0) + 'Sheet25'!BY194:
OFFSET('Sheet25'!BY194; $F$36-1; 0) ) ); SUMPRODUCT(
($S128:$S$155) * ($AG$55:OFFSET($AG$55;100-$AF128;0)) *
('Sheet25'!BY84:BY$111 + 'Sheet25'!BY194:BY$221) ) )
Почему не Google Docs API:
1. Работает только в онлайн
2. Очень медленный
3. Проблемы при конвертации некоторых
xls
4. Максимум 40 тыс формул в файле
Вопрос №0: это возможно? :)
С помощью JavaScript все возможно ;)
Вопрос №1: Достаточно ли у JS
производительности?
1. Определяем целевые платформы
(движки)
a. Браузеры и их версии
b. iOS устройства
c. Android устройства

2. Пишем синтетический мини бенчмарк
a. Математический вычисления
b. Длинные цепи вычислений
Вопрос №2: Как вычитать данные
с XLS файла?
● Необходимо вычитать значения
● Необходимо вычитать формулы
● Необходимо вычитать называние
листов
● Необходимо вычитать имена
диапазонов и ячеек
Варианты:
● Nodejs модули - не способны даже
вычитать значения, сваливаются на
огромных файлах.
● Ruby/Python/Perl/PHP - нет возможности
получить формулы или имена ячеек
Что сработало?
Perl (100 строк)
+ Windows
+ Win32::OLE
+ Excel
+ документация VBA
= тупой дамп в JSON сырых данных.
Вопрос №3: Вычитали и что?
1. Нужно разобрать гору сырых данных
2. Нужно проанализировать все формулы
3. Нужно отслеживать завимости между
формулами
4. Нужно это как-то хранить
5. Нужно реализовать множество функций
c Excel
6. Нужен движок, который все выполнит
Вопрос №4: Как разобрать
формулу в JS?
1.
2.
3.
4.
5.
6.

Учет приоритета операторов
Инфиксные/префиксные операторы
Функции
Ссылки на ячейки
Ссылки на диапазоны
Именованные адреса
Неправильное решение
Самописный лексер и парсер:
1. Сложно
2. Долго
3. Дорого
Отказались с первыми существенными
проблемами приоритета операторов.
Правильное решение - ANTLR
1.
2.
3.
4.

Генератор парсеров (включая JS)
Лексический и синтаксический анализ
На выходе AST (Abstract Syntax Tree)
Лучшее из всего, что есть под JS (и не
только)
Мы используем версию 3.3 (в версии 3.4 баг
в JS генераторе)
http://www.antlr.org/
Примеры формул
Formula: '=1+2*3'
JS AST: [ '+', 1, [ '*', 2, 3] ]
Formula: '=A1+B1'
JS AST: [‘+’, ['=', 0, 0, 0], ['=', 0, 1, 0] ]
Formula: ‘=SUM(B5:B100, 42)'
JS AST: [ 'SUM', [ 'RANGE', 0, 1, 4, 1, 99 ], 42 ]
Компоненты движка
● LocalRunner - работает с файлом и
определяет порядок вычислений
● Formula Evaluator - вычисляет формулу
● Address Parser - парсит адреса
введенные пользователем
● Functions - реализация Excel функций
Реализация EXCEL функций
● Одна функция - один класс
● Все функции без побочных эффектов
● Используется принцип внедрения
завимостей для подключения
● node-qunit для тестирования
Пример вызова:
SQRT([ 9 ]) вернет 3
SUM([2, [5, 6, 7, 9], 1 ]) вернет 30
Вопрос №5: зависимости ячеек
A1=1
A2=A1+1
A3=A1+A2
Ячейка А1 влияет на A2 и A3
Ячейка A2 влияет на А3
Что представляют собой
зависимости?
По сути, мы имеем
направленный
ациклический
граф
(храним в JSON
вместе с AST)
При изменении ячейки
пересчитывать зависимые
На тестовых файлах
работает, а в реальной
жизни - нет.
Причина - множественные
пересчеты одних
и тех же ячеек.
Топологическая сортировка
Позволяет нам вычислять ячейку один раз.
На тестовых файлах работает, в реальной
жизни - нет.
Причина - переполнение стека вызовов.
Что делать?
Не используйте рекурсию, сами управляйте
стеком и обходите граф.
Результат на реальной модели:
Без сортировки - 1час
С сортировкой - 6 секунд
Как работать с диапазонами
ячеек?

SUM( [ [ 21, 22, 23, 31, 32, 33 ] ] );
SUM( [ new ArrayRange([21, 22, 23, 31, 32, 33]) ] );
SUM( [ new ModelRange(model, ‘B2:C4’ ) ] );
Оптимизация
Обращайте внимание на:
1. Рекурсивные алгоритмы
2. Большие JSON файлы(40мб повалит
ваш браузер)
3. Лимиты по помяти в NodeJS (иногда
невозможно обойти)
4. Копирования данных в памяти
Инструменты
1. ANTLR для синтаксического анализа
2. Web Workers для повышения
отзывчивости интерфейса
3. Browserify для использования
CommonJS модулей в браузере
4. Qunit для тестирования
Поддержка разных окружений
Для сервера - nodejs
Для браузера - browserify
Для планшетов - phonegap
Живая демонстрация
Viktor Turskyi
viktor@webbylab.com
http://koorchik.blogspot.com
http://search.cpan.org/~koorchik/
https://github.com/koorchik

WebbyLab
http://webbylab.com
WebbyLab
ищет
Junior Frontend Developer
http://www.work.ua/jobs/1433919/

More Related Content

What's hot

Экстремальная оптимизация производительности на примере MongoDB Java Driver
Экстремальная оптимизация производительности на примере MongoDB Java DriverЭкстремальная оптимизация производительности на примере MongoDB Java Driver
Экстремальная оптимизация производительности на примере MongoDB Java DriverVitebsk DSC
 
4. Многомерные массивы и массивы массивов в C#
4. Многомерные массивы и массивы массивов в C#4. Многомерные массивы и массивы массивов в C#
4. Многомерные массивы и массивы массивов в C#Olga Maksimenkova
 
Лекция о языке программирования Haskell
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskellhusniyarova
 
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...Nikolay Grebenshikov
 
Android - 03 - Multithreading, Collections
Android - 03 - Multithreading, CollectionsAndroid - 03 - Multithreading, Collections
Android - 03 - Multithreading, CollectionsNoveo
 
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Ontico
 
2. Операторы языка C#
2. Операторы языка C#2. Операторы языка C#
2. Операторы языка C#Olga Maksimenkova
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#Dmitri Soshnikov
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C codeDenis Efremov
 
1. Типы данных. Операции. Ввод и вывод C#
1. Типы данных. Операции. Ввод и вывод C#1. Типы данных. Операции. Ввод и вывод C#
1. Типы данных. Операции. Ввод и вывод C#Olga Maksimenkova
 
ОПК № 5 – Составные типы данных, списки
ОПК № 5 – Составные типы данных, спискиОПК № 5 – Составные типы данных, списки
ОПК № 5 – Составные типы данных, спискиVladimir Parfinenko
 
Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...
Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...
Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...Nikolay Grebenshikov
 
Николай Волосатов — Работа с крэшами библиотек
Николай Волосатов — Работа с крэшами библиотекНиколай Волосатов — Работа с крэшами библиотек
Николай Волосатов — Работа с крэшами библиотекCocoaHeads
 
Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Olga Maksimenkova
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиMikhail Kurnosov
 
Cpp/cli particularities
Cpp/cli particularitiesCpp/cli particularities
Cpp/cli particularitiesmcroitor
 
Олег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonОлег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonYandex
 

What's hot (20)

Экстремальная оптимизация производительности на примере MongoDB Java Driver
Экстремальная оптимизация производительности на примере MongoDB Java DriverЭкстремальная оптимизация производительности на примере MongoDB Java Driver
Экстремальная оптимизация производительности на примере MongoDB Java Driver
 
4. Многомерные массивы и массивы массивов в C#
4. Многомерные массивы и массивы массивов в C#4. Многомерные массивы и массивы массивов в C#
4. Многомерные массивы и массивы массивов в C#
 
Лекция о языке программирования Haskell
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskell
 
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
 
Android - 03 - Multithreading, Collections
Android - 03 - Multithreading, CollectionsAndroid - 03 - Multithreading, Collections
Android - 03 - Multithreading, Collections
 
Obj c
Obj cObj c
Obj c
 
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
 
2. Операторы языка C#
2. Операторы языка C#2. Операторы языка C#
2. Операторы языка C#
 
Основы MATLAB. Программирование
Основы MATLAB. ПрограммированиеОсновы MATLAB. Программирование
Основы MATLAB. Программирование
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C code
 
Основы MATLAB. Лекция 1.
Основы MATLAB. Лекция 1.Основы MATLAB. Лекция 1.
Основы MATLAB. Лекция 1.
 
1. Типы данных. Операции. Ввод и вывод C#
1. Типы данных. Операции. Ввод и вывод C#1. Типы данных. Операции. Ввод и вывод C#
1. Типы данных. Операции. Ввод и вывод C#
 
ОПК № 5 – Составные типы данных, списки
ОПК № 5 – Составные типы данных, спискиОПК № 5 – Составные типы данных, списки
ОПК № 5 – Составные типы данных, списки
 
Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...
Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...
Лекция №2. Абстрактные типы данных. ООП. Предмет "Структуры и алгоритмы обраб...
 
Николай Волосатов — Работа с крэшами библиотек
Николай Волосатов — Работа с крэшами библиотекНиколай Волосатов — Работа с крэшами библиотек
Николай Волосатов — Работа с крэшами библиотек
 
Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Cpp/cli particularities
Cpp/cli particularitiesCpp/cli particularities
Cpp/cli particularities
 
Олег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonОлег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и Python
 

Viewers also liked

Testing orm based code
Testing orm based codeTesting orm based code
Testing orm based codeViktor Turskyi
 
Language Independent Validation Rules (LIVR)
Language Independent Validation Rules (LIVR)Language Independent Validation Rules (LIVR)
Language Independent Validation Rules (LIVR)Viktor Turskyi
 
JS Lab 2016 - Frontend trends 2015 - 2016
JS Lab 2016 - Frontend trends 2015 - 2016JS Lab 2016 - Frontend trends 2015 - 2016
JS Lab 2016 - Frontend trends 2015 - 2016Viktor Turskyi
 
Maybe you do not know that ...
Maybe you do not know that ...Maybe you do not know that ...
Maybe you do not know that ...Viktor Turskyi
 
Kharkiv JS 2015 - Creating isomorphic applications in React (en)
Kharkiv JS  2015 - Creating isomorphic applications in React (en)Kharkiv JS  2015 - Creating isomorphic applications in React (en)
Kharkiv JS 2015 - Creating isomorphic applications in React (en)Viktor Turskyi
 
It's Quiz - Cloud testing platform
It's Quiz - Cloud testing platformIt's Quiz - Cloud testing platform
It's Quiz - Cloud testing platformViktor Turskyi
 

Viewers also liked (7)

Testing orm based code
Testing orm based codeTesting orm based code
Testing orm based code
 
Language Independent Validation Rules (LIVR)
Language Independent Validation Rules (LIVR)Language Independent Validation Rules (LIVR)
Language Independent Validation Rules (LIVR)
 
JS Lab 2016 - Frontend trends 2015 - 2016
JS Lab 2016 - Frontend trends 2015 - 2016JS Lab 2016 - Frontend trends 2015 - 2016
JS Lab 2016 - Frontend trends 2015 - 2016
 
Maybe you do not know that ...
Maybe you do not know that ...Maybe you do not know that ...
Maybe you do not know that ...
 
Hadoop webcamp 2015
Hadoop webcamp 2015 Hadoop webcamp 2015
Hadoop webcamp 2015
 
Kharkiv JS 2015 - Creating isomorphic applications in React (en)
Kharkiv JS  2015 - Creating isomorphic applications in React (en)Kharkiv JS  2015 - Creating isomorphic applications in React (en)
Kharkiv JS 2015 - Creating isomorphic applications in React (en)
 
It's Quiz - Cloud testing platform
It's Quiz - Cloud testing platformIt's Quiz - Cloud testing platform
It's Quiz - Cloud testing platform
 

Similar to Excel in Javascript

Реляционные базы данных
Реляционные базы данныхРеляционные базы данных
Реляционные базы данныхLevon Avakyan
 
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Badoo Development
 
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher SqlAlexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher SqlAlexander Dymo
 
Adymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher SqlAdymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher SqlOleksandr Petrov
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке СиPositive Development User Group
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке СиPositive Hack Days
 
Пишем свою платформу для управления данными. Это очень просто / Суханов Васил...
Пишем свою платформу для управления данными. Это очень просто / Суханов Васил...Пишем свою платформу для управления данными. Это очень просто / Суханов Васил...
Пишем свою платформу для управления данными. Это очень просто / Суханов Васил...Ontico
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...Ontico
 
"Alasql.js — база данных SQL на JavaScript" — Андрей Гершун, MoscowJS 18
"Alasql.js — база данных SQL на JavaScript" — Андрей Гершун, MoscowJS 18"Alasql.js — база данных SQL на JavaScript" — Андрей Гершун, MoscowJS 18
"Alasql.js — база данных SQL на JavaScript" — Андрей Гершун, MoscowJS 18MoscowJS
 
Alasql - база данных SQL на JavaScript (MoscowJS)
Alasql - база данных SQL на JavaScript (MoscowJS)Alasql - база данных SQL на JavaScript (MoscowJS)
Alasql - база данных SQL на JavaScript (MoscowJS)Andrey Gershun
 
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"Yandex
 
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьTanya Denisyuk
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Alex Ott
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Yandex
 
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"Yandex
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозитElena Kotina
 
Не бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоНе бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоRoman Dvornov
 

Similar to Excel in Javascript (20)

2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure
 
Underscore js
Underscore jsUnderscore js
Underscore js
 
Реляционные базы данных
Реляционные базы данныхРеляционные базы данных
Реляционные базы данных
 
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
 
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher SqlAlexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
 
Adymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher SqlAdymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher Sql
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Пишем свою платформу для управления данными. Это очень просто / Суханов Васил...
Пишем свою платформу для управления данными. Это очень просто / Суханов Васил...Пишем свою платформу для управления данными. Это очень просто / Суханов Васил...
Пишем свою платформу для управления данными. Это очень просто / Суханов Васил...
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
 
"Alasql.js — база данных SQL на JavaScript" — Андрей Гершун, MoscowJS 18
"Alasql.js — база данных SQL на JavaScript" — Андрей Гершун, MoscowJS 18"Alasql.js — база данных SQL на JavaScript" — Андрей Гершун, MoscowJS 18
"Alasql.js — база данных SQL на JavaScript" — Андрей Гершун, MoscowJS 18
 
Alasql - база данных SQL на JavaScript (MoscowJS)
Alasql - база данных SQL на JavaScript (MoscowJS)Alasql - база данных SQL на JavaScript (MoscowJS)
Alasql - база данных SQL на JavaScript (MoscowJS)
 
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
 
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
 
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозит
 
Не бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоНе бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их много
 
Efficiency vvv
Efficiency vvvEfficiency vvv
Efficiency vvv
 

More from Viktor Turskyi

How to create a high performance excel engine in java script
How to create a high performance excel engine in java scriptHow to create a high performance excel engine in java script
How to create a high performance excel engine in java scriptViktor Turskyi
 
Livr 2.0 in JS - Vinnytsia.JS 2019
Livr 2.0 in JS - Vinnytsia.JS 2019Livr 2.0 in JS - Vinnytsia.JS 2019
Livr 2.0 in JS - Vinnytsia.JS 2019Viktor Turskyi
 
The working architecture of node js applications open tech week javascript ...
The working architecture of node js applications   open tech week javascript ...The working architecture of node js applications   open tech week javascript ...
The working architecture of node js applications open tech week javascript ...Viktor Turskyi
 
Yet another json rpc library (mole rpc)
Yet another json rpc library (mole rpc)Yet another json rpc library (mole rpc)
Yet another json rpc library (mole rpc)Viktor Turskyi
 
KharkivJS 2018 Information Security Practice
KharkivJS 2018 Information Security PracticeKharkivJS 2018 Information Security Practice
KharkivJS 2018 Information Security PracticeViktor Turskyi
 
"Offline mode for a mobile application, redux on server and a little bit abou...
"Offline mode for a mobile application, redux on server and a little bit abou..."Offline mode for a mobile application, redux on server and a little bit abou...
"Offline mode for a mobile application, redux on server and a little bit abou...Viktor Turskyi
 
The working architecture of NodeJs applications
The working architecture of NodeJs applicationsThe working architecture of NodeJs applications
The working architecture of NodeJs applicationsViktor Turskyi
 
Language Independent Validation Rules 2.0, Viktor Turskyi, talk at OSDN 2017
Language Independent Validation Rules 2.0, Viktor Turskyi, talk at OSDN 2017Language Independent Validation Rules 2.0, Viktor Turskyi, talk at OSDN 2017
Language Independent Validation Rules 2.0, Viktor Turskyi, talk at OSDN 2017Viktor Turskyi
 
How to extract information from text with Semgrex
How to extract information from text with SemgrexHow to extract information from text with Semgrex
How to extract information from text with SemgrexViktor Turskyi
 
How to translate your Single Page Application - Webcamp 2016 (en)
How to translate your Single Page Application - Webcamp 2016 (en)How to translate your Single Page Application - Webcamp 2016 (en)
How to translate your Single Page Application - Webcamp 2016 (en)Viktor Turskyi
 
Kharkiv JS 2015: Боль и радость создания изоморфных приложений на ReactJS (RU)
Kharkiv JS  2015: Боль и радость создания изоморфных приложений на ReactJS (RU)Kharkiv JS  2015: Боль и радость создания изоморфных приложений на ReactJS (RU)
Kharkiv JS 2015: Боль и радость создания изоморфных приложений на ReactJS (RU)Viktor Turskyi
 
Mapreduce in JavaScript
Mapreduce in JavaScriptMapreduce in JavaScript
Mapreduce in JavaScriptViktor Turskyi
 

More from Viktor Turskyi (12)

How to create a high performance excel engine in java script
How to create a high performance excel engine in java scriptHow to create a high performance excel engine in java script
How to create a high performance excel engine in java script
 
Livr 2.0 in JS - Vinnytsia.JS 2019
Livr 2.0 in JS - Vinnytsia.JS 2019Livr 2.0 in JS - Vinnytsia.JS 2019
Livr 2.0 in JS - Vinnytsia.JS 2019
 
The working architecture of node js applications open tech week javascript ...
The working architecture of node js applications   open tech week javascript ...The working architecture of node js applications   open tech week javascript ...
The working architecture of node js applications open tech week javascript ...
 
Yet another json rpc library (mole rpc)
Yet another json rpc library (mole rpc)Yet another json rpc library (mole rpc)
Yet another json rpc library (mole rpc)
 
KharkivJS 2018 Information Security Practice
KharkivJS 2018 Information Security PracticeKharkivJS 2018 Information Security Practice
KharkivJS 2018 Information Security Practice
 
"Offline mode for a mobile application, redux on server and a little bit abou...
"Offline mode for a mobile application, redux on server and a little bit abou..."Offline mode for a mobile application, redux on server and a little bit abou...
"Offline mode for a mobile application, redux on server and a little bit abou...
 
The working architecture of NodeJs applications
The working architecture of NodeJs applicationsThe working architecture of NodeJs applications
The working architecture of NodeJs applications
 
Language Independent Validation Rules 2.0, Viktor Turskyi, talk at OSDN 2017
Language Independent Validation Rules 2.0, Viktor Turskyi, talk at OSDN 2017Language Independent Validation Rules 2.0, Viktor Turskyi, talk at OSDN 2017
Language Independent Validation Rules 2.0, Viktor Turskyi, talk at OSDN 2017
 
How to extract information from text with Semgrex
How to extract information from text with SemgrexHow to extract information from text with Semgrex
How to extract information from text with Semgrex
 
How to translate your Single Page Application - Webcamp 2016 (en)
How to translate your Single Page Application - Webcamp 2016 (en)How to translate your Single Page Application - Webcamp 2016 (en)
How to translate your Single Page Application - Webcamp 2016 (en)
 
Kharkiv JS 2015: Боль и радость создания изоморфных приложений на ReactJS (RU)
Kharkiv JS  2015: Боль и радость создания изоморфных приложений на ReactJS (RU)Kharkiv JS  2015: Боль и радость создания изоморфных приложений на ReactJS (RU)
Kharkiv JS 2015: Боль и радость создания изоморфных приложений на ReactJS (RU)
 
Mapreduce in JavaScript
Mapreduce in JavaScriptMapreduce in JavaScript
Mapreduce in JavaScript
 

Excel in Javascript

  • 1. Excel на JavaScript! Viktor Turskyi CTO at WebbyLab Kyiv.js 2013
  • 2. Бизнес задача Запускать XLS файлы со сложными математическими моделями в браузере и чтобы без сервера
  • 3.
  • 4. Требования к производительности: 1. Возможность запуска крупных моделей (до 2-х миллионов ячеек, 400тыс формул, 1млн Excel функций, 50 листов) 2. Поддержка цепей вычисления на сотни тысяч ячеек 3. Высокая производительность 4. Небольшой размер файла
  • 5.
  • 6. Требования к окружению ● Офлайн работа в браузере ● Работа на сервере ● Работа на планшетах(iOS, Android)
  • 7.
  • 8. От заказчика получили 1. Дизайн интерфейса 2. 12 мб xls файл c формулами вида: =IF($F$36 + $AF128 <= 101; SUMPRODUCT( ($S128:OFFSET ($S128;$F$36-1;0)) * ($AG$55:OFFSET($AG$55;$F$36-1;0)) * ('Sheet25'!BY84:OFFSET('Sheet25'!BY84;$F$36-1;0) + 'Sheet25'!BY194: OFFSET('Sheet25'!BY194; $F$36-1; 0) ) ); SUMPRODUCT( ($S128:$S$155) * ($AG$55:OFFSET($AG$55;100-$AF128;0)) * ('Sheet25'!BY84:BY$111 + 'Sheet25'!BY194:BY$221) ) )
  • 9. Почему не Google Docs API: 1. Работает только в онлайн 2. Очень медленный 3. Проблемы при конвертации некоторых xls 4. Максимум 40 тыс формул в файле
  • 10. Вопрос №0: это возможно? :) С помощью JavaScript все возможно ;)
  • 11. Вопрос №1: Достаточно ли у JS производительности? 1. Определяем целевые платформы (движки) a. Браузеры и их версии b. iOS устройства c. Android устройства 2. Пишем синтетический мини бенчмарк a. Математический вычисления b. Длинные цепи вычислений
  • 12.
  • 13. Вопрос №2: Как вычитать данные с XLS файла? ● Необходимо вычитать значения ● Необходимо вычитать формулы ● Необходимо вычитать называние листов ● Необходимо вычитать имена диапазонов и ячеек
  • 14. Варианты: ● Nodejs модули - не способны даже вычитать значения, сваливаются на огромных файлах. ● Ruby/Python/Perl/PHP - нет возможности получить формулы или имена ячеек
  • 15. Что сработало? Perl (100 строк) + Windows + Win32::OLE + Excel + документация VBA = тупой дамп в JSON сырых данных.
  • 16. Вопрос №3: Вычитали и что? 1. Нужно разобрать гору сырых данных 2. Нужно проанализировать все формулы 3. Нужно отслеживать завимости между формулами 4. Нужно это как-то хранить 5. Нужно реализовать множество функций c Excel 6. Нужен движок, который все выполнит
  • 17.
  • 18. Вопрос №4: Как разобрать формулу в JS? 1. 2. 3. 4. 5. 6. Учет приоритета операторов Инфиксные/префиксные операторы Функции Ссылки на ячейки Ссылки на диапазоны Именованные адреса
  • 19. Неправильное решение Самописный лексер и парсер: 1. Сложно 2. Долго 3. Дорого Отказались с первыми существенными проблемами приоритета операторов.
  • 20. Правильное решение - ANTLR 1. 2. 3. 4. Генератор парсеров (включая JS) Лексический и синтаксический анализ На выходе AST (Abstract Syntax Tree) Лучшее из всего, что есть под JS (и не только) Мы используем версию 3.3 (в версии 3.4 баг в JS генераторе) http://www.antlr.org/
  • 21. Примеры формул Formula: '=1+2*3' JS AST: [ '+', 1, [ '*', 2, 3] ] Formula: '=A1+B1' JS AST: [‘+’, ['=', 0, 0, 0], ['=', 0, 1, 0] ] Formula: ‘=SUM(B5:B100, 42)' JS AST: [ 'SUM', [ 'RANGE', 0, 1, 4, 1, 99 ], 42 ]
  • 22. Компоненты движка ● LocalRunner - работает с файлом и определяет порядок вычислений ● Formula Evaluator - вычисляет формулу ● Address Parser - парсит адреса введенные пользователем ● Functions - реализация Excel функций
  • 23. Реализация EXCEL функций ● Одна функция - один класс ● Все функции без побочных эффектов ● Используется принцип внедрения завимостей для подключения ● node-qunit для тестирования Пример вызова: SQRT([ 9 ]) вернет 3 SUM([2, [5, 6, 7, 9], 1 ]) вернет 30
  • 24. Вопрос №5: зависимости ячеек A1=1 A2=A1+1 A3=A1+A2 Ячейка А1 влияет на A2 и A3 Ячейка A2 влияет на А3
  • 25. Что представляют собой зависимости? По сути, мы имеем направленный ациклический граф (храним в JSON вместе с AST)
  • 26. При изменении ячейки пересчитывать зависимые На тестовых файлах работает, а в реальной жизни - нет. Причина - множественные пересчеты одних и тех же ячеек.
  • 27. Топологическая сортировка Позволяет нам вычислять ячейку один раз. На тестовых файлах работает, в реальной жизни - нет. Причина - переполнение стека вызовов.
  • 28. Что делать? Не используйте рекурсию, сами управляйте стеком и обходите граф. Результат на реальной модели: Без сортировки - 1час С сортировкой - 6 секунд
  • 29. Как работать с диапазонами ячеек? SUM( [ [ 21, 22, 23, 31, 32, 33 ] ] ); SUM( [ new ArrayRange([21, 22, 23, 31, 32, 33]) ] ); SUM( [ new ModelRange(model, ‘B2:C4’ ) ] );
  • 30. Оптимизация Обращайте внимание на: 1. Рекурсивные алгоритмы 2. Большие JSON файлы(40мб повалит ваш браузер) 3. Лимиты по помяти в NodeJS (иногда невозможно обойти) 4. Копирования данных в памяти
  • 31. Инструменты 1. ANTLR для синтаксического анализа 2. Web Workers для повышения отзывчивости интерфейса 3. Browserify для использования CommonJS модулей в браузере 4. Qunit для тестирования
  • 32. Поддержка разных окружений Для сервера - nodejs Для браузера - browserify Для планшетов - phonegap