Я кратко читал о Maxine, которая является реализацией JVM с открытым исходным кодом записанный в Java. Это звучит круговым мне. Если Java потребует, чтобы виртуальная машина работала в, как может сама виртуальная машина писаться в Java (РАЗВЕ, то код VM не потребует VM, в котором можно работать и так далее?).
Править: Хорошо, таким образом, я вижу, что пропустил то, что Java не должен работать в VM. Как затем каждый объясняет, как компилятор LISP может быть записан в LISP? Или это должно быть новым вопросом в целом?
Ваше предположение, что Java требует виртуальной машины , неверно, начиная с .
Я перепрофилировал методы faseIn и faseOut. Кажется, я не получаю черный цвет на изображении PNG. Родительский div не требуется. По-прежнему используется как jQuery.
http://www.pagecolumn.com/javascript/fade.htm
-121--1100564-В качестве общей концепции кэширование не подразумевает стратегию реализации. Распространенная идея заключается в том, что вы сохраняете информацию где-то, которая обеспечивает вам более эффективный доступ, чем то, откуда вы получили данные изначально.
Поэтому в этом случае более эффективно получать данные с диска, чем запрашивать Twitter (как правило, задержка сети больше, чем задержка ввода-вывода диска).
Кроме того, получение данных из памяти более эффективно, чем получение информации с диска (поскольку задержка памяти меньше, чем задержка ввода-вывода диска).
При этом вы можете хранить значения из Twitter в памяти, если хотите, или в файле на диске, если вам нужно, чтобы значения сохранялись, кроме, скажем, завершения работы. Как это сделать, зависит от вас (диск или память, расширения, формат и т.д.). Это твой тайник.
Вы должны быть осторожны в том, что кэш становится устаревшим. Это происходит, когда имеющаяся в кэше информация не синхронизирована с исходным источником данных. Необходимо определить для приложения, насколько приемлемы устаревшие данные, и при необходимости запросить замену значений кэша.
-121--4195943-См. загрузка .
Вы спрашиваете о курице и яйце.
Прочтите: http://en.wikipedia.org/wiki/Bootstrapping_%28compilers%29
Это своего рода «уууаааа, как это может работать ???» - но я думаю, что вы описываете явление, известное как «самообслуживание»:
Языки (или инструментальные цепочки / платформы) не начинаются как самостоятельный хостинг - они начинают жизнь, будучи построенными на существующей платформе: в в определенный момент они становятся достаточно функциональными, чтобы можно было писать программы, которые понимают синтаксис, в котором они сами написаны.
В классической книге AWK есть отличный пример, который вводит программу AWK, которая может анализировать ( урезанная версия как это бывает) другие программы AWK: см. ссылку ниже.
В книге «Красивый код» есть еще один пример, в котором есть программа Javascript, которая может анализировать Javascript.
Я думаю, что следует помнить об этом - если у вас есть (скажем) JVM, написанная на Java, которая, следовательно, может запускать байтовый код Java: JVM, которая запускает саму Java JVM, должна быть изначально размещена (возможно, эта JVM была написана в 'C', а затем скомпилирован в машинный код): это верно в любом случае, в конечном итоге, для программы с собственным хостингом - где-то по ходу.
Таким образом, тайна удалена - потому что в какой-то момент под всем работает программа с машинным кодом.
Это своего рода эквивалент возможности описать английский (и т.д.) язык, используя сам английский язык .... возможно ...
Вероятно, самое близкое, что вы можете получить это: (Пожалуйста, не понижайте меня; это просто академическое упражнение. Конечно, нельзя использовать какие-либо локальные переменные в теле этих искусственных с
блоками!)
struct Bar {
int field;
};
void foo( Bar &b ) {
struct withbar : Bar { void operator()() {
cerr << field << endl;
}}; static_cast<withbar&>(b)();
}
Или, более демонически,
#define WITH(T) do { struct WITH : T { void operator()() {
#define ENDWITH(X) }}; static_cast<WITH&>((X))(); } while(0)
struct Bar {
int field;
};
void foo( Bar &b ) {
if ( 1+1 == 2 )
WITH( Bar )
cerr << field << endl;
ENDWITH( b );
}
или в C++ 0x
#define WITH(X) do { auto P = &X; \
struct WITH : typename decay< decltype(X) >::type { void operator()() {
#define ENDWITH }}; static_cast<WITH&>((*P))(); } while(0)
WITH( b )
cerr << field << endl;
ENDWITH;
-121--1698009- код Java может быть скомпилирован непосредственно в машинный код, так что виртуальная машина не нужна.
-121--2052052-Вы можете ознакомиться с хорошо зарекомендовавшим себя методом начальной загрузки компиляторов. Думаю, это началось в 70-е...
JVM, необходимая для начальной загрузки JVM, написанной на Java, вероятно, не требует большого количества функций (таких как сборка мусора и JIT), может быть очень простой. Затем все более продвинутые функции могут быть реализованы на Java (что, кажется, является целью Maxine, чтобы экспериментировать с новыми идеями в технологии JVM).
Кроме того, Maxine действительно содержит код C, который, я думаю, составляет минимальную среду выполнения, которая используется для работы остальной части Maxine. Я так понимаю, что интересные части (JIT-компилятор, сборка мусора) полностью реализованы на Java.
На прошлой неделе я посмотрел на Максин и подумал о том же:)
1 Создание загрузочного образа
Теперь давайте создадим [загрузочный образ]. На этом шаге Maxine запускается на хосте JVM для настройки прототипа, затем компилирует свой собственный код и данные для создания исполняемой программы для { {1}} целевая платформа.
2 Запуск Maxine
Теперь, когда Maxine скомпилировал себя, мы можем запустить его как стандартную виртуальную машину Java. Команда max vm обрабатывает детали класса и пути к библиотекам, а предоставляет интерфейс, аналогичный стандартной команде запуска Java .
Код Java может быть скомпилирован непосредственно в машинный код, чтобы виртуальная машина не нужен.