Fable: التسلسل في الخرافة 2

تم إنشاؤها على ٢ مارس ٢٠١٨  ·  17تعليقات  ·  مصدر: fable-compiler/Fable

بدأ استمرار المناقشة هنا https://github.com/SaturnFramework/Saturn/issues/33

هناك أيضًا بعض التعليقات المثيرة للاهتمام حول التسلسل الضمني مقابل التسلسل الصريح في سلسلة Twitter هذه .

ربما لم أكن جيدًا بما يكفي للتعبير عن نواياي في القضية المرتبطة و (مثل أي تغيير مفاجئ) أثار هذا بعض الجدل. سأحاول الكشف عن تفكيري الحالي أدناه للحصول على أساس أفضل للمناقشة :)

  • سيتم شحن Fable 2 alpha مبدئيًا بدون دعم انعكاس. افتراضي هو أن هذا سيؤثر بشكل أساسي على ofJson/toJson حيث أعتقد أنه لا يوجد الكثير من الانعكاسات الأخرى في Fable الآن. يرجى ملاحظة أن إصدار ألفا ليس مخصصًا للإنتاج بشكل واضح ، ولكن للمستخدمين لتجربة وتقديم الملاحظات.

  • لماذا إسقاط دعم التفكير؟ حسنًا ، في النهاية أعيد كتابة أجزاء كبيرة من الكود (على أمل) لجعله أكثر نظافة ، وأكثر قابلية للصيانة وجاذبية للمساهمين. في إعادة البناء ، لاحظت أن نموذج الانعكاس في Fable غير متسق ويلوث كثيرًا كلاً من كود JS الذي تم إنشاؤه (يعد تقليل أحجام الحزم أحد الأهداف الرئيسية لـ Fable 2) وقاعدة كود Fable. لهذا السبب أرغب في _بدء جديد _ باستخدام Fable 2 alpha لمعرفة احتياجات المستخدمين الحقيقية وإعادة تطبيقها من الصفر (أو لا ، إذا لم نكن بحاجة إليها).

  • كيف يمكن إعادة تنفيذ التفكير؟ الآن يتم تضمين معلومات التسلسل في الأنواع. هذا يجعل الأنواع تبدو أكثر بدانة وهي مشكلة عندما يقارن الناس البدائل في REPL لأنهم سيرون أن Fable يولد المزيد من الأكواد للأنواع البسيطة (لقد حدث بالفعل). بالنسبة إلى Fable 2 ، فكرت في خيارين:

    • اجعل معلومات الانعكاس متاحة من خلال طريقة ثابتة على أمل إزالتها عن طريق اهتزاز الشجرة عند البناء للإنتاج. من المحتمل أن تكون هذه هي أسهل طريقة ولكنها ستظل تعرض الكود في REPL.
    • قم بإنشاء معلومات انعكاس في موقع الاتصال لاستبدال typeof<Foo> على سبيل المثال. أعتقد أن هذا سيكون مفيدًا لمعظم الحالات ، لكنه يمكن أن يعاقب التطبيقات التي تستخدم الانعكاس على نطاق واسع ، حيث من المحتمل أن يكون هناك رمز مكرر.

      • لقد فكرت أيضًا في خيار ثالث: حقن ملف إضافي بمعلومات الانعكاس بحيث يظل مخفيًا للمستخدم ولا يتم استعادته إلا إذا لزم الأمر. لكن الطريقة التي يتفاعل بها Fable الآن مع أدوات وأدوات JS (Webpack ...) تجعل هذا الأمر معقدًا.

  • كيف يمكن أن يعمل التسلسل التلقائي في Fable 2؟ ستصبح السجلات كائنات JS عادية ، والنقابات ، مصفوفات JS. لذلك في معظم الحالات ، قد يعمل مجرد الاتصال بـ JSON.parse/stringify الأصلي. قد تكون المشكلة هي الأشياء غير المتوافقة مع المتصفح JSON api ، مثل الخرائط ، والمجموعات ، والتواريخ ، والأرقام الطويلة ، وما إلى ذلك ... لذلك سيظل Fable بحاجة إلى معرفة معلومات حول الحقول في وقت التشغيل من أجل القيام بذلك بشكل صحيح تضخيم / ينكمش لهم.

  • ما الذي لا يعجبني في التسلسل الحالي؟ هناك عدد قليل من الأشياء

    • إنه يعمل مع معظم الحالات ولكن ليس كل الحالات ، ويمكن أن يمنحك مفاجآت في وقت التشغيل ، وهذا ليس شيئًا جيدًا إذا كنا نبيع لغة "آمنة".
    • إنه بطريقة ما _mirror_ Newtonsoft.Json على جانب الواجهة الأمامية ، ويتوقع بعض الأشخاص أنه يدعم أشياء مثل السمات ، وتضمين معلومات الكتابة في json ، وما إلى ذلك.

      • اللغات الأخرى التي أعرفها (متضمنة F #) لا تحتوي على تسلسل مضمّن في نظامها الأساسي. يؤدي هذا إلى زيادة تكلفة صيانة قاعدة كود Fable ويزيد من صعوبة إعادة بنائه (كما حدث مع Fable 2). سأكون سعيدًا جدًا بنقل التسلسل إلى مكتبة خارجية.

  • ما هي البدائل؟ كما تم التعليق عليه في المسألة أعلاه ، فإن البديل الرئيسي في الوقت الحالي الذي يجب أن يعمل مع Fable 2 alpha على الفور هو Thot.Json . تمنحك هذه المكتبة مزيدًا من التحكم في JSON الذي تم إنشاؤه والتحقق من صحة أفضل بكثير. العيب الوحيد هو أنك تحتاج إلى كتابة أجهزة فك التشفير بنفسك ، ولكن هناك بالفعل عمل لتوليدها تلقائيًا .

dev2.0 discussion

التعليق الأكثر فائدة

أحد أسباب إعجابي بـ Fable هو دعمه لـ JSON. سيكون من الصعب بيع الحاجة إلى الذهاب وإضافة وظيفة التشفير / وحدة فك التشفير في كل مكان. أتذكر في الإصدارات المبكرة جدًا ، أنواع F # حيث تكون قريبة جدًا من كائنات JS وفي معظم الأوقات يمكنك فقط JSON.parse/stringify ومعرفة أن هذا القيد يعني أنه يمكنني تشغيله. لسوء الحظ ، مع تحسن Fable ، بدأت في استخدام Lists و DateTimes في JSON الخاص بي ، لذا إذا ذهبوا ، فسيكون ذلك بمثابة إعادة كتابة للمشروع: S

إذا كان إنشاء كود Thot.Json يمكن أن يكون جزءًا من سلسلة البناء لكل من العميل والخادم (في net46x - نعم أعلم ، يومًا ما سأضطر إلى الترقية) ، ربما كنوع من حدث ما قبل الإنشاء الذي يطلق على استخدامها لنشر قاعدة بيانات SQL لـ FSharp.Data.SqlClient) ثم يمكن أن تكون قابلة للتطبيق؟ أم أن مهام / أهداف بناء MS لا تزال شيئًا ... كيف paket لاستعادتها تلقائيًا؟

_ اختلفت مع Newtonsoft. منذ سنوات.

ال 17 كومينتر

أحد أسباب إعجابي بـ Fable هو دعمه لـ JSON. سيكون من الصعب بيع الحاجة إلى الذهاب وإضافة وظيفة التشفير / وحدة فك التشفير في كل مكان. أتذكر في الإصدارات المبكرة جدًا ، أنواع F # حيث تكون قريبة جدًا من كائنات JS وفي معظم الأوقات يمكنك فقط JSON.parse/stringify ومعرفة أن هذا القيد يعني أنه يمكنني تشغيله. لسوء الحظ ، مع تحسن Fable ، بدأت في استخدام Lists و DateTimes في JSON الخاص بي ، لذا إذا ذهبوا ، فسيكون ذلك بمثابة إعادة كتابة للمشروع: S

إذا كان إنشاء كود Thot.Json يمكن أن يكون جزءًا من سلسلة البناء لكل من العميل والخادم (في net46x - نعم أعلم ، يومًا ما سأضطر إلى الترقية) ، ربما كنوع من حدث ما قبل الإنشاء الذي يطلق على استخدامها لنشر قاعدة بيانات SQL لـ FSharp.Data.SqlClient) ثم يمكن أن تكون قابلة للتطبيق؟ أم أن مهام / أهداف بناء MS لا تزال شيئًا ... كيف paket لاستعادتها تلقائيًا؟

_ اختلفت مع Newtonsoft. منذ سنوات.

فقط لإنشاء نقطة معاكسة ، أستخدم الانعكاس في تطبيق عقدة Fable 1 للإنتاج على حد سواء لإلغاء تسلسل أنواع الرسائل في DU:

https://github.com/intel-hpdd/device-scanner/blob/16233ff62ad710aa02d6c8fe8acdbcad0c3e1e3e/IML.DeviceScannerDaemon/src/Main.fs#L13 -L20

وللتحديد التلقائي لأنواع ترميز تدفقات العقدة حتى أتمكن من تكوين تحويلات معًا وجعلها محددة نوعًا / تهيئتها كما هو متوقع في وقت التشغيل:

https://github.com/intel-hpdd/fable-import-node-powerpack/blob/4004f9c430517c1f26bf47f9c2f766598e500b0d/fable/Stream.fs#L99 -L120

https://github.com/intel-hpdd/device-scanner/blob/16233ff62ad710aa02d6c8fe8acdbcad0c3e1e3e/IML.DeviceScannerDaemon/src/Main.fs#L23 -L42

من المتوقع أن يرسل مستهلكو هذه الخدمة رسالة إلى البرنامج الخفي للحصول على بيانات متدفقة: https://github.com/intel-hpdd/device-scanner/tree/master/IML.DeviceScannerDaemon (لذا احتفظ بها كسجل / سلسلة بدلاً من ذلك من المصفوفة مثالية) لكنني أعتقد أنه يمكنني فقط مطابقة السلسلة قبل محاولة التسلسل للالتفاف على ذلك.

المشكلة الأكبر بالنسبة لي هي فقدان القدرة على التكوين التلقائي لتدفقات العقدة بناءً على نقص معلومات الانعكاس في وقت التشغيل ، ولكن قد أتمكن من حل هذا الأمر أيضًا.

davidtme أنا

سأفتح مشكلة على Thot.Json لتتبع تقدمي المستقبلي في هذا الموضوع.

لمعلوماتك ، قمت فقط بنشر Thot.Json.Net الذي يقدم نفس واجهة برمجة التطبيقات مثل Thot.Json لـ Fable.

الفكرة هي أنه يمكنك استخدام توجيه المترجم لمشاركة الكود:

// By adding this condition, you can share you code between your client and server 
#if FABLE_COMPILER
open Thot.Json
#else
open Thot.Json.Net
#endif

توثيق

alfonsogarciacaro هل سيكون من الممكن اكتشاف معلومات النوع في وقت التجميع وتكييف عملية serialization بناءً على ذلك؟

معلومات النوع متاحة في نوع التحويل البرمجي ، نعم. على الرغم من أننا إذا أردنا وصول _both_ إلى معلومات النوع دون انعكاس ونقل التسلسل خارج المترجم ، فإننا نحتاج إلى نوع من المكونات الإضافية (والذي لن يكون متاحًا أيضًا في Fable 2 alpha: wink :). لكن ماذا تقصد بالضبط بـ "تكييف عملية التسلسل"؟

TBH ، أجد أنه من الغريب استبعاد الوظائف لمجرد جعل نداء جافا سكريبت الذي تم إنشاؤه أكثر للأشخاص الذين يقومون بتقييم Fable. أعلم أن شعار Fable هو إنشاء جافا سكريبت جميل وأنا معجب به حقًا ، لكن IMO ، أقوى نقطة بيع Fable لديها كمترجم لجافا سكريبت ، تستخدم F # ، قابلية التشغيل البيني الرائعة مع نظام JS البيئي وقابلة للتطبيق على أي جافا سكريبت مدة العرض. جافا سكريبت الذي تم إنشاؤه بشكل جيد هو مجرد: من الجيد أن يكون لديك. (ماذا عن إجراء استطلاع لسؤال المستخدمين؟)

إنه يعمل مع معظم الحالات ولكن ليس كل الحالات ، ويمكن أن يمنحك مفاجآت في وقت التشغيل ، وهذا ليس شيئًا جيدًا إذا كنا نبيع لغة آمنة.

ثم نقوم بتنفيذ الحالات الاستثنائية الفاشلة. يبدو أن حالات فشل التسلسل التلقائي / إلغاء التسلسل تأتي في الأماكن التي ليس لدينا فيها بيانات وصفية كافية في وقت التشغيل.

إنه يعكس بطريقة ما Newtonsoft.Json على الجانب الأمامي ، ويتوقع بعض الأشخاص أنه يدعم أشياء مثل السمات ، وتضمين معلومات الكتابة في json ، وما إلى ذلك.

أود أن أقول أنه يوفر نفس سهولة Newtonsoft. يسعد Json والمستخدمون بالفعل باستخدامه كإعداد افتراضي. إذا أراد الناس المزيد من التحكم والتخصيصات ، فإن Thot.Json أو Fable.SimpleJson يوفران المستوى المطلوب من التحكم.

اللغات الأخرى التي أعرفها (متضمنة F #) لا تحتوي على تسلسل مضمّن في نظامها الأساسي. يؤدي هذا إلى زيادة تكلفة صيانة قاعدة كود Fable ويزيد من صعوبة إعادة بنائه (كما حدث مع Fable 2). سأكون سعيدًا جدًا بنقل التسلسل إلى مكتبة خارجية.

أوافق على زيادة تكاليف الصيانة ofJson<'a> و "toJson" لكن الأمر يستحق ذلك حقًا. إذا أردنا إنشاء مكتبة خارجية ، فيجب تنفيذ الانعكاس جيدًا للمستهلكين حتى يتمكنوا من كتابة مثل هذه المحولات

@ Zaid-Ajaj من وجهة نظري ، لا يقتصر الأمر على جعل جافا سكريبت الذي تم إنشاؤه يبدو رائعًا ولكن أيضًا لتقليل حجم الحزمة.

نرى الكثير من الأشخاص يشكون من ذلك خاصة في بلد لا يزال الاتصال بالإنترنت بطيئًا :)

alfonsogarciacaro كنت أتعجب من جعل Fable يخصص مكالمة المسلسل لدعم الخرائط والمجموعات وما إلى ذلك باستخدام اسم الخاصية كمفتاح ولكنها فكرة سيئة نوعًا ما. هذا يعني الكثير من تكرار الكود وأيضًا لن تكون كل مكالمة متسلسلة هي نفسها. دعونا ننسى هذه الفكرة :)

alfonsogarciacaro هل من الممكن تضمين معلومات الأنواع في "وحدة نمطية".

يمكن أن تحتوي الوحدة على جميع معلومات نوع التطبيق وإذا لم يتم استخدامها ، فهل يجب أن تتمكن Webpack من إزالتها ، أليس كذلك؟

شكرا لكم على تعليقاتكم. أتفهم أن المساعدين الحاليين ofJson/toJson مناسبون للغاية ولا ينبغي استبدالهم إلا إذا قدمنا ​​شيئًا سهل الاستخدام تقريبًا. شكرًا أيضًا على عينات jgrund ، من المفيد جدًا معرفة كيفية استخدام Fable في الإنتاج. لما يمكنني رؤيته يتم استخدام الانعكاس مقابل ofJson ، هل هناك أي مكان آخر تستخدم فيه typeof<'T> أو ما شابه ذلك؟

نشكرك أيضًا على رؤيتك @ Zaid-Ajaj. كما يقول Maxime ، لا يتعلق الأمر فقط بجعل الكود أكثر قابلية للقراءة (في الواقع في بعض الأماكن قد يصبح _ليس _ قابلاً للقراءة ولكن أكثر تحسينًا في Fable 2) ، ولكن تقليل أحجام الحزم وجعل الكود الذي تم إنشاؤه مناسبًا بشكل أفضل لأدوات تحسين JS. إنها أيضًا مسألة بقاء لأن لدينا الآن مكتبات أكثر نضجًا وتعقيدًا مثل Fulma إذا كانت أحجام الحزم كبيرة جدًا ، فقد يفكر المستخدمون في خيارات أخرى (ونحن نعلم أن المنافسة صعبة بين اللغات الوظيفية التي يتم تجميعها إلى JS). يحاول Fable تجميع لغة F # مع _ most_ من ميزاتها و FSharp.Core و _ بعض _ من BCL وتحديد ما إذا كان الانعكاس هو ميزة لغة F # أو جزء من وقت تشغيل BCL / .NET هو موضوع آخر. بالطبع ، إنه شيء مفيد للغاية ، لكني أرغب في استخدام إصدار Fable 2 alpha لتقييم تكاليفه / فوائده وما إذا كان لدينا بدائل قابلة للتطبيق.

@ MangelMaxime نعم ، هذا هو الخيار الثالث الذي كنت أفكر فيه أعلاه. لدي بعض الشكوك بشأن تجميعات الساعات ، لأن هذه الوحدة النمطية Types قد تصبح في حالة غير متسقة. لكني لست متأكدًا ، أعتقد أنه يمكننا المحاولة.

مرة أخرى ، شكرًا لكم جميعًا على تعليقاتكم ، إنها مفيدة حقًا ويرجى التأكد من أنها أقل نواياي لفعل أي شيء يمكن أن يضر بمستخدمي Fable الحاليين. سأحاول إصدار نسخة ألفا من Fable 2 بحيث يسهل مقارنة البدائل وتأثيراتها: +1:

كان السبب الوحيد الأكثر أهمية لاختيار Fable على Elm هو القدرة على استخدام F # على كلا الجانبين وإعادة استخدام الأنواع عبر المستويات. لست بحاجة إلى التفكير في حد ذاته ، ولكن كما قال davidtme ، فإن التنفيذ السابق "

سيكون التسلسل المستخرج في مكون إضافي للمترجم بمثابة حل وسط كبير ، إذا كان بإمكانك سحبه ؛)

هل هناك أي مكان آخر تستخدم فيه typeof <'T> أو ما شابه ذلك؟

آسف ، لم تسليط الضوء على القسم ذي الصلة. https://github.com/intel-hpdd/fable-import-node-powerpack/blob/4004f9c430517c1f26bf47f9c2f766598e500b0d/fable/Stream.fs#L144

من خلال القيام بذلك ، يمكنني تعيين ترميز التدفقات وحالة الجانب المقروء فقط من معلومات وقت التجميع ، مما يحفظني من تكوين كل دفق يدويًا بالمعلومات التي تم تشفيرها بالفعل بواسطة الأنواع.

بناءً على ذلك ، يمكنني القيام بأشياء مثل إنشاء التدفقات معًا دون القلق بشأن خيارات التشفير الثابت مسبقًا ، وهو أمر جيد جدًا: https://github.com/intel-hpdd/fable-import-node-powerpack/blob/4004f9c430517c1f26bf47f9c2f766598e500b0d/test/ Stream.Test.fs # L221 -L232

استخدام انعكاس ذكي آخر هنا:
https://github.com/Zaid-Ajaj/Fable.Remoting/blob/master/Fable.Remoting.Client/Proxy.fs#L70

و هنا:
https://github.com/Zaid-Ajaj/Fable.Remoting/blob/master/Fable.Remoting.Client/Proxy.fs#L169

تعتمد فكرة مشروع Fable.Remoting بالكامل على مدى توفر الانعكاس على كل من الخادم والعميل.

ربما لا يكون طلبًا شائعًا - ما لم يكن الاتصال حساسًا لوقت الاستجابة أو الأداء - ولكن ماذا عن دعم أنواع القيمة الأولية للنقل (مع دعم النسخ الصفري أو بدونه)؟ على سبيل المثال ، دعم أنواع القيمة المعبأة وغير المُدارة .NET؟ بحكم التعريف لها نفس التمثيل في كل مكان سواء في الأم أو في .NET. قد يكون هذا التمثيل الأولي أمرًا بالغ الأهمية ، لأنه في بعض الأحيان يكون تسلسل json / إلغاء التسلسل مكثفًا للغاية في وحدة المعالجة المركزية / الذاكرة / gc / زمن الوصول على الخادم (خاصة مع الكثير من العملاء و / أو معدل الرسائل المرتفع). يمكن أيضًا دعم النسخة الصفرية على العميل باستخدام دعم ArrayView / TypedArray / DataView (ستقرأ الحقول / تكتب مباشرة من / إلى المخزن المؤقت).
ربما يكون هذا أيضًا قابلاً للاستخدام مع NodeJS الأصلي المتداخل أيضًا (مع ffi).

[<Struct>]
[<StructLayout(LayoutKind.Sequential, Pack=1)>]
type Vector3 =
    val X: int32
    val Y: int32
    val Z: int32
    new(x,y,z) = {
      X=x;
      Y=y;
      Z=z;
    }
    new(dataview: DataView,offset) = {
    //TODO
    }

شكرا لتعليقكzpodlovics. يجب أن أقول إنني لست على دراية بهذا النوع من التسلسل. هل تتحدث عن JSON أو التسلسل الثنائي؟ (لقد لعبت قليلاً مع التسلسل الثنائي باستخدام بروتوكول Google flatbuffers في مشروع واحد ، لكنه تضمن الكثير من التعليمات البرمجية المعيارية.) هل يمكنك إعطاء مثال على الشكل الذي ستبدو عليه البيانات المتسلسلة؟ قد يكون من الصعب بعض الشيء الحصول على نفس التمثيل الدقيق في كل من .NET و JS لأن Fable يزيل بعض البيانات من الأنواع لتحسينها في كود JS ووقت التشغيل. إلى جانب القيود في JS ، مثل عدم القدرة على تعريف أنواع القيمة (البنية).

أيضًا ، كما تم التعليق أعلاه ، أفضل الاحتفاظ بالتسلسل منفصلاً عن الكود الأساسي للمجمع. في Fable 2 ، من المحتمل أن نحتفظ بنوع من تسلسل JSON الافتراضي لأنه الآن لراحة المستخدمين ، ولكن يفضل القيام بالأشياء الأكثر تعقيدًا في حزمة منفصلة.

alfonsogarciacaro شكرا على التعليق!

حسنًا ، إنه ليس تنسيقًا تسلسليًا حقًا ، ولكنه تمثيل مباشر للذاكرة كما سيتم تمثيله في بنية C أصيلة. سيبدو التنسيق "المتسلسل" تمامًا مثل التركيب (الأصلي) [1]. هذا مطلوب أيضًا للتشغيل المتداخل الأصلي ، حيث يستخدم نفس تمثيل الذاكرة مثل التطبيق الأصلي. سيستخدم المثال السابق 3 * 4 = منطقة ذاكرة 12 بايت. يمكن "محاكاة" البنية ككائن بطريقة تحل محل منطقة ذاكرة الدعم (.Wrap).

يمكن ترجمة البنية السابقة إلى شيء مثل هذا الرمز الزائف باستخدام واجهة برمجة تطبيقات JS DataView (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getInt32):

على سبيل المثال:

type Vector3 =
    val mutable view: DataView
    val mutable offset: int32
    static member XOffset=0
    static member YOffset=4
    static member ZOffset=8
    new(v: DataView,o:int32) = {
      view=v;
      offset=o;
    }
    member __.Wrap(v: DataView,o:int32) = {
      view=v;
      offset=o;
    }
    member __.X
        with get() = __.view.getInt32(__.offset+Vector3.XOffset)
        and set(v) = __.view.setInt32(__.offset+Vector3.XOffset,v)
    member __.Y
        with get() = __.view.getInt32(__.offset+Vector3.YOffset)
        and set(v) = __.view.setInt32(__.offset+Vector3.YOffset,v)
    member __.Z
        with get() = __.view.getInt32(__.offset+Vector3.ZOffset)
        and set(v) = __.view.setInt32(__.offset+Vector3.ZOffset,v)       

نعم ، يمكن إنشاء هذا يدويًا ، ولكن القيام بذلك يدويًا قد يستغرق وقتًا طويلاً ويكون عرضة للخطأ. خاصة إذا كان المترجم لديه بالفعل كل المعلومات المطلوبة: الأنواع ، وتخطيط الذاكرة ، وإزاحات الحقول ، وما إلى ذلك. سيكون نوعًا من ملحق ملحق / api / ast مناسبًا تمامًا أيضًا مع برنامج ترميز مخصص تم إنشاؤه. في النهاية سيواجه الجميع المشكلة الثنائية - كيف يجب أن يقرأ / يكتب الثنائيات على سبيل المثال: حزم الصور / الصوت / الفيديو / المستندات / الشبكة / إلخ.

يمكن أن يكون لإعادة تمثيل الذاكرة الأولية المدمجة كتنسيق تسلسل من أجل التشغيل المتداخل (لدعم ffi) قيمة مذهلة للجميع. في كل نظام أساسي ، يتوفر للمطورين خياران للتعامل مع النظام الأساسي: 1) كتابة كود التشغيل المتداخل كرمز أصلي للنظام الأساسي (مترجم النظام الأساسي ، سلسلة أدوات مختلفة ، عملية بناء / اختبار / نشر مختلفة ، إلخ) 2) كتابة كود يمثل ذاكرة أولية للتشغيل المتداخل + ffi. ليس من قبيل المصادفة أن .NET لديها دعم pinvoke المدمج.

ج:
[1] https://en.wikipedia.org/wiki/Struct_ (C_programming_language)
.صافي
[2] https://www.developerfusion.com/article/84519/mastering-structs-in-c/
شبيبة
[3] https://github.com/TooTallNate/ref-struct

شكرًا جزيلاً على الشرح الأكثر تفصيلاًzpodlovics! لقد استكشفت استخدام طرق عرض البيانات لمحاكاة الهياكل في الماضي ولكني لم أفعل الكثير لأنه لا تزال هناك قيود (مثل القدرة على استخدام الأرقام فقط ، ومن الصعب أيضًا نسخ بنية من مصفوفة ، إلخ. ). أيضًا ، من الممكن بالفعل التحكم بشكل أفضل في الذاكرة باستخدام Fable باستخدام المصفوفات الرقمية ، حيث سيتم ترجمتها إلى مصفوفات مكتوبة ، لكن هذا لم يكن جذابًا بين المستخدمين حتى الآن.

من المحتمل أن نفتح إصدارًا جديدًا لهذا الأمر لأنه ، كما قلت ، لا يتعلق بالضبط بالتسلسل. لا يمكنني اعتباره أولوية في الوقت الحالي ، لكن سيكون من الجيد جدًا رؤية مساهمات في هذا الصدد. قصة المكون الإضافي لـ Fable 2 لا تزال TBD ولكن يمكننا أن نجعلها تسمح بشيء كهذا إذا كنت مهتمًا بالعمل في مثل هذا المكون الإضافي.

هناك شيء واحد يجب مراعاته على الرغم من أن دعم WebAssembly يأتي إلى .NET / F # وسيكون تمثيل الذاكرة في هذه الحالة أقرب إلى نموذج .NET. عندما يحدث هذا ، قد تظل Fable كطريقة لدمج F # أقرب إلى نظام JS البيئي (كما هو الحال الآن) والاستفادة من الأدوات / libs الحالية المتاحة لبناء الواجهة الأمامية لتطبيقاتك.

alfonsogarciacaro هل يمكننا إغلاق هذه المشكلة؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات