Концепция указателей в 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" геттер и сеттер. Его и можно отправлять в плаванье. |
Часовой пояс GMT +3, время: 17:15. |