dr_klm: (Default)
[personal profile] dr_klm
В общем и с явовской виртуальной машиной вышло по сценарию -- "хотели как лучше, а получилось -- как всегда." ;-) Вроде бы делали универсальный байткод, который write once, run anywhere... Сделали. Но теперь неймется компании Google, которая мало того, что написала для Явы новую виртуальную машину, да еще к тому-же и совершенно другой архитектуры.

Большинству, конечно, все равно, они свои программы перекомпилируют специальным гуглевским компилятором (который из обычных Java class files делает Dalvik-овские dex файлы). А что делать нам, несчастным писателям компиляторов ? ;-)

Но мало того, то байткод другой архитектуры. Еще и загружать динамически его приходится по-новому. И не просто по-новому, оказывается сам этот байткод Dalvik загрузить непосредственно не может, только из zip архива... В общем, грабли на граблях.

Ну вот я вроде разобрался. Пишу, чтобы зафиксировать. Вам это, скорее всего, будет не интересно. ;-)


Итак, возьмем программу Hello.java с одним единственным методом hello, который очевидно что делает. Задача в том, чтобы загрузить этот файл в Андроид динамически, непосредственно в двоичном виде.

Тоесть загрузить нужно Вот этот zip файл, созданный командой:
javac Hello.java && \
dx --dex --output=Hello.zip Hello.class && \ 
adb -e push Hello.zip /data/local
Чтобы это сделать, нужна вот такая программа SayHello.java, которая компилируется и работает вот так:
javac SayHello.java && \ 
dx --dex --output=SayHello.zip SayHello.class && \ 
adb -e push SayHello.zip /data/local \ 
adb -e shell dalvikvm -classpath /data/local/SayHello.zip SayHello
Note: SayHello.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
43 KB/s (2034 bytes in 0.045s)
Hi ! Im' your "Hello World" loader !
First, I'm hooking the DexFile class...Good.
Second, I'm getting hold of its constructor...Good.
Third, I'm instantiating the DexFile object on "/data/local/Hello.zip"...Good.
Fourth, I'm getting to its loadClass method...Good.
Fifth, loading Hello class from the loaded dex...Good.
Sixth, getting hello method of Hello class...Good.
Seventh, invoking the hello method:
Hello WORLD !
Done. Easy, isn't it ? ;-)

Ну не жуть ли ? ;-)


Так что, наступает эра многоплатформенных компиляторов в явовские байткоды со всеми вытекающими "прелестями". Да, явовский байткод не очень оптимален в плане используемого пространства, но неужели такая оптимизация, всего-лишь в несколько раз, стоила того ? И все равно-ж, гады, в процессе загрузки этого .zip с файлом .dex (вызов конструктора DexFile), они докомпилируют его в "оптимизированный" байткод в формате .odex, который еще хранят в отдельном файле.

Вот такая вот бессмысленная политика (ибо по-другому мне это сложно объяснить). Нет, для меня это, конечно, выгодно. Я то думал проект уже закончен. А тут опа, появляется возможность переписать все заново (с сохранением старого, проверенного и удобного API). Типа раз, и снова в девках. ;-) Хорошо, но бессмысленно.

По-хорошему нужно было спрятать свой dalvik подальше (как implementation detail, раз уж они верят, что именно такой подход даст им performance edge), включить в стандартную поставку перекомпилятор dx в прозрачном режиме и пройти явовский testsuite.

Date: 2010-12-15 01:14 am (UTC)
From: [identity profile] caml-programmer.livejournal.com
Ещё один маленький и симпатичный java-писец?

Date: 2010-12-15 01:30 am (UTC)
From: [identity profile] dr-klm.livejournal.com
Ладно еще клоны, которые работают немного, но таки по-разному...

Здесь вообще все не так, а вместо стековой машины, регистровая (это вообще, совершенно мне не понятное design decision). Чем им стек не нравится, чем хуже эмуляция стека эмуляции регистрового файла произвольного размера ?

К.Л.М.

Date: 2010-12-15 05:37 am (UTC)
From: [identity profile] http://users.livejournal.com/_zerg/
Я не настоящий сварщик конечно, но видел статью в которой утверждалось, что регистровые VM быстрее стековых.

Date: 2010-12-15 03:25 pm (UTC)
From: [identity profile] dr-klm.livejournal.com
На каких-то операциях да, на других наоборот. Спор между стековыми и регистровыми машинами, реализованными в железе, идет десятилетиями, что доказывает отсутствие однозначного преимущества. Между виртуальными машинами разницы еще меньше.

К.Л.М.

Date: 2010-12-15 06:39 pm (UTC)
From: [identity profile] zeux.livejournal.com
Я, конечно, тоже не сварщик, однако:
- в железе регистровые машины победили давно и однозначно. Intel x86, x64, IA64, PowerPC, ARM - если честно, я не знаю ни одной нерегистровой, хоть сколько-нибудь популярной.
- при удачном стечении обстоятельств можно замапить регистры vm на железные регистры 1 в 1, что сильно упростит и ускорит JIT

Date: 2010-12-15 08:25 pm (UTC)
From: [identity profile] dr-klm.livejournal.com
я не знаю ни одной нерегистровой, хоть сколько-нибудь популярной.
В популярных процессорах обычно есть и специальные инструкции для работы со стеком. Это, конечно, не делает их полностью стековыми машинами, но показывает, что реальные продукты всегда далеки от теоретических идеалов.

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

Теоретически не очевидно -- что лучше. Ни в железе. Ни, тем более в VM.

Преимущества и недостатки одной архитектуры можно покрыть преимуществами и недостатками другой. Но, если у Вас есть мнение и конкретные аргументы -- говорите. Я буду оппонировать.

К.Л.М.

Date: 2010-12-15 08:58 pm (UTC)
From: [identity profile] zeux.livejournal.com
Мне только что пришло в голову, что x87 fpu таки стековый. (правда, насколько я знаю, особой радости разработчикам под x87 это никогда не приносило)

Ну, инструкции для работы со стеком есть потому что стек используется, конечно - просто не для вычислений, а для spilling-а локальных переменных и для передачи параметров/хранения return value, зависит от ABI.

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

Насколько я понимаю жизнь, стековая архитектура немного усложняет вычисление выражений с общими частями (т.е. появляются лишние инструкции добавления на вершину стека элемента из его середины) и очень препятствует вычислению выражений в случае, если инструкции имеют латентность больше такта. В регистровых машинах зависимости идут по регистрам, в простых стековых машинах зависимости, видимо, бесполезны, потому что любая инструкция зависит от stack pointer и его меняет :) Получается, что в стековой машине придется про верхние N элементов стека помнить, когда станет доступно значение в этом элементе - т.е. фактически сделать из верхушки стека набор регистров. По идее, если сделать следующий шаг и вынести распил между регистрами и стеком на софтварный уровень - железо упростится, и появятся возможности для доп. оптимизаций (переиспользование регистров).

В процессорах уже достаточно давно любят делать dual-issue. С трудом понимаю, как он может работать на одном стеке.

Накладные расходы на декодирование инструкций, по идее, должны быть меньше, и вообще конвеер должен быть проще в регистровых - в трехадресной архитектуре, чтобы сложить две локальных переменных, нужна одна инструкция, в стековой - 3 (да, каждая проще).

Непонятно, что делать с разными наборами вычислительных юнитов - делать три стека? Вряд ли, они должны быть неограниченного размера - иначе смысл в стеке? :) - тогда непонятно, как менеджить память. Делать один стек, на который можно класть что угодно? Если типы разных размеров (int32, float64, vector128), то видимо очень неудобно получается, когда нужно оптимизировать. Плюс, то же самое что и выше про dual-issue - обычно латентности разных юнитов можно скрывать работой других юнитов, кажется, что такое очень сложно делать на одном стеке.

Date: 2010-12-19 04:35 pm (UTC)
From: [identity profile] dr-klm.livejournal.com
Да, основное достоинство стековой архитектуры -- простота. И простота является залогом эффективной реализации, поскольку, больше времени можно уделить оптимизации вместо реализации различных corner-cases, которых, чем сложнее -- тем больше.

Как я себе представляю, многих проблем, для которых придуманы красивые методы оптимизации, в стековой архитектуре просто бы не было.

Ведь регистры -- это просто близкая к ALU, специализированная кэш-память. В стековой архитектуре они не нужны вообще, вместо них была-бы просто кэш-память, не специализированная, которая хранила бы наиболее часто адресуемые адреса из основной памяти, содержащей номинально безграничный стек. Это позволило-бы делать процессоры более масштабируемыми, сделало бы оптимизацию более динамической (что хранить в кэше на этапе выполнения программы виднее, чем на этапе статического ее анализа). Не нужно было-бы перекомпилировать программу под разные под-типы процессоров, с разной шириной и количеством регистров, а просто процессор с большим кэшем, автоматически использовал бы его полностью и содержал бы по-сути большее количество регистров совершенно прозрачно для программиста и компилятора.

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

Никаких проблем нет и с суперскалярной архитектурой. В стековой машине можно применить по-сути целиком и полностью register renaming, только переименовывать не регистры, а несколько верхних элементов стека (сколько -- опять-же было-бы всего-лишь несущественной деталью реализации), что позволило бы развязать кажущиеся зависимости по данным и выполнять несколько инструкций параллельно.

В стеке, конечно, нужно хранить не какие-то конкретные типы данных, а машинные слова. Типы данных определяются поверх машинных слов, это более высокоуровневая концепция.

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

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

К.Л.М.

Date: 2010-12-20 12:34 am (UTC)
From: [identity profile] dr-klm.livejournal.com
высокопроизводительность --> высокопроизводительных
управления кэшем-регистрами --> управления кэш памятью, играющей роль регистров

Date: 2010-12-15 09:09 pm (UTC)
From: [identity profile] zeux.livejournal.com
Прошу прощения, забыл. Если стек это не выделенная область памяти, то вообще все достаточно жестоко - надо поддерживать многопоточность, т.е. иметь всю ту механику которая есть сейчас в стиле store queues, load queues, решать load/store конфликты и т.п. - с тем исключением что собственно hazards будут на каждом шагу - записали на стек, прочитали со стека, записали, прочитали, и т.п. - т.е. если сейчас некоторые архитектуры могут себе позволить пенальти в 60 тактов за Load Hit Store (read after write hazard), например, то в стековых пощады не будет.

А, и еще надо уметь все кеши которые есть на верхушку стека (состояния "регистров" т.е. - в стиле "значение есть на int конвеере, можно забирать") уметь сбрасывать по любой записи на стек другой инструкцией этого потока, ну или при загрузке cache line.

Я всегда считал, что главное достоинство стековой модели - простота концепции, ну и тот факт что древовидные вычисления естественным образом представимы в виде набора стековых инструкций. Вроде бы, как только надо серьезно оптимизировать, все становится сложнее, чем в регистровой.

Date: 2010-12-19 04:40 pm (UTC)
From: [identity profile] dr-klm.livejournal.com
Стэк в памяти, вместо регистров произвольного размера кэш, суперскалярная архитектура с register renaming (sort of). Это то, что я имею в виду. Переключение задач запоминает instruction pointer и stack pointer, два машинных слова (за одну транзакцию на шине удвоенной ширины).

Мне кажется, это должно быть просто и эффективно. По крайней мере, в сравнении с монстрозной архитектурой x86/x87 -- гораздо проще и гораздо эффективнее.

К.Л.М.

Date: 2010-12-20 12:37 am (UTC)
From: [identity profile] dr-klm.livejournal.com
произвольного размера кэш -> кэш произвольного размера (в зависимости от модели процессора)

Date: 2010-12-21 12:03 am (UTC)
From: [identity profile] dr-klm.livejournal.com
Казалось-бы, а почему не пойти дальше, отказавшись (в пользу кэша) не только от регистров, но и от стека тоже, сделав все операции работающими непосредственно с операндами в оперативной памяти*?

Так будет плохо потому, что при прямом доступе к оперативной памяти есть только операции считывания и записи, но нет операции стирания (запись невозможно отменить). Тоесть, если некоторая формула использует более одного промежуточного значения при вычислении результата, ячейки, соответствующие этим промежуточным значениям, будут "dirty" и их таки прийдется по окончании расчета записать из кэша в память**. А шина работает (и всегда будет работать по фундаментальным причинам) гораздо медленнее процессора.

Стек неявно подразумевает операцию стирания. При правильной реализации кэша в описанной мной стековой машине промежуточные значения (вставленные в стек, а затем убранные из него в процессе расчета) в оперативную память никогда записаны не будут.

К.Л.М.

*При небольших ухищрениях (добавив несколько инструкций), на самом деле, можно сделать и так. Но это будет некрасиво.

** Этой проблемы не возникает, если в процессе счета операции производятся только над одной ячейкой памяти, которая и будет по окончании расчета содержать результат. Но это слишком частный случай, когда формула -- лишь последовательность унарных операций.

Date: 2010-12-15 02:26 am (UTC)
From: (Anonymous)
ваш проект заключается в написании компилятора? а какого, если не секрет?

Date: 2010-12-15 03:23 pm (UTC)
From: [identity profile] dr-klm.livejournal.com
Проект называется JEL (http://www.gnu.org/software/jel/), он довольно таки старый. Однако, несмотря на это, поддерживается, прекрасно работает и широко используется.

Сейчас я пытаюсь понять -- нужно для него писать Dalvik backend или нет... Для приложений в Андроид такой мини-компилятор очень бы пригодился. Но переписывать кодогенератор -- занятие не из легких... Тем более, под другую архитектуру... Хотя, все возможно, принципиальных проблем нет, стек в регистрах запросто эмулируется.

К.Л.М.

Date: 2010-12-15 04:30 pm (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
С выходом Java6, в которой появилась поддержка скриптинга, нужда в JEL резко уменьшилась.

Например, в Open Galaxy Viewer (http://sourceforge.net/projects/ogv/) выражения используются для вычисления пользовательских столбцов, фильтров и т.п. Я замерил время -- и все столбцы сделал динамически вычисляемыми (толко оптимизировал специальный случай для простейших выражений вида tech.drive). Прекомпилированные выражения JavaScript вычислялись где-то вдвое медленнее нативных жавовских, а оптимизированные вообще не отличались (в пределах погрешности). util.Evaluator -- сам вычислитель, gui.dialogs.EditColumn -- форма редактирования, с блекджеком и шлюхами примитивной подсветкой синтаксиса и деревом свойств.

Date: 2010-12-15 04:53 pm (UTC)
From: [identity profile] dr-klm.livejournal.com
API javax.script на то и javax, что присутствует не во всякой Java платформе. Кроме того, нужен же еще, собственно, и движок скрипта, который может быть, а может и не быть...

JEL -- это один self-contained .jar файл, на 35k.

Так что может, в каких-то случаях и уменьшилась, но все равно использование javax ведет к привязке к конкретной Java платформе и установленным extensions. В случае использования JEL, достаточно просто забросить .jar в проект и всё.

По производительности (во время выполнения и во время компиляции) вряд-ли будет быстрее JEL. Во-первых, поскольку нормальная JVM очень круто оптимизирует (движкам скриптовых языков до этого еще расти), а во-вторых интерфейс с приложением прямой, без всяких посредников. Компиляция однопроходная.

К.Л.М.

Date: 2010-12-15 05:17 pm (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
Насчёт производительности я не сомневаюсь, что JEL обгоняет во всех случаях. Но не везде эта разница существенна. Кроме JavaScript есть реализации этих интерфейсов ещё для десятков языков, на любой вкус (кроме того, они предоставляют свой собственный интерфейс, так что можно обойтись без javax.script), некоторые возможно и меньше 35Кб (но это интерпретаторы). В Андроиде должна быть скриптовая машина.

Так что область востребованности JEL сильно сузилась. Хм-м-м, может попробовать использовать в OGV? Текущие потребности удовлетворяет, +5% размера допустимо. Нет, универсальность и расширяемость, пожалуй, важнее.

Date: 2010-12-15 05:37 pm (UTC)
From: [identity profile] dr-klm.livejournal.com
Ну конечно, по сравнению с тем временем, когда JEL только только появилась и была монополистом в соответствующем сегменте рынка (одним из первых third-party компиляторов в байткод JVM, между прочим), уровень востребованности JEL только сузился, если для Вас это так важно утвердить. Сузился в том смысле, что появились другие продукты, пытающиеся решать ту-же задачу.

Но не нужно забывать, что проекту уже 12 лет.

Тем не менее, эта библиотека очень даже востребована и актуальна по сей день. В первую очередь, за счет малого размера, простоты и более универсальной доступности на различных Java платформах. Причем, не обязательно использовать язык JEL, я знаю народ, который выбрасывает парсер и цепляет JEL в качестве кодогенератора.

К.Л.М.

Date: 2010-12-15 06:40 pm (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
Ну так мы вроде ни в чём и не расходимся во мнениях. ;)

Как минимум, сделать компилятор в Далвик -- интересная задача. А значит, стоящая. Я делал компиляторы и для менее осмысленных вещей.

Date: 2010-12-15 08:17 pm (UTC)
From: [identity profile] dr-klm.livejournal.com
Задача интересная. Но хорошо-бы, перед тем как делать, узнать "политику партии". То-ж можно возиться возиться, а они вместо того, чтобы стандартизовать (ну, или хотя-бы заморозить в каком-то виде) описание байткода dex, возьмут и включат перекомпилятор в стандартную библиотеку. А гоняться за постоянно изменяющимся (возможно, без сохранения совместимости) промежуточным форматом -- то еще удовольствие. Особенно при наличии перекомпилятора на каждом устройстве, который сделает такую погоню ненужной.

Вот Вы знаете, что они там себе в Гугле думают ? Я лично твердого ответа по поводу их дальнейших планов насчет dalvik не нашел... Они таки собираются делать fork байткода, или таки сделают свою библиотеку (в т.ч. и класс ClassLoader) полностью совместимой с явовской ?

К.Л.М.

Date: 2010-12-15 08:16 am (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
И что же сложного в этих командах? И почему бы не сделать просто new dalvik.system.DexFile("/data/local/Hello.zip").loadClass(...)?

Parrot вот уже много лет пилят -- регистровую виртуальную машину для Perl 6 и других языков. Говорят, так эффективнее. Да и CLR -- регистро-стековая.

Date: 2010-12-15 03:12 pm (UTC)
From: [identity profile] dr-klm.livejournal.com
почему бы не сделать просто new dalvik.system.DexFile("/data/local/Hello.zip").loadClass(...)?
Потому, что явовский исходник компилируется стандартным javac (в платформе Андроид нет компилятора Java, только перекомпилятор dex из *.class в один файл .zip, содержащий один файл .dex и MANIFEST), а javac о классе dalvik.system.DexFile ничего не знает. Этот класс существует только внутри Dalvik VM (у него даже нет явовского исходника, насколько я помню).

Спор между регистровыми и стековыми машинами вечен, что доказывает отсутствие подавляющего превосходства одних над другими. И там и там есть свои плюсы и минусы, какие-то операции лучше ложатся на стек, какие-то на регистры. Но это если речь идет о машинах в железе. Для виртуальных машин, которые потом все равно компилируют код на лету, разницы между стековыми и регистровыми архитектурами еще меньше.

К.Л.М.

Date: 2010-12-15 04:10 pm (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
Некоторые жавовские стандартные классы тоже не на жаве написаны (Math, например). Но публичный интерфейс есть. Почему бы не быть и dalviklib.jar, содержащему интерфейс к dalvik.system.DexFile? Или же, если это ненужные детали реализации, рекомендованным должно быть простое использование ClassLoader. Не верится мне, что нет прямее пути.

Стековая виртуальная машина просто намного проще, её соберёт и школьник. Все учебные компиляторы компилируют именно в стековую машину, а из регистров используют разве что PC, SP и PSW. На практике же выполнение на дешёвом процессоре с РОН оказывается быстрее (да, жаль, что Форт не занял место Бейсика 30 лет назад, многое бы пошло не так). Ну а сейчас регистровые команды просто легче параллелятся. Так что стек остался в учебниках.

Date: 2010-12-15 04:35 pm (UTC)
From: [identity profile] dr-klm.livejournal.com
Почему бы не быть и dalviklib.jar, содержащему интерфейс к dalvik.system.DexFile?
Почему бы и не быть... Но нету. ;-))

Но краткость записи тут не главное. Хотя да, я подал так, что это бросается в глаза и кажется главным, на первый взгляд... Главное, что я не могу просто загрузить байткод из памяти. Мне его нужно будет: 1) сгенерировать; 2) зазиповать; 3) записать на диск; 4) запустить приведенную выше программу (ну или Ваш, краткий ее аналог), которая заставит Dalvik VM: 4a) раззиповать архив; 4b) "оптимизировать" хранящийся там dex; 4c) записать оптимизированный его вариант .odex на диск; 4d) отобразить (mmap) этот, записанный на диск odex, в память; и только потом, собственно, приступить к инициализации этого класса...

Краткость записи тут не главное. Очень много лишних ненужных действий...

Стековая виртуальная машина просто намного проще, её соберёт и школьник.
Ну, это смотря какой школьник. ;-) Меня, например, в школе больше интересовали игры с нулевым исходом и эффективная реализация алгоритма мини-макс. ;-)) Хотя, согласен, ничего принципиально сложного в стековых машинах нет. Как нет ничего принципиально сложного и в регистровых машинах или в эмуляции стека в регистрах. Да, распределение регистров -- это лишний проход по дереву, но и в этом ничего принципиально сложного нет. Для всего этого есть классические алгоритмы в учебниках.

Тем не менее, между "алгоритмом в учебнике" и "реальным программным продуктом" есть большая разница.

К.Л.М.

Date: 2010-12-15 04:59 pm (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
Ага! То есть проблема на самом деле в другом -- что программа на Андроиде должна скомпилировать данное выражение в эффективный код (код Далвика) и (многократно) выполнить его. Вы решаете её методом математика: погасить огонь, вылить огонь из чайника... Может есть краткий путь? Например, какой интерфейс реализует DexFile, может есть другие имплементации?

Date: 2010-12-15 05:23 pm (UTC)
From: [identity profile] dr-klm.livejournal.com
Это не я решаю. На сегодня другого пути загрузить код в Dalvik нет. Только через такое вот многократное выливание воды из чайника. В этом-то, собственно, и проблема...

Причем, я подозреваю, что проблема эта архитектурная. Одна из основных фишек Dalvik в том, что байт код не загружается, а отображается (причем, в формате odex) в память через mmap. Было бы просто, если бы была возможность подсунуть виртуальной машине массив с байткодом в формате odex для непосредственной загрузки. Но, этого мне никто сделать не даст, поскольку odex -- небезопасный формат, там многие проверки уже сделаны (собственно, в этом и заключается "оптимизация" dex -> odex). Если же я стартую с dex, то, по крайней мере, один раз вылить воду из чайника, записав соответствующий odex на диск, а потом торжественно отобразив его обратно в память через mmap сделать прийдется (при этом, заметьте, выигрыш от использования mmap за счет этого полностью сходит на нет). Но и этого мне не дают сделать, поскольку текущая реализация Android позволяет загружать файлы только в формате .zip, содержащие manifest и dex. Тоесть воду прийдется наливать и выливать еще раз.

Гениальные программисты работают в корпорации Google ! ;-)

К.Л.М.

Date: 2010-12-15 06:36 pm (UTC)
ext_605364: geg MOPO4 (Default)
From: [identity profile] gegmopo4.livejournal.com
Я не сомневаюсь в креативности гуглевых программистов (как и программистов любой корпорации, и вообще программистов), но остаётся крохотный шанс, что вы не поняли друг друга. Вот если попробовать использовать JEL как есть, компилируя в жавовский байт-код, -- вдруг подхватит? Встроенный браузер выполняет Java-апплеты?

Если же всё настолько печально, может быть PathClassLoader (http://developer.android.com/reference/dalvik/system/PathClassLoader.html#PathClassLoader(java.lang.String, java.lang.String, java.lang.ClassLoader)) сократит полшага, вроде он может читать и незазипованные dex.

Date: 2010-12-15 08:11 pm (UTC)
From: [identity profile] dr-klm.livejournal.com
Если честно, я баллансирую пока между "делать"/"не делать". Что-то мне подсказывает, что текущее положение дел временное и они таки включат "dex" (в стандартную библиотеку)... тогда можно будет просто его вызвать и обойтись малой кровью. Переписывать кодогенератор -- дело муторное. В принципе, он у меня может сгенерировать процентов на 90 того, что может сгенерировать стандартный javac. Переписывать его означало бы браться за задачу, за которую в google не взялись, остановившись на перекомпиляции байткода.

PathClassLoader, а так-же DexClassLoader -- это такое западло для "умников", которые вооружившись тем-же ха-ха Гуглем, думают, что они могут теперь легко беседовать на равных на любые темы от кодогенераторов, до адронного коллайдера. Загрузку непосредственно из raw dex ни PathClassLoader, ни DexClassLoader на сегодня не поддерживает. Да, там написано, что поддерживает, я знаю. Но, если на заборе написано Х.., это-же не значит, что там действительно ... ;-))

Нет, ну Вы попробуйте, конечно... ;-)))

К.Л.М.

Date: 2010-12-16 08:05 am (UTC)
From: [identity profile] antilamer.livejournal.com
Прошу прощения за офтоп и надоедливость - но, в отсутствие ответа по e-mail (может, опять написал на не тот адрес..), не теряю надежды на ответ здесь - не появилось ли у Вас еще время/желание написать что-нибудь о языке J в fprog.ru?

Date: 2010-12-19 02:55 pm (UTC)
From: [identity profile] dr-klm.livejournal.com
Евгений... отсутствие ответа, в данном случае, и было ответом.

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

Кроме того, я не вижу смысла писать снова то, что уже написано. Просто, чтобы это было в другом (антикварном) формате ? Все что я мог бы написать в журнальном формате о J и даже больше есть в этом ЖЖ, и все это можно легко найти в google и по тэгам. Кроме того, в отличие от журнального формата, мне здесь можно задать вопрос (или добавить дополняющую ссылку). На вопросы к старым записям, если они по теме, я отвечаю.

К.Л.М.

Date: 2010-12-19 03:16 pm (UTC)
From: [identity profile] antilamer.livejournal.com
Понял, спасибо за ответ, больше беспокоить не буду :)

Profile

dr_klm: (Default)
Dr. K. L. Metlov

March 2017

S M T W T F S
   1234
567891011
1213141516 1718
19202122232425
262728293031 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 20th, 2025 02:12 pm
Powered by Dreamwidth Studios