منذ بعض الوقت (في خريف عام 2016) ، عند تطوير الإصدار التالي من منصة تكنولوجيا 1C: Enterprise ، ظهر السؤال داخل فريق التطوير حول دعم معيار
C ++ 14 الجديد في الكود الخاص بنا. سيتيح لنا الانتقال إلى معيار جديد ، كما توقعنا ، كتابة العديد من الأشياء بشكل أكثر أناقة وبساطة وموثوقية ، مما يبسط دعم وصيانة الشفرة. ويبدو أنه لا يوجد شيء غير عادي في الترجمة ، إن لم يكن لمقياس قاعدة الكود والميزات المحددة لكودنا.
بالنسبة لأولئك الذين لا يعرفون ، فإن 1C: Enterprise هي بيئة للتطوير السريع لتطبيقات الأعمال عبر الأنظمة الأساسية ووقت التشغيل لتنفيذها في أنظمة تشغيل مختلفة و DBMS مختلفة. بعبارات عامة ، يشمل المنتج:
- مجموعة خادم التطبيقات ، تعمل على نظامي التشغيل Windows و Linux
- يعمل العميل مع الخادم عبر http (s) أو باستخدام بروتوكول ثنائي خاص به يعمل على Windows و Linux و macOS
- عميل ويب يعمل في Chrome و Internet Explorer و Microsoft Edge و Firefox و Safari (مكتوب بلغة JavaScript)
- بيئة التطوير ( Configurator ) ، تعمل على أنظمة التشغيل Windows و Linux و macOS
- أدوات إدارة خادم التطبيقات ، تعمل على Windows و Linux و macOS
- يعمل عميل الهاتف المحمول المتصل بالخادم عبر http (s) على الأجهزة المحمولة التي تعمل بنظام Android و iOS و Windows
- النظام الأساسي للجوّال - إطار عمل لإنشاء تطبيقات جوّال بلا اتصال بالإنترنت مع إمكانية المزامنة والتشغيل على Android و iOS و Windows
- 1 ج: أدوات تطوير المشاريع ، مكتوبة بلغة جافا
- خادم التفاعل
نحاول كتابة أكبر قدر ممكن من رمز واحد لأنظمة التشغيل المختلفة - قاعدة رمز الخادم هي 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).
:
- ( ).
- Copy On Write. , / .
, STLPort stream ( ), 20%.
Boost. Boost stream, , API (, ), , stream. , , Boost.
C++14 :
- STLPort C++14. , .. STLPort 2010 , .
- STL, C++14. , Windows Linux.
- .
- .
;
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).