Como convertemos 10 milhões de linhas de código C ++ no padrão C ++ 14 (e depois no C ++ 17)

Há algum tempo (no outono de 2016), ao desenvolver a próxima versão da plataforma de tecnologia 1C: Enterprise, surgiu a pergunta dentro da equipe de desenvolvimento sobre o suporte ao novo padrão C ++ 14 em nosso código. A transição para um novo padrão, como esperávamos, permitiria escrever muitas coisas de maneira mais elegante, simples e confiável, simplificando o suporte e a manutenção do código. E parece não haver nada de extraordinário na tradução, se não for a escala da base de código e os recursos específicos do nosso código.

Para quem não sabe, 1C: Enterprise é um ambiente para o rápido desenvolvimento de aplicativos de negócios de plataforma cruzada e tempo de execução para execução em diferentes sistemas operacionais e DBMS. Em termos gerais, o produto inclui:


Tentamos escrever o máximo possível de um código para diferentes sistemas operacionais - a base de códigos do servidor é de 99% no total, a base de clientes é de aproximadamente 95%. Plataforma tecnológica 1C: A empresa é escrita principalmente em C ++ e as seguintes são características aproximadas do código:

  • 10 milhões de linhas de código C ++,
  • 14 mil arquivos
  • 60 mil aulas
  • meio milhão de métodos.

E toda essa economia teve que ser transferida para o C ++ 14. Falaremos sobre como fizemos isso e o que encontramos no processo.

imagem

Isenção de responsabilidade


Tudo o que está escrito abaixo sobre operação lenta / rápida, (não) grande consumo de memória por implementações de classes padrão em várias bibliotecas significa uma coisa: isso é verdade PARA NÓS. É possível que as implementações padrão sejam mais adequadas para suas tarefas. Começamos com nossas tarefas: pegamos os dados típicos de nossos clientes, executamos cenários típicos, analisamos o desempenho, a quantidade de memória consumida etc. e analisamos se nossos resultados se adequam a nós e a nossos clientes. E agiu de acordo.

O que tínhamos


Inicialmente, escrevemos o código para a plataforma 1C: Enterprise 8 no Microsoft Visual Studio. O projeto começou no início dos anos 2000 e tínhamos uma versão apenas para Windows. Naturalmente, desde então, o código foi desenvolvido ativamente, muitos mecanismos foram completamente reescritos. Mas o código foi escrito de acordo com o padrão de 1998 e, por exemplo, os colchetes de ângulo reto foram separados por espaços para que a compilação passasse com êxito, assim:
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/pt429678/


All Articles