السلام عليكم
هل سبق لأحد هنا أن تعامل مع ال byte code. لدي مثلا سلسلة أوامر bytecode وأريد تحويلها إلى java code.
أعلم أنه توجد decompiler أو disassembler، لكني أريد عمل ذلك يدويا.
السلام عليكم
هل سبق لأحد هنا أن تعامل مع ال byte code. لدي مثلا سلسلة أوامر bytecode وأريد تحويلها إلى java code.
أعلم أنه توجد decompiler أو disassembler، لكني أريد عمل ذلك يدويا.
مممممممممممممممم
لم تمر عليه من قبل
على العموم ما المفيد في الموضوع؟
هل تريد إنشاء برنامج ما لذلك؟
على كل لو أحببت فأعتقد أن عليك القراءة عن byte code أكثر
مع التأكيد على أن طريقة عمل المترجم سيأثر في الشكل النهائي للـ byte code والكثير من المترجمات تتدخل لتحسين الشيفرة المصدرية
لا أعرف إذا كان مترجم الجافا نفسه مفتوحاً أم أن صن اكتفت بفتح الآلة الافتراضية
تحياتي
فقط فضول ![]()
ال specification موجودة بالنسبة لأوامر ال bytecode، وليس لدي مشكل في الحصول على ال bytecode من الملفات class، المشكل هو التحويل إلى الجافا، وكما قلت في ردك فالمترحم يدخل تحسينات تصعب الأمور
مثلا لنفترض الطريقة التالية
public int getX() {
return x;
}والمتغير x يساوي 0. عند قراءة ال bytecode الخاص بها، سنجد التالي
iconst_0 ireturn
بحبث
اقتباسiconst_0 : Push the int constant 0 onto the operand stack
و ireturn تعيد قيمة int من ال operand stack
المشكل هنا هو أن compiler قام بتغيير x بقيمتها. فلا يمكنني معرفة أن الطريقة تعيد قيمة المتغير x، كل ما أعرفه أنها تعيد القيمة 0.
![]()
كنت أريد عمل decompiler من زمان، لكن مثل هذه الخزعبلات تجعلني دائما أترك الموضوع إلى وقت لاحق... حين أصبح أكثر ذكاء ربما ![]()
غير صحيح يا حج عصام
هناك شيء غلط
المترجم هنا يتعامل مع ثابت وليس مع متغير
هل أنت متأكد من الموضوع؟
النقطة لو كان كلامك صحيح ما الذي سيحصل عندما أغير x
هناك فرضية واحدة قد تكون صحيحة هل x ليس لها setX ؟
في هذه الحالة سيكون الموضوع صحيح مئة بالمئة
تحياتي
معك حق
المتغير final ولم أكن منتبه
الآن أصبح الكود كالتالي
aload_0 getfield nop iconst_m1 ireturn
aload_0 تسترجع reference من متغير محلي، وهو this بلا شك
getfield تسترجع حقل، والذي هو x في الغالب.
الباقي لم أفهم ما الفائدة منه، باستثناء ireturn
iconst_m1 : Push the int constant −1 onto the operand stack.
nop : Do nothing.
شيء آخر لا أفهمه، وهو أن كل هذه الأوامر تتعامل مع ال operand stack، وهذه الأخيرة المفروض أنها تمتلأ فقط في ال runtime؟ فكيف تعمل ال disassemblers ؟؟
تم تعديل هذه المشاركة بواسطة herch في 17 سبتمبر 2011 في 23:18
استعملت javap -c للتأكد، فكان الناتج
public int getX(); Code: 0: aload_0 1: getfield #2 // Field x:I 4: ireturn
سأراجع الكود لمعرفة مكان المشكل
بيني وبينك علمي علمك
لا أعرف تفاصيل عن الـ byte code
لكني أحاول من أجلك :)
هل لديك مكان نستطيع القراءة منه عن تعليمات الـ byte code
تحياتي
http://download.oracle.com/javase/cmn/spec_index.html
لا تشغل نفسك يا علاء، الموضوع ليس المهم، فقط لتمرير الوقت في وقت الفراغ
MohamedIBrahim كتب:
شكرا. لكن غرضي ليس استعمال برنامج، كما قلت في السؤال
اقتباسأعلم أنه توجد decompiler أو disassembler، لكني أريد عمل ذلك يدويا.
herch كتب:شكرا. لكن غرضي ليس استعمال برنامج، كما قلت في السؤال
اذا راجع decompiler ومن ثم شوف فى موقعه Design Issues وافهم طريقة عمل هذه الاشياء
GoodBye