وماوس وضفدع. مترجم عالمي

في سلسلة حول البرمجة الموثوقة [1] ، [2] بقي سويفت منسياً بشكل غير مستحق. لنكون صادقين ، لم أعتبرها عبر الأنظمة الأساسية ، ولكني أعمل حصريًا لنظام macOS / iOS. حدث بالصدفة أن Swift مدعوم أيضًا ببيئة تطوير مثل RemObjects Elements .

اتضح أن لديها مترجم عالمي. يمكنه تجميع البرامج في C # و Go و Java و Oxygene Object Pascal و Swift for: Android و Cocoa (MacOS و iOS و tvOS) و JVM و Linux (x64 و armv6 و aarch64) و .NET / .NET Core / Mono و Native Windows (x86 / x64) ، WebAssembly.

ويفعل ذلك في أي مزيج من نظام اللغة الهدف تقريبًا! على سبيل المثال ، يمكنك كتابة برنامج بلغة Java يستخدم WPF لمنصة .NET الهدف ، وكل هذا في الأمثلة التي تأتي مع الحزمة.

لذلك ، أقدم مذكرة صغيرة حول عناصر RemObjects ، وفي الوقت نفسه حول موثوقية اللغتين المدعومتين فيها - Swift و Oxygene.

الرقم من radionetplus


بالإضافة إلى المناقشات حول مشكلة قابلية التشغيل المتبادل لأوقات التشغيل المختلفة - الأصلية ، JVM ، .NET ، GC ، ARC ، اتضح أنها ببساطة لا تصدق ، ومن كلا الحواس - حيث توصلنا خلال المناقشات إلى استنتاج مفاده أن الإدخال / الإخراج العادي أمر مستحيل.

باختصار حول عناصر RemObjects


هذه إما بيئة تطوير مستقلة مع مصحح أخطاء ، بما في ذلك واحدة بعيدة ، وإكمال التعليمات البرمجية لـ Windows أو macOS ، أو تتكامل مع Visual Studio ، و Xcode مطلوب لـ Cocoa. بالنسبة إلى Swift ، إنه مجاني ، أما بالنسبة للبقية ، فيتكلف من 199 دولارًا للنسخة للمشاريع الشخصية ، حتى 799 دولارًا للترخيص التجاري لجميع اللغات. للعمل مع DBMS العميل - الخادم من الضروري دفع مبلغ إضافي كبير.

الماء هو اسم إصدار Windows ، إنه زاهد تمامًا ، ولا يحتوي على محرر نموذج مرئي ، ولكنه يتعاطف مع الصرامة ، ولا يستغرق المثبت سوى 700 ميجابايت ، بالطبع ، لا يشمل JRE و .NET و Android NDK ، إلخ.

لتوبيخها ، أو لن أشيد كثيرًا ، تؤدي وظائفها ، لم تسقط أبدًا (لكن الذاكرة تتدفق).

المكافأة لـ IDE كثيرة:

  • ( Water , -)
  • -
  • C#, Swift, Java, Delphi, C, Obj-C Oxygene, C#, Swift, Java, Go
  • Go- . Go
  • -
  • Delphi/VCL


بالطبع ، هناك كمية صغيرة لأولئك الذين يعتقدون أنه (ج) يمكنك فقط أخذ ونقل أي برنامج إلى منصة أخرى.

OI هنا هو أن البرنامج لا يمكنه إلا استخدام إمكانات النظام الأساسي لـ RTL _ و_ الهدف لجميع اللغات ومجموعاتها. أي أنه لغرض .NET ، يمكنك استخدام WPF ، ولكن ليس rt.jar ، ولكن بالنسبة لـ Native ، فقط WinAPI أو GTK ، على التوالي. لكن المكتبة الأساسية المكتوبة بلغة الأوكسيجين متاحة في كل مكان ، كما هو الحال مع طبقة الهجرة مع دلفي - بالمناسبة فهي متاحة على جيثب .

يمكن أن يتضمن المشروع مشاريع فرعية بلغات مختلفة يدعمها RO. ومع استيراد المكتبات الخارجية ، هناك أيضًا خيارات متطورة.

سيتم استخدام إدارة الذاكرة من منصة مستهدفة مثل ARC for Cocoa. لم أخوض في التفاصيل ، لأن Native GC يتم استخدامه افتراضيًا ، على الرغم من وجود خيار - يتم التحقق منه ، يوجد في مشروعي على github .

أضف ملاحظة واحدة. إذا تمت كتابة البرنامج تحت إدارة الذاكرة اليدوية (malloc / مجانًا) ، فسيعمل ببساطة تحت ARC. وإذا كان البرنامج تحت ARC ، فسوف يعمل بدون تغييرات بموجب GC (باستثناء التدمير الفوري).

الموثوقية


الأكسجين


هذا هو في الأساس كائن مألوف باسكال ، ولكن على المنشطات. تم تسويق إصدار Oxygene for .NET أيضًا باسم Delphi Prism.

يبدو أكثر أمانًا بسبب:

  • ج
  • دعم تحكم لاغية
  • توفر العقود والثوابت
  • مراقبة تسجيل الهوية
  • القدرة على التحكم في المسافة البادئة لأزواج البداية / النهاية (ليس من الواضح كيف يعمل)
  • مغلق / كسول الخيط طرق الطبقة الآمنة
  • باستخدام باستخدام ، بمعنى RAII

السلبيات. يحتوي GC أيضًا على جانب سلبي - عدم الحتمية المؤقتة ، والاستهلاك المفرط للذاكرة. يمكنك أيضا كتابة عيوب أن حجم الشركة والمجتمع هو صغير، وبالتالي هناك ربما أكثر أخطاء التنفيذ من لtechnomonsters. الوثائق ضعيفة ، والإطار الأصلي هو الحد الأدنى ، والذي يمكن أن يسحب مجموعة من "الدراجات" إلى المشاريع إذا لم يكن هدفك هو .NET أو JRE.

من الناحية الفنية ، أضافت السكر نسبة إلى دلفي:

  • غير متزامن / انتظار / المستقبل ، ينتظر - حتى الآن فقط لشبكة
  • لينك
  • أنواع عامة / ديناميكية (مختلفة عن دلفي)
  • الصفوف
  • تسلسل / العائد
  • استيفاء سلسلة

إستراحة. ج #


تم التخلص منه سابقًا بسبب محدودية الأنظمة الأساسية المشتركة ، ولكن مع إصدار .NET Core 3 ، وظهور المترجم الأصلي بما في ذلك Linux ، أصبح أفضل قليلاً. بالإضافة إلى ذلك ، يتم دعم اللغة بشكل متساوٍ في RemObjects مع تحديد عشوائي للأهداف.

في الواقع ، مع الموثوقية ، C # أكثر أو أقل كل الحق. GC تفسد الجمال ، وليس مريحًا جدًا للعمل مع لاغية ، مما يؤدي إلى NPEs العادية ، والقدرة على الحصول على استثناء من وظيفة تبحث عن الأبرياء ، ومشاكل في الاستخدام غير الناجح لـ LINQ.

بسبب GC واستهلاك الموارد ، فهي ليست مناسبة جدًا لـ Embedded. علاوة على ذلك ، تم التخلي عن المترجم فقط بدون JIT .NET Micro Framework للتضمين منذ عام 2015 ، على الرغم من أنه تم تطويره كـ TinyCLR

الآن عن Swift


بشكل عام ، لغة مجمعة تشبه الآلة ، وهي واحدة من أحدثها وتم إنشاؤها مع الأخذ في الاعتبار تاريخ أسلافها. من صنع شركة آبل لنفسها ، لا يزال المترجم الرسمي تحت Ubuntu ، تم نقله إلى Open Source.

تولي الفرص على مستوى الموثوقية اهتماما لائقا. يمكنني أن أشكو من إمكانية تغيير فئات ثابتة وإمكانية الخلط بين فئة مرجعية وبنية - قيمة ، ولكن هنا كما هو الحال في C #.

إدارة الذاكرة موجودة في ARC الأصلي ، و RemObjects لمنصات أخرى غير Apple لديها GC.
ثقيل للمدمجة ، لا قدرات في الوقت الحقيقي.

الباقي الذي أود رؤيته هو كل شيء تقريبًا. لا توجد عقود (هناك ملحقات غير قياسية في RemObjects) ، ولكن هناك نوع من المحاكاة ممكن من خلال Property Observers أوpropertyWrapper التي ظهرت في 5.2 ( لم يتم تنفيذها بعد في RemObjects )

يجب ملاحظة الصفوف ، أسماء المعلمات وظائف ، array.insert(x, at: i)صريحة لف اختياري ، وعموما التفكير في العمل معها.

فارق بسيط أساسي ، أسميه تطور اللغة. العديد من الأمثلة من البرنامج التعليمي الرسمي (5.2) ببساطة لا تعمل على نفس Repl.it (5.0) ، ناهيك عن RemObjects ، وهي غير واضحة ما هي الإصدارات التي تتوافق تمامًا .

يختلف التنفيذ في RemObjects عن المرجع - تتم الإشارة إلى الصفيف هنا ، والسلسلة غير قابلة للتغيير ، وتختلف الواجهات أيضًا عن تلك الموضحة في البرنامج التعليمي ، وواجهات المكتبة ليس لها واجهاتها فحسب ، ولكنها تختلف قليلاً بين الأنظمة الأساسية. مما يجلب بعض التنوع إلى عملية الترميز المملة =)

الملخص النهائي المحدث لجدول الموثوقية في

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

جودة التجميع


دعونا نحاول أن نجعل برنامج Swift مشابهًا لمسافة Levenshtein في المقالة 0xd34df00d ومقارنتها بالبرامج من هناك.

سويفت
/*    
	  Windows.Native, Elements.Island
*/

class Program {
	 public static func LevDist(_ s1: [UInt8], _ s2: [UInt8]) -> Int32! {
		 let m = s1.count
		 let n = s2.count
		 //  Edge cases.
		 if m == 0 {
			 return n
		 } else {
			 if n == 0 {
				 return m
			 }
		 }

		 var range = Range(0 ... (n + 1))
		 var v0: Swift.Array<Int64> = range.GetSequence()  //17ms

//         var v1 = v0;    // in Swift must copy, but RO make a ref
		 var v1 = Swift.Array<Int64>(v0);

		 var i = 0
		 while i < m {
			 v1[0] = i + 1
			 var j = 0
			 while j < n {
				 let substCost = (s1[i] == s2[j] ? v0[j] : v0[j] + 1)
				 let delCost = v0[j + 1] + 1
				 let insCost = v1[j] + 1
				 v1[j + 1] = substCost < delCost ? substCost : delCost
				 if insCost < v1[j + 1] {
					 v1[j + 1] = insCost
				 }
				 j += 1
			 }

			 let temp = v0; v0 = v1; v1 = temp // copy refs
			 i += 1
		 }
		 return v0[n]
	 }
 }


var b1 = [UInt8](repeating: 61 as! UInt8, count: 20000)
var b2: [UInt8] = b1
var b3 = Swift.Array<UInt8>(repeating: UInt8(63), count: 20000)

print("Start Distance");

var execTimer: StopWatch! = StopWatch()
execTimer.Start()

print(Program.LevDist(b1, b2))
print(Program.LevDist(b1, b3))

execTimer.Stop()

var execTime: Float64 = execTimer.ElapsedMilliseconds / 1000.0 / 10

print("\(execTime) s")
return 0


البقية مع الحد الأدنى من التغييرات ، على الرغم من بالطبع العيوب الأكثر شدة ، قلصت على جيثب . أولئك الذين ليسوا خائفين وكسالى جدًا لتنزيل البيئة وتجميعها ، هناك أيضًا ثنائيات هناك ، إذا كنت ترغب في ذلك ، يمكنك تشغيل خيارات JVM و NET الآمنة نسبيًا ، أو في وضع الحماية.

تتعلق التغييرات بتعديلات RO ، وإزالة Encoding.UTF8.GetBytes من جزء القياس ، وتبين أنه في إصدار باسكال for i := 1 to 20000 do s1 := s1 + 'a';يمكن أن يستغرق تشكيل الخطوط في النموذج ما يصل إلى 4 دقائق (خارج جزء القياس).

جدول النتائج (تمت تسويته بواسطة Java باعتباره عالمي)
لسانمنصةالمترجمالوقت قمعيارالمعلمات
ج #NET4.7NET4.7.306213،075445٪-o +
ج #NET Core 3.1العناصر 10.011327385٪الإصدار> dotnet cs.dll
ج #فوز x64العناصر 10.06،312215٪إطلاق سراح
جافاJvmJDK 1.8.0.2422،941100٪-g: لا شيء
java LevDist
جافاJvmالعناصر 10.0285197٪release
$java -jar java8.jar
OxygeneNET4.7Elements 10.022,079751%release, range checking off
OxygeneWin x64Elements 10.09,421320%release, range checking off
SwiftJVMElements 10.023,733807%release
$java -jar swiftjvm.jar
SwiftWin x64Elements 10.0131,4004468%release
Go (Beta)Win x64Elements 10.089,2433034%release
سيكون من المثير للاهتمام اختبار WASM ، ولكن فاتني هذه النقطة.

تم إجراء القياسات في جهاز افتراضي مع Win7 ، مما أدى إلى إبطاء هذه المهمة بنحو ثلاث مرات بالنسبة إلى أجهزتي الحقيقية ، تم أخذ المتوسط ​​من 5 قياسات.

حتى الآن هناك استنتاج واحد فقط - الحياة على Swift ممكنة أيضًا خارج نظام Apple البيئي. لكن حتى الآن ليس سريعا. الفرضية القائلة بوجود مشكلة في Win7 ، لأن Win10 SDK تستخدم في التجميع الأصلي ، لم يتم تأكيدها - على خادم 2016 1607 الأوقات متشابهة تقريبًا.

[1] برمجة موثوقة في سياق اللغات - مراجعة noob. الجزء الأول
[2] البرمجة الموثوقة في سياق اللغات. الجزء 2 - المتحدين

All Articles