Bagaimana kami menerjemahkan 10 juta baris kode C ++ ke standar C ++ 14 (dan kemudian ke C ++ 17)

Beberapa waktu yang lalu (pada musim gugur 2016), ketika mengembangkan versi berikutnya dari platform teknologi 1C: Enterprise, muncul pertanyaan dalam tim pengembangan tentang mendukung standar C ++ 14 baru dalam kode kami. Transisi ke standar baru, seperti yang kami harapkan, akan memungkinkan kami untuk menulis banyak hal dengan lebih elegan, sederhana dan lebih andal, menyederhanakan dukungan dan pemeliharaan kode. Dan sepertinya tidak ada yang luar biasa dalam terjemahan, jika tidak untuk skala basis kode dan fitur spesifik dari kode kita.

Bagi mereka yang tidak tahu, 1C: Enterprise adalah lingkungan untuk pengembangan cepat aplikasi bisnis lintas-platform dan runtime untuk eksekusi mereka di berbagai OS dan DBMS. Secara umum, produk ini meliputi:

  • Application Server Cluster , berjalan pada Windows dan Linux
  • Klien yang bekerja dengan server melalui http (s) atau menggunakan protokol biner sendiri berfungsi pada Windows, Linux, macOS
  • Klien web berjalan di Chrome, Internet Explorer, Microsoft Edge, Firefox, Safari (ditulis dalam JavaScript)
  • Development Environment ( Configurator ), berjalan di Windows, Linux, macOS
  • Alat administrasi server aplikasi, berjalan di Windows, Linux, macOS
  • Klien seluler yang terhubung ke server melalui http berfungsi di perangkat seluler yang menjalankan Android, iOS, Windows
  • Platform seluler - kerangka kerja untuk membuat aplikasi seluler offline dengan kemampuan untuk menyinkronkan, berjalan di Android, iOS, Windows
  • 1C: Alat Pengembangan Perusahaan , ditulis dalam Java
  • Server Interaksi

Kami mencoba menulis sebanyak mungkin satu kode untuk sistem operasi yang berbeda - basis kode server adalah 99% total, basis klien adalah sekitar 95%. Platform teknologi 1C: Perusahaan terutama ditulis dalam C ++ dan berikut ini adalah perkiraan karakteristik kode:

  • 10 juta baris kode C ++,
  • 14 ribu file
  • 60 ribu kelas
  • setengah juta metode.

Dan semua ekonomi ini harus ditransfer ke C ++ 14. Kami akan berbicara tentang bagaimana kami melakukan ini dan apa yang kami temui dalam proses.

gambar

Penafian


Segala sesuatu yang ditulis di bawah ini tentang operasi lambat / cepat, (bukan) konsumsi memori yang besar dengan implementasi kelas standar di berbagai pustaka berarti satu hal: ini benar UNTUK US Ada kemungkinan bahwa implementasi standar paling cocok untuk tugas Anda. Kami mulai dari tugas-tugas kami: kami mengambil data khas untuk pelanggan kami, menjalankan skenario tipikal pada mereka, melihat kinerja, jumlah memori yang dikonsumsi, dll, dan menganalisis apakah hasil kami cocok atau tidak dengan kami dan pelanggan kami. Dan ditindaklanjuti.

Apa yang kita miliki


Awalnya, kami menulis kode untuk platform 1C: Enterprise 8 di Microsoft Visual Studio. Proyek ini dimulai pada awal 2000-an dan kami memiliki versi hanya untuk Windows. Tentu saja, sejak itu kode telah dikembangkan secara aktif, banyak mekanisme telah sepenuhnya ditulis ulang. Tetapi kode tersebut ditulis sesuai dengan standar 1998, dan, misalnya, kurung sudut kanan dipisahkan oleh spasi agar kompilasi berhasil, seperti ini:
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/id429678/


All Articles