Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - vlad

Страницы: 1 2 [3] 4 5 ... 93
31
Общий раздел / Re: OberonJS
« : Январь 23, 2017, 07:37:50 pm »
Спасибо за советы. Попробую сделать как Владислав написал, чтобы сохраненные готовые модули (фреймворк) копировались в начало рекурсивно.

На самом деле еще проще: запихни все библиотечные модули текстуально до компилируемого и все заработает без бубнов с настройкой компилятора. Т.е.:
oc.compile(libModulesText + userEnteredText);

Несколько неэстетично, зато дешево надежно и практично.

P.S. Порядок модулей в тексте должен быть строго в порядке зависимостей.

32
Общий раздел / Re: OberonJS
« : Январь 23, 2017, 05:56:05 pm »
Читать импортируемые модули примерно так: https://github.com/vladfolts/oberonjs/blob/master/src/nodejs.js#L67
return oc.compileModules(
            sources,

            // вот эта функция по имени импортируемого модуля должна вернуть его исходный текст
            function(name){
                var fileName = name;
                if (!path.extname(fileName).length)
                    fileName += ".ob";
               
                readPath = calcPath(fileName);
                return fs.readFileSync(readPath, "utf8");
            },
...

"fs.readFileSync" в браузере нет (как и вообще доступа к файловой системе, это nodejs), тебе придется заменить его на что-то другое.

33
Общий раздел / Re: OberonJS
« : Январь 23, 2017, 05:48:42 pm »
Я почти разобрался и даже нашел примеры с канвасами тут на форуме.

Вопрос. Как скомпилированный код, загрузить в HTML для повторного использования?

Вот начал делать образовательный проект по биофизическим моделям.
http://molpit.org/models

Начинаю с разработки модуля Log.
http://molpit.org/models/Log.js

require("Log.js"); не помогает
<script src="Log.js"></script>тоже

Не очень понял, попробую угадать, что ты хочешь:
- скомпилировать обероновский модуль (Log) в js.
- импортировать скомпилированный модуль из HTML, чтобы скомпилировать еще один обероновский модуль из текста ввведенного на этой HTML

Если это так, то в таком виде оно сейчас не поддерживается. Точнее не поддерживается импорт уже скомпиленных модулей. Поэтому для твоего (предполагаемого) случая это будет работать так:
- все импортируемые модули доступны в исходном обероне
- компилятор конфигурится так, что знает где достать модуль, когда встретит очередной импорт. При этом импортируемый модуль компилируется "на лету".
- на выходе получается один большой js, который и запускается после компиляции всего.

34
Общий раздел / Re: OberonJS
« : Январь 23, 2017, 05:39:43 pm »
Я почти разобрался и даже нашел примеры с канвасами тут на форуме.

Вопрос. Как скомпилированный код, загрузить в HTML для повторного использования?

Вот начал делать образовательный проект по биофизическим моделям.
http://molpit.org/models

Начинаю с разработки модуля Log.
http://molpit.org/models/Log.js

require("Log.js"); не помогает
<script src="Log.js"></script>тоже

Не очень понял, попробую угадать, что ты хочешь:
- скомпилировать обероновский модуль (Log) в js.
- импортировать скомпилированный модуль из HTML, чтобы скомпилировать еще один обероновскм

35
Общий раздел / Re: OberonJS
« : Январь 22, 2017, 04:55:33 pm »
Влад и Алексей, сделайте хотя бы минимальную документацию.
Я просто не понимаю как пользоваться компилятором.

Минимальная там есть, вполне в духе оберона :) У тебя build.py заработал? _out/os.js собрался? Ты его в каком виде хочешь использовать? На вебе или вместе с Node.js?

36
Общий раздел / Re: OberonJS
« : Январь 06, 2017, 12:19:05 am »
Транслятор разрабатывал vlad2.

Тем не менее, valexey главный по PR ;) И демки у него хорошо получались. Применительно к графике valexey скрещивал oberonjs с http://processingjs.org/.

37
Еще хотел добавить: чисто технически на С++ можно реализовать маску как некий контейнер указателей на произольные методы произвольных объектов, которые можно вызывать со всеми необходимым гарантиями корректности типов. Но это будет сильно многословнее в использовании (как в месте декларации/инициализации такой маски так и в месте вызыва нужного метода), чем мой вариант с маской как контейнером ссылок на интерфейсы.

38
Доступ к нужному интерфейсу выглядит так:
mask.get<I1>().method(); // здесь компилятор тоже все проверяет - есть такой интерфейс и у него есть такой метод

39
хочется не рантайм.  А даже вот такое через приведение типов Mask m = (Mask)a;
Только всё это повлечет большую вероятность сделать ошибки, а этого надо избегать (не давать технической возможности делать ошибки)

Мне кажется я делал что-то подобное. Может тебе подойдет такой подход:

Есть набор интерфейсов: I1, I2, ...In. Применительно к твоему случаю можно считать, что каждый интерефейс имеет всего один метод. Далее, ты декларируешь маску как набор интерфейсов:
typedef mask<I1, I3, I5> mask1;
typedef mask<I1, I3> mask2;

Далее эти маски используются на стыке подсистем:
ss1 make_subsystem1(mask1 const&);

Далее у тебя есть полная свобода откуда получить эту маску для передачи в подсистему: либо от объекта, реализующего необходимые интерфейсы, либо от другой маски, имеющей все необходимые интерфейсы. Корректность проверяется во время компиляции, работает в продакшине :)
class object1 : public I1, public I3
{
};

object1 o1;

mask2 m(o1); // OK, компилятор проверяет, что у o1 есть нужные интерфейсы
mask1 m(o1); // компилятор выдает ошибку - не хватвет интерфейса I5

40
А после того как собрали, многопоточка выходила за ограничения по памяти, а после фикса этого выдает не верный результат (размер файла не верен).

Фикснул. Как я и предполагал - непрваильно поток прибивался, до того как он успел файлик записать :)
С памятью интереснее - у меня не получилось выставить ограничение (процесс не прибивается, если много отжирает).

41
Да, а многопоточное решение по производительности не отличимо в этом тесте от однопоточного.

Что очень странно. Единственное объяснение, которое я могу придумать - все уперлось в диск. А наблюдаемая разница на моем нетбуке - это потому что проц совсем дохлый.

42
Общий раздел / Re: Объясните ООП на пальцах
« : Декабрь 06, 2016, 05:38:25 am »
Да, это сишный аналог ООП из С++ (если отбросить виртуальные функции и виртуальное наследование - там сложнее).
Т.е., наследование в С это когда "родитель" идет первым полем в "наследнике". При этом для доступа к родителю приходится квалифицировать это поле. Приведение типа родитель -> наследние будет выглядеть как обычное сишное приведение типа: (derived*)base.

Чтобы сделать аналог dynamic_cast - придется вручную завести type info, на которую будет хранится указатель в каждом объекте. Эту же структуру можно использовать для реализации виртуальных функций.

Вобщем там особой магии со стороны компилятора С++ нет, можно делать ООП на голом С, но муторно.

43
Добавил еще одно решение - мультипоточное. Создал пулреквест - valexey, мерджни когда удобнее.

Как ни странно, получил хороший прирост (больше 30%) даже не моем дохлом нетбуке. Заодно убедился, что на оном нетбуке честных два ядра (раньше думал, что они бутафорские, какие-нибудь хипертрединговые).

Еще из интересных наблюдений - прирост есть даже если сортировать в единственном потоке, но отдельно от чтения. Т.е., если скорость чтения с диска сопоставима со скоростью сортировки в памяти, то за счет мультипоточности можно получить выигрыш даже на одноядерном железе.

44
Похоже, что решение на модуле-2 (merge_heap, merge_qs еще не пускал) выдает не верные результаты на файлах больше 128 Мб. Но надо еще потестить.

Кстати, а как проверяешь корректоность? Отдельная прога?

45
Итоги последнего прогона:
  • vlad fast - отработало быстрее всех, но вылетело с out of memory на файле в 1024 Мб (на всех других размерах отработало корректно)

Странно. Там есть линейная зависимость потребляемой памяти от размера файла, но совсем небольшая - порядка 2.5Mb на каждый Gb исходного файла. Возможно плюсовые потоки в какой-то момент отжирают сколько-то. Стек есть?

Страницы: 1 2 [3] 4 5 ... 93