Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.08.2015, 10:42
Интересующийся
Отправить личное сообщение для acterhd Посмотреть профиль Найти все сообщения от acterhd
 
Регистрация: 16.08.2015
Сообщений: 23

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

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

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

Последний раз редактировалось acterhd, 10.09.2015 в 00:17.
Ответить с цитированием
  #2 (permalink)  
Старый 16.08.2015, 10:56
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

http://lljs.org/
http://asmjs.org/
__________________
kobezzza
code monkey
Ответить с цитированием
  #3 (permalink)  
Старый 16.08.2015, 11:01
Интересующийся
Отправить личное сообщение для acterhd Посмотреть профиль Найти все сообщения от acterhd
 
Регистрация: 16.08.2015
Сообщений: 23

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

Последний раз редактировалось acterhd, 16.08.2015 в 11:31.
Ответить с цитированием
  #4 (permalink)  
Старый 16.08.2015, 11:10
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

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

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

Последний раз редактировалось kobezzza, 16.08.2015 в 11:13.
Ответить с цитированием
  #5 (permalink)  
Старый 16.08.2015, 11:37
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 458

acterhd, а зачем это надо?
Ответить с цитированием
  #6 (permalink)  
Старый 16.08.2015, 11:37
Интересующийся
Отправить личное сообщение для acterhd Посмотреть профиль Найти все сообщения от acterhd
 
Регистрация: 16.08.2015
Сообщений: 23

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

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

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

Последний раз редактировалось acterhd, 16.08.2015 в 11:41.
Ответить с цитированием
  #7 (permalink)  
Старый 16.08.2015, 11:52
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

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

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

Хотя вроде эту возможность удалят в новых версиях.
__________________
kobezzza
code monkey
Ответить с цитированием
  #8 (permalink)  
Старый 16.08.2015, 12:11
Интересующийся
Отправить личное сообщение для acterhd Посмотреть профиль Найти все сообщения от acterhd
 
Регистрация: 16.08.2015
Сообщений: 23

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

Последний раз редактировалось acterhd, 16.08.2015 в 12:55.
Ответить с цитированием
  #9 (permalink)  
Старый 16.08.2015, 13:02
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Цитата:
Ну если удалят, тогда тем более будет повод нажиться
Тогда делай АПИ такое же, как у 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.
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 16.08.2015 в 13:04.
Ответить с цитированием
  #10 (permalink)  
Старый 16.08.2015, 13:08
Интересующийся
Отправить личное сообщение для acterhd Посмотреть профиль Найти все сообщения от acterhd
 
Регистрация: 16.08.2015
Сообщений: 23

Вот теперь 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" геттер и сеттер. Его и можно отправлять в плаванье.

Последний раз редактировалось acterhd, 16.08.2015 в 13:46.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книга: JavaScript. Сильные стороны Magneto Учебные материалы 16 21.04.2013 15:28
Интерпретатор Java на JS kobezzza Оффтопик 24 11.10.2012 18:32
Первый Moscow JavaScript Meetup korenyushkin Общие вопросы Javascript 0 26.07.2011 15:23
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34