Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Концепция указателей в JavaScript (https://javascript.ru/forum/project/57714-koncepciya-ukazatelejj-v-javascript.html)

acterhd 16.08.2015 10:42

Концепция указателей в JavaScript
 
Я недавно решил попытаться реализовать типизированные переменные в JS. Но вместо этого получил указатели, а точнее их подобие. Получилось на мой взгляд довольно не плохо. Все расписано в example.js. Пока что проект находится на самой ранней стадии. Но уже сейчас можно испытывать код в действии.

Недавно провел полную перепись кода, избавил от всего г...а.
https://github.com/acterhd/array-pointer-js

Восстановил репозитории.

kobezzza 16.08.2015 10:56

http://lljs.org/
http://asmjs.org/

acterhd 16.08.2015 11:01

Окей, я обязательно подумаю над полным слиянием с 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.

kobezzza 16.08.2015 11:10

Я добавил ссылки, просто как возможную справку :)

Вообще ASM.js - это промежуточный этап, т.к. будущее за WebAssembly. Но ASM.js уже сейчас поддерживается в FF и Edge (новый IE) и частично в Chrome, а также в него умеют компилиться проекты из UnrealEngine и Unity. Производительность очень близка к нативной.

Rise 16.08.2015 11:37

acterhd, а зачем это надо?

acterhd 16.08.2015 11:37

А как вы смотрите на TypeScript? Стоит ли для него писать библиотеку указателей?

Rise, надо обычно если вы разрабатываете приложение, например требующее работы с бинарными файлами. Также неплохо подойдет и для WebGL приложений (поскольку там используются буферы).

Сегодня думаю интегрироваться под Node.JS, поскольку большая часть всех JS проектов пишется под него.

kobezzza 16.08.2015 11:52

Цитата:

А как вы смотрите на TypeScript? Стоит ли для него писать библиотеку указателей?
Ну, мне кажется более правильным не тянуть такие низкоуровневые как указатели штуки в JS (всё таки у нас язык с GC), а использовать для этого более предпочтительные языки как C/C++ и компилить их в ASM.js (http://kripken.github.io/emscripten-site/). А без использования ASM.js / WebAssembly вообще не вижу смысла в таких вещах.

Цитата:

Сегодня думаю интегрироваться под Node.JS
https://nodejs.org/api/smalloc.html

Хотя вроде эту возможность удалят в новых версиях.

acterhd 16.08.2015 12:11

Ну если удалят, тогда тем более будет повод нажиться :)
Жалко что до крупного проекта еще очень далеко. Еще нужно красивый сайт с документацией сделать.

kobezzza 16.08.2015 13:02

Цитата:

Ну если удалят, тогда тем более будет повод нажиться
Тогда делай АПИ такое же, как у Node.js, чтобы можно было использовать без переработки старой кодовой базы.

Цитата:

Еще нужно красивый сайт с документацией сделать.
Имхо, для такой либы - это лишнее :)

PS: в IOJS3 уже удалили smalloc api:

Цитата:

smalloc: The smalloc module has been removed as it is no longer possible to provide the API due to changes in V8 (Ben Noordhuis) #2022.

acterhd 16.08.2015 13:08

Вот теперь 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.