0Pricing
Java Academy · درس

التخطيطات والهياكل

وصف تخطيطات الذاكرة الأصلية

التخطيطات والهياكل درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

وصف الذاكرة الأصلية

نادراً ما تكون البيانات الأصلية قيمةً واحدة. تستخدم C البنى والمصفوفات والاتحادات. وتمثّل FFM هذه الأشكال باستخدام تخطيطات الذاكرة، مما يتيح قراءة الذاكرة الأصلية المنظمة وكتابتها بأمان.

عائلة التخطيطات

تشكل أنواع التخطيطات تسلسلًا هرميًا صغيرًا:

  • ValueLayout: قيمة أولية (int أو long أو double أو address)
  • SequenceLayout: مصفوفة ثابتة الحجم من تخطيط معين
  • StructLayout: حقول مرتبة بالتتابع
  • UnionLayout: حقول متداخلة

تخطيط قيمة

أبسط التخطيطات هي تخطيطات القيم المضمنة. وهي تحمل معلومات الحجم والمحاذاة وترتيب البايتات.

import java.lang.foreign.ValueLayout;

public class Main {
    public static void main(String[] args) {
        System.out.println("int size: " + ValueLayout.JAVA_INT.byteSize());
        System.out.println("double size: " + ValueLayout.JAVA_DOUBLE.byteSize());
    }
}

تعريف بنية

مثّل بنية C باستخدام MemoryLayout.structLayout(...)، وسمِّ كل حقل باستخدام withName. لنأخذ بعين الاعتبار struct Point { int x; int y; } في C.

import java.lang.foreign.*;

public class Main {
    public static void main(String[] args) {
        StructLayout point = MemoryLayout.structLayout(
            ValueLayout.JAVA_INT.withName("x"),
            ValueLayout.JAVA_INT.withName("y"));
        System.out.println("Point size: " + point.byteSize());
    }
}

مقابض VarHandle للحقول

لقراءة حقل مسمّى أو الكتابة فيه، اشتق VarHandle باستخدام تعبير مسار. ويحدد groupElement("x") الحقل حسب اسمه.

import java.lang.foreign.*;
import java.lang.invoke.VarHandle;

public class Main {
    public static void main(String[] args) {
        StructLayout point = MemoryLayout.structLayout(
            ValueLayout.JAVA_INT.withName("x"),
            ValueLayout.JAVA_INT.withName("y"));
        VarHandle xHandle = point.varHandle(
            MemoryLayout.PathElement.groupElement("x"));
        System.out.println("Built VarHandle for x: " + xHandle);
    }
}

قراءة بنية وكتابتها

خصص مقطعًا بالحجم الذي يتطلبه التخطيط، ثم استخدم مقابض var لتعيين الحقول وقراءتها. وهذا يحاكي ملء بنية C.

import java.lang.foreign.*;
import java.lang.invoke.VarHandle;

public class Main {
    public static void main(String[] args) {
        StructLayout point = MemoryLayout.structLayout(
            ValueLayout.JAVA_INT.withName("x"),
            ValueLayout.JAVA_INT.withName("y"));
        VarHandle xh = point.varHandle(MemoryLayout.PathElement.groupElement("x"));
        VarHandle yh = point.varHandle(MemoryLayout.PathElement.groupElement("y"));
        try (Arena arena = Arena.ofConfined()) {
            MemorySegment p = arena.allocate(point);
            xh.set(p, 0L, 3);
            yh.set(p, 0L, 4);
            System.out.println("Point = (" + xh.get(p, 0L) + ", " + yh.get(p, 0L) + ")");
        }
    }
}

الحشو والمحاذاة

تُدرج مترجمات C حشوًا بحيث تكون الحقول بمحاذاة صحيحة. ولا تضيف FFM هذا الحشو تلقائيًا، لذا يجب أن تدرج MemoryLayout.paddingLayout(n) لمطابقة تخطيط C تمامًا.

ويؤدي الخطأ في المحاذاة إلى إفساد كل حقل يلي الفجوة.

مثال على الحشو الصريح

في البنية struct { char c; int n; }، يجب محاذاة int على 4 بايتات، ولذلك تتبع char ثلاثة بايتات للحشو.

import java.lang.foreign.*;

public class Main {
    public static void main(String[] args) {
        StructLayout s = MemoryLayout.structLayout(
            ValueLayout.JAVA_BYTE.withName("c"),
            MemoryLayout.paddingLayout(3),
            ValueLayout.JAVA_INT.withName("n"));
        System.out.println("Aligned struct size: " + s.byteSize());
    }
}

التخطيطات التسلسلية

يصف SequenceLayout مصفوفة. ويمثّل MemoryLayout.sequenceLayout(count, element)، مثلًا، مصفوفةً من 10 قيم double.

import java.lang.foreign.*;

public class Main {
    public static void main(String[] args) {
        SequenceLayout arr = MemoryLayout.sequenceLayout(10, ValueLayout.JAVA_DOUBLE);
        System.out.println("Array bytes: " + arr.byteSize());
    }
}

التخطيطات المتداخلة

يمكن تركيب التخطيطات. فقد تحتوي بنية على تسلسل، وقد يحتوي تسلسل على بنى. وتتنقل تعبيرات المسار مثل sequenceElement() وgroupElement(name) داخل البيانات المتداخلة بعمق.

وهذا يتعامل مع هياكل بيانات C الواقعية مهما بلغت درجة تعقيدها.

الإزاحات والتقطيع

يمكنك الاستعلام عن byteOffset الخاص بحقل من مساره، واستخدام segment.asSlice(offset, size) للحصول على مقطع فرعي، وهو أمر مفيد لتمرير حقل واحد من بنية إلى دالة أصلية.

تحقق سريع

تذكّر مشكلة شائعة في التعامل مع البنى.

مراجعة

تعلمت كيفية وصف البيانات الأصلية:

  • عائلة التخطيطات: ValueLayout وSequenceLayout وStructLayout وUnionLayout
  • سمِّ الحقول باستخدام withName، واصل إليها عبر VarHandle وعناصر المسار
  • أضف paddingLayout صراحةً لضمان المحاذاة الصحيحة
  • ركّب التخطيطات المتداخلة واقطعها باستخدام asSlice

وبذلك يكتمل مقرر Foreign Function and Memory API.

الأسئلة الشائعة

هل درس «التخطيطات والهياكل» مجاني؟

نعم — نص درس «التخطيطات والهياكل» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «التخطيطات والهياكل»؟

وصف تخطيطات الذاكرة الأصلية تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «التخطيطات والهياكل»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. لماذا FFM بدلًا من JNI
  2. MemorySegment وArena
  3. مقابض Downcall
  4. التخطيطات والهياكل
← العودة إلى Java Academy