· Blog · 12 min read
تعريف النوع للجهاز الظاهري AQ - AQ
نظرًا لأن الأنظمة والأجهزة والظروف الخارجية الأخرى المختلفة لها دعم وتعريفات مختلفة للذاكرة، لكي يلبي الجهاز الظاهري AQ متطلبات التشغيل عبر الأنظمة الأساسية، فمن الضروري تصميم معيار نوع موحد. تحدد هذه المقالة أنواع أجهزة AQ الافتراضية وتوحيدها للتأكد من إمكانية تشغيل أجهزة AQ الافتراضية الموجودة على أنظمة مختلفة بشكل طبيعي.
مقدمة
نظرًا لأن “الأنظمة” و”الأجهزة” والظروف الخارجية الأخرى المختلفة لها دعم وتعريفات مختلفة لـ “الذاكرة”، فمن أجل جعل “الجهاز الظاهري AQ” يلبي متطلبات التشغيل عبر الأنظمة الأساسية، فمن الضروري تصميم معيار “النوع” الموحد لا غنى عنه. تحدد هذه المقالة أنواع أجهزة AQ الافتراضية وتوحيدها للتأكد من إمكانية تشغيل أجهزة AQ الافتراضية الموجودة على أنظمة مختلفة بشكل طبيعي.
أفكار التصميم
أولاً وقبل كل شيء، من أجل تحقيق تبسيط “الأنواع” وزيادة كفاءة التشغيل، يجب أن يكون تصميم “الأنواع الأصلية” (“الأنواع” التي يدعمها الجهاز الظاهري بشكل مباشر دون تعريفها من خلال التعليمات البرمجية) كما يلي: أقل ما يمكن. لذلك، بالنسبة إلى الأنواع المعقدة ذات الصلة، مثل “التعداد”، و”البنية”، وما إلى ذلك، فإننا نقوم بتطويرها على مستوى “المترجم” لتقليل عدد “الأنواع” و”التعقيد” في “الجهاز الافتراضي”.
وفقًا لتعريف
النوع
فيAqvmMemory_Memory
فيmemory.h
، يقوم كلuint8_t
بتخزين2
نوعين، لذلك يجب أن يكون عددالأنواع
بين0x00
-0x0F
(16) بين.
ثانيًا، من خلال البحث عن “أنواع” “لغات البرمجة” الأخرى، قمنا بتلخيص “الأنواع” الشائعة وقمنا بتصميم “الأنواع” التالية لتحقيق أداء و بساطة “الآلة الافتراضية”. `التوازن.
- null - نوع فارغ
- byte -
1
نوع عدد صحيح موقّع بالبايت - int -
4
بايت نوع عدد صحيح مُوقع - long -
8
بايت نوع عدد صحيح مُوقع - float -
4
بايت نوع النقطة العائمة بدقة واحدة - double -
8
بايت نوع النقطة العائمة بدقة واحدة
أخيرًا، قمنا بتصميم “معايير” تفصيلية لـ “الأنواع” لضمان قدرة “جهاز AQ الظاهري” على تحقيق التشغيل “عبر الأنظمة الأساسية”.
من أجل تقليل تعريف نوع “الجهاز الظاهري”، سيتم تنفيذ “الأنواع غير الموقعة” على مستوى “المترجم”.
تعريفات “النوع” لـ “لغات البرمجة” الأخرى
من أجل جعل “أنواع” AQ أكثر شمولاً وأسهل على المطورين فهمها، نشير إلى تعريفات “النوع” الخاصة بـ “لغات البرمجة” الشائعة الموجودة.
“الأنواع الأساسية” المحددة أدناه هي أنواع “بيانات” عامة مثل الأعداد الصحيحة وأرقام الفاصلة العائمة والأنواع الفارغة. يتولى أعمال تخزين البيانات الأساسية أو له أهمية خاصة.
ج
المعيار “C” الحالي هو “ISO/IEC 9899:2018 تكنولوجيا المعلومات - لغات البرمجة - C”. نظرًا لأن حقوق الطبع والنشر لهذا المعيار تعود إلى “ISO (المنظمة الدولية للمعايير)” و”IEC (اللجنة الكهروتقنية الدولية)”، ومن أجل تجنب النزاعات حول حقوق الطبع والنشر، فقد قمنا بتلخيص تعريفات “النوع”. نفس أدناه.
الموقع الرسمي: https://www.iso.org/standard/74528.html
_Bool
- الكائنات التي تم تعريفها كنوع_Bool
كبيرة بما يكفي لتخزين القيمتين0
و1
.(unsigned) char
- نوع الحرف. الكائن المُعلن كنوع char كبير بما يكفي لتخزين أي عضو في مجموعة أحرف التنفيذ الأساسية. إذا تم تخزين أحد أعضاء مجموعة أحرف التنفيذ الأساسية في كائنchar
، فسيتم ضمان أن تكون قيمته غير سالبة. إذا تم تخزين أي أحرف أخرى في كائن حرف، فإن القيمة الناتجة هي “محددة التنفيذ”، ولكن يجب أن تكون ضمن نطاق القيم التي يمكن تمثيلها في هذا النوع.signed char
- نوع الحرف الموقع.short int
- نوع عدد صحيح موقّع ممتد.unsigned short int
- نوع عدد صحيح ممتد غير موقع.int
- نوع عدد صحيح موقّع قياسي ممتد.unsigned int
- نوع عدد صحيح قياسي غير موقع.long int
- نوع عدد صحيح موقّع ممتد.unsigned long int
- نوع عدد صحيح ممتد غير موقع.long long int
- نوع عدد صحيح موقّع ممتد.unsigned long long int
- نوع عدد صحيح ممتد غير موقع.float
- نوع النقطة العائمة. مجموعة القيم من النوع “العائم” هي مجموعة فرعية من مجموعة القيم من النوع “مزدوج”.double
- نوع النقطة العائمة. مجموعة القيم من النوعمزدوج
هي مجموعة فرعية من مجموعة قيم من النوعمزدوج طويل
.long double
- نوع النقطة العائمة.void
- يحتوي النوعvoid
على مجموعة من القيم الخالية، وهو نوع كائن غير مكتمل ولا يمكن تنفيذه.
بالإضافة إلى ذلك، تحتوي لغة C أيضًا على أنواع أخرى غير “أساسية”، مثل أنواع “التعداد” (أنواع “التعداد”)، وأنواع المؤشر، وما إلى ذلك. لن تتم مناقشته في تصميم “الجهاز الظاهري”.
C++
ومتغيرات C
الأخرى
معيار C++
الحالي هو ISO/IEC 14882:2020 Programming languages — C++
. نظرًا لأن C++
ومتغيرات C
الأخرى هي في الأساس نفس أنواع C
، فلم تعد مدرجة في القائمة بعد الآن.
Python
أحدث إصدار رسمي من Python
هو “3.12.4”. الأنواع المضمنة في وثائق Python 3.12.4 توثق الأنواع القياسية المضمنة في مترجم Python.
الأنواع الرئيسية المضمنة هي Number
وSequence
وMap
وClass
وInstance
وException
. لأسباب تتعلق بالمساحة، لن تتم مناقشة المحتوى بخلاف “الأنواع الأساسية” هنا.
رابط المصدر: https://docs.python.org/zh-cn/3/library/stdtypes.html
int
- عدد صحيحعدد صحيح
له دقة لا نهائية. تنتج الأعداد الصحيحة غير المعدلة (بما في ذلك الأرقام السداسية العشرية والثمانية والثنائية) أعدادًا صحيحة.float
- أرقام الفاصلة العائمة عادةً ما يتم تنفيذ “أرقام الفاصلة العائمة” في لغة “C” باستخدام “مزدوج”. تنتج القيم الحرفية الرقمية التي تحتوي على علامة عشرية أو علامة أس رقمًا عائمًا.complex
- الأعداد المركبة تحتوي الأعداد المركبة على “جزء حقيقي” و”جزء تخيلي”، وكل جزء هو “رقم فاصلة عائمة”. من خلال إضافةj
أوJ
بعد عدد حرفي، يمكنك الحصول علىرقم وهمي
رقم مركب
بجزء حقيقي من الصفر، قم بإضافته إلىعدد صحيح
أورقم النقطة العائمة
الحصول على “عدد وهمي” “عدد مركب” مع الجزء الحقيقي والجزء التخيلي.bool
- Boolean Boolean هو أيضًا نوع فرعي من الأعداد الصحيحة. كائن منطقي يمثل قيمة حقيقية. يحتوي النوع “bool” على حالتين ثابتتين فقط: “True” و”False”.list
- القائمة “القائمة” هي “تسلسل قابل للتغيير”، تُستخدم عادةً للاحتفاظ “بمجموعة” من العناصر المتشابهة (حيث ستختلف درجة التشابه الدقيقة اعتمادًا على التطبيق).tuple
- TupleTuple
هوتسلسل غير قابل للتغيير
، يُستخدم عادة لتخزينمجموعات متعددة العناصر
من البيانات غير المتجانسة (مثلالصفوف
التي تنتجها الدالةenumerate()
المضمنة). تُستخدم “الصفوف” أيضًا في المواقف التي تتطلب “تسلسلًا غير قابل للتغيير” من البيانات المتجانسة (على سبيل المثال، السماح بتخزين مثيلات “set” أو “dict”).range
- يمثل النوع “النطاق” “تسلسلًا رقميًا” “غير قابل للتغيير” ويستخدم عادةً للتكرار لعدد محدد من المرات في حلقة “for”.str
- نوع تسلسل النص تستخدم معالجة البيانات النصية في “Python” الكائن “str”، المعروف أيضًا باسم “string”. “السلسلة” هي “تسلسل غير قابل للتغيير” لنقاط كود “Unicode”.bytes
- كائن “البايتات” هو “تسلسل غير قابل للتغيير” من البايتات الفردية. نظرًا لأن العديد من البروتوكولات الثنائية الرئيسية تعتمد على ترميز نص ASCII، فإن كائن البايت يوفر بعض الأساليب المتوفرة فقط عند العمل مع البيانات المتوافقة مع ASCII وترتبط ارتباطًا وثيقًا بكائنات السلسلة في العديد من الميزات.bytearray
-byteearray' - كائن
byteearrayهو النظير القابل للتغيير لكائن
bytes`.memoryview
-memoryview
- عرض الذاكرة يسمح كائنmemoryview
لكودPython
بالوصول إلى البيانات الداخلية للكائن، طالما أن الكائن يدعمبروتوكول المخزن المؤقت
دون عمل نسخة.set
-set
- نوع المجموعة كائنset
هو عبارة عن مجموعة غير مرتبة متعددة العناصر تتكون من كائنات فريدة قابلة للتجزئة. تشمل الاستخدامات الشائعة اكتشاف العضوية، وإزالة التكرارات من التسلسلات، وتعيين العمليات الحسابية في الرياضيات، مثل التقاطع والاتحاد والفرق والفرق المتماثل وما إلى ذلك. النوعset
قابل للتغيير، ويمكن تغيير محتوياته باستخدام طرق مثلadd()
وremove()
. نظرًا لأنه نوع قابل للتغيير، فهو لا يحتوي على قيمة تجزئة ولا يمكن استخدامه كمفتاح في قاموس أو عنصر في مجموعة.frozenset
-frozenset
- نوع المجموعة نوعfrozenset
هوغير قابل للتغيير
وقابل للتجزئة
، ولا يمكن تغيير محتوياته بعد إنشائه، لذلك يمكن استخدامه كـمفتاح
لـقاموس
أو غيره` مجموعة “العنصر” من.dict
-dict
- نوع التعيين سيقوم كائنتعيين' بتعيين قيمة
قابلة للتجزئة` إلى كائن عشوائي. “الخريطة” هي “كائن قابل للتغيير”. يوجد حاليًا نوع تعيين قياسي واحد فقط “قاموس”.GenericAlias
- “الاسم المستعار العام” - عادةً ما يتم إنشاء كائنات “الاسم المستعار العام” عن طريق “استخراج” “فئة”. يتم استخدامها بشكل شائع مع “فئات الحاويات” مثل “list” أو “dict”. على سبيل المثال، يتم إنشاء كائنGenericAlias
list[int]
عن طريق استخراج فئةlist
باستخدام المعلمةint
. الغرض الرئيسي من كائنات “GenericAlias” هو “التعليق التوضيحي للنوع”.union
-union` - يحتوي
كائن الاتحاد“ على قيمة العملية|(bitwise OR)
التي يتم تنفيذها علىكائنات نوع
متعددة. تُستخدم هذه الأنواع بشكل أساسي في “التعليقات التوضيحية للنوع”. مقارنةً بـ Typing.Union، تتيح تعبيرات “نوع الاتحاد” صياغة أكثر إيجازًا لتلميحات النوع.
Java
”مواصفات” JVM (Java Virtual Machine) هي “مواصفات Java® Virtual Machine”، وأحدث إصدار هو “Java SE 22 Edition”، وتاريخ الإصدار هو “2024-02-09”. بالمقارنة مع “تعريف النوع” على مستوى “المترجم” للغات الأخرى، فإن وضع “JVM” أكثر انسجامًا مع تصميم “الجهاز الظاهري”. في الوقت نفسه، تنقسم أنواع JVM إلى أنواع بدائية وأنواع مرجعية نظرًا لاحتياجات تطوير الآلة الافتراضية، اخترنا الأنواع البدائية للمناقشة.
بالإضافة إلى ذلك، تحتوي Java
أيضًا على مواصفات
وهي مواصفات لغة Java، إصدار Java SE 22
، رابط HTML
: https://docs.Oracle.com/javase/specs/jls/se22/ html /index.html رابط PDF
: https://docs.Oracle.com/javase/specs/jls/se22/jls22.pdf. نظرًا للاحتياجات الخاصة لتطوير “الآلة الافتراضية”، تختار هذه المقالة دراسة “تعريف النوع” لـ “JVM” بدلاً من “تعريف النوع” للغة “Java”.
رابط المصدر (HTML): https://docs.Oracle.com/javase/specs/jvms/se22/html/jvms-2.html#jvms-2.3
رابط المصدر (PDF): https://docs.Oracle.com/javase/specs/jvms/se22/jvms22.pdf
byte
- نوع عدد صحيح قيمته8
بت عدد صحيح مكمل لاثنين، وقيمته الافتراضية هيصفر
. من-128
إلى127
(-27 إلى 27 - 1)، شاملاً.short
- نوع عدد صحيح تبلغ قيمته16
بت عددًا صحيحًا مكملاً لاثنين مُوقعين، وقيمته الافتراضية هيصفر
. من-32768
إلى32767
(-215 إلى 215 - 1)، شاملاً.int
- نوع عدد صحيح تبلغ قيمته32
بت عددًا صحيحًا مكملاً لاثنين مُوقعين وقيمته الافتراضية هيصفر
. من-2147483648
إلى2147483647
(-231 إلى 231 - 1)، شاملاً.long
- نوع عدد صحيح تبلغ قيمته64
بت عددًا صحيحًا مكملاً لاثنين مُوقعين وقيمته الافتراضية هيصفر
. من-9223372036854775808
إلى9223372036854775807
(-263 إلى 263 - 1)، شاملاً.char
- نوع عدد صحيح قيمته هي16
بت عدد صحيح غير موقّع، يمثل نقطة كودUnicode
في المستوى الأساسي متعدد اللغات، المشفر كـUTF-16
، وقيمته الافتراضية هينقطة الرمز(
\u0000
) خالية. من0
إلى65535
.float
- نوع النقطة العائمة تتوافق قيمته تمامًا مع تنسيق32
بت IEEE 754 ثنائي 32، والقيمة الافتراضية هيصفر موجب
.double
- نوع النقطة العائمة قيمته هي نفس القيمة تمامًا بتنسيق64
بت IEEE 754 ثنائي64، والقيمة الافتراضية هيصفر موجب
.
معايير مفصلة
تعريف النوع
ستتم معالجة الأنواع المعقدة بواسطة المترجم لضمان بساطة وكفاءة الجهاز الظاهري، وسيتم دعم الأنواع البسيطة مباشرة بواسطة الجهاز الظاهري.
فيما يلي الأنواع الأساسية “6” التي يحددها “جهاز AQ الظاهري”:
تشمل الأنواع غير المدعومة بشكل مباشر “عددًا صحيحًا غير موقّع”، و”عنوان الذاكرة (المؤشر)”، و”سلسلة”، وما إلى ذلك. سيتم تنفيذ هذه الأنواع على مستوى “المترجم”. بالنسبة إلى “الأجهزة الافتراضية”، يتم تنفيذ هذه الأنواع بشكل غير مباشر.
null
-0x00
- نوع فارغ
الأنواع الفارغة تمثل فقط الأنواع غير المعروفة أو الأنواع التي لا تحتاج إلى استخدامها (على سبيل المثال: بلا إرجاع). لا طول.byte
-0x01
-1
بايت (8
بت) نوع عدد صحيح موقّع
مخزنة في مكملين. يُستخدم بشكل عام لتخزين “bool” أو “char”. من-128
إلى127
(-27 إلى 27 - 1)، شاملاً.int
-0x02
-4
بايت (32
بت) نوع عدد صحيح موقّع
مخزنة في مكملين. من-2147483648
إلى2147483647
(-231 إلى 231 - 1)، شاملاً.long
-0x03
-8
بايت (64
بت) نوع عدد صحيح موقّع
مخزنة في مكملين. يتم أيضًا تخزين “عنوان الذاكرة (المؤشر)” باستخدام هذا. قيمته هي 64 بت عدد صحيح مكمل لتوقيع اثنين وقيمته الافتراضية هي صفر. من-9223372036854775808
إلى9223372036854775807
(-263 إلى 263 - 1)، شاملاً.float
-0x04
-4
بايت (32
بت) نوع النقطة العائمة بدقة واحدة
يعتمد معيارISO/IEC 60559 Information technology — Microprocessor Systems — Floating-Point arithmetic
.double
-0x05
-8
بايت (64
بت) نوع النقطة العائمة بدقة واحدة
采用ISO/IEC 60559 Information technology — Microprocessor Systems — Floating-Point arithmetic
标准。
الكود المكمل
تعريف
”المكمل” هو تمثيل الأرقام الموقعة في أجهزة الكمبيوتر.
طريقة
”الكود المكمل” لـ “الأرقام الموجبة” و”0” هو الرقم نفسه بالإضافة إلى أعلى بت 0. “المكمل” لـ “الرقم السالب” هو عكس قيمته المطلقة بمقدار البت وإضافة 1.
معيار النقطة العائمة
تعريف
يعتمد “معيار الأرقام ذات الفاصلة العائمة” معيار ISO/IEC 60559 Information technology — Microprocessor Systems — Floating-Point arithmetic
. ويسمى هذا المعيار أيضًا “معيار IEEE الثنائي الحسابي للنقطة العائمة (IEEE 754)“
الموقع الرسمي: https://www.iso.org/standard/80985.html
طريقة
”القيمة الفعلية” لـ “رقم الفاصلة العائمة” تساوي “بت الإشارة” مضروبًا في “قيمة إزاحة الأس” مضروبة في “القيمة الكسرية”. للحصول على تعريفات مفصلة، راجع معيار ISO/IEC 60559 Information technology — Microprocessor Systems — Floating-Point arithmetic
.
32
بت رقم النقطة العائمة
Bit length | Name | Bit number |
---|---|---|
1 | Sign | 31 |
8 | Number | 30 to 23 positive value (actual exponent size + 127) |
23 | Significant digit | 22 to 0 bit number (starting from the right with 0) |
64
بت رقم النقطة العائمة
Bit length | Name | Bit number |
---|---|---|
1 | Sign | 63 |
11 | Number | 62 to 52 positive value (actual exponent size + 1023) |
52 | Significant digit | 51 to 0 bit number (starting from the right with 0) |
types.h
الكود الكامل:
هناك أيضًا رموز ذات صلة بـ “النوع”. فيما يلي رمز types.h
:
// Copyright 2024 AQ author, All Rights Reserved.
// This program is licensed under the AQ License. You can find the AQ license in
// the root directory.
#ifndef AQ_AQVM_MEMORY_TYPES_H_
#define AQ_AQVM_MEMORY_TYPES_H_
#include <stdint.h>
// null - 0x00 - null type
// The null type simply represents an unknown type or a type that is not needed
// (e.g., returns nothing). Has no length.
typedef void aqnull;
// byte - 0x01 - 1 byte (8-bit) signed integer type
// Using two's complement storage. Generally used to store bool or char. From
// -128 to 127 (-2^7 to 2^7 - 1), inclusive.
typedef int8_t aqbyte;
// int - 0x02 - 4-byte (32-bit) signed integer type
// Stored in two's complement notation. From -2147483648 to 2147483647 (-2^31 to
// 2^31 - 1), inclusive.
typedef int aqint;
// long - 0x03 - 8-byte (64-bit) signed integer type
// Stored in two's complement notation. From -9223372036854775808 to
// 9223372036854775807 (-2^63 to 2^63 - 1), inclusive.
typedef int64_t aqlong;
// float - 0x04 - 4-byte (32-bit) single-precision floating point type
// Using ISO/IEC 60559 Information technology — Microprocessor Systems —
// Floating-Point arithmetic standard.
typedef float aqfloat;
// double - 0x05 - 8-byte (64-bit) double-precision floating point type
// Using ISO/IEC 60559 Information technology — Microprocessor Systems —
// Floating-Point arithmetic standard.
typedef double aqdouble;
// The part beyond 0x05 and within 0x0F is currently designated as a reserved
// type. The part beyond 0x0F cannot be used because it exceeds the 4-bit size
// limit.
#endif
نحن نعمل بجد لتطوير “AQ Virtual Machine”. إذا كنت ترغب في معرفة المزيد من المعلومات أو المشاركة في أعمال التطوير، يرجى متابعة موقعنا الرسمي: https://www.axa6.com وGithub: https://github.com/aq-org/AQ.
تم نشر هذه المقالة بناءً على ترخيص AQ: https://github.com/aq-org/AQ/blob/main/LICENSE، إذا لزم الأمر، يرجى تعديلها أو إعادة طباعتها وفقًا لترخيص AQ.