ãç¹å¥ã³ã©ã ããªãäžçã¯ä»ãC++ã§åããŠããã®ãïŒ ãã·ãªã³ã³ã®éŒåãšãŒããªãŒããŒãããã®çŸåŠã
ãé£ãããã ã代ãããããªããââç«ææ¢æ»æ©ããUnreal EngineãAIåºç€ãŸã§äººé¡ã®éçãæŒãåºãç¶ããè³é«ã®èšèª
ãC++ã¯é£ããããããèŠããããšãå€ãããããšèšãããªãããããªã40幎éã«ãããäžçæé«å³°ã®ãœãããŠã§ã¢ã¯C++ã§æžããç¶ããŠããã®ã§ããããïŒUnreal Engine 5ãNASAã®ç«ææ¢æ»ããŒããŒãSpaceXã®ãã±ããå¶åŸ¡ãGoogle ChromeããããŠPyTorch/TensorFlowã®AIã³ã¢ãšã³ãžã³ã人é¡ãããŒããŠã§ã¢ã®æ¥µéã«æããšããåžžã«éžã°ããã®ã¯C++ã§ããã·ãªã³ã³ã®ç©çéçãåŒãåºãããŒããªãŒããŒãããååãã®çŸåŠãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã«é Œããªããæ±ºå®è«ç寿åœãããããŠæ³¥èãããŒããŠã§ã¢å¶åŸ¡ããæé«åºŠã®åæœè±¡åãŸã§ã瞊暪ç¡å°œã«æãC++ã®å§åçé
åãç±ãèªããŸãã
1. 人é¡ã®æåç·ã¯ããã¹ãŠC++ã§æžãããŠãã
ããªãã仿¥äœ¿ã£ãã¹ããŒããã©ã³ã®OSåºç€ãéãã 倧äœã²ãŒã ãæ€çŽ¢ãšã³ãžã³ããããŠå®å®ãã±ãããäžçãèå°è£ã§æ¯ããC++ã®å§åçæ¯é
åã
ð§ ãã³ã®ã³å
茩
ãã³å
çïŒäžã®äžã«ã¯PythonãJavaScriptãGoãRustãªã©æ°ãããŠæžããããèšèªãããããããã®ã«ããªãä»ã§ã倧äœã²ãŒã ãæå
端ã®ã·ã¹ãã ã¯C++ã§æžãããŠãããã§ããïŒ
ð»ââïž ã·ãã¯ãå
ç
ã¬ããïŒè¯ãçåããããããã³ïŒä»ã®èšèªããæžãããããããæè»œãããç«¶ãåãäžã§ãC++ã ããåžžã«èè² ãç¶ããŠããå¯äžç¡äºã®äœ¿åœããããããã¯ãããŒããŠã§ã¢ãæã€æ¬æ¥ã®æ§èœã100%åŒãåºãåãããšãããïŒ
ð§ ãã³ã®ã³å
茩
ããŒããŠã§ã¢ã®æ§èœã100%âŠâŠïŒïŒ
ð»ââïž ã·ãã¯ãå
ç
ããããïŒUnreal Engine 5ã®ãã©ããªã¢ã«ãª3Dã°ã©ãã£ãã¯ãããªç§åäœã§å€æããèªåé転è»ãNASAã®æ¢æ»æ©ãGoogle Chromeã®ãã©ãŠã¶ãšã³ãžã³ããããŠæå
端AIã®æ·±å±€åŠç¿ã©ã€ãã©ãªïŒPyTorch / CUDAïŒã人é¡ãã1ããªç§ãç¡é§ã«ã§ããªã極éã®äžçãã«æãæãããã«ã¯å¿
ãC++ãããããããïŒ
### äžçãåããC++ãããã¯ããã¡
æ¥åžžã§èŠãããå€ãã®ãœãããŠã§ã¢ã®å¥¥åºã§ã¯ãå®ã¯C++ãå¿èãšããŠéŒåããŠããŸãã
1. **åçšãã€ãšã³ãã²ãŒã ãšã³ãžã³**:
- **Unreal Engine 5**: äžçæé«å³°ã®ãã©ããªã¢ã«ã²ãŒã ãšã³ãžã³ãããã€ãïŒä»®æ³åãã€ã¯ãããªãŽã³ïŒãã«ãŒã¡ã³ïŒå€§åç
§æïŒãæ¯ç§60ãã¬ãŒã ã§èšç®ãå°œããã®ã¯C++ã®ç¬å£å Žã§ãã
2. **å®å®ã»èªç©ºã»é²è¡**:
- **NASAç«ææ¢æ»ããŒããŒïŒPerseveranceïŒ**: éä¿¡ã«äœååããããç«æã§èªåŸèµ°è¡ããé è³ã
- **SpaceX Falcon 9 / Dragon**: åçŽçéžãããã±ããã®æšåååå¶åŸ¡ã·ã¹ãã ã
3. **OSïŒãã©ãŠã¶ã®ã³ã¢ãšã³ãžã³**:
- **Google Chrome / V8 ãšã³ãžã³**: äžçäžäœ¿ãããŠãããã©ãŠã¶ã®è¶
é«éJavaScriptå®è¡åºç€ã
- **Windows / macOS / Linux ã«ãŒãã«åšèŸº**: ããŒããŠã§ã¢ãšçŽçµããè¶
éèŠãµãã·ã¹ãã ã
4. **人工ç¥èœïŒAIïŒïŒãã£ãŒãã©ãŒãã³ã°**:
- **PyTorch / TensorFlow**: PythonããåŒã³åºãããŸãããGPUãé
·äœ¿ããŠè¡åæŒç®ãçéå®è¡ããããã¯ãšã³ãã¯ãã¹ãŠ **C++ ãš CUDA** ã§æžãããŠããŸãã
2. ãŒããªãŒããŒãããååã®çŸåŠïŒã䜿ããªããã®ã«ã³ã¹ãã¯æããªãã
JavaãC#ãPythonã«ã¯ç䌌ã§ããªããC++èšèšææ³ã®æé«å°éç¹ãZero-Overhead Principleããšã¯äœãïŒ
ð§ ãã³ã®ã³å
茩
ä»ã®é«çŽèšèªã ãšãã¬ããŒãžã³ã¬ã¯ã¿ïŒGCïŒãè£ã§åæã«ã¡ã¢ãªãæé€ããŠãããŠæ¥œã¡ãã§ããããC++ã¯ãªãèªåã¬ããŒãžã³ã¬ã¯ã¿ãå
¥ããªããã§ããïŒ
ð»ââïž ã·ãã¯ãå
ç
ãããããC++ã®çã¿ã®èŠªãã£ãŒãã»ã¹ãããŽã¹ãã«ãããæ²ãã絶察ååãããŒããªãŒããŒãããååãããïŒãããã°ã©ãã䜿ã£ãŠããªãæ©èœã®ããã«ã1ãµã€ã¯ã«ã®CPUæéãã1ãã€ãã®ã¡ã¢ãªãåæã«æ¶è²»ããŠã¯ãªããªãããšãã信念ãããïŒ
ð§ ãã³ã®ã³å
茩
䜿ã£ãŠããªãæ©èœã®ããã«ã³ã¹ããæããªãâŠâŠïŒ
ð»ââïž ã·ãã¯ãå
ç
ã¬ããŒãžã³ã¬ã¯ã¿ä»ãã®èšèªã§ã¯ãã²ãŒã ã®ãã¹æŠã®çã£æäžã«ãGCã®å®ææž
æããçªç¶å§ãŸããç»é¢ãæ°ãã¬ãŒã æ¢ãŸãïŒStop the WorldïŒããšããããã ãC++ã®ãRAIIïŒã¹ã³ãŒããæããç¬éã«å³åº§ã«ç Žæ£ïŒããªãããã€ã»ã©ãã§ã¡ã¢ãªãè§£æŸããããã寞åéããå®å
šã«äºæž¬ã§ããïŒæ±ºå®è«ç寿åœïŒïŒãããããã®ã²ãŒã éçºã§C++ãéžã°ããæ±ºå®æãªãããïŒ
### ãŒããªãŒããŒãããã®2倧æçŸ©
C++ãå倧ãããããŠããã®ã¯ã以äžã®2ã€ã®ã«ãŒã«ã§ãïŒ
> 1. **䜿ããªããã®ã«ãã³ã¹ããæ¯æã£ãŠã¯ãªããªãã**
> 2. **䜿ããã®ã«ã€ããŠã¯ãææžãã®ã¢ã»ã³ãã©ã§æžããã³ãŒããããåªããã³ãŒããçæã§ããªããã°ãªããªãã**
#### ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒé決å®è«çïŒ vs RAIIïŒæ±ºå®è«çïŒ
| ç¹åŸŽ | äžè¬çãªGCèšèªïŒJava/C#/PythonïŒ | C++ïŒRAIIã»ã¹ããŒããã€ã³ã¿ïŒ |
| :--- | :--- | :--- |
| **ã¡ã¢ãªè§£æŸã®ã¿ã€ãã³ã°** | äžå®æïŒGCã¹ã¬ãããæ°ãŸããã«æé€ïŒ | **ã¹ã³ãŒããæãããã®ç¬éïŒ100%確å®ïŒ** |
| **ãã¬ãŒã ã¬ãŒãïŒFPSïŒ** | GCçºçæã«ç¬éçãªã«ã¯ã€ãïŒStutterïŒã®ãªã¹ã¯ | **å®å
šäžå®ã®ãã¬ãŒã ã¿ã€ã ãç¶æ** |
| **ã¡ã¢ãªæ¶è²»é** | GCãåãããã®ãããã¡é åïŒå®ããŒã¿ã®2ã3åïŒ | **å¿
èŠæå°éïŒ1ãã€ãã®ç¡é§ããªãïŒ** |
| **ã¡ã¢ãªä»¥å€ã®è§£æŸ** | ãã¡ã€ã«ã»ãœã±ããã»GPUãã¥ãŒããã¯ã¹ã®è§£æŸå¿ãå€çº | **ãã¹ãã©ã¯ã¿ã§å
šãŠèªåïŒç¢ºå®ã«ã¯ããŒãº** |
C++ã§ã¯ãã¯ã©ã¹ãã©ããªã«è€éã«éå±€åããŠããã€ã³ã©ã€ã³å±éãšãªããã£ãã€ã¶ã«ãã£ãŠãæçµçã«ã³ã³ãã€ã«ãããæ©æ¢°èªã¯ãè·äººãææžãããã¢ã»ã³ããªããšåçã®ç¡é§ã®ãªãã³ãŒãã«ãªããŸããããã**ãŒãã³ã¹ãæœè±¡åïŒZero-cost AbstractionïŒ**ã®éæ³ã§ãã
3. äºåæµã®æ¥µã¿ïŒæ³¥èãã·ãªã³ã³å¶åŸ¡ããæé«åºŠã®æ°åŠçæœè±¡åãŸã§
ãã€ã³ã¿ãš1ãããåäœã®ããŒããŠã§ã¢å¶åŸ¡ãæ¡ããããªãããè¶
é«åºŠãªã¡ã¿ããã°ã©ãã³ã°ãåæã«æããå¯äžã®èšèªã
ð§ ãã³ã®ã³å
茩
äœã¬ãã«ãªãããæŒç®ãã§ããã®ã«ããã³ãã¬ãŒããã¯ã©ã¹ã§çŸããæœè±¡åãçµããâŠâŠç¢ºãã«ãããªäºåæµãã§ããèšèªã£ãŠä»ã«ãªãã§ããïŒ
ð»ââïž ã·ãã¯ãå
ç
ãã®éãããïŒCèšèªã®ããã«ãã·ãªã³ã³ïŒCPUã»ã¡ã¢ãªïŒã®å°èãã«çŽæ¥è§Šããããçã
ããããããªãããåæã«çŸä»£æ°åŠã®ãããªé«éæœè±¡åãã³ã³ãã€ã«æèšç®ïŒconstexprïŒãçŸããæ§ç¯ã§ããããŸãã«ãéçã®çç£ãšæŽç·Žããã貎æã®è¡ãåå±
ããèšèªããªããããïŒ
### C++ãèªãã衚çŸåã®æ¯ãå¹
ã
C++ã®ç骚é ã¯ãäžéãšäžéã®å§åçãªåºãã«ãããŸãïŒ
```
ãæäžå±€ïŒã·ãªã³ã³çŽçµã
ã»ãã€ã³ã¿æŒç®ã«ããã¡ã¢ãªã¢ã©ã€ã¡ã³ãå¶åŸ¡
ã»SIMDïŒAVX-512ïŒãã¯ãã«åœä»€ã®çŽå©ã
ã»ããŒããŠã§ã¢ã¬ãžã¹ã¿ãžã®1ãããåäœã®ã¢ã¯ã»ã¹
â²
â 1ã€ã®èšèªã®äžã§ã·ãŒã ã¬ã¹ã«è¡ãæ¥ã§ããïŒ
âŒ
ãæäžå±€ïŒæ¥µéã®ãŒãã³ã¹ãæœè±¡åã
ã»RAII ã«ãã絶察å®å
šãªã©ã€ããµã€ã¯ã«
ã»CRTP ã Concepts ã«ããã³ã³ãã€ã«æåæ€èšŒ
ã»constexpr ã«ããããã«ãæã«èšç®ãå
šãŠçµããŠãããç¥æ¥
ã»ECSïŒEntity-Component-SystemïŒã«ããããŒã¿æåèšèš
```
ä»ã®èšèªã§ã¯ãé床ãè¶³ããªããããéãéšåã ãCèšèªã§æžããŠé£æºããããïŒFFI/JNIïŒããšãªããã¡ã§ãããC++ãªã**æåããæåŸãŸã§1ã€ã®èšèªã®åã·ã¹ãã ã®æ©æµãåããªãããæé«éãå©ãåºã**ããšãã§ããŸãã
4. ã·ãã¯ãæå°å®ããã®ç±ãã¡ãã»ãŒãžïŒC++ãå¶ããè
ã¯ããã¹ãŠãå¶ã
C++ãåŠã¶ããšã¯ãã³ã³ãã¥ãŒã¿ãšããç¥æ§ã®å·šäººãå®å
šã«ä¹ãããªãå
èš±çäŒãåŸãããšã
ð§ ãã³ã®ã³å
茩
ãã³å
çãç§ãæåã¯ãå
šéšGameManagerã«æžãã°ããããããã£ãŠæã£ãŠãŸãããã§ããã¡ã¢ãªã®ä»çµã¿ããªãã¯ã©ã¹ãåããã®ãããªããã€ã³ã¿ã®æææš©ãå¿
èŠãªã®ããåŠãã§ãããã¡ã«ãã³ãŒããæžãã®ãäœåãæ¥œãããªã£ãŠããŸããïŒ
ð»ââïž ã·ãã¯ãå
ç
ãã©ããã©ããã©ïŒããã§ããã¯ã·ã®èªæ
¢ã®çåŸããïŒC++ã®åŠç¿æ²ç·ã¯ç¢ºãã«éºãããã ããC++ã§ããªãåãã®ããããªããã®èšèšãªã®ãããè¯ããçè§£ãããšã³ãžãã¢ã¯ãå°æ¥ã©ããªæ°ããèšèªããã¬ãŒã ã¯ãŒã¯ãçŸããããšããæ±ºããŠè¿·åã«ãªããïŒã³ã³ãã¥ãŒã¿ã®æ ¹æ¬åçã峿¹ã«ã€ããããããïŒ
### C++ãåŠã¶ãã¹ãŠã®åéºè
ãž
C++ãåŠã¶éã®ãã¯ã決ããŠå¹³åŠã§ã¯ãããŸããã
æªå®çŸ©åäœïŒUBïŒãäºéè§£æŸãè±åœ¢ç¶æ¿ãè€éæªå¥ãªãã³ãã¬ãŒããšã©ãŒâŠâŠã
äœåºŠãã³ã³ãã€ã©ã«åŒŸãããå®è¡æãšã©ãŒã«é ãæ±ããå€ãããã§ãããã
ããããç«ã¡æ¢ãŸããªãã§ãã ããã
ããªããã¶ã€ãã£ãŠããå£ã¯ã**ãã³ã³ãã¥ãŒã¿ãµã€ãšã³ã¹ã®æŽå²ã40幎ãããŠè§£ãæãããŠãããæ¬è³ªçãªèª²é¡ãã®ãã®ã**ã§ãã
C++ãä¹ãè¶ããæãããªãã¯åãªããæ§æãæèšããŠã³ãŒãã䞊ã¹ãããã°ã©ããããã
**ãã¡ã¢ãªã®é
眮ãèŠéãããã£ãã·ã¥ã©ã€ã³ãæèãã10幎åŸãå£ããªãå
ç¢ãªã¢ãŒããã¯ãã£ããŒãããçã¿åºããçã®ãœãããŠã§ã¢ã¢ãŒããã¯ãã**
ãžãšé²åããŠããŸãã
ãããããã·ãªã³ã³ã®éŒåãé¿ãC++ã®äžçãžã
ã·ãã¯ãC++ã©ãã¯ãããªãã®èšèšã®æ
ããããããå
šåã§å¿æŽãç¶ããŸãïŒð»ââïžâïž
ð ç解床ãã§ãã¯ã¯ã€ãº
Q1. C++ã®èšèšææ³ã®æ ¹å¹¹ã§ããããŒããªãŒããŒãããååïŒZero-Overhead PrincipleïŒãã®ç²Ÿç¥ã衚ãèšèãšããŠæãé©åãªãã®ã¯ã©ãã§ããïŒ
- 1. ãã¹ãŠã®ããã°ã©ã ã®ã¡ã¢ãªäœ¿çšéã1MB以äžã«æããªããã°ãªããªã
- 2. 䜿ããªãæ©èœã«å¯ŸããŠããã°ã©ãã¯äžåã®ã³ã¹ãïŒCPUæéã»ã¡ã¢ãªïŒãæ¯æã£ãŠã¯ãªãããäœ¿ãæ©èœã«ã€ããŠã¯ææžãã¢ã»ã³ãã©ã«å¹æµããæé«å¹çãéæããªããã°ãªããªã
- 3. C++ã®ã³ã³ãã€ã«æéã¯0ç§ã§ãªããã°ãªããªã
- 4. ãã¹ãŠã®å€æ°ã0ã§åæåããªããã°ãªããªã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒäœ¿ããªãæ©èœã«å¯ŸããŠããã°ã©ãã¯äžåã®ã³ã¹ãïŒCPUæéã»ã¡ã¢ãªïŒãæ¯æã£ãŠã¯ãªãããäœ¿ãæ©èœã«ã€ããŠã¯ææžãã¢ã»ã³ãã©ã«å¹æµããæé«å¹çãéæããªããã°ãªããªã
ãã£ãŒãã»ã¹ãããŽã¹ãã«ãããå®ãããWhat you don't use, you don't pay for. What you do use, you couldn't hand code any better.ããšãã2倧ååã§ãããã®ä¿¡å¿µã«ãããC++ã¯æ¥µããŠé«åºŠãªæœè±¡åãæã¡ãªããæ¥µéã®å®è¡é床ãç¶æããŠããŸãã
Q2. ã²ãŒã éçºããªã¢ã«ã¿ã€ã ã·ã¹ãã ã«ãããŠãJavaãC#çã®GCïŒã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒèšèªã«æ¯ã¹ãC++ã®RAIIïŒãªãœãŒã¹ååŸã¯åæåïŒã決å®çãªåŒ·ã¿ãšãããæå€§ã®çç±ã¯äœã§ããïŒ
- 1. C++ã§ã¯ã¡ã¢ãªè§£æŸãäžèŠã«ãªããã
- 2. ã¹ã³ãŒãçµäºæã«ãªãœãŒã¹ãå³åº§ã«è§£æŸããããæ±ºå®è«ç寿åœããæã€ãããGCã®å®ææž
æã«ããçªçºçãªåŠç忢ïŒStop-the-WorldïŒããã¬ãŒã èœã¡ãèµ·ããªããã
- 3. RAIIã䜿ããšGPUã®æç»æ§èœã2åã«ãªããã
- 4. C++ã¯ã¡ã¢ãªãããŒãã§ã¯ãªãCPUã¬ãžã¹ã¿ã«ãã¹ãŠä¿åãããã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒã¹ã³ãŒãçµäºæã«ãªãœãŒã¹ãå³åº§ã«è§£æŸããããæ±ºå®è«ç寿åœããæã€ãããGCã®å®ææž
æã«ããçªçºçãªåŠç忢ïŒStop-the-WorldïŒããã¬ãŒã èœã¡ãèµ·ããªããã
GCèšèªã¯ã¡ã¢ãªè§£æŸã®ã¿ã€ãã³ã°ãéæ±ºå®è«çã§ãããè² è·ã®é«ãã¿ã€ãã³ã°ã§çªç¶GCãèµ°ã£ãŠç»é¢åæ¢ïŒã¹ãã€ã¯ïŒãèµ·ãããªã¹ã¯ããããŸããäžæ¹ãC++ã®RAIIã¯ãã€è§£æŸããããã100%äºæž¬å¯èœïŒæ±ºå®è«çïŒã§ããã60FPS/120FPSãæ»å®ãããªã¢ã«ã¿ã€ã å¶åŸ¡ã«äžå¯æ¬ ã§ãã
Q3. æ©æ¢°åŠç¿ãã¬ãŒã ã¯ãŒã¯ïŒPyTorchãTensorFlowçïŒã§ãAPIã¯Pythonã§æäŸããã€ã€ããæ·±å±€åŠç¿ã®ã³ã¢èšç®ãšã³ãžã³ãC++ã§å®è£
ãããŠããäž»ãªçç±ã¯äœã§ããïŒ
- 1. Pythonã§ã¯ãã¡ã€ã«ãéãããšãã§ããªããã
- 2. GPUïŒCUDAïŒããã«ãã¹ã¬ãããSIMDãã¯ãã«æŒç®ãªã©ã®ããŒããŠã§ã¢æ§èœããªãŒããŒããããªãã§æ¥µéãŸã§åŒãåºããã
- 3. C++ã®æ¹ãã³ãŒãã®è¡æ°ãçããªããã
- 4. Webãã©ãŠã¶äžã§åäœããããã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒGPUïŒCUDAïŒããã«ãã¹ã¬ãããSIMDãã¯ãã«æŒç®ãªã©ã®ããŒããŠã§ã¢æ§èœããªãŒããŒããããªãã§æ¥µéãŸã§åŒãåºããã
Pythonã®GILïŒã°ããŒãã«ã€ã³ã¿ããªã¿ããã¯ïŒãåçåä»ãã®ãªãŒããŒããããåé¿ããGPUãCPUã®å
šã³ã¢ã»SIMDäžŠåæŒç®ãŠãããã®ç©çéçæ§èœãåŒãåºãããã«ãAIãã¬ãŒã ã¯ãŒã¯ã®èšç®ã³ã¢ã¯ãã¹ãŠC++/CUDAã§æ¥µéãŸã§æé©åãããŠããŸãã
ð»ââïž ã·ãã¯ãC++ã©ã ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ã·ã¹ãã
ãã©ãŠã¶ã§JavaScriptãæå¹ã«ãããšããã©ãŠã¶å
ã€ã³ããŒããŒã²ãŒã ãšãã¥ã¬ãŒã¿ãã¡ã¢ãªãããå¯èŠåãUMLã¯ã©ã¹å³ã察話å解説ãç解床ã¯ã€ãºãèµ·åããŸãã
ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ãéå§ãã â