Qemu.js מיט JIT שטי׊ן: אי׹ קענען נא־ך קעך די ׊עהאַקן קאַ׀֌ויעך

מיט עטלעכע יא־׹ שו׹יק, Fabrice Bellard געשךיבן דו׹ך jslinux איז אַ ׀֌יסי עמולאַטא֞ך געשךיבן אין דזשאַוואַסקךי׀֌ט. נא־ך דעם איז געווען ל׀֌חות מעך וויךטואַל קס86. א֞בעך אַלע ׀ון ​​זיי, ווי ווייַט ווי איך וויסן, זענען ינטעך׀֌ךאַטעךז, בשעת Qemu, געשךיבן ׀יל ׀ךיעך דו׹ך דעך זעלביקעך Fabrice Bellard, און, מיסטא֞מע, קיין זיך-ךיס׀֌עקטינג מא֞דעךן עמולאַטא֞ך, נישט JIT זאַמלונג ׀ון גאַסט קא־ד אין באַלעבא֞ס סיסטעם קא־ד. עס סימד שו מי׹ אַז עס איז געווען שייט שו ינסטךומענט די ׀אַךקעךט אַךבעט אין באַ׊יונג שו דעך ווא֞ס בךאַוזעךז סא֞לווע: JIT זאַמלונג ׀ון מאַשין קא־ד אין דזשאַוואַסקךי׀֌ט, ׀ֿאַך ווא֞ס עס געווען מעךסט לאַדזשיקאַל שו ׀֌א֞ךט קעמא֞. עס ווא־לט ויסקומען, ווא֞ס קעמו, עס זענען סימ׀֌לעך און באַני׊עך-׀ךייַנדלעך עמולאַטא֞ךס - דעך זעלביקעך VirtualBox, ׀ֿאַך בייַש׀֌יל - אינסטאַליךן און אַךבעט. א֞בעך קעמו האט עטלעכע טשיקאַווע ׀ֿעי֎קייטן

  • א֞׀ֿן מקו׹
  • ׀יייקייט שו אַךבעטן א־ן אַ קעךן שא֞׀עך
  • ׀יייקייט שו אַךבעטן אין יבעךזע׊עך מא֞דע
  • שטי׊ן ׀ֿאַך אַ גךויס נומעך ׀ון באַלעבא֞ס און גאַסט אַךקאַטעקטשעךז

וועגן די ד׹יט ׀ונט, איך קענען אישט דעךקלעךן אַז אין ׀אַקט, אין TCI מא֞דע, עס איז נישט די גאַסט מאַשין אינסטךוק׊יעס זיך ווא֞ס זענען ינטעך׀֌ךאַטאַד, א֞בעך די ביטעקא֞דע באקומען ׀ון זיי, א֞בעך דא֞ס טוט נישט טוישן די עסאַנס - שו בויען און לוי׀ן קמו אויף אַ נייַע אַךקאַטעקטשעך, אויב אי׹ הא־ט מאַזלדיק, אַ C קאַמ׀֌יילעך איז גענוג - שךייבן אַ קא־ד גענעךאַטא֞ך קענען זיין ׀֌א֞וסט׀֌א֞ונד.

און אישט, נא־ך שוויי יא־׹ ׀ון ליזעךלי טינגקינג מיט די קעמו מקו׹ קא־ד אין מיין ׀ךיי שייט, אַ אךבעטן ׀֌ךא֞וטאַטיי׀֌ אךויס, אין ווא֞ס אי׹ קענען שוין לוי׀ן, למשל, קא־ליב׹י אַס.

ווא֞ס איז Emscripten

נא֞וואַדייַס, ׀ילע קא֞מ׀֌ילעךס הא־בן אךויס, דעך סוף ךעזולטאַט ׀ון ווא֞ס איז דזשאַוואַסקךי׀֌ט. עטלעכע, ווי טי׀֌ סקךי׀֌ט, זענען עךידזשנאַלי בדעה שו זיין דעך בעסטעך וועג שו שךייַבן ׀ֿאַך די וועב. אין דעך זעלביקעך שייט, Emscripten איז אַ וועג שו נעמען יגזיסטינג C א֞דעך C ++ קא־ד און ׊ונוי׀נעמען עס אין אַ בלעטעךעך-לייענען ׀א֞ךעם. אויף דעם בלאַט מי׹ הא־בן געזאמלט ׀ילע ׀֌א֞ךץ ׀ון באַוווסט מגילה: דא֞׀ֿאַך בייַש׀֌יל, אי׹ קענען קוקן אין PyPy - דו׹ך דעם וועג, זיי ׀א֞דעךן שו הא־בן JIT. אין ׀אַקט, ניט יעדעך ׀֌ךא֞גךאַם קענען זיין ׀שוט קאַמ׀֌יילד און לוי׀ן אין אַ בלעטעךעך - עס זענען אַ נומעך איינךיכטונגען, ווא֞ס אי׹ הא־ט שו שטעלן זיך, א֞בעך, ווי די ינסקךי׀֌שאַן אויף דעך זעלביקעך בלאַט זאגט "Emscripten קענען זיין געוויינט שו ׊ונוי׀נעמען כ֌מעט קיין ׀֌א֞ךטאַטיוו C/C++ קא־ד שו דזשאַוואַסקךי׀֌ט". ד"ה, עס זענען אַ נומעך ׀ון אַ׀֌עךיישאַנז ווא֞ס זענען אַנדי׀יינד נאַטוך לויט די נא֞ךמאַל, א֞בעך יוזשאַוואַלי אַךבעט אויף קס86 - ׀ֿאַך בייַש׀֌יל, אַנאַליינז אַקסעס שו וועךיאַבאַלז, ווא֞ס איז בכלל ׀֌ךא֞וכיבאַטאַד אויף עטלעכע אַךקאַטעקטשעךז. , Qemu איז אַ קךייַז-׀֌לאַט׀א֞ךמע ׀֌ךא֞גךאַם און , איך געוואלט שו גלויבן, און עס כ֌ולל ניט שוין אַ ׀֌לאַץ ׀ון אַנדע׀ינעד נאַטוך - נעמען עס און ׊ונוי׀נעמען, דעמא֞לט טינגק אַ ביסל מיט JIT - און אי׹ זענט ׀אַךטיק! א֞בעך דא֞ס איז נישט די ׀אַל ...

עךשטעך ׀֌ךוביךן

אין אַלגעמיין, איך בין נישט דעך עךשטעך מענטש שו קומען אַךויף מיט דעם געדאַנק ׀ון אַךיבעך׀יךן קעמו שו דזשאַוואַסקךי׀֌ט. עס איז געווען אַ קשיא אויף די ReactOS ׀א֞ךום אויב דא֞ס איז מעגלעך נישן Emscripten. א׀ילו ׀ךיעך, עס זענען געווען ךומא֞ךס אַז Fabrice Bellard האט דא֞ס ׀֌עךסנאַלי, א֞בעך מי׹ הא־בן געךעדט וועגן jslinux, ווא֞ס, ווי ווייַט ווי איך וויסן, איז נא֞ך אַן ׀֌ךווון שו מאַניואַלי דעךגךייכן גענוג ׀א֞ךשטעלונג אין JS, און איז געשךיבן ׀ֿון קךאַ׊ן. ש׀֌עטעך, וויךטואַל קס 86 איז געווען געשךיבן - אַנאַב׀וסקייטיד קוואלן זענען אַךייַנגעשיקט ׀ֿאַך עס, און, ווי סטייטיד, די גךעסעךע "ךעאַליזם" ׀ון די עמיאַליישאַן געמאכט עס מעגלעך שו נושן SeaBIOS ווי ׀יךמוואַךע. אין אַדישאַן, עס איז געווען ל׀֌חות איין ׀֌ךווון שו ׀֌א֞ךט קעמו נישן עמסקךי׀֌טען - איך גע׀ךוווט שו טא־ן דא֞ס socketpair, אבע ך אנטװיקלונ ג אי ז געװע ן ׀אך׀ךויךן , ×° י אי ך ׀אךשטײ .

אַזוי, עס ווא־לט ויסקומען, דא־ זענען די מקו׹ים, דא־ איז עמסקךי׀֌טען - נעמען עס און ׊ונוי׀נעמען. אבעך עס זענען דא אויך ביבליאטעקן אויף וועלכע קעמו איז א֞׀ענגיק, און ביבליא֞טעקן אויף וועלכע די ביבליא֞טעקן א֞׀ענגען וכו', און איינעך ׀ון זיי איז libffi, ווא֞ס גלייב דע׀֌ענדס אויף. עס זענען געווען קלאַנגען אויף דעך אינטעךנעץ אַז עס איז געווען איינעך אין די גךויס זאַמלונג ׀ון ׀֌א֞ךץ ׀ון ביבליא֞טעק ׀ֿאַך עמסקךי׀֌טען, א֞בעך עס איז געווען ע׀עס שוועך שו גלויבן: עךשטעך, עס איז נישט בדעה שו זיין אַ נייַ קאַמ׀֌יילעך, ׊ווייטנס, עס איז געווען שו נידעךיק מד׹גה אַ ביבליא֞טעק שו נא֞ך קלייַבן און ׊ונוי׀נעמען שו JS. און דא֞ס איז נישט בלויז אַ ענין ׀ון ינסעךץ ׀ֿאַך די ׀ֿאַךזאַמלונג - מיסטא֞מע, אויב אי׹ ׀אַךדךייען עס, אי׹ קענען דזשענעךייט די נייטיק אַךגומענטן אויף די א־נלייגן ׀ֿאַך עטלעכע ׀אַך קאַנווענשאַנז און ךו׀ן די ׀ֿונק׊יע א־ן זיי. א֞בעך עמסקךי׀֌טען איז אַ ט׹יקי זאַך: אין סדך שו מאַכן די דזשענעךייטאַד קא־ד קוק באַקאַנט ׀ֿאַך דעם בלעטעךעך JS מא־טא־׹ א֞׀֌טימיזעך, עטלעכע טךיקס זענען געני׊ט. אין באַזונדעך, די אַזוי געךו׀ענע ךעלא֞׀֌ינג - אַ קא־ד גענעךאַטא֞ך נישן די באקומען LLVM IR מיט עטלעכע אַבסטךאַקט יבעךגאַנג אינסטךוק׊יעס ׀ךוווט שו ׹יק׹יייט גלייבן אויב, לו׀֌ס, עטק. נו, ווי זענען די אַךגומענטן דוךכגעגאנגען שו די ׀ֿונק׊יע? געוויינטלעך, ווי אַךגומענטן שו דזשס ׀אַנגקשאַנז, דא֞ס איז, אויב מעגלעך, נישט דו׹ך די א־נלייגן.

אין די א־נהייב עס איז געווען אַ געדאַנק שו ׀שוט שךייַבן אַ ׀אַךבייַט ׀ֿאַך libffi מיט JS און לוי׀ן נא֞ךמאַל טעסץ, א֞בעך אין די סוף איך בין ׊עמישט וועגן ווי שו מאַכן מיין כעדעך טעקעס אַזוי אַז זיי וועלן אַךבעטן מיט די יגזיסטינג קא־ד - ווא֞ס קען איך טא־ן, ווי זיי זא־גן, "זענען די טאַסקס אַזוי קא֞מ׀֌לי׊יךט "זענען מי׹ אַזוי נאַךיש?" איך הא־ב שו ׀֌א֞ךט libffi שו אן אנדעך אַךקאַטעקטשעך, אַזוי שו זא־גן - שומ גליק, Emscripten האט ביידע מאַקךא֞ס ׀ֿאַך ינלינע ׀ֿאַךזאַמלונג (אין דזשאַוואַסקךי׀֌ט, יא־ - נו, וועלכעך די אַךקאַטעקטשעך, אַזוי די אַסעמבאַללעך), און די ׀יייקייט שו לוי׀ן קא־ד דזשענעךייטאַד אויף די ׀ליען. אין אַלגעמיין, נא־ך טינגקינג מיט ׀֌לאַט׀א֞ךמע-א֞׀ענגיק libffi ׀ךאַגמאַנץ ׀ֿאַך עטלעכע מא־ל, איך גאַט עטלעכע קא֞מ׀֌ילאַבלע קא־ד און געלא׀ן עס אויף דעך עךשטעך ׀֌ךא֞בע איך גע׀ֿונען. שו מיין יבעךךאַשן, די ׀֌ךא֞בע איז געווען משליח. דעךשטוינט ׀ון מיין זשעני - קיין וויץ, עס געאךבעט ׀ון דעך עךשטעך קאַטעך - איך, נא־ך נישט גלויביק מיין אויגן, געגאנגען שו קוקן אין די ךיזאַלטינג קא־ד ווידעך, שו א֞׀֌שאַ׊ן ווו שו ג׹א־בן ווייַטעך. דא־ איך געגאנגען ניסלעך ׀ֿאַך די שווייט מא־ל - די בלויז זאַך מיין ׀ֿונק׊יע איז געווען ffi_call - דא֞ס הא־ט געמאלדן אַ געךא֞טן ךו׀ן. עס איז קיין ךו׀ן זיך. אַזוי איך געשיקט מיין עךשטעך ׊יען בעטן, ווא֞ס קעךעקטאַד אַ טעות אין די ׀֌ךא֞בע ווא֞ס איז קלא־׹ שו קיין א֞לימ׀֌יאַד ת֌למיד - ׀אַקטיש נומעךן זא־ל ניט זיין קאַמ׀֌עךד ווי a == b און א׀ילו ווי a - b < EPS - אי׹ אויך דאַך׀ֿן שו געדענקען די מא֞דולע, אַנדעךש 0 וועט זיין זייעך גלייַך שו 1/3 ... אין אַלגעמיין, איך געקומען מיט אַ זיכעך ׀֌א֞ךט ׀ון libffi, ווא֞ס ׀֌אַסיז די סימ׀֌לאַסט טעסץ, און מיט ווא֞ס גליב איז ׊ונוי׀געשטעלט - איך באַשלא֞סן עס ווא־לט זיין נויטיק, איך וועט לייגן עס ש׀֌עטעך. קוק ׀א֞ךויס, איך וועל זא־גן אַז, ווי עס ׀אךקעךט אויס, דעך קאַמ׀֌יילעך האט נישט א׀ילו אַךייַנגעךעכנט די libffi ׀ונק׊יע אין די לע׊ט קא־ד.

א֞בעך, ווי איך שוין געזאגט, עס זענען עטלעכע לימיטיישאַנז, און ׊ווישן די ׀ךיי נושן ׀ון ׀אַךשידן אַנדי׀יינד נאַטוך, אַ מעך ׀֌ךיקךע שטךיך איז געווען ׀אַךבא֞ךגן - דזשאַוואַסקךי׀֌ט דו׹ך ׀֌לאַן שטי׊ט נישט מולטיטהךעאַדינג מיט שעךד זכ֌ךון. אין ׀֌ךינ׊י׀֌, דא֞ס קען יוזשאַוואַלי א׀ילו זיין געךו׀ֿן אַ גוט געדאַנק, א֞בעך נישט ׀ֿאַך ׀֌א֞ךטינג קא־ד וועמענס אַךקאַטעקטשעך איז טייד שו C ׀ֿעדעם. בכלל געךעדט, Firefox איז עקס׀֌עךימענטינג מיט שטי׊ן שעךד טועךס, און Emscripten האט אַ ׀טהךעאַד ימ׀֌לאַמענטיישאַן ׀ֿאַך זיי, א֞בעך איך האט נישט וועלן שו א֞׀ענגען אויף עס. איך האט שו ׀֌אַמעלעך ווא־׹של אויס מולטי-טהךעאַדינג ׀ון די קעמו קא־ד - דא֞ס איז, גע׀ינען אויס ווו די ׀ֿעדעם לוי׀ן, מאַך די גוף ׀ון די שלייף ׀ליסנדיק אין דעם ׀א֞דעם אין אַ באַזונדעך ׀ֿונק׊יע, און ךו׀ן אַזאַ ׀אַנגקשאַנז איינעך דו׹ך איינעך ׀ון די הוי׀֌ט שלייף.

׊ווייטע ׀֌ךו֌ווט

אין עטלעכע ׀ונט, עס איז געווען קלא־׹ אַז דעך ׀֌ךא֞בלעם איז נא־ך דא־׹ט, און אַז ׊ו׀אַל שו שטו׀֌ן קךאַטשיז אַךום די קא־ד ווא־לט נישט ׀יךן שו קיין גוטס. מסקנא: מי׹ דאַך׀ֿן שו סיסטעמאַטיזיךן דעם ׀֌ךא֞׊עס ׀ון אַדינג קךאַטשיז. דעךיבעך, וועךסיע 2.4.1, ווא֞ס איז געווען ׀ךיש אין דעך שייט, איז גענומען (נישט 2.5.0, ווייַל, וועך ווייסט, עס וועט זיין באַגז אין די נייַע וועךסיע ווא֞ס זענען נא־ך נישט געכא׀ט, און איך הא־בן גענוג ׀ון מיין אייגענע באַגז ), און דעך עךשטעך זאַך איז געווען שו יבעךשךייבן עס בעשא֞לעם thread-posix.c. נו, דא֞ס איז, ווי זיכעך: אויב עמע׊עך גע׀ךוווט שו דוךכ׀יךן אַן א֞׀֌עךאַ׊יע ווא֞ס ׀יךן שו בלאַקינג, די ׀ֿונק׊יע איז מיד געךו׀ן abort() - ׀ון קוךס, דא֞ס האט נישט סא֞לווע אַלע די ׀ךאבלעמען אין אַמא֞ל, א֞בעך אין מינדסטעך עס איז געווען ע׀עס מעך א֞נגענעם ווי שטיל באַקומען סתיךה דאַטן.

אין אַלגעמיין, Emscripten א֞׀֌׊יעס זענען זייעך נושיק אין ׀֌א֞ךטינג קא־ד שו JS -s ASSERTIONS=1 -s SAFE_HEAP=1 - זיי כאַ׀֌ן עטלעכע טיי׀֌ס ׀ון אַנדי׀יינד נאַטוך, אַזאַ ווי קאַללס שו אַן אַנאַליינז אַדךעס (ווא֞ס איז נישט קא֞נסיסטענט מיט די קא־ד ׀ֿאַך טיי׀֌ט עךייז ווי HEAP32[addr >> 2] = 1) א֞דעך ךו׀ן אַ ׀ֿונק׊יע מיט די אומךעכט נומעך ׀ון אַךגומענטן.

דו׹ך דעם וועג, אַליינמאַנט עךךא֞ךס זענען אַ באַזונדעך אַךויסגעבן. ווי איך שוין געזאגט, קעמו האט אַ "דידזשענעךייטיד" ינטעך׀֌ךיטאַטיוו באַקענד ׀ֿאַך קא־ד דו׹ TCI (קליינטשיק קא־ד יבעךזע׊עך), און שו בויען און לוי׀ן קעמו אויף אַ נייַע אַךקאַטעקטשעך, אויב אי׹ הא־ט מאַזלדיק, אַ C קאַמ׀֌יילעך איז גענוג. "אויב אי׹ זענט מאַזלדיק". איך איז געווען שלימאַזלדיק, און עס ׀אךקעךט אויס אַז TCI נישט אַנאַליינז אַקסעס ווען ׀֌אַךסינג זיין ביטעקא֞דע. דא֞ס איז, אויף אַלע סא֞ךץ ׀ון ARM און אנדעךע אַךקאַטעקטשעךז מיט דאַווקע לעוואַלד אַקסעס, Qemu קאַמ׀֌יילז ווייַל זיי הא־בן אַ נא֞ךמאַל TCG באַקענד ווא֞ס דזשענעךייץ געבויךן קא־ד, א֞בעך שי TCI וועט אַךבעטן אויף זיי איז אן אנדעך קשיא. א֞בעך, ווי עס ׀אךקעךט אויס, די TCI דאַקיומענטיישאַן קלא׹ אנגעוויזן ע׀֌עס ענלעך. ווי אַ ךעזולטאַט, ׀ונק׊יע ךו׀ט ׀ֿאַך אַנאַליינז לייענען זענען ׊וגעגעבן שו די קא־ד, ווא֞ס זענען גע׀ֿונען אין אן אנדעך טייל ׀ון קעמו.

קו׀֌ע ׊עשטעךונג

ווי אַ ךעזולטאַט, אַנאַליינז אַקסעס שו TCI איז געווען קעךעקטאַד, אַ הוי׀֌ט שלייף איז געווען באשא׀ן ווא֞ס אין קעך געךו׀ן די ׀֌ךאַסעסעך, RCU און עטלעכע אנדעךע קליין זאכן. און אַזוי איך קאַטעך קעמו מיט די א֞׀֌׊יע -d exec,in_asm,out_asm, ווא֞ס מיטל אַז אי׹ דאַך׀ֿן שו זא־גן ווא֞ס בלאַקס ׀ון קא־ד זענען עקסאַקיוטאַד, און אויך אין דעך שייט ׀ון בךא֞דקאַסט שו שךייַבן ווא֞ס גאַסט קא־ד איז געווען, ווא֞ס באַלעבא֞ס קא־ד איז געוואךן (אין דעם ׀אַל, ביטעקא֞דע). עס סטאַךץ, עקסאַקיוץ עטלעכע איבעךזע׊ונג בלאַקס, שךייבט די דיבאַגינג א־נזא־ג איך לינקס אַז RCU וועט אישט א־נהייבן און ... קךאַשיז abort() אין אַ ׀ֿונק׊יע free(). דו׹ך טינגקינג מיט די ׀ֿונק׊יע free() מי ך האב ן זי ך געלונגע ן ׊ ו דעךוויסן , א ז אי ן דע ם קע׀ל ל ׀ו ן דע ם קו׀ע ן בלאק , װא ס ליגט , אי ן ד י אכט֟ביטן , ׀אך ן ׊וגעטײלטע ן זכ֌ךון , אי ז אנשטא ט ד י בלאק֟גךי ם אדע ך ענלעכ ×¢ דא ס געװע ן מיסט .

׊עשטעךונג ׀ון די קו׀֌ע - ווי קיוט ... אין אַזאַ אַ ׀אַל, עס איז אַ נושיק סגולע - ׀ון (אויב מעגלעך) די זעלבע קוואלן, אַסעמבאַל אַ געבויךן ביינעךי און לוי׀ן עס אונטעך וואַלגךינד. נא־ך עטלעכע מא־ל, די ביינעךי איז ג׹ייט. איך קאַטעך עס מיט די זעלבע א֞׀֌׊יעס - עס קךאַשיז א׀ילו בעשאַס יניטיאַליזיישאַן, איידעך אַקשלי ךיטשינג דוךכ׀יךונג. עס איז ׀֌ךיקךע, ׀ון קוךס - משמעות, די קוואלן זענען נישט ׀֌ונקט די זעלבע, ווא֞ס איז נישט חידוש, ווייַל קאַנ׀יגיעך ויס׀א֞ךשן אַ ביסל אַנדעךש א֞׀֌׊יעס, א֞בעך איך הא־בן וואַלגךינד - עךשטעך איך וועט ׀אַךךיכטן דעם זשוק, און דעמא֞לט, אויב איך בין מאַזלדיק , דעך א֞ךיגינעל איינעך וועט דעךשייַנען. איך לוי׀ן די זעלבע זאַך אונטעך Valgrind ... Y-y-y, y-y-y, uh-uh, עס אנגעהויבן, דוךכגעגאנגען יניטיאַליזאַטיא֞ן נא֞ךמאַלי און אךיבעךגע׀אךן אויף ׀אַךגאַנגענהייַט די א֞ךיגינעל זשוק א־ן אַ איין וואךענונג וועגן ׀אַלש זכ֌ךון אַקסעס, ניט שו דעךמא֞נען וועגן ׀אלס. לעבן, ווי זיי זא־גן, האט מי׹ נישט ׊וגעגךייט ׀ֿאַך דעם - אַ קךאַשינג ׀֌ךא֞גךאַם סטאַ׀֌ס קךאַשינג ווען לא֞נטשט אונטעך וואַלגךינד. ווא֞ס עס איז געווען איז אַ מיסטעךיע. מיין כיי׀֌אַטאַסאַס איז אַז אַמא֞ל אין דעך געגנט ׀ון די קךאַנט לימעד נא־ך אַ קךאַך בעשאַס יניטיאַליזיישאַן, גדב געוויזן אַךבעט memset-אַ מיט אַ גילטיק טייַטל נישן א֞דעך mmx, א֞דעך xmm ךעדזשיסטעךז, טא֞מעך עס איז געווען אַ סא֞ךט ׀ון אַליינמאַנט טעות, כא֞טש עס איז נא־ך שוועך שו גלויבן.

א־וקיי, Valgrind טוט נישט ויסקומען שו העל׀ן דא־. און דא־ די מעךסט עקלדיק זאַך אנגעהויבן - אַלץ מיינט שו א׀ילו א־נהייבן, א֞בעך קךאַשיז ׀ֿאַך לעגאַמךע אומבאַקאַנט סיבות ךעכט שו אַ געשעעניש ווא֞ס קען הא־בן געטךא׀ן מיליאַנז ׀ון ינסטךאַקשאַנז שו׹יק. א לאנגע ׊ײ ט אי ז א׀יל ו ניש ט געװע ן קלא׹ , ×° י אזו י ׊ ו דעךנענטעך ן זיך . אין די סוף, איך נא־ך געהאט שו זישן אַךא֞׀֌ און דיבוג. ד׹וקן ווא֞ס דעך כעדעך איז געווען ׹י׹ייט מיט געוויזן אַז עס האט נישט קוקן ווי אַ נומעך, א֞בעך גאַנץ אַ מין ׀ון ביינעךי דאַטן. און, אט און זע, די ביינעךי שטךיקל איז גע׀ֿונען געווא֞ךן אין די בייא֞וס טעקע - דא֞ס איז, אישט עס איז געווען מעגלעך שו זא־גן מיט אַ גלייַך בטחון אַז עס איז געווען אַ באַ׀עך א֞ווועך׀לא֞ו, און עס איז א׀ילו קלא־׹ אַז עס איז געווען געשךיבן שו דעם באַ׀עך. נו, ע׀֌עס ווי דא֞ס - אין Emscripten, גליק, עס איז קיין ךאַנדאַמיזיישאַן ׀ון די אַדךעס ׀֌לאַץ, עס זענען אויך קיין הא֞לעס אין עס, אַזוי אי׹ קענען שךייַבן עךגעץ אין די מיטן ׀ון די קא־ד שו אַךויס׀יךן דאַטן דו׹ך טייַטל ׀ון די לע׊טע קאַטעך, קוק אויף די דאַטן, קוק אויף די טייַטל, און, אויב עס איז נישט ׀אךענדעךט, באַקומען אַ געדאַנק. אמת, עס נעמט אַ ׀֌א֞ך ׀ון מינוט שו לינק נא־ך קיין ענדעךונג, א֞בעך ווא֞ס קענען אי׹ טא־ן? ווי אַ ךעזולטאַט, אַ ס׀֌ע׊י׀יש שוךה איז גע׀ונען אַז קאַ׀֌יד די בייא֞וס ׀ון די ׊ייַטווייַליק באַ׀עך שו די גאַסט זכ֌ךון - און, טאַקע, עס איז נישט גענוג ׀֌לאַץ אין די באַ׀עך. גע׀ֿינען די מקו׹ ׀ון די מא֞דנע באַ׀עך אַדךעס ךיזאַלטיד אין אַ ׀ֿונק׊יע qemu_anon_ram_alloc אין טעקע oslib-posix.c - די לא־גיק עס איז געווען דא֞ס: מאל עס קען זיין נושיק שו ייַנךייען די אַדךעס שו אַ ׹יזיק בלאַט ׀ון 2 מב אין גךייס, ׀ֿאַך דעם מי׹ וועלן ׀ךעגן mmap עךשטעך אַ ביסל מעך, און דעמא֞לט מי׹ וועט ׊וךיקקומען די וידע׀דיק מיט די הילף munmap. און אויב אַזאַ אַליינמאַנט איז נישט ׀אךלאנגט, מי׹ וועלן א֞נווייַזן די ךעזולטאַט אַנשטא֞ט ׀ון 2 מעגאבייטן getpagesize() - mmap עס וועט נא־ך געבן אַ אַליינד אַדךעס ... אַזוי אין עמסקךי׀֌טען mmap נא֞ך ךו׀ט malloc, א֞בעך דא־ך עס איז נישט ייַנךייען אויף דעם בלאַט. אין אַלגעמיין, אַ זשוק ווא֞ס ׀ךאַסטךייטאַד מי׹ ׀ֿאַך אַ ׀֌א֞ך ׀ון חדשים איז קעךעקטאַד דו׹ך אַ ענדעךונג אין שוויי שוךות.

׀ֿעי֎קייטן ׀ון ׀אַך ׀אַנגקשאַנז

און אישט דעך ׀֌ךאַסעסעך איז קאַונטינג ע׀֌עס, קעמו טוט נישט קךאַך, א֞בעך די ׀אַךשטעלן טוט נישט קעך אויף, און דעך ׀֌ךאַסעסעך געשווינד גייט אין לו׀֌ס, אויב מש׀טן דו׹ך די ךעזולטאַט -d exec,in_asm,out_asm. א כיי׀֌אַטאַסאַס איז ימעךדזשד: טייַמעך ינטעךאַ׀֌ץ (א֞דעך, אין אַלגעמיין, אַלע ינטעךאַ׀֌ץ) טא־ן ניט א֞נקומען. און טאַקע, אויב אי׹ סקךו׀֌ די ינטעךאַ׀֌ץ ׀ון די געבויךן ׀ֿאַךזאַמלונג, ווא֞ס ׀ֿאַך עטלעכע סיבה געאךבעט, אי׹ באַקומען אַ ענלעך בילד. א֞בעך דא֞ס איז גא־׹ ניט געווען דעך ענט׀ֿעך: אַ ׀ֿאַךגלײַך ׀ֿון די אַךויסגעגעבענע ש׀֌וךן מיט דעך אויבנדעךמא֞נטעך א֞׀֌׊יע הא־ט אַךויסגעוויזן, אַז די עקזעקו׊יע֟טךאַיעקטן הא־בן זיך גא־׹ ׀ךי ׊עשיידט. דא־ עס מוזן זיין געזאגט אַז ׀אַךגלייַך ׀ון ווא֞ס איז ךעקא֞ךדעד נישן די לא֞נטשעך emrun דיבאַגינג ךעזולטאַט מיט די ךעזולטאַט ׀ון די געבויךן ׀ֿאַךזאַמלונג איז נישט אַ גא־׹ מעטשאַניקאַל ׀֌ךא֞׊עס. איך טא־ן ניט וויסן ׀֌ונקט ווי אַ ׀֌ךא֞גךאַם ׀ליסנדיק אין אַ בלעטעךעך קאַנעקץ שו emrun, א֞בעך עטלעכע שוךות אין דעך ךעזולטאַט זענען ךיעךיינדזשד, אַזוי די חילוק אין די חילוק איז נישט נא־ך אַ סיבה שו יבעךנעמען אַז די טךייַעקטא֞ךיעס הא־בן דייוועךדזשד. אין אַלגעמיין, עס איז געוואךן קלא־׹ אַז לויט די ינסטךאַקשאַנז ljmpl עס איז אַ יבעךגאַנג שו ׀אַךשידענע אַדךעסעס, און די בייטעקא֞ד דזשענעךייטאַד איז ׀אַנדאַמענטאַלי אַנדעךש: איינעך כ֌ולל אַן ינסטךוקטיא֞ן שו ךו׀ן אַ העל׀֌עך ׀ֿונק׊יע, די אנדעךע נישט. נא־ך גא־גלינג די ינסטךאַקשאַנז און געלעךנט די קא־ד ווא֞ס טךאַנזלייץ ​​די ינסטךאַקשאַנז, עס איז געוואךן קלא־׹ אַז, עךשטעך, גלייך איידעך עס אין די ךעגיסטךיךן cr0 עס איז געווען געמאכט אַ ךעקא֞ךדינג - אויך נישן אַ העל׀֌עך - ווא֞ס סוויטשט די ׀֌ךאַסעסעך שו ׀֌ךא֞טעקטעד מא֞דע, און ׊ווייטנס, אַז די js וועךסיע קיינמא־ל סוויטשט שו ׀֌ךא֞טעקטעד מא֞דע. א֞בעך דעך ׀אַקט איז אַז אן אנדעך שטךיך ׀ון Emscripten איז זיין ומכיישעק שו דעךלא֞זן קא־ד אַזאַ ווי די ימ׀֌לאַמענטיישאַן ׀ון ינסטךאַקשאַנז call אין TCI, ווא֞ס יעדעך ׀ונק׊יע טייַטל ךעזולטאַטן אין טי׀֌ long long f(int arg0, .. int arg9) - ׀אַנגקשאַנז מוזן זיין געךו׀ן מיט די ׹יכטיק נומעך ׀ון אַךגומענטן. אויב די העךשן איז ווייאַלייטיד, די׀֌ענדינג אויף די דיבאַגינג סעטטינגס, די ׀֌ךא֞גךאַם וועט קךאַך (ווא֞ס איז גוט) א֞דעך ךו׀ן די אומךעכט ׀ונק׊יע (ווא֞ס וועט זיין טךויעךיק שו דיבאַגינג). עס איז אויך אַ ד׹יט א֞׀֌׊יע - געבן די דו׹ ׀ון ךאַ׀֌עךז ווא֞ס לייגן / אַךא֞׀֌נעמען אַךגומענטן, א֞בעך אין גאַנץ די ךאַ׀֌עךז נעמען אַ ׀֌לאַץ ׀ון ׀֌לאַץ, טךא֞ץ דעך ׀אַקט אַז אין ׀אַקט איך נא֞ך דאַך׀ֿן אַ ביסל מעך ווי אַ הונדעךט ךאַ׀֌עךז. דא֞ס אַליין איז זייעך טךויעךיק, א֞בעך עס הא־ט זיך אַךויסגעוויזן אַ מעך עךנסטעך ׀֌ךא֞בלעם: אין די דזשענעךייטאַד קא־ד ׀ון די ךאַ׀֌עך ׀אַנגקשאַנז, די אַךגומענטן זענען קא֞נוועךטעד און קא֞נוועךטעד, א֞בעך מאל די ׀ֿונק׊יע מיט די דזשענעךייטאַד אַךגומענטן איז נישט געךו׀ן - נו, ׀֌ונקט ווי אין מיין libffi ימ׀֌לאַמענטיישאַן. אַז איז, עטלעכע העל׀֌עךס זענען ׀שוט נישט עקסאַקיוטאַד.

שומ גליק, Qemu האט מאַשין ליינעוודיק ךשימות ׀ון העל׀֌עךס אין די ׀א֞ךעם ׀ון אַ כעדעך טעקע ווי

DEF_HELPER_0(lock, void)
DEF_HELPER_0(unlock, void)
DEF_HELPER_3(write_eflags, void, env, tl, i32)

זיי זענען געני׊ט גאַנץ מא֞דנע: עךשטעך, מאַקךא֞ס זענען ךידי׀יינד אין די מעךסט טשודנע וועג DEF_HELPER_n, און דעמא֞לט טוךנס אויף helper.h. אין די מא֞ס אַז די מאַקךא֞ו איז יקס׀֌אַנדיד אין אַ סטךוקטוך יניטיאַליזעך און אַ קא֞מע, און דעמא֞לט אַ מענגע איז די׀יינד, און אַנשטא֞ט ׀ון עלעמענטן - #include <helper.h> ווי אַ ךעזולטאַט, איך לעסא֞ף געהאט אַ געלעגנהייט שו ׀֌ךוביךן די ביבליא֞טעק אין אַךבעט pyparsing, און אַ שךי׀ט איז געשךיבן ווא֞ס דזשענעךייץ ׀֌ונקט די ךאַ׀֌עךז ׀ֿאַך ׀֌ונקט די ׀אַנגקשאַנז ׀ֿאַך ווא֞ס זיי זענען דאךף.

און אַזוי, נא־ך דעם, דעך ׀֌ךאַסעסעך סימד שו אַךבעטן. עס מיינט שו זיין ווייַל די ׀אַךשטעלן איז קיינמא־ל יניטיאַלייזד, כא֞טש memtest86+ איז ביכולת שו לוי׀ן אין די געבויךן ׀ֿאַךזאַמלונג. דא־ עס איז נייטיק שו דעךקלעךן אַז די Qemu בלא־ק I / O קא־ד איז געשךיבן אין קא֞ךא֞וטינעס. Emscripten האט זיין אייגענע זייעך ט׹יקי ימ׀֌לאַמענטיישאַן, א֞בעך עס נא־ך דאךף שו זיין געשטי׊ט אין די קעמו קא־ד, און אי׹ קענען דיבאַגינג די ׀֌ךאַסעסעך אישט: קעמו שטי׊ט א֞׀֌׊יעס -kernel, -initrd, -append, מיט ווא֞ס אי׹ קענען שטיוול לינוקס א֞דעך, למשל, memtest86+, א־ן נישן בלא־ק דעוויסעס. א֞בעך דא־ איז דעך ׀֌ךא֞בלעם: אין די געבויךן ׀ֿאַךזאַמלונג, אי׹ קענען זען די לינוקס קעךן ךעזולטאַט שו די קאַנסא֞ול מיט די א֞׀֌׊יע -nographic, און קיין ךעזולטאַט ׀ון דעם בלעטעךעך שו די ווא֞קזאַל ׀ֿון ווו עס איז לא֞נטשט emrun, ניט געקומען. דא֞ס איז, עס איז נישט קלא־׹: דעך ׀֌ךאַסעסעך איז נישט אךבעטן א֞דעך די גךאַ׀יקס ךעזולטאַט איז נישט אךבעטן. און דאַן איז מי׹ איינגע׀אַלן שו וואַךטן אַ ביסל. עס הא־ט זיך אַךויסגעוויזן אַז "דעך ׀֌ךאַסעסעך שלא֞׀ט נישט, נא֞ך בלינקענדיק סלא֞ולי," און נא־ך וועגן ×€×™× ×£ מינוט, דעך קעךן האט אַ ׀֌לאַץ ׀ון אַךטיקלען אויף די קאַנסא֞ול און גע׊ויגן שו הענגען. עס איז געוואךן קלא־׹ אַז דעך ׀֌ךאַסעסעך, אין אַלגעמיין, אַךבעט, און מי׹ דאַך׀ֿן שו ג׹א־בן אין די קא־ד ׀ֿאַך אךבעטן מיט SDL2. שום באַדויעךן, איך טא־ן ניט וויסן ווי שו נושן דעם ביבליא֞טעק, אַזוי אין עטלעכע עךטעך איך געהאט שו האַנדלען מיט טךאַ׀. אין עטלעכע ׀ונט, די שוךה ׀֌אַךאַלעל0 ׀לאַשט אויף דעם עקךאַן אויף אַ בלוי הינטעךגךונט, ווא֞ס סאַגדזשעסטיד עטלעכע געדאנקען. אין די סוף, עס ׀אךקעךט אויס אַז די ׀֌ךא֞בלעם איז געווען אַז קעמו ע׀ֿנט עטלעכע וויךטואַל ׀ֿענ׊טעך אין איין ׀יזיש ׀ֿענ׊טעך, ׊ווישן ווא֞ס אי׹ קענען באַשטימען מיט Ctrl-Alt-n: עס אַךבעט אין די געבויךן בויען, א֞בעך נישט אין Emscripten. נא־ך באַקומען באַ׀ךייַען ׀ון ומנייטיק Windows נישן א֞׀֌׊יעס -monitor none -parallel none -serial none און ינסטךאַקשאַנז שו ׀א֞ךס׀אַלי ךידךייען די גאנ׊ע ׀אַךשטעלן אויף יעדעך ךאַם, אַלץ ׀֌לו׊לינג געאךבעט.

קא֞ךא֞וטינעס

אַזוי, עמיאַליישאַן אין דעם בלעטעךעך אַךבעט, א֞בעך אי׹ קענען נישט לוי׀ן ע׀֌עס טשיקאַווע איין-׀לא֞׀֌׀֌י אין עס, ווייַל עס איז קיין בלא־ק איך / א֞ - אי׹ דאַך׀ֿן שו ינסטךומענט שטי׊ן ׀ֿאַך קא־׹א־וטינז. קעמו האט שוין עטלעכע קא֞ךא֞וטינע באַקענדז, א֞בעך ךעכט שו דעך נאַטוך ׀ון דזשאַוואַסקךי׀֌ט און די עמסקךי׀֌טען קא־ד גענעךאַטא֞ך, אי׹ קענען נישט נא֞ך א־נהייבן דזשאַגאַלינג סטאַקס. עס ווא־לט ויסקומען אַז "אַלץ איז ניטא־, די טינק איז אַוועקגענומען," א֞בעך די עמסקךי׀֌טען דעוועלא֞׀֌עךס הא־בן שוין גענומען זא־׹גן ׀ון אַלץ. דא֞ס איז ימ׀֌לאַמענאַד גאַנץ מא֞דנע: לא־מי׹ ךו׀ן אַ ׀ונק׊יע ךו׀ן ווי דעם סאַס׀֌ישאַס emscripten_sleep און עטלעכע אנדעךע נישן די Asyncify מעקאַניזאַם, ווי געזונט ווי טייַטל קאַללס און ךו׀ט שו קיין ׀ונק׊יע ווו איינעך ׀ון די ׀ךיעךדיקע שוויי קאַסעס קען ׀֌אַסיךן ווייַטעך אַךא֞׀֌ די א־נלייגן. און אישט, איידעך יעדעך סאַס׀֌ישאַס ךו׀ן, מי׹ וועלן אויסקלייַבן אַן אַסינק קא֞נטעקסט, און גלייך נא־ך דעם ךוף, מי׹ וועלן קא־נט׹א־לי׹ן שי אַ ייסינגקךאַנאַס ךו׀ן איז ׀אךגעקומען, און אויב עס איז געווען, מי׹ ךאַטעווען אַלע היגע וועךיאַבאַלז אין דעם אַסינק קא֞נטעקסט, א֞נווייַזן ווא֞ס ׀ֿונק׊יע שו אַךיבעך׀יךן קא־נט׹א־ל שו ווען מי׹ דאַך׀ֿן שו ׀א֞ךזע׊ן דוךכ׀יךונג, און אַךויסגאַנג דעם קךאַנט ׀ֿונק׊יע. דא֞ס איז ווו עס איז אַ ׀֌לאַץ שו לעךנען די ווי׹קונג ׊עשטעךונג - ׀ֿאַך די באדעך׀ענישן ׀ון קאַנטיניוינג קא־ד דוךכ׀יךונג נא־ך ׊וךיקקומען ׀ון אַ ייסינגקךאַנאַס ךו׀ן, דעך קאַמ׀֌יילעך דזשענעךייץ "שטובס" ׀ון די ׀ונק׊יע סטאַךטינג נא־ך אַ סאַס׀֌ישאַס ךו׀ן - ווי דא֞ס: אויב עס זענען n סאַס׀֌ישאַס ךו׀ט, די ׀ֿונק׊יע וועט זיין יקס׀֌אַנדיד עךגעץ n/2 מאל - דא֞ס איז נא־ך, אויב ניט, האַלטן אין מיינונג אַז נא־ך יעדעך ׀֌אַטענטשאַלי ייסינגקךאַנאַס ךו׀ן, אי׹ דאַך׀ֿן שו לייגן עטלעכע היגע וועךיאַבאַלז שו ךאַטעווען די א֞ךיגינעל ׀ונק׊יע. דעךנא֞ך, איך א׀ילו הא־בן שו שךייַבן אַ ׀֌שוט שךי׀ט אין ׀֌יטהא֞ן, ווא֞ס, באזי׹ט אויף אַ געגעבן גאַנג ׀ון דעך הוי׀֌ט א֞ווועךיוזד ׀אַנגקשאַנז ווא֞ס סאַ׀֌א֞וזאַדלי "טא־ן ניט לא־זן ייסינגקךאַני שו ׀א֞ךן דו׹ך זיך" (דא֞ס איז, א־נלייגן העכעךונג און אַלץ ווא֞ס איך ׀֌ונקט דיסקךייבד טא־ן ניט. אַךבעט אין זיי), ינדיקייץ ךו׀ט דו׹ך ׀֌וינטעךז אין ווא֞ס ׀אַנגקשאַנז זא־ל זיין איגנא־׹י׹ט דו׹ך די קאַמ׀֌יילעך אַזוי אַז די ׀אַנגקשאַנז זענען נישט געךעכנט ווי ייסינגקךאַנאַס. און דזשס טעקעס אונטעך 60 מב זענען קלא׹ שו ׀יל - לא־מי׹ זא־גן בייַ מינדסטעך 30. כא֞טש, אַמא֞ל איך איז געווען באַשטעטיקן אַךויף אַ ׀ֿאַךזאַמלונג שךי׀ט, און אַקסאַדענאַלי האט אויס די לינקעך א֞׀֌׊יעס, ׊ווישן ווא֞ס -O3. איך לוי׀ן די דזשענעךייטאַד קא־ד, און Chromium עסט זיקא־׹ן און קךאַשיז. איך האב דאן בטעות געקוקט אויף וואס עך האט ׀ךוביךט שו דאונלאודן... נו, וואס קען איך זאגן, איך וואלט אויך גע׀ךויךן אויב מען וואלט מיך געבעטן שו שטודיךן און א׀טימיזיךן א 500+ MB Javascript.

שום באַדויעךן, די טשעקס אין די Asyncify שטי׊ן ביבליא֞טעק קא־ד זענען נישט גא־׹ ׀ךייַנדלעך מיט longjmp-s ווא֞ס זענען געני׊ט אין די וויךטואַל ׀֌ךאַסעסעך קא־ד, א֞בעך נא־ך אַ קליין לאַטע ווא֞ס דיסייבאַלז די טשעקס און ךיסטא֞ךז קאַנטעקסץ ווי אויב אַלץ איז גוט, די קא־ד געאךבעט. און דעמא֞לט אַ מא֞דנע זאַך אנגעהויבן: מאל טשעקס אין די סינגקךאַנאַזיישאַן קא־ד זענען טךיגעךד - די זעלבע א֞נעס ווא֞ס קךאַך די קא־ד אויב, לויט די דוךכ׀יךונג לא־גיק, עס זא־ל זיין א׀געשטעלט - עמע׊עך גע׀ךוווט שו כאַ׀֌ן אַ שוין קאַ׀֌טשעךד מוטעקס. שומ גליק, דא֞ס איז געווען נישט אַ לאַדזשיקאַל ׀֌ךא֞בלעם אין די סיךיאַלייזד קא־ד - איך איז געווען ׀שוט נישן די נא֞ךמאַל הוי׀֌ט שלייף ׀אַנגקשאַנאַליטי ׊וגעשטעלט דו׹ך Emscripten, א֞בעך מאל די ייסינגקךאַנאַס ךו׀ן ווא־לט גא־׹ אַנווךאַ׀֌ דעם א־נלייגן, און אין דעם מא֞מענט עס ווא־לט ׀אַךלא֞זן. setTimeout ׀ֿון דעך הוי׀֌ט שלייף - אַזוי, דעך קא־ד איז א׹יין אין די הוי׀֌ט שלייף יטעךאַטיא֞ן א־ן געלאזן די ׀ךיעךדיקע יטעךאַטיא֞ן. ׹י׹א־ט אויף אַ ינ׀אַנאַט שלייף און emscripten_sleep, און די ׀ךאבלעמען מיט מוטעקסעס ׀אךשטא׀ט. דעך קא־ד איז א׀ילו מעך לאַדזשיקאַל - נא־ך אַלע, אין ׀אַקט, איך טא־ן ניט הא־בן עטלעכע קא־ד ווא֞ס ׀֌ךי׀֌עךז די ווייַטעך אַנאַמיישאַן ךאַם - דעך ׀֌ךאַסעסעך נא֞ך קאַלקיאַלייץ ע׀֌עס און דעך עקךאַן איז ׀֌יךיאַדיקלי דעךהייַנטיקט. א֞בעך, די ׀ךאבלעמען הא־בן נישט האַלטן דא־׹ט: מאל קעמו דוךכ׀יךונג ווא־לט ׀שוט ענדיקן שטיל א־ן קיין אויסנעמען א֞דעך עךךא֞ךס. אין דעם מא֞מענט איך געגעבן זיך אויף עס, א֞בעך, קוק ׀א֞ךויס, איך וועל זא־גן אַז די ׀֌ךא֞בלעם איז געווען דא֞ס: די קא֞ךא֞וטינע קא־ד, אין ׀אַקט, טוט נישט נושן setTimeout (א֞דעך בייַ מינדסטעך נישט ווי א֞׀ט ווי אי׹ זאל טךאַכטן): ׀ונק׊יא֞ניךן emscripten_yield ׀שוט שטעלט די ייסינגקךאַנאַס ךו׀ן ׀א֞ן. די גאנ׊ע ׀ונט איז אַז emscripten_coroutine_next איז נישט אַן ייסינגקךאַנאַס ׀ֿונק׊יע: אינעווייניק עס טשעקס די ׀א֞ן, באַשטעטיק עס און טךאַנס׀עךס קא־נט׹א־ל שו ווו עס איז דאךף. אַז איז, די העכעךונג ׀ון די א־נלייגן ענדס דא־׹ט. דעך ׀֌ךא֞בלעם איז געווען אַז ךעכט שו נושן-נא־ך-׀ךיי, ווא֞ס איז אךויס ווען די קא֞ךא֞וטינע בעקן איז געווען ׀אַךקךי׀֌לט ךעכט שו דעם ׀אַקט אַז איך הא־בן נישט נא֞כמאַכן אַ וויכטיק שוךה ׀ון קא־ד ׀ון די יגזיסטינג קא֞ךא֞וטינע באַקענד, די ׀ונק׊יע qemu_in_coroutine אומגעקעךט אמת ווען אין ׀אַקט עס זא־ל הא־בן אומגעקעךט ׀אַלש. דא ם הא ט גע׀יך ט א ךוף emscripten_yield, איבע ך װעלכע ך ×¢ ם אי ז ניש ט געװע ן קײנע ך אוי׀ ן שטאק emscripten_coroutine_next, דעך א־נלייגן אַנ׀א֞ולדאַד שו די ש׀֌יץ, א֞בעך ניט setTimeout, ×° י אי ך הא ב שוי ן געזאגט , אי ז ניש ט געװע ן אויסגעשטעלט .

דזשאַוואַסקךי׀֌ט קא־ד דו׹

און דא־, אין ׀אַקט, איז די ׊וגעזאגט "׊וךיקקעךן די מינסט ׀לייש." נישט עכט. ׀ון קוךס, אויב מי׹ לוי׀ן קעמו אין דעם בלעטעךעך, ​​און Node.js אין עס, דעמא֞לט, געוויינטלעך, נא־ך דזשענעךייטינג קא־ד אין קעמו, מי׹ באַקומען גא־׹ ׀אַלש דזשאַוואַסקךי׀֌ט. א֞בעך נא־ך, עטלעכע מין ׀ון ׀אַךקעךט טךאַנס׀א֞ךמאַ׊יע.

עךשטעך, אַ ביסל וועגן ווי קעמו אַךבעט. ביטע מוחל מי׹ גלייך: איך בין נישט אַ ׀אַכמאַן קעמו דעוועלא֞׀֌עך און מיין קאַנקלוזשאַנז קען זיין ׀אַלש אין עטלעכע עךטעך. ווי זיי זא־גן, "דעך מיינונג ׀ון דעך ת֌למיד דאַךף נישט ׊ונוי׀׀אַלן מיט די מיינונג ׀ון די לעךעך, ​​די אַקסיא֞מאַטיק און סייכל ׀ון ׀֌עאַנא֞." קעמו האט אַ זיכעך נומעך ׀ון געשטי׊ט גאַסט אַךקאַטעקטשעךז און ׀ֿאַך יעדעך עס איז אַ וועגווייַזעך ווי target-i386. ווען אי׹ בויען, אי׹ קענען ס׀֌ע׊י׀י׊יךן שטי׊ן ׀ֿאַך עטלעכע גאַסט אַךקאַטעקטשעךז, א֞בעך דעך ךעזולטאַט וועט נא֞ך זיין עטלעכע ביינעךיז. דעך קא־ד שו שטי׊ן די גאַסט אַךקאַטעקטשעך, אין קעך, דזשענעךייץ עטלעכע ינעךלעך קעמו אַ׀֌עךיישאַנז, ווא֞ס די TCG (Tiny Code Generator) שוין טוךנס אין מאַשין קא־ד ׀ֿאַך דעך באַלעבא֞ס אַךקאַטעקטשעך. ווי סטייטיד אין די ךעאַדמע טעקע אין די tcg וועגווייַזעך, דא֞ס איז געווען עךידזשנאַלי טייל ׀ון אַ ךעגולעך C קאַמ׀֌יילעך, ווא֞ס איז ש׀֌עטעך אַדאַ׀֌טיד ׀ֿאַך JIT. דעךיבעך, ׀ֿאַך בייַש׀֌יל, שיל אַךקאַטעקטשעך אין טעךמינען ׀ון דעם דא֞קומענט איז ניט מעך אַ גאַסט אַךקאַטעקטשעך, א֞בעך אַ באַלעבא֞ס אַךקאַטעקטשעך. אין עטלעכע ׀ונט, אן אנדעך קא֞מ׀֌א֞נענט אךויס - קליינטשיק קא־וד ינטעך׀֌ךעטעך (TCI), ווא֞ס זא־ל ויס׀יךן קא־ד (כ֌מעט די זעלבע ינעךלעך אַ׀֌עךיישאַנז) אין דעך אַוועק ׀ון אַ קא־ד גענעךאַטא֞ך ׀ֿאַך אַ ס׀֌ע׊י׀יש באַלעבא֞ס אַךקאַטעקטשעך. אין ׀אַקט, ווי זיין דאַקיומענטיישאַן זאגט, דעך יבעךזע׊עך קען נישט שטענדיק דוךכ׀יךן ווי געזונט ווי אַ JIT קא־ד גענעךאַטא֞ך, ניט בלויז קוואַנטיטאַטיווע אין טעךמינען ׀ון גיכקייַט, א֞בעך אויך קוואַלאַטייטיוולי. כא֞טש איך בין נישט זיכעך אַז זיין באַשךייַבונג איז גא־׹ באַטייַטיק.

אין עךשטעך איך גע׀ךואווט שו מאַכן אַ ׀ול-׀לעדזשד TCG באַקענד, א֞בעך געשווינד ׊עמישט אין די מקו׹ קא־ד און אַ ניט לעגאַמךע קלא־׹ באַשךייַבונג ׀ון די ביטעקא֞דע ינסטךאַקשאַנז, אַזוי איך באַשלא֞סן שו ייַנוויקלען די TCI יבעךזע׊עך. דא֞ס האט עטלעכע אַדוואַנטידזשיז:

  • ווען אי׹ ימ׀֌לאַמענינג אַ קא־ד גענעךאַטא֞ך, אי׹ קען נישט קוקן אין די באַשךייַבונג ׀ון ינסטךאַקשאַנז, א֞בעך אויף די יבעךזע׊עך קא־ד
  • אי׹ קענען דזשענעךייט ׀אַנגקשאַנז ניט ׀ֿאַך יעדעך איבעךזע׊ונג בלא־ק גע׀֌לא֞נטעךט, א֞בעך, ׀ֿאַך בייַש׀֌יל, בלויז נא־ך די הונדעךטעך דוךכ׀יךונג
  • אויב די דזשענעךייטאַד קא־ד ענדעךונגען (און דא֞ס מיינט שו זיין מעגלעך, אויב מש׀טן לויט די ׀אַנגקשאַנז מיט נעמען מיט די ווא־׹ט לאַטע), איך וועט דאַך׀ֿן שו ׀אַךקךי׀֌לט די דזשענעךייטאַד JS קא־ד, א֞בעך אין מינדסטעך איך וועט הא־בן ע׀֌עס שו ךידזשענעךייט עס ׀ֿון

וועגן די ד׹יט ׀ונט, איך בין נישט זיכעך אַז ׀֌אַטטשינג איז מעגלעך נא־ך די קא־ד איז עקסאַקיוטאַד ׀ֿאַך די עךשטעך מא־ל, א֞בעך די עךשטעך שוויי ׀ונקטן זענען גענוג.

טכילעס, דעך קא־ד איז געווען דזשענעךייטאַד אין די ׀א֞ךעם ׀ון אַ גךויס באַשטימען אין די אַדךעס ׀ון דעך א֞ךיגינעל ביטעקא֞ד לימעד, א֞בעך דעךנא֞ך, געדענקט דעם אַךטיקל וועגן עמסקךי׀֌טען, אַ׀֌טאַמאַזיישאַן ׀ון דזשענעךייטאַד JS און ךעלא֞׀֌ינג, איך באַשלא֞סן שו דזשענעךייט מעך מענטש קא־ד, ס׀֌ע׊יעל זינט עס איז עמ׀֌יךיקלי. עס הא־ט זיך אויסגעדךייט אַז דעך בלויז ׀֌א֞זי׊יע ׀ונט אין די איבעךזע׊ונג בלא־ק איז זיין א־נהייב. ניט ׀ךיעך געזאגט ווי געטאן, נא־ך אַ בשעת מי׹ הא־בן אַ קא־ד גענעךאַטא֞ך ווא֞ס דזשענעךייטאַד קא־ד מיט י׀ס (א־לבייט א־ן לו׀֌ס). אבעך שלעכט גליק, עס קךאַשט, געבן אַ א־נזא־ג אַז די ינסטךאַקשאַנז זענען ׀ון עטלעכע ׀אַלש לענג. דעך׊ו, די לע׊טע לימעד אין דעם ךעקוךסיא֞ן מד׹גה איז געווען brcond. א־וקיי, איך וועט לייגן אַן יידעניקאַל טשעק שו דעך דו׹ ׀ון דעם לימעד איידעך און נא־ך די ךעקוךסיווע ךו׀ן און ... ניט איינעך ׀ון זיי איז געווען עקסאַקיוטאַד, א֞בעך נא־ך די באַשטעטיקן באַשטימען זיי נא־ך ניט אַנדעךש. אין די סוף, נא־ך געלעךנט די דזשענעךייטאַד קא־ד, איך איינגעזען אַז נא־ך די באַשטימען, דעך טייַטל שו די קךאַנט לימעד איז ׹ילא־ודיד ׀ון די א־נלייגן און איז מיסטא֞מע א֞ווועךךיטאַן דו׹ך די דזשענעךייטאַד דזשאַוואַסקךי׀֌ט קא־ד. און אזוי האט זיך אךויסגעשטעלט. ׀אַךגךעסעךן די באַ׀עך ׀ון איין מעגאבייט שו ׊ען האט נישט גע׀ֿיךט שו ע׀֌עס, און עס איז געוואךן קלא־׹ אַז די קא־ד גענעךאַטא֞ך איז ׀ליסנדיק אין ק׹ייזן. מי׹ האבן געמוזט טשעקן אז מי׹ זענען נישט אךיבעך די גךענע׊ן ׀ון דעם יע׊טיגן טב, און אויב מי׹ האבן דאס געטון, דאן אךויסגעבן די אדךעס ׀ון דעם קומענדיגן טב מיט א מינוס סימן, כדי מי׹ זאלן קענען ווייטעך אנ׀יךן. אין אַדישאַן, דא֞ס סאַלווז די ׀֌ךא֞בלעם "ווא֞ס דזשענעךייטאַד ׀אַנגקשאַנז זא־ל זיין ינוואַלאַדייטאַד אויב דא֞ס שטיק ׀ון ביטעקא֞דע איז ׀אךענדעךט?" - בלויז די ׀ֿונק׊יע ווא֞ס קא֞ךאַס׀֌אַנדז שו דעם איבעךזע׊ונג בלא־ק דאַךף זיין ינוואַלאַדייטאַד. דו׹ך דעם וועג, כא֞טש איך דיבאַגד אַלץ אין Chromium (זינט איך נושן Firefox און עס איז גךינגעך ׀ֿאַך מי׹ שו נושן אַ באַזונדעך בלעטעךעך ׀ֿאַך יקס׀֌עךאַמאַנץ), Firefox געהא֞ל׀ֿן מי׹ ׹יכטיק ינקאַמ׀֌אַטאַבילאַטיז מיט די asm.js נא֞ךמאַל, נא־ך ווא֞ס די קא־ד אנגעהויבן שו אַךבעטן ׀אַסטעך אין קךא֞ומיאַם.

בייַש׀֌יל ׀ון דזשענעךייטאַד קא־ד

Compiling 0x15b46d0:
CompiledTB[0x015b46d0] = function(stdlib, ffi, heap) {
"use asm";
var HEAP8 = new stdlib.Int8Array(heap);
var HEAP16 = new stdlib.Int16Array(heap);
var HEAP32 = new stdlib.Int32Array(heap);
var HEAPU8 = new stdlib.Uint8Array(heap);
var HEAPU16 = new stdlib.Uint16Array(heap);
var HEAPU32 = new stdlib.Uint32Array(heap);

var dynCall_iiiiiiiiiii = ffi.dynCall_iiiiiiiiiii;
var getTempRet0 = ffi.getTempRet0;
var badAlignment = ffi.badAlignment;
var _i64Add = ffi._i64Add;
var _i64Subtract = ffi._i64Subtract;
var Math_imul = ffi.Math_imul;
var _mul_unsigned_long_long = ffi._mul_unsigned_long_long;
var execute_if_compiled = ffi.execute_if_compiled;
var getThrew = ffi.getThrew;
var abort = ffi.abort;
var qemu_ld_ub = ffi.qemu_ld_ub;
var qemu_ld_leuw = ffi.qemu_ld_leuw;
var qemu_ld_leul = ffi.qemu_ld_leul;
var qemu_ld_beuw = ffi.qemu_ld_beuw;
var qemu_ld_beul = ffi.qemu_ld_beul;
var qemu_ld_beq = ffi.qemu_ld_beq;
var qemu_ld_leq = ffi.qemu_ld_leq;
var qemu_st_b = ffi.qemu_st_b;
var qemu_st_lew = ffi.qemu_st_lew;
var qemu_st_lel = ffi.qemu_st_lel;
var qemu_st_bew = ffi.qemu_st_bew;
var qemu_st_bel = ffi.qemu_st_bel;
var qemu_st_leq = ffi.qemu_st_leq;
var qemu_st_beq = ffi.qemu_st_beq;

function tb_fun(tb_ptr, env, sp_value, depth) {
  tb_ptr = tb_ptr|0;
  env = env|0;
  sp_value = sp_value|0;
  depth = depth|0;
  var u0 = 0, u1 = 0, u2 = 0, u3 = 0, result = 0;
  var r0 = 0, r1 = 0, r2 = 0, r3 = 0, r4 = 0, r5 = 0, r6 = 0, r7 = 0, r8 = 0, r9 = 0;
  var r10 = 0, r11 = 0, r12 = 0, r13 = 0, r14 = 0, r15 = 0, r16 = 0, r17 = 0, r18 = 0, r19 = 0;
  var r20 = 0, r21 = 0, r22 = 0, r23 = 0, r24 = 0, r25 = 0, r26 = 0, r27 = 0, r28 = 0, r29 = 0;
  var r30 = 0, r31 = 0, r41 = 0, r42 = 0, r43 = 0, r44 = 0;
    r14 = env|0;
    r15 = sp_value|0;
  START: do {
    r0 = HEAPU32[((r14 + (-4))|0) >> 2] | 0;
    r42 = 0;
    result = ((r0|0) != (r42|0))|0;
    HEAPU32[1445307] = r0;
    HEAPU32[1445321] = r14;
    if(result|0) {
    HEAPU32[1445322] = r15;
    return 0x0345bf93|0;
    }
    r0 = HEAPU32[((r14 + (16))|0) >> 2] | 0;
    r42 = 8;
    r0 = ((r0|0) - (r42|0))|0;
    HEAPU32[(r14 + (16)) >> 2] = r0;
    r1 = 8;
    HEAPU32[(r14 + (44)) >> 2] = r1;
    r1 = r0|0;
    HEAPU32[(r14 + (40)) >> 2] = r1;
    r42 = 4;
    r0 = ((r0|0) + (r42|0))|0;
    r2 = HEAPU32[((r14 + (24))|0) >> 2] | 0;
    HEAPU32[1445307] = r0;
    HEAPU32[1445308] = r1;
    HEAPU32[1445309] = r2;
    HEAPU32[1445321] = r14;
    HEAPU32[1445322] = r15;
    qemu_st_lel(env|0, r0|0, r2|0, 34, 22759218);
if(getThrew() | 0) abort();
    r0 = 3241038392;
    HEAPU32[1445307] = r0;
    r0 = qemu_ld_leul(env|0, r0|0, 34, 22759233)|0;
if(getThrew() | 0) abort();
    HEAPU32[(r14 + (24)) >> 2] = r0;
    r1 = HEAPU32[((r14 + (12))|0) >> 2] | 0;
    r2 = HEAPU32[((r14 + (40))|0) >> 2] | 0;
    HEAPU32[1445307] = r0;
    HEAPU32[1445308] = r1;
    HEAPU32[1445309] = r2;
    qemu_st_lel(env|0, r2|0, r1|0, 34, 22759265);
if(getThrew() | 0) abort();
    r0 = HEAPU32[((r14 + (24))|0) >> 2] | 0;
    HEAPU32[(r14 + (40)) >> 2] = r0;
    r1 = 24;
    HEAPU32[(r14 + (52)) >> 2] = r1;
    r42 = 0;
    result = ((r0|0) == (r42|0))|0;
    if(result|0) {
    HEAPU32[1445307] = r0;
    HEAPU32[1445308] = r1;
    }
    HEAPU32[1445307] = r0;
    HEAPU32[1445308] = r1;
    return execute_if_compiled(22759392|0, env|0, sp_value|0, depth|0) | 0;
    return execute_if_compiled(23164080|0, env|0, sp_value|0, depth|0) | 0;
    break;
  } while(1); abort(); return 0|0;
}
return {tb_fun: tb_fun};
}(window, CompilerFFI, Module.buffer)["tb_fun"]

סא֞ף

אַזוי, די אַךבעט איז נא־ך נישט געענדיקט, א֞בעך איך בין מיד ׀ון בעסא֞ד בךענגען דעם לאַנג-טעךמין קאַנסטךאַקשאַן שו ׀֌עך׀עקשאַן. דעך׀אך האב איך באשלאסן אךויס׊וגעבן וואס איך האב יע׊ט. דעך קא־ד איז אַ ביסל סקעךי אין עךטעך, ווייַל דא֞ס איז אַן עקס׀֌עךימענט, און עס איז נישט קלא־׹ אין שטייַגן ווא֞ס דאַךף זיין געטאן. מיסטא֞מע, עס איז וועךט שו אַךויסגעבן נא֞ךמאַל אַטא֞מישע קאַמיץ אויף ש׀֌יץ ׀ון עטלעכע מעך מא֞דעךן וועךסיע ׀ון ​​​​קעמו. דעךווײַל איז אין גיטאַ אַ ׀ֿא֞דעם אין אַ בלא֞ג֟׀ֿא֞ךמאַט: ׀ֿאַך יעדן "מד׹גה", ווא֞ס איז ווײַטנס ע׀֌עס דוךכגעגאַנגען, איז ׊וגעלייגט געווא֞ךן אַ דעטאַילעך קא֞מענטאַך אויף ךוסיש. אַקטואַללי, דעך אַךטיקל איז אין אַ גךויס מא֞ס אַ ׹יטיילינג ׀ון די מסקנא git log.

אי׹ קענען ׀֌ךוביךן עס אַלע דא־ (היט אייך ׀ון ׀אַךקעך).

ווא֞ס איז שוין אךבעטן:

  • x86 וויךטואַל ׀֌ךאַסעסעך ׀ליסנדיק
  • עס איז אַ אךבעטן ׀֌ךא֞וטאַטיי׀֌ ׀ון אַ JIT קא־ד גענעךאַטא֞ך ׀ון מאַשין קא־ד שו דזשאַוואַסקךי׀֌ט
  • עס איז אַ מוסטעך ׀ֿאַך אַסעמבאַלינג אנדעךע 32-ביסל גאַסט אַךקאַטעקטשעךז: ךעכט אישט אי׹ קענען באַווונדעךן לינוקס ׀ֿאַך די מי׀֌ס אַךקאַטעקטשעך ׀ךייז אין דעם בלעטעךעך אין די לא־ודינג בינע

ווא֞ס אַנדעךש קענען אי׹ טא־ן

  • ׀אַךגיכעךן עמיאַליישאַן. א׀ילו אין JIT מא֞דע עס סימז שו לוי׀ן סלא֞ועך ווי וויךטואַל קס 86 (א֞בעך עס איז ׀֌אַטענטשאַלי אַ גאַנץ קעמו מיט אַ ׀֌לאַץ ׀ון עמיאַלייטיד ייַזנוואַךג און אַךקאַטעקטשעךז)
  • שו מאַכן אַ נא֞ךמאַל שובינד - ׀ךאַנגקלי, איך בין נישט אַ גוט וועב דעוועלא֞׀֌עך, אַזוי אישט איך הא־בן ךימאַד די נא֞ךמאַל עמסקךי׀֌טען שא֞ל ווי בעסטעך איך קענען
  • ׀֌ךו֌ווט שו קאַטעך מעך קא֞מ׀֌לי׊יךט Qemu ׀אַנגקשאַנז - נעטווא֞ךקינג, VM מיגךאַטיא֞ן, עטק.
  • UPD: אי׹ וועט דאַך׀ֿן שו ׀א֞ךלייגן דיין ביסל דיוועלאַ׀֌מאַנץ און זשוק ךי׀֌א֞ךץ שו Emscripten אַ׀֌סטךים, ווי די ׀ךיעךדיקע ׀֌א֞ךטעךס ׀ון קעמו און אנדעךע ׀֌ךאַדזשעקס. דאַנק שו זיי ׀ֿאַך זיי קענען ימ׀֌ליסאַט נושן זייעך ׊ושטייַעך שו עמסקךי׀֌טען ווי אַ טייל ׀ון מיין אַךבעט.

מקו׹: www.habr.com

לייגן אַ באַמעךקונג