الصدأ لمطور الويب - بداية سريعة ورحلة سريعة

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

تاريخ موجز لقيم البرمجة


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

لغات المستوى المنخفض: C ، C ++


من الواضح أنه يمكنك كتابة البرنامج فورًا على شكل أرقام على رموز الماكينات والعديد منهم فعل ذلك على ZX Spectrum و BK0010-01 وعلى الكمبيوتر - اتضح أن الرمز سريع للغاية :-) لكننا أشخاص ، الكثير من المعلومات لا تتناسب مع رؤوسنا ، فنحن منشغلون وبالتالي حتى اختراع المجمّع لم يساعد كثيرًا - نادرًا ما تتم كتابة التعليمات البرمجية في هذا المستوى المنخفض وبصورة دقيقة جدًا ، وعلى الأرجح ، إذا كنت لا تقوم بتطوير برامج تشغيل أو وحدات تحكم دقيقة أو أنظمة مدمجة صعبة ، فلن يكون هذا مفيدًا في الحياة.


في أوائل سبعينيات القرن العشرين ، اخترع Bell Labs لغة C ، التي ترسخت بفضل بناء الجملة التجريدية والتجريدات "الرخيصة" ، والتي أصبحت تقريبًا "مجمّع متنقل". من الواضح أنك إذا كنت تأخذ لحنًا ، تكتب لمدة 10 سنوات في ليالي C ، ولا تأكل اللحم ، والصلاة ، ولا تتشتت انتباهك عن طريق الشبكات الاجتماعية والجنس العادل ، يمكنك كتابة برامج مفيدة وسريعة للغاية ، كما تشهد GNU ببلاغة على ألعاب إنتاجية ممتازة ، حبيبي ، ولكن غير بديلة في جودة ويندوز ، ويمكن إعطاء العديد من الأمثلة.
لكن الجانب الآخر من العملة يجعله دائمًا يشعر - باستمرار فتح ثغرات في الأمان (تم إنشاء صناعة بأكملها لـ "ثقوب في البرمجيات") ، والناجمة عن ثقوب في مفهوم لغة C نفسها - المترجم يشبه الثور غير المسؤول ، مع قوة لا تصدق ، والنشوة الشديدة والذاكرة القصيرة. أي إهمال - ولا يمكنك فقط إسقاط البرنامج (إلغاء تحديد مؤشر لاغية ، قم بتحرير المؤشر مرتين ، واخرج من الصفيف) ، ولكن قم بتدمير البيانات بشكل لا يمكن إصلاحه ولا تلاحظه لفترة طويلة حتى يبدأ العملاء في الاتصال وعندما يفوت الأوان (سلوك غير محدد) ، مختلف من المترجم إلى المترجم).

Björn Straustrup زاد من إرباك الوضع في أوائل الثمانينيات ، مضيفًا إمكانيات OOP إلى C. على الرغم من شعبيته الكبيرة ، يُنظر إلى C ++ ، بشكل عام ، على أنها سلسلة من تجارب البرمجة ، على هذا النحو ، مع نتائج نجاح مختلفة ، بما في ذلك قاتلة. في بعض الأحيان ، يبدو أنه لا يوجد أي معنى في C ++ من البداية ، أو أنه قد ضاع تدريجياً ، مما أدى إلى كومة من المفاهيم المعقدة والمتضاربة موضوعيًا ، والتي أصبحت أكثر وأكثر مع كل معيار جديد. على الرغم من الهدف الممتاز المتمثل في "التجريد بدون تكلفة" ، مما يسمح لك بالحصول على كود سريع ، لإنشاء حل موثوق ، كما هو الحال في C ، تكون الشروط التالية مطلوبة:
  • من ذوي الخبرة ، من كلمة "جدا" ، فريق (سنوات الممارسة ، "رهبان" البرمجة)
  • جيد محلل ثابت القانون
  • قسم الاختبار (في الكود قد يكون هناك ثقوب خلفها مترجم غير مسؤول ، مما قد يجعلهم يشعرون لفترة طويلة)
  • لا يتم استخدام المتطلبات المتفق عليها من قبل جميع أعضاء الفريق والتي يتم مراقبتها بعناية (لا يتم استخدام المؤشرات الأولية والتعبئة الصارمة وأشد الانضباط لمتغيرات التسمية وتهيئة الكائنات وما إلى ذلك)


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

مرة أخرى ، ملخص C / C ++ - لدينا مترجم قوي ، ولكن "غير مسؤول" مع "التجريدات الحالية" ، والتي تساعد المطور قليلاً. نتيجة لذلك ، يتم تمرير جميع المشاكل إلى أكتاف المبرمج. إذا كان هناك مبرمج واحد على الأقل في الفريق غير متمرس ، ليس دقيقًا للغاية ولا يعرف كل التفاصيل الدقيقة للمترجم (في الحقيقة ، لا أحد يعرف كل التفاصيل الدقيقة ويجدها المستخدمون لاحقًا) - انتظر المشكلة. ولكن بعد ذلك يعمل البرنامج بسرعة وربما بشكل صحيح :-) هذا ، بالطبع ، أنتج سوقًا كاملاً من "العكازات" - محللون ثابتون ، والذي ، كما اتضح ، يجب أن يدفعه العميل. السؤال الذي يطرح نفسه - لا يمكن أن يكون من الممكن كتابة مترجم أكثر صرامة وآمنة تساعد المطور وتلد برامج دون مفاجآت وثغرات أمنية منخفضة المستوى؟

جافا ، C # ، Kotlin


أدى الموقف مع التحكم الضعيف بصراحة في "السلوك غير المحدد" والمتطلبات العالية جدًا للمطورين في C / C ++ إلى الرغبة في خلق بيئة تطوير آمنة ، بما في ذلك للإنترنت ، في متناول معظم القادمين. حتى في أواخر 90s ظهرت جافا.
من حيث المبدأ ، الآن يمكن لأي شخص لديه مستوى مختلف من التدريب أن يكتب أي شيء وأي شيء وقد تم تشغيله ولم يتم وضعه في البرنامج - لم تكن هناك "فتحات" منخفضة المستوى في مجال الأمن والحوادث العفوية (تقريبًا ، لكنها كانت ناجمة بالفعل عن الأخطاء في الجهاز الظاهري وثابتة مركزيا). لم يكن هناك سوى "فتحات" منطقية أو رمز بطيء مخفي (ولد من جهل الخوارزميات ، ومفهوم التكلفة الخوارزمية والتباطؤ عند زيادة حجم البيانات) ، وهو ما لم يكن مخيفًا جدًا بعد الآن ، ويسمح لك بإجراء برامج سريعة ، وإذا لزم الأمر ، أعد كتابة أجزاء صغيرة بفريق C / C مؤهل C ++.
الأشياء المثيرة للاهتمام والقيمة التي جلبها عالم Java هي ما يلي:
  • يتم كتابة الكود مرة واحدة لجهاز ظاهري يعمل على أي تصميمات (ويندوز ، لينكس ، ماك)
  • المطور لم يعد يدير الذاكرة مباشرة ، كما هو الحال في C / C ++ - يتم تمرير هذا إلى أكتاف "جامع البيانات المهملة" ؛ يؤدي ذلك إلى إزالة خطر حدوث سلوك غير محدد وتلف البيانات غير المكتمل وثغرات الأمان المحتملة المنخفضة المستوى
  • يتم تجميع الشفرة أثناء التنقل ، بينما يتم تشغيل البرنامج (تصنيف Just_In_Time) ، لأن من المعروف أن جزءًا صغيرًا فقط يتم تنفيذه بشكل فعال وغالبًا في البرنامج ، لذلك لا معنى لتجميع كل شيء
  • أصبح من الأسهل لكتابة رمز متعدد الخيوط فعالة ، كما تم تحديد نموذج الذاكرة بدقة (قبل ذلك بكثير في C ++) ، ولكن المزيد عن ذلك ، لم يتم حل جميع المشكلات المتعلقة ب "الموثوقية المنطقية لعدة مؤشرات ترابط" (لا تزال الجمود ، على سبيل المثال ، أو سباقات البيانات ، ممكنة)


بالطبع ، أتاح ظهور مثل هذه المنصة الصديقة كتابة العديد من البرامج المفيدة وغير المجدية ، والتي استفادت منها الشركة على الفور. كما أن دعم التوافق مع الإصدارات السابقة في Java لمدة 15 عامًا أو أكثر جعل التكنولوجيا شائعة جدًا في عالم المؤسسات.

نعم ، لدي أيضًا نظائر مع البيرة غير الكحولية والمرأة المطاطية.

ومع ذلك ، بعيدًا عن الحال ، ظهرت المشكلات التالية في Java:
  • بسبب "الثقب" المنطقي في نظام الكتابة ، الذي ورث من C / C ++ ، وصل نوع "Null" إلى Java ، مما تسبب حتى يومنا هذا في العديد من المشاكل ويؤدي باستمرار إلى تعطل المبرمجين "غير المتمرسين للغاية" لا تعرف نوعًا اختياريًا ولا تهتم بالأشخاص الأحاديين من البرمجة الوظيفية
  • تتطلب مشاريع Java ، التي تعمل في بعض الأحيان بشكل أبطأ قليلاً ، أوامر بحجم أكبر من ذاكرة الوصول العشوائي (C / C ++) التي يحتاجها جامع البيانات المهملة (لدينا العديد من المشاريع التي تستهلك عشرات أو مئات غيغا بايت من ذاكرة الوصول العشوائي) ؛ هذا في كثير من الأحيان ليست مشكلة مباشرة ، كما أسعار ذاكرة الوصول العشوائي تتراجع ، لكن "الرواسب ظلت"
  • على الرغم من تجميع jit والاستثمارات الكبيرة في تسريع أداة تجميع مجمعي القمامة (التي تظهر العديد من المشاريع الجديدة بشكل منتظم ومستمر يقول: "جرّب GC جديدة ، إنها أفضل بكثير") ، منذ حوالي 20 عامًا ، تعمل بعض مشاريع Java المحملة بدرجة عالية مع توقف مؤقت لعدة ثوانٍ ، التي لا يمكن إزالتها بأي شكل من الأشكال (هناك مجموعة إجبارية للقمامة ، ومثل البراغي الموجودة في GC لا تلتف ، فإن جامع القمامة ببساطة ليس لديه الوقت لتنظيف كل شيء ، حتى العمل بالتوازي وحتى التهام موارد أكثر من البرنامج نفسه)
  • من المعروف أن تطبيقات Java GUI تتجمد وتتباطأ في بعض الأحيان ، مما تسبب في غضب المستخدمين ، بسبب نفس مجموعة البيانات المهملة وليس هناك أمل ولا يتوقع
  • بناء الجملة للغة مطوّل جدًا ومتكرر (تحتاج إلى الكتابة ثم قراءة الكلمات "functon public static" بدلاً من "pub fn" أو "def" مثلاً ، مما يضطر أحيانًا إلى كسر أصابع الأظافر والتسبب في الألم الموضوعي والنزيف من العينين
  • أدى الانخفاض الحاد في متطلبات مستوى مؤهلات المطورين ومنحنى الدخول المنخفض بما فيه الكفاية إلى ظهور الكثير من كود "درجة غريبة من النضارة" ، الأمر الذي يجعل نفسه يشعر باستمرار طوال حياتي مع رائحة لا تنسى


بعد القراءة ، يجب أن يكون واضحًا أن كل شيء لا يمكن كتابته بلغة Java ، وسوف يتم كتابته ببطء شديد ، ثم يتباطأ ويتوقف مؤقتًا لفترة ثانية تحت التحميل ، وأحيانًا "يأكل" الكثير من ذاكرة الوصول العشوائي (عادة ما يتم أكل نصف ذاكرة الوصول العشوائي على الخادم) ، والألعاب المنتجة لن تكون قادرًا على القيام بذلك أيضًا ، إلا أن بعض أجزاء منطق الأعمال التي لا تتطلب بشكل خاص الأداء وذاكرة الوصول العشوائي ، خاصة تلك متعددة الخيوط ، ممكنة ومفيدة للغاية ، وبالتالي نرى مثل هذه التكنولوجيا شعبية في عالم المؤسسات. ونحن أنفسنا نستخدم Java بشكل منتظم ونشط لخدمات الشركة.

C # ، Scala ، Kotlin


"ومتى سيكون حول روست؟" - انتظر لحظة ، ستحتاج إلى مزيد من التحضير لتناول هذا البرسيمون الحلو. إذا كنت لا تتحدث عن ميزات التقنيات الأخرى ، فلن تفهم سبب ظهور Rust ولماذا تحظى بشعبية كبيرة وفي الطلب .

لذا ، في محاولة لجعل Java أفضل وأكثر تقدمًا ، توصلت Microsoft ، في شخص المؤلف TurboPascal / Delphi ، في بداية الصفر إلى C # ومفهوم .NET. من الناحية الموضوعية ، وفقًا للعديد من الخبراء ذوي السمعة الطيبة ، وفي غرف التدخين لدى المطورين ، يعد "C #" أكثر جنسية من Java ، على الرغم من أنه بالطبع ، حتى الآن ، على الرغم من Mono ، فإنه يرتبط بقوة بـ Microsoft مع كل التدفقات والنتائج :-)

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

Kotlin تحظى بشعبية ل يجعل جافا أكثر فاعلية وأسهل للمبتدئين ، خاصة على المنصات المحمولة التي ليس لديها وقت لدراسة البرمجة بجدية :-)

ولكن المشكلة الرئيسية في C # (على منصة .NET) ، وكذلك في Scala و Kotlin ولغات JVM الأخرى - ظلت قائمة. جامع القمامة ، كارل ، يخلق حمولة ملحوظة على الخادم ويوقف تنفيذ الكود لثوانٍ تحت متطلبات ذاكرة الوصول العشوائي الشراهة! وكم عدد اللغات التي لا يوجد بها جامع قمامة وتجميع jit- لن تظهر ، ستبقى هذه المشكلات ولا يوجد أمل بعد ، حتى من الناحية النظرية.

البرمجة


"لكن ماذا عن PHP؟". نعم ، دعونا الآن نتحدث عن البرمجة النصية. يبدو ، لماذا هو؟ قرب نهاية الثمانينات ، أصبح من الواضح أنه إذا كنت بحاجة إلى حل سريع للمشكلة باستخدام الكود ، وليس بالضرورة فائق السرعة ، وهو آمن ، دون سلوك غير محدد وثقوب منخفضة المستوى ، يمكنك كتابة نص برمجي. تم كتابة البرامج النصية من قبل ، في bash ، perl ، awk ، لكن اتضح أنه في python يمكنك كتابة نصوص كبيرة وكبيرة ، خاصة تلك العلمية ، ولعدة سنوات!

وجدت Lua مكانتها في gamedev والتعلم الآلي ( Torch ) وجافا سكريبت - في تطوير الويب من جانب المستعرض ومن جانب الخادم (ما زالوا يعلمون أنه تمت إعادة كتابة الترخيص في البنية التحتية "npm" Node.js من Node.js و جولانج على الصدأ؟). Python - في التعلم الآلي وتحليل البيانات ، وكذلك في برمجة النظام. و PHP - تتواءم تمامًا مع مهام الخادم لتطوير الويب.


مزايا البرمجة النصية واضحة:
  • يتم إنشاء رمز آمن وفعال دون سلوك غير محدد وثغرات أمنية منخفضة المستوى ، باستخدام الخوارزميات الشائعة وهياكل البيانات (القوائم والقواميس وقوائم الانتظار) في دقائق حرفيًا
  • بداية سريعة للغاية ومنحنى دخول لطيف. يستغرق الأمر عدة أيام لاستكشاف وكتابة برنامج نصي بيثون مفيد ، أو تغيير منطق nginx من خلال البرمجة النصية في Lua ، أو القيام بتكامل المتجر عبر الإنترنت في PHP
  • إذا كنت تكتب نصوصًا بطريقة منضبطة ، وتراقب CodeStyle وبأقصى قدر ممكن من الدقة ، يمكنك حل المشكلات المعقدة بسرعة وإنشاء منتجات برمجية كبيرة: عدد كبير من المكتبات العلمية في أنظمة python ، وإدارة الأعمال والمواقع الإلكترونية في PHP ، ومنصة الشبكة العصبية Torch في LuaJit ، وبرمجة اللعبة بطريقة الألعاب الشهيرة والشعبية ، إلخ.
  • يتم حل بعض أنواع البرمجة متعددة الخيوط ، حيث I / O عنق الزجاجة ، بكفاءة في بيثون. وباستخدام أحدث ميزات الثعبان مع العقود الآجلة مثل "async / await" ، من الأسهل حل مشاكل معالجة عدد كبير من مآخذ الشبكة
  • بأناقة فائقة ، تم حل مهمة معالجة عدد كبير من المقابس بشكل غير متزامن ، حتى بدون تعدد مؤشرات الترابط ، في Node.js خارج الصندوق
  • أنشئ صفحات ويب ، واستخدم العديد من مكتبات يونكس ، وانتقل إلى قاعدة البيانات التي لا تزال سهلة ومريحة باستخدام PHP والمنتجات القائمة عليها
  • في python و PHP و JavaScript ، من المريح جدًا اختبار الفرضيات وإنشاء نماذج أولية في ساعات وليس أشهر
  • بالنسبة للتحليلات ومعالجة البيانات ، من المألوف جدًا استخدام python / R جنبًا إلى جنب مع عدد كبير من المكتبات عالية الجودة (الباندا ، scikit-learn ، seaborn ، matplotlib ...)


ومع ذلك ، لا يمكنك معرفة العيوب المحتملة للبرمجة النصية:
  • يؤدي مستوى الدخول المنخفض وسرعة البرمجة النصية السريعة جدًا في بعض الأحيان ، في ظل عدم وجود تحكم مناسب على المطورين ، إلى إنشاء الكثير من التعليمات البرمجية غير الفعالة والتي يصعب الحفاظ عليها على أي نظام أساسي
  • يتطلب عدم وجود برنامج التحويل البرمجي ونظام الكتابة والطباعة الثابتة فحصًا ديناميكيًا للمعلمات التي تم تمريرها إلى وظائف وطرق الأنواع وتغطية الكود عالية الجودة مع الاختبارات التلقائية. خلاف ذلك ، فإن أي تغيير في الكود قد يكسر البرنامج وسيكون العميل ، وليس المطور ، هو أول من يعلم به (نعم ، أنا أعرف عن TypeScript ، ولكن هذه عكازات وبادات ميتة)
  • بشكل موضوعي وواضح ، في اللغات التي لا تحتوي على كتابة وتجميع ثابتين ، حيث تحدث أشياء كثيرة في وقت التشغيل ، لا يمكنك استخدام العديد من التحسينات ، وبالتالي ، في بعض المهام ، تعمل أوامر البرامج النصية بأحجام كبيرة وتستهلك موارد أكثر كثيرًا. على الرغم من محاولات تنفيذ تجميع jit في python (pypy) و PHP (hhvm) وجافا سكريبت (الترجمة إلى رمز الجهاز ، wow ، Node.js v8) ، LuaJIT - دعونا لا نخدع أنفسنا: كل هذا يبدو وكأنه عكازين ضعيف الفعالية. والسبب هو ، ويجب أن نفهم مرة واحدة وإلى الأبد ، أنه بسبب الكتابة الضعيفة المتعمدة للغات ، من غير المحتمل أن تتمكن البرامج النصية من كتابة وقت تشغيل فعال ، حيث تقترب بسرعة من طباعة Java / C #
  • وفي الثعبان ، يبدو أنه لن يكون هناك تعدد مؤشرات ترابط فعال ، كما هو الحال في Java / C # ، بسبب GIL


ومع ذلك ، منذ ذلك الحين في معظم تطبيقات الأعمال ، بما في ذلك أنظمة إدارة الموقع ، CRM ، إلخ. نظرًا لأن معظم وقت تنفيذ التعليمات البرمجية يقضي على الاستعلامات في قاعدة البيانات ، فإن ميزة jit Java / C # مستوية للغاية من خلال سرعة حلول الكتابة في PHP / python / JavaScript ، وشخصيًا ، لإنشاء تطبيقات الويب ، سأختار 10-20 سطرًا في PHP من 10،000 خيوط وحفنة من الجملونات في Java / Spring. و PHP7 فيركلوك بطريقة أو بأخرى بحيث يتم تشغيله بشكل أسرع من python3 ؛-)

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


غالبًا ما نمارس هذا النهج في الشركة:
  • بسرعة اتخاذ قرار في PHP / python / JavaScript / Node.js ، إطلاق في المعركة والبدء في حل مشاكل العملاء
  • ندير الميزات والفرص ، وتحسين الخدمات
  • في حالات نادرة ، من التجربة ، عادة لا تكون أقدم من بضع سنوات ، تتم إعادة كتابة بعض الخدمات المستقرة بالفعل في الوظائف في C / C ++ / Java / Golang / Rust

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

البرمجة الوظيفية ، Lisp ، Haskell ، F #


كثيرون ، طوال حياتهم المهنية لمطور ما ، لا يأتون إلى هنا أبدًا ، ولكن دون جدوى. , ( ) .

. , «halting problem» . , , , , . لماذا؟ - , :
  • ,

. , , . , , .
, 50- . , - — Haskell .

, :
  • pattern-matching
  • ( ) ( , , )
  • , , -
  • , «» « »,
  • ( , Rust)


Haskell «» — , , , : . Haskell «», , , , . Haskell .

, , — Haskell , , , Java/C#.

, . Haskell , , , , . , «» — Haskell .

«C/C++» — Golang, D


, , C/C++ (, Forth). C++ , , D ( — , ).

, - /C++ c RAII , . 2009 Google Golang .
, Golang , , , . Golang Java/C# ( ) , … , Golang:
  • «green threads» ( ), python
  • , , (, Docker ) :-)

. Node.js python .

, Golang , Google vs Sun/Oracle, , , , :-) , « Java/C#» , — . Docker Golang . Golang — Java/C#, , .


, , Swift , c « » . macOS.

— Rust!


, , 40-50 , , , «zero-cost» , , - - :-) , , (Java/C#), , (C/C++), -, — . , ?

— . , , , 50 , 2010 Mozilla Research. , :
  • «zero-cost» ( C/C++ ), .. , , ------ « » (, , )
  • cargo ,
  • (* — ): , — « », , , ,
  • , , ( , , GC , - runtime, )
  • -, Null (!),
  • Haskell pattern-matching , Enumeration (Golang, , )
  • ( Java, )
  • ( Golang — ; Java/C#/Erlang .. , )
  • , ( C/C++)


, , -. ? ! , 50 . , , «» , , .

Rust «» , , Haskell .
Rust , , , Java :-) — Nulls, pattern-matching , generics traits . . , , , « Haskell», .

.

?


! , «» («ownership») . « » ( «lifetime», Rust book, ), ( , ).
/, . /, .
C++, - move-. , rust , .

zero-cost ?


, traits, . , , Golang. , , - pattern-matching, ( Golang, ). / . : . («borrowing»). , ( «read-write locks», ). , , , , .
slice , , , . — « » , , ; , .


:
  • ,
  • ( , )
  • , ---,
  • , , ,


, ( , ) … . / , C/C++ . .


, - , - . - , . Sync/Send, , : , , , .

, , 1-2 futures . , Node.js python async/await, , . , ?

unit


, unit . .

— cargo


Java, «Maven cargo » , : , . , , , .

Heap


, , heap. , , ( ) « » ( «lifetime»). , ( Swift). , — , heap . — , .


, , , . , (2 ) , , , , , AmazonWebServices c tls/ssl, .
, , , , , - . « » ( «lifetimes») .
, . IntelliJ rust , . Notepad++ — .

Rust


  • افهم أنك تحتاج حقًا إلى كتابة رمز نظام سريع للغاية ، حيث تعمل بكميات كبيرة وتستهلك الحد الأدنى من الموارد وبدون أي تكاليف إضافية مثل أداة تجميع مجمعي البيانات المهملة. إذا لم يكن كذلك ، فاكتب نصًا في python / PHP / Node.js ثم عد إلى المهمة بعد 2-3 سنوات (في 97٪ من الحالات لا يتعين عليك العودة).
  • لا تخف من الصدأ. أهم ما يميز اللغة هو مترجم ذكي للغاية وصارم من الناحية الرياضية لن يفوتك رمزًا خطيرًا وغير صحيح. عن طريق التجربة والخطأ ، وتجنب الزوايا الحادة ، سوف تتعلم كيفية البرمجة باستخدام المترجم بدقة وأمان :-)
  • البدء في تعلم اللغة مع " كتاب الصدأ ". كتاب جميل ومثير يسهل قراءته ومتعة القراءة. لكن من الأفضل قراءتها مرتين ، "حل" جميع الأمثلة.
  • " كتاب الطبخ الصدأ " يساعد كثيرا . من المستحسن أيضًا "حلها" ومعرفة كيفية عمل الكود ، ليشعر به.
  • هناك كتابات عن Rust للمستخدمين المتقدمين ، مثل Rustonimicon ، لكنني لا أوصي بالقلق مع أشياء تقنية معقدة للغاية دون داع.



فهم مرة أخرى - من أجل إتقان التكنولوجيا ، تحتاج إلى بدء كتابة التعليمات البرمجية المفيدة للشركة على ذلك. برنامج التحويل البرمجي Rust ذكي جدًا لدرجة أنه يوفر ضمانات (في الواقع ، من المهم جدًا ، لا يعرف برنامج التحويل البرمجي C ++ كيفية القيام بذلك) ولا يقوم بتجميع التعليمات البرمجية الخطيرة / التالفة من الذاكرة ، لذا قم بالتجربة قدر ما تريد وستحصل على الشفرة بسرعة وأمان ، وستحسن البرنامج: - )

تفاصيل تنفيذ المشروع


سأكشف عن القليل من التفاصيل للمشروع. تسرب Amazon SQS مئات حزم البيانات في الثانية. تتم قراءة قائمة الانتظار ، وتحليلها محليا من قبل العمال ، تتم معالجة كل رسالة من قبل الوسيط وإعادة توجيهها إلى خادم خارجي آخر. هناك العديد من الخوادم الخارجية. في البداية ، تم تنفيذ الحل من خلال البرمجة النصية: البرنامج النصي ، تناول عملية في نظام التشغيل ، قراءة الرسائل ، معالجتها وإرسالها عبر الشبكة. على العديد من خوادم الحديد القوية (8 مراكز ، 16 جيجابايت من ذاكرة الوصول العشوائي) ، تم إطلاق المئات من البرامج النصية (في كل منها!) ، والقراءة في وقت واحد من SQS ، ومعالجة البيانات وإرسالها. بسيطة وموثوقة ، ولكن تناول الحديد بدأ يزعج. كانت تكلفة الحديد تتزايد باستمرار.

يستخدم الصدأ معظم المكتبات والوحدات النمطية القياسية من البضائع:
  • rusoto_sqs - للعمل مع Amazon Web Services ، لا توجد أسئلة ، يعمل حسب الحاجة
  • rustls - ل tls ، مدفوع. التفاعلات مع خدمات TLS من Google و Apple واستخدام شهادات العميل
  • خطاف الإشارة - لاعتراض عمليات القتل وإحضار نهاية المعاملة لإرسال البيانات
  • العقود الآجلة ، tokio-rustls - "كسول" ، عمل متعدد مؤشرات الترابط ، غير متزامن مع مآخذ شبكة TLS ، ala Node.js
  • التصفيق تحليل وسيطات سطر الأوامر
  • serde_json - تشكيل json ، لا شيء مثير للاهتمام هنا


لسوء الحظ ، لم يكن الأمر بدون استخدام كتل "غير آمنة" و "std :: mem :: transmute" - لم تتمكن المكتبة القياسية من العثور على أدوات لتحليل البيانات الثنائية في الأشجار.

الرئيسي ، إذا استطعت تسميته أن "توصيل" حدث في الترجمة - لم يتم تجميع المكتبات على CentOS6 بسبب "المجمّع القديم" في binutils ، لكن لم تكن هناك مشاكل في CentOS7.

الانطباع العام هو أن التطوير على Rust يشبه ، بدلاً من ذلك ، "البرمجة النصية الصارمة" بدلاً من برمجة النظام ، وليس أطول بكثير من البرمجة النصية أو تطوير الويب ، سواء من حيث الموارد والاختبار. في هذه الحالة ، تجميع ثابت صارم ، وغياب جامع البيانات المهملة وأنواع البيانات جبريًا.

الشعور العام هو إيجابي للغاية. ومع ذلك ، فبدلاً من العديد من الخوادم الحديدية (8 مراكز ، 16 جيجابايت من ذاكرة الوصول العشوائي) ، بدأت المشكلة في حلها عن طريق عملية واحدة (مع عشرات الخيوط) التي لا تزيد عن 5 غيغابايت من ذاكرة الوصول العشوائي وتخلق حمولة غير ملحوظة للغاية على النوى ، مع حركة المرور في المنطقة من 0.5-1 غيغا بايت .

استنتاج


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

PS:
* - نعم ، لقد نسيت تقريبا. بالطبع ، تحتاج إلى التحدث عن كتلة غير آمنة. في هذه المجموعة ، يمكنك:
  • لبرمجة الأشياء التي لا تتوفر في الصدأ العادي - مؤشرات "خام" dereference والقيام ببعض الأشياء التي يحتمل أن تكون خطرة ، مطلوبة أحيانًا في برمجة النظام. لكن كل شيء ليس مخيفًا جدًا:
  • الكتل غير الآمنة مرئية ولا يوجد منها على الإطلاق ، أو تتركز الكود المسؤول فيها
  • يتم اختبار مكتبة الصدأ القياسية تمامًا ، مما يعني أننا نعتقد أن الكتل غير الآمنة تعمل فيها
  • يتم اختبار المكتبات المشهورة في البضائع تمامًا (كل شيء مدمج في اختبار الوحدة والتكامل في الصدأ) وبالتالي يمكن أخذها واستخدامها بأمان

أي في الكتلة "غير الآمنة" لا يمكنك الانخراط في الفجور التعسفي ، والمتوفر في C - ولكن فقط مع أنواع معينة من الأنشطة الخطرة بدقة . لذلك ، يمكنك ويجب أن تنام بسلام :-)

Source: https://habr.com/ru/post/ar477342/


All Articles