الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تحويل ال byte code إلى java code

بدأه herch في 17 سبتمبر 2011 · 10 رد · 890 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

هل سبق لأحد هنا أن تعامل مع ال byte code. لدي مثلا سلسلة أوامر bytecode وأريد تحويلها إلى java code.

أعلم أنه توجد decompiler أو disassembler، لكني أريد عمل ذلك يدويا.

#2

مممممممممممممممم

لم تمر عليه من قبل

على العموم ما المفيد في الموضوع؟

هل تريد إنشاء برنامج ما لذلك؟

على كل لو أحببت فأعتقد أن عليك القراءة عن byte code أكثر

مع التأكيد على أن طريقة عمل المترجم سيأثر في الشكل النهائي للـ byte code والكثير من المترجمات تتدخل لتحسين الشيفرة المصدرية

لا أعرف إذا كان مترجم الجافا نفسه مفتوحاً أم أن صن اكتفت بفتح الآلة الافتراضية

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#3

فقط فضول smile.gif

ال 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.

wacko.gif

كنت أريد عمل decompiler من زمان، لكن مثل هذه الخزعبلات تجعلني دائما أترك الموضوع إلى وقت لاحق... حين أصبح أكثر ذكاء ربما laugh.gif

#4

غير صحيح يا حج عصام

هناك شيء غلط

المترجم هنا يتعامل مع ثابت وليس مع متغير

هل أنت متأكد من الموضوع؟

النقطة لو كان كلامك صحيح ما الذي سيحصل عندما أغير x

هناك فرضية واحدة قد تكون صحيحة هل x ليس لها setX ؟

في هذه الحالة سيكون الموضوع صحيح مئة بالمئة

تحياتي

1
حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#5

معك حق blush.gif المتغير 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

#6

استعملت javap -c للتأكد، فكان الناتج

public int getX();
	Code:
   	0: aload_0   	
   	1: getfield  	#2              	// Field x:I
   	4: ireturn

سأراجع الكود لمعرفة مكان المشكل

#7

بيني وبينك علمي علمك

لا أعرف تفاصيل عن الـ byte code

لكني أحاول من أجلك :)

هل لديك مكان نستطيع القراءة منه عن تعليمات الـ byte code

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#8

http://download.oracle.com/javase/cmn/spec_index.html

لا تشغل نفسك يا علاء، الموضوع ليس المهم، فقط لتمرير الوقت في وقت الفراغ

#10
MohamedIBrahim كتب:

شكرا. لكن غرضي ليس استعمال برنامج، كما قلت في السؤال

اقتباس
أعلم أنه توجد decompiler أو disassembler، لكني أريد عمل ذلك يدويا.
#11
herch كتب:

شكرا. لكن غرضي ليس استعمال برنامج، كما قلت في السؤال

اذا راجع decompiler ومن ثم شوف فى موقعه Design Issues وافهم طريقة عمل هذه الاشياء

GoodBye

مواضيع مشابهة