Концепция указателей в JavaScript
Я недавно решил попытаться реализовать типизированные переменные в JS. Но вместо этого получил указатели, а точнее их подобие. Получилось на мой взгляд довольно не плохо. Все расписано в example.js. Пока что проект находится на самой ранней стадии. Но уже сейчас можно испытывать код в действии.
Недавно провел полную перепись кода, избавил от всего г...а. https://github.com/acterhd/array-pointer-js Восстановил репозитории. |
|
Окей, я обязательно подумаю над полным слиянием с asm.js. Хотя уже сейчас можно использовать асму.
Но я вижу что asm и lljs довольно интересный продукт. Но кажись lljs уже мертв. https://github.com/mbebenita/LLJS Соответственно остается ASM. Но и его спецификации уже 1 год исполнилось. Впрочем основная задумка теперь - это псевдо указатели! Но реализовано и другие фичи, таких как выделение памяти. Пожалуй это основная фича после оборачивания массивов в указатели. 1. В C чтобы выделить память используется malloc и указатель. int * mem; mem = (int *)malloc(10); В JavaScript чтобы выделить память нужно хотя объявить пустой псевдо-указатель. var mem = PRIM.Int.var(); PRIM.Int.alloc(mem, 10); 2. В C можно сделать указатель на переменную. int val = 1; int * ptr = &val; В JavaScript точного эквивалента данной операции нету. //Первый вариант var ptr = PRIM.Int.var(1); //Второй вариант var val = [1|0]; //ASM.js var ptr = PRIM.Pointer.array(val); //Следует оборачивать через Pointer.array //Второй точка один вариант var val = new Int32Array([1]); //Через типизированный массив var ptr = PRIM.Pointer.array(val); Вот они "преимущества" JavaScript. |
Я добавил ссылки, просто как возможную справку :)
Вообще ASM.js - это промежуточный этап, т.к. будущее за WebAssembly. Но ASM.js уже сейчас поддерживается в FF и Edge (новый IE) и частично в Chrome, а также в него умеют компилиться проекты из UnrealEngine и Unity. Производительность очень близка к нативной. |
acterhd, а зачем это надо?
|
А как вы смотрите на TypeScript? Стоит ли для него писать библиотеку указателей?
Rise, надо обычно если вы разрабатываете приложение, например требующее работы с бинарными файлами. Также неплохо подойдет и для WebGL приложений (поскольку там используются буферы). Сегодня думаю интегрироваться под Node.JS, поскольку большая часть всех JS проектов пишется под него. |
Цитата:
Цитата:
Хотя вроде эту возможность удалят в новых версиях. |
Ну если удалят, тогда тем более будет повод нажиться :)
Жалко что до крупного проекта еще очень далеко. Еще нужно красивый сайт с документацией сделать. |
Цитата:
Цитата:
PS: в IOJS3 уже удалили smalloc api: Цитата:
|
Вот теперь IOJS и библиотека primitive друзья :)
В C чтобы использовать элемент массива достаточно: int * array = {0, 1, 2, 3}; int a = array[0]; //Очень просто В JS чтобы так сделать нужно: var array = PRIM.Int.array([0, 1, 2, 3]); var a = array.get(0); //Получить нулевой индекс - да такие вот операторы на JS var a = array.get(); //Для нулевого индекса можно так var a = array.add(0).ptr; //Через геттер, создавая при этом еще один экземпляр pointer Однако есть и отличия: var a = 1; var array = PRIM.Int.array([0, 1, 2, 3]); array.set(a, 0); //Установить так array.add(0).ptr = a; //Большая разница array.add(0).set(a); //Можно и так И мало кто знает. В primitive.js сеттеры, геттеры и функции, которые встроены в классы не являются основными. Основными являются именно static функции. Я этот фарш решил добавить для удобочитаемости кода. Кстати, новые экземпляры (классы) не содержать многого. Они содержат всего 2 переменные (1 из которых ссылка). Остальное это либо прототипы либо статики. За основу стиля я взял именно стиль как у SIMD. Да и сам SIMD можно использовать (скажу позже как). У данной библиотеки есть еще ".mem" геттер и сеттер. Его и можно отправлять в плаванье. |
Цитата:
|
В JS нет operator overload. Так просто нельзя.
Ведь это классы а не массивы. Вот ты представь себе что будет если сделать? extends Array Я потеряю возможность адресации. Нельзя будет просто так двигать изначальный адрес. Да к тому же надо будет реализовать для всех массивов, включая типизированные. Так нельзя будет передавать указатель в указатель (т.е. приравнивание). Мне такое не надо. |
Цитата:
|
Прокси это прокси, это отдельная фича (обертка поверх класса).
Да и в хроме нету. Также я не вижу в Proxy столь важной функции как замещение скалярных операторов. |
Цитата:
Цитата:
|
Провожу доработку, довожу до ума.
|
Цитата:
var arr = []; Object.defineProperty ( arr, 0, { get: function () { alert(); return 0; } set: function (val) { alert(val); } } ); arr [0] = 5; console.log( arr [0] ) |
Cyber, Я реализовал через Proxy.
Вот обработчик для Proxy. let _indexer = { get: function(obj, prop){ return (!isNaN(prop) ? obj.get(parseInt(prop)) : obj[prop]); }, set: function(obj, prop, val){ if(!isNaN(prop)){ obj.set(val, parseInt(prop)); } else { obj[prop] = val; } } }; Проверяет, является ли переменная prop числом или нет. Если да, то извлечь ячейку памяти. |
acterhd, учитывая поддержку прокси браузерами то не особо полезно тогда)
|
Работает библиотека во всех браузерах, кроме Firefox.
|
Цитата:
|
Цитата:
Цитата:
|
https://github.com/acterhd/primitive...rimitive.js#L3
acterhd, ты же в курсе, что у тебя не ASM.js код, поэтому данная инструкция ничего не даст :) И почему у тебя такой странный способ экспорта модуля? Это не будет работать в ноде и более того, раз ты юзаешь ES6, то логичнее заюзать Babel и сделать UMD экспорт. Также, почему у тебя не оформлен пакет для NPM и Bower? UPD: Увидел, https://github.com/acterhd/primitive...mitive.js#L470. Нагугли UMD :) |
Цитата:
|
Что я сделал?
- перешел на typescript - подготовил проект на visual studio - демонстрация пока в iframe, и ведет в visual studio проекту - отказались от Proxy cyber, я еще пока не забил на primitive.js, а о браузерах я позаботился kobezzza, пока что ситуация с ecmascript 6 очень плачевна. Это одна из причин перехода на typescript, чтобы сохранить обратную совместимость. http://acterhd.github.io/primitive-js/ |
Цитата:
|
Проект буду переделывать.
Вот сырой проект. На чистом ES6. Убрал весь хлам. Оставил только самое необходимое для указателя. Основная суть - работа с массивами, а так же выделении собственной памяти (создание нового массива). https://github.com/acterhd/array-pointer-js Ту библиотеку временно оставлю на память, потом удалю. |
Слушайте, я порылся в Emscripten, и понял. Так вот где бы она понадобилась бы!
|
Провел полный рефакторинг библиотеки!
|
Часовой пояс GMT +3, время: 22:42. |