Comment nous avons traduit 10 millions de lignes de code C ++ au standard C ++ 14 (puis au C ++ 17)

Il y a quelque temps (à l'automne 2016), lors du développement de la prochaine version de la plateforme technologique 1C: Enterprise, la question s'est posée au sein de l'équipe de développement de prendre en charge la nouvelle norme C ++ 14 dans notre code. La transition vers une nouvelle norme, comme nous nous y attendions, nous permettrait d'écrire beaucoup de choses de manière plus élégante, simple et fiable, simplifiant le support et la maintenance du code. Et il n'y a rien d'extraordinaire dans la traduction, sinon pour l'échelle de la base de code et les spécificités de notre code.

Pour ceux qui ne le savent pas, 1C: Enterprise est un environnement pour le développement rapide d'applications métier multiplateformes et de runtime pour leur exécution dans différents OS et SGBD. De manière générale, le produit comprend:


Nous essayons d'écrire autant que possible un code pour différents systèmes d'exploitation - la base de code du serveur est de 99% au total, la base de client est d'environ 95%. Plateforme technologique 1C: Enterprise est principalement écrite en C ++ et les caractéristiques suivantes sont approximatives du code:

  • 10 millions de lignes de code C ++,
  • 14 mille fichiers
  • 60 mille classes
  • un demi-million de méthodes.

Et toute cette économie a dû être transférée en C ++ 14. Nous parlerons de la façon dont nous l'avons fait et de ce que nous avons rencontré au cours du processus.

image

Clause de non-responsabilité


Tout ce qui est écrit ci-dessous sur le fonctionnement lent / rapide, (pas) la grande consommation de mémoire par les implémentations de classes standard dans diverses bibliothèques signifie une chose: c'est vrai POUR NOUS. Il est possible que les implémentations standard conviennent le mieux à vos tâches. Nous sommes partis de nos tâches: nous avons pris les données typiques de nos clients, exécuté des scénarios types sur eux, examiné les performances, la quantité de mémoire consommée, etc., et analysé si ces résultats nous convenaient ou non à nos clients. Et a agi.

Ce que nous avions


Initialement, nous avons écrit le code de la plate-forme 1C: Enterprise 8 sur Microsoft Visual Studio. Le projet a commencé au début des années 2000 et nous n'avions qu'une version pour Windows. Naturellement, depuis lors, le code a été activement développé, de nombreux mécanismes ont été complètement réécrits. Mais le code a été écrit selon la norme de 1998, et, par exemple, les parenthèses à angle droit ont été séparées par des espaces afin que la compilation réussisse, comme ceci:
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/fr429678/


All Articles