ΠΡΠΎΠ΅ΠΊΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ ΠΊΠΎΠ΄Π° Π΄Π»Ρ ΡΠ·ΡΠΊΠ° Python, ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΠΉ Π½Π° C++. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ ΠΌΠ΅ΡΡΠΈΠΊΠΈ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², Π° ΡΠ°ΠΊΠΆΠ΅ Π°Π³ΡΠ΅Π³ΠΈΡΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ.
ΠΠ»ΡΡΠ΅Π²ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΡΠΎΠΊΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ C++ (Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, C++20/23), ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² (std::ranges
) Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠ²Π½ΡΡ
ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΡ
ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠΎΠ² ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π°Π½Π½ΡΡ
.
-
ΠΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΡΡΠΈΠΊ ΠΊΠΎΠ΄Π°:
- ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΡΠΎΠΊ ΠΊΠΎΠ΄Π° (LOC): ΠΠΎΠ΄ΡΡΡΡ Π½Π΅ΠΏΡΡΡΡΡ ΡΡΡΠΎΠΊ, Π½Π΅ ΡΠ²Π»ΡΡΡΠΈΡ ΡΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌΠΈ.
- Π¦ΠΈΠΊΠ»ΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ: ΠΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΊΠΎΠ΄Π° Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΡ
ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΉ (
if
,for
,while
,try
,assert
ΠΈ Π΄Ρ.). - ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ.
- Π‘ΡΠΈΠ»Ρ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ (Naming Style): ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅
snake_case
,camelCase
,PascalCase
ΠΈ Π΄ΡΡΠ³ΠΈΡ ΡΡΠΈΠ»Π΅ΠΉ.
-
ΠΠ³ΡΠ΅Π³Π°ΡΠΈΡ ΠΌΠ΅ΡΡΠΈΠΊ:
- Π‘ΡΠΌΠΌΠ° ΠΈ ΡΡΠ΅Π΄Π½Π΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΌΠ΅ΡΡΠΈΠΊ, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ LOC ΠΈ ΡΠΈΠΊΠ»ΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ.
- Π‘ΡΠ΅Π΄Π½Π΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ².
- ΠΠΎΠ΄ΡΡΡΡ ΠΏΠΎ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡΠΌ Π΄Π»Ρ ΡΡΠΈΠ»Π΅ΠΉ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ.
-
ΠΡΡΠΏΠΏΠΈΡΠΎΠ²ΠΊΠ° ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ²:
- ΠΠ½Π°Π»ΠΈΠ· ΠΈ Π²ΡΠ²ΠΎΠ΄ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² Π² ΡΠ°Π·ΡΠ΅Π·Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ².
- ΠΠ½Π°Π»ΠΈΠ· ΠΈ Π²ΡΠ²ΠΎΠ΄ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² Π² ΡΠ°Π·ΡΠ΅Π·Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ².
- ΠΠ±ΡΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· ΠΏΠΎ Π²ΡΠ΅ΠΌ Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΠΌ ΡΡΠ½ΠΊΡΠΈΡΠΌ.
- Π―Π·ΡΠΊ: C++20/23
- Π‘ΠΈΡΡΠ΅ΠΌΠ° ΡΠ±ΠΎΡΠΊΠΈ: CMake
- ΠΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ: Conan
- ΠΠ°ΡΡΠΈΠ½Π³ AST: tree-sitter
- ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ: Boost.Program_options
- Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅: GoogleTest
- ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π΄Π°Π½Π½ΡΡ
:
std::ranges
graph TD
subgraph "ΠΡΠ°ΠΏ 1: ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ°"
A["ΠΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ (.py ΡΠ°ΠΉΠ»Ρ)"] --> B("ΠΠ°ΡΡΠΈΠ½Π³ ΠΈ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ");
end
subgraph "ΠΡΠ°ΠΏ 2: ΠΠ½Π°Π»ΠΈΠ·"
style C fill:#fff,stroke:#333,stroke-width:2px,stroke-dasharray: 5 5
C("ΠΠ°Π±ΠΎΡ ΠΌΠ΅ΡΡΠΈΠΊ (LOC, Cyclomatic, etc.)")
B --> D("ΠΠΎΠ΄ΡΠ»Ρ Π°Π½Π°Π»ΠΈΠ·Π°");
C -.-> D;
end
subgraph "ΠΡΠ°ΠΏ 3: ΠΠ³ΡΠ΅Π³Π°ΡΠΈΡ"
style F fill:#fff,stroke:#333,stroke-width:2px,stroke-dasharray: 5 5
F("ΠΠ°Π±ΠΎΡ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠΎΠ² (Average, Sum, etc.)")
D --> E("Π‘ΡΡΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ") --> G("ΠΠΎΠ΄ΡΠ»Ρ Π°Π³ΡΠ΅Π³Π°ΡΠΈΠΈ");
F -.-> G;
end
subgraph "ΠΡΠ°ΠΏ 4: Π Π΅Π·ΡΠ»ΡΡΠ°Ρ"
G --> H["ΠΡΠΎΠ³ΠΎΠ²ΡΠΉ ΠΎΡΡΠ΅Ρ"];
end
ΠΡΠΎΠ΅ΠΊΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ conan
Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌΠΈ ΠΈ cmake
Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ. Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ ΠΎΠ½ΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ. ΠΠ»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Dev Containers Π² Visual Studio Code.
ΠΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΈΠ· ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ
mkdir build && cd build
# Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Conan (Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·)
# ΠΠ»Ρ Debug-ΡΠ±ΠΎΡΠΊΠΈ:
conan install .. --settings=build_type=Debug --build=missing
# ΠΠ»Ρ Release-ΡΠ±ΠΎΡΠΊΠΈ:
conan install .. --settings=build_type=Release --build=missing
# Π‘Π±ΠΎΡΠΊΠ° ΠΏΡΠΎΠ΅ΠΊΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ CMake ΠΈ Conan
# ΠΠ»Ρ Debug-ΡΠ±ΠΎΡΠΊΠΈ:
conan build .. --settings=build_type=Debug
# ΠΠ»Ρ Release-ΡΠ±ΠΎΡΠΊΠΈ:
conan build .. --settings=build_type=Release
mkdir build ; cd build
conan install --settings=build_type=Debug ..
conan build --build=missing ..
./build/analyser -f files/sample.py
cd build
ctest --verbose
Π Visual Studio Code
Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ° Π½Π°Ρ
ΠΎΠ΄ΡΡΡΡ Π² .vscode/launch.json
ΡΠ°ΠΉΠ»Π΅. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΡΡΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΡΠΆΠ΅ Π΅ΡΡΡ ΠΎΠ΄Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Launch Analyser
Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ python ΡΠ°ΠΉΠ»Ρ ΠΈ Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ Π΄Π»Ρ Π½ΠΈΡ
ΠΌΠ΅ΡΡΠΈΠΊΠΈ, ΡΠΎ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π½Π°ΠΆΠ°ΡΡ F5
ΠΈΠ»ΠΈ ΠΎΡΠΊΡΡΡΡ ΠΎΠΊΠ½ΠΎ Run and Debug
ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠ΅ΠΉ ΠΊΠ»Π°Π²ΠΈΡ Ctrl+Shift+D
.