كيف ترجمنا 10 ملايين سطر من كود C ++ إلى معيار C ++ 14 (ثم إلى C ++ 17)

منذ بعض الوقت (في خريف عام 2016) ، عند تطوير الإصدار التالي من منصة تكنولوجيا 1C: Enterprise ، ظهر السؤال داخل فريق التطوير حول دعم معيار C ++ 14 الجديد في الكود الخاص بنا. سيتيح لنا الانتقال إلى معيار جديد ، كما توقعنا ، كتابة العديد من الأشياء بشكل أكثر أناقة وبساطة وموثوقية ، مما يبسط دعم وصيانة الشفرة. ويبدو أنه لا يوجد شيء غير عادي في الترجمة ، إن لم يكن لمقياس قاعدة الكود والميزات المحددة لكودنا.

بالنسبة لأولئك الذين لا يعرفون ، فإن 1C: Enterprise هي بيئة للتطوير السريع لتطبيقات الأعمال عبر الأنظمة الأساسية ووقت التشغيل لتنفيذها في أنظمة تشغيل مختلفة و DBMS مختلفة. بعبارات عامة ، يشمل المنتج:


نحاول كتابة أكبر قدر ممكن من رمز واحد لأنظمة التشغيل المختلفة - قاعدة رمز الخادم هي 99٪ إجمالًا ، وقاعدة العملاء هي 95٪ تقريبًا. المنصة التكنولوجية 1C: تمت كتابة Enterprise بشكل أساسي بلغة C ++ ، وفيما يلي الخصائص التقريبية للرمز:

  • 10 مليون سطر من كود C ++ ،
  • 14 ألف ملف
  • 60 ألف فصل
  • نصف مليون طريقة.

وكان يجب نقل كل هذا الاقتصاد إلى C ++ 14. سنتحدث عن كيف فعلنا ذلك وما واجهناه في هذه العملية.

الصورة

تنويه


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

ما كان لدينا


في البداية ، قمنا بكتابة كود النظام الأساسي 1C: Enterprise 8 على Microsoft Visual Studio. بدأ المشروع في أوائل عام 2000 وكان لدينا إصدار لـ Windows فقط. بطبيعة الحال ، منذ ذلك الحين تم تطوير الكود بنشاط ، تمت إعادة كتابة العديد من الآليات بالكامل. لكن الشفرة تمت كتابتها وفقًا لمعيار 1998 ، على سبيل المثال ، تم فصل أقواس الزاوية اليمنى بمسافات من أجل أن يمر التجميع بنجاح ، مثل هذا:
vector<vector<int> > IntV;

2006 , 8.1, Linux STLPort. . std::wstring, wchar_t. Windows 2 , Linux 4 . , . gcc , wchar_t 2 , , .. glibc, 4- wchar_t. , - , . , last but not least, . , .. .

, 2000- . , Facebook, Facebook , (. folly).

:

  1. ( ).
  2. Copy On Write. , / .

, STLPort stream ( ), 20%. Boost. Boost stream, , API (, ), , stream. , , Boost.


C++14 :

  1. STLPort C++14. , .. STLPort 2010 , .
  2. STL, C++14. , Windows Linux.
  3. .

- .

; libc++, Windows. libc++ Windows, — , , , , libc++ POSIX API.

.


, STLPort (Visual Studio 2015 Windows, gcc 7 Linux, clang 8 macOS).

, , , , , , . 10 000 ( 14 000). wchar_t char16_t; wchar_t, .. char16_t 2 Windows Linux.

. , STLPort , . , .

, , . .

( 20-30%) ( 10-15%) . , , . , .

: ( ) std::map std::set . . , , – ( STLPort). Boost, , .

, , , , Windows-. , 2017 ( 8.3.11 1:) .


++14 6 . ( ) , , — UI, , ..

. , 1: 8.3.14 ( , ) ++17.

. STL std, std , stdx – , , boost – boost. , .

«» (move constructors) . , STL (, capacity ).


, , ( ) — obj-, 60 – 70 . , . , , , . . , . , , . unity build (, , Google Chrome).

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


All Articles