5.5ãã©ã³ãå
ã®SObjectizerã®æåã®ããŒãžã§ã³ã¯ã4幎以äžå-2014幎10æäžæ¬ã«ãªãªãŒã¹ãããŸããã ãããŠä»æ¥
ãæ¬¡ã®ããŒãžã§ã³ã5.5.23ãšããçªå·ã§ãªãªãŒã¹ãããŸãã ãããã¯ãããããSObjectizer-5.5ã®æŽå²ãçµããããã§ãããã ç§ã®æèŠã§ã¯ãããã¯éå»4幎éã«äœãè¡ãããããæ¯ãè¿ã£ãŠèŠãçµ¶å¥œã®æ©äŒã§ãã
ãã®èšäºã§ã¯ãæãéèŠã§éèŠãªå€æŽãšã€ãããŒã·ã§ã³ãæœè±¡çã«åæããããšããŸãïŒè¿œå ããããã®ãçç±ãSObjectizerèªäœãŸãã¯ãã®äœ¿çšã«ã©ã®ããã«åœ±é¿ãããã
ãããã誰ããèå€åŠã®èгç¹ãããã®ãããªç©èªã«èå³ãæã€ã§ãããã ãããŠããããã誰ãããC ++çšã®ç¬èªã®ã¢ã¯ã¿ãŒãã¬ãŒã ã¯ãŒã¯ã®éçºã®ãããªçãããåéºã黿¢ãããã§ãããã
å€ãC ++ã³ã³ãã€ã©ã®åœ¹å²ã«é¢ããå°ãåæ
çãªäœè«
SObjectizer-5ã®æŽå²ã¯2010幎åã°ã«å§ãŸããŸããã åæã«ãããã«C ++ 0xã«æ³šç®ããŸããã ãã§ã«2011幎ã«ãSObjectizer-5ã®æåã®ããŒãžã§ã³ã補åã³ãŒãã®èšè¿°ã«äœ¿çšããå§ããŸããã ãã®ãšããéåžžã®C ++ 11ããµããŒãããã³ã³ãã€ã©ããªãã£ãããšã¯æããã§ãã
é·ãéããmodern C ++ãã®ãã¹ãŠã®æ©èœãå®å
šã«äœ¿çšããããšã¯ã§ããŸããã§ããïŒå¯å€é·ãã³ãã¬ãŒããnoexceptãconstexprãªã©ãããã¯SObjectizer APIã«åœ±é¿ãäžããã ãã§ããã ãããŠãããã¯éåžžã«é·ãé圱é¿ãåãŒããŸããã ãããã£ãŠãæ©èœã®èª¬æãèªããšãã«ããªã以åã«è¡ãããªãã£ãã®ãããšãã質åãããå Žåããã®è³ªåã«å¯Ÿããçãã¯ã以åã¯äžå¯èœã ã£ããããã§ããå¯èœæ§ãæãé«ãã§ãã
éå»ã«SObjectizer-5.5ã§äœã衚瀺ããã³/ãŸãã¯å€æŽãããŸãããïŒ
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãSObjectizerã«å€§ããªåœ±é¿ãäžããå€ãã®æ©èœã«ã€ããŠèª¬æããŸãã ãã®ãªã¹ãã®é åºã¯ã©ã³ãã ã§ããã説æãããŠããæ©èœã®ãéèŠæ§ãããéã¿ããšã¯é¢ä¿ãããŸããã
so_5 :: rtåå空éã®æåŠ
ã©ãããïŒ
æåã«ã5çªç®ã®SObjectizerã§ã¯ãSObjectizerã©ã³ã¿ã€ã ã«é¢é£ãããã¹ãŠãso_5 :: rtåå空éå
ã§å®çŸ©ãããŸããã ããšãã°ãso_5 :: rt :: environment_tãso_5 :: rt :: agent_tãso_5 :: rt :: message_tãªã©ããããŸããã ããšãã°ãSO-5.5.0ã®åŸæ¥ã®HelloWorldã®äŸã§èŠãããšãã§ãããã®ïŒ
#include <so_5/all.hpp> class a_hello_t : public so_5::rt::agent_t { public: a_hello_t( so_5::rt::environment_t & env ) : so_5::rt::agent_t( env ) {} void so_evt_start() override { std::cout << "Hello, world! This is SObjectizer v.5." << std::endl; so_environment().stop(); } void so_evt_finish() override { std::cout << "Bye! This was SObjectizer v.5." << std::endl; } }; int main() { try { so_5::launch( []( so_5::rt::environment_t & env ) { env.register_agent_as_coop( "coop", new a_hello_t( env ) ); } ); } catch( const std::exception & ex ) { std::cerr << "Error: " << ex.what() << std::endl; return 1; } return 0; }
ç¥èªãrtãã¯ã©ã³ã¿ã€ã ã衚ããŸãã ãããŠãã¬ã³ãŒã "so_5 :: rt"ã¯ã "so_5 ::ã©ã³ã¿ã€ã "ãããã¯ããã«åªããŠãããå®çšçã§ããããã«æãããŸããã
ããããå€ãã®äººã«ãšã£ãŠãrtãã¯ããªã¢ã«ã¿ã€ã ãã«éãããä»ã«ã¯äœããªãããšã倿ããŸããã ãŸãããã©ã³ã¿ã€ã ãã®ç¥èªãšããŠãrtãã䜿çšãããšãææ
ã倧ããæãªããããããRuNetã§ã®SObjectizerã®ããŒãžã§ã³ã®ã¢ããŠã³ã¹ããããªã¢ã«ã¿ã€ã ã以å€ã®ãrtãã®èš±å¯ãããªãè§£éãããŒãã«ããªããŒã«å€ããããšããããŸãã
çµå±ãç§ãã¡ã¯ããã«ããããããŠããŸãã ãããŠãso_5 :: rtåå空éã®æºåãè§£é€ããŸããã
äœã«ãªã£ãã®ïŒ
ãso_5 :: rtãå
ã§å®çŸ©ããããã¹ãŠã®ãã®ã¯ãåã«ãso_5ãã«åãæ¿ãããŸããã ãã®çµæãåãHelloWorldã¯æ¬¡ã®ããã«ãªããŸãã
#include <so_5/all.hpp> class a_hello_t : public so_5::agent_t { public: a_hello_t( context_t ctx ) : so_5::agent_t( ctx ) {} void so_evt_start() override { std::cout << "Hello, world! This is SObjectizer v.5 (" << SO_5_VERSION << ")" << std::endl; so_environment().stop(); } void so_evt_finish() override { std::cout << "Bye! This was SObjectizer v.5." << std::endl; } }; int main() { try { so_5::launch( []( so_5::environment_t & env ) { env.register_agent_as_coop( "coop", env.make_agent<a_hello_t>() ); } ); } catch( const std::exception & ex ) { std::cerr << "Error: " << ex.what() << std::endl; return 1; } return 0; }
ãããããso_5 :: rtãã®å€ãååã¯ãéåžžã®sïŒtypedefsïŒã®äœ¿çšãéããŠããšã«ããå©çšå¯èœã®ãŸãŸã§ããã ãããã£ãŠãSO-5.5ã®æåã®ããŒãžã§ã³çšã«èšè¿°ãããã³ãŒãã¯ãSO-5.5ã®æè¿ã®ããŒãžã§ã³ã§ãæ©èœããŸãã
æåŸã«ãso_5 :: rtåå空éã¯ããŒãžã§ã³5.6ã§åé€ãããŸãã
ã©ã®ãããªåœ±é¿ããããŸãããïŒ
ãããããSObjectizerã®ã³ãŒãã¯èªã¿ããããªããŸããã ããã§ããso_5 :: sendïŒïŒã¯ãso_5 :: rt :: sendïŒïŒãããé©åã«èªèãããŸãã
ããŠãããã§ã¯ãSObjectizeréçºè
ãšåæ§ã«ãé çã®çš®ãæžããŸããã äžåºŠã«SObjectizerã®ã¢ããŠã³ã¹ã®åšãã«ç©ºã£ãœã®ãã£ãããšäžå¿
èŠãªæšè«ãå€ãããŸããïŒããªãC ++ã®ã¢ã¯ã¿ãŒãå¿
èŠãªã®ãããšãã質åããå§ãŸããããšã³ãã£ãã£ã«ååãä»ããããã«PascalCaseã䜿çšããªãã®ã¯ãªãããã§çµããïŒã 1ã€ã®å¯çæ§ã®ããŒããå°ãªããªããè¯ãã£ã:)
ç°¡çŽ åãããã¡ãã»ãŒãžéä¿¡ãšã¡ãã»ãŒãžãã³ãã©ãŒã®é²å
ã©ãããïŒ
SObjectizer-5.5ã®æåã®ããŒãžã§ã³ã§ããéåžžã®ã¡ãã»ãŒãžã¯deliver_messageã¡ãœããã䜿çšããŠéä¿¡ãããŸããããããã¯åä¿¡è
ã®mboxã§åŒã³åºãå¿
èŠããããŸããã ä¿çäžãŸãã¯å®æçãªã¡ãã»ãŒãžãéä¿¡ããã«ã¯ãenvironment_tåã®ãªããžã§ã¯ãã§single_timer / schedule_timerãåŒã³åºãå¿
èŠããããŸããã ãŸããå¥ã®ãšãŒãžã§ã³ãã«ãã§ã«åæãªã¯ãšã¹ããéä¿¡ããã«ã¯ãéåžžãäžé£ã®æäœå
šäœãå¿
èŠã§ããã ããã§ãããšãã°ã4幎åã«ã©ã®ããã«èŠãããïŒstd :: make_uniqueïŒïŒã¯C ++ 11ã§ã¯ãŸã å©çšã§ããŸããã§ãããããã§ã«äœ¿çšãããŠããŸãïŒïŒ
ããã«ãSObjectizerã®ã¡ãã»ãŒãžãã³ãã©ãŒã®åœ¢åŒã¯ããŒãžã§ã³5.5ã«é²åããŸããã æåã«SObjectizer-5ã䜿çšããå Žåããã¹ãŠã®ãã³ãã©ãŒã®åœ¢åŒã¯æ¬¡ã®ãšããã§ãã
void evt_handler(const so_5::event_data_t<Msg> & cmd);
æéãçµã€ã«ã€ããŠãèš±å¯ããã圢åŒã«ããã«ããã€ãã远å ãããŸããã
以æ¥ãæ°ãããã³ãã©åœ¢åŒãåºã䜿çšãããããã«ãªããŸãã åžžã«ãconst so_5 :: event_data_t <Msg>ïŒãããã€ã³ãããããšã¯ããŸã 楜ãã¿ã§ãã ããããäžæ¹ã§ãããåçŽãªåœ¢åŒã¯ãã³ãã¬ãŒããšãŒãžã§ã³ãã«ãšã£ãŠäœ¿ãããããã®ã§ã¯ãããŸããã§ããã äŸïŒ
template<typename Msg_To_Process> class my_actor : public so_5::agent_t { void on_receive(const Msg_To_Process & msg) {
ãã®ãããªãã³ãã¬ãŒããšãŒãžã§ã³ãã¯ãMsg_To_Processãã¡ãã»ãŒãžã¿ã€ãã§ãããã·ã°ãã«ã¿ã€ãã§ã¯ãªãå Žåã«ã®ã¿æ©èœããŸãã
äœã«ãªã£ãã®ïŒ
ãã©ã³ã5.5ã§ã¯ãéä¿¡æ©èœã®ãã¡ããªãŒãç»å Žãã倧å¹
ã«é²åããŸããã ãããè¡ãã«ã¯ããŸããå¯å€é·ãã³ãã¬ãŒãããµããŒãããã³ã³ãã€ã©ãŒãèªç±ã«äœ¿çšããå¿
èŠããããŸããã ãããŠã第äºã«ãäžè¬çãªå¯å€åŒæ°ãã³ãã¬ãŒããšsend-functionsã®æåã®ããŒãžã§ã³ã®äž¡æ¹ã§äœæ¥ããååãªçµéšãèç©ããŸãã ããã«ãããŸããŸãªã³ã³ããã¹ãã§ïŒéåžžã®ãšãŒãžã§ã³ããã¢ãããã¯ãšãŒãžã§ã³ãããã³ãã¬ãŒãã¯ã©ã¹ã«ãã£ãŠå®è£
ããããšãŒãžã§ã³ããããã³äžè¬çãªå€éšãšãŒãžã§ã³ãã mchainsã§send-functionsã䜿çšããå Žåãå«ããŸãïŒä»¥äžã§èª¬æããŸãïŒã
éä¿¡é¢æ°ã«å ããŠããšãŒãžã§ã³ãéã®åæçžäºäœçšã®ããã«èšèšãããrequest_future / request_value颿°ãç»å ŽããŸããã
ãã®çµæãã¡ãã»ãŒãžã®éä¿¡ã¯æ¬¡ã®ããã«ãªããŸããã
ã¡ãã»ãŒãžãã³ãã©ã®å¥ã®å¯èœãªåœ¢åŒã远å ãããŸããã ããã«ãSObjectizerã®æ¬¡ã®ã¡ãžã£ãŒãªãªãŒã¹ã§ã¡ã€ã³ïŒãããŠãããããå¯äžã®ïŒãšããŠæ®ãããã®ã¯ããã®åœ¢åŒã§ãã ããã¯æ¬¡ã®åœ¢åŒã§ãã
ret_type evt_handler(so_5::mhood_t<Msg> cmd);
Msgã¯ãã¡ãã»ãŒãžã¿ã€ããŸãã¯ã·ã°ãã«ã¿ã€ãã®ããããã§ãã
ãã®åœ¢åŒã¯ãéåžžã®ã¯ã©ã¹ã®åœ¢åŒã®ãšãŒãžã§ã³ããšãã³ãã¬ãŒãã¯ã©ã¹ã®åœ¢åŒã®ãšãŒãžã§ã³ãã®éã®å¢çãææ§ã«ããã ãã§ã¯ãããŸããã ãã ããã¡ãã»ãŒãž/ã·ã°ãã«ã®è»¢éãç°¡çŽ åãããŸãïŒéä¿¡æ©èœãã¡ããªã®ãããã§ãïŒã
void my_agent::on_msg(mhood_t<Some_Msg> cmd) { ...
ã©ã®ãããªåœ±é¿ããããŸãããïŒ
mhood_t <Msg>ãåä¿¡ããéä¿¡é¢æ°ãšã¡ãã»ãŒãžãã³ãã©ã®å€èгã¯ãã¡ãã»ãŒãžãéä¿¡ããã³åŠçãããã³ãŒããæ ¹æ¬çã«å€æŽãããšèšããŸãã ããã¯ãSObjectizer-5ã®äœæ¥ã®æåã®æ®µéã§ãå¯å€ååŒæ°ãã³ãã¬ãŒãããµããŒãããã³ã³ãã€ã©ãããããã䜿çšããçµéšããªãã£ãããšãåŸæããã ãã®å Žåã§ãã éä¿¡é¢æ°ãšmhood_tã®ãã¡ããªã¯ãæåããå¿
èŠã§ããã ããããæŽå²ã¯çºå±ããã«ã€ããŠçºå±ããŸãã...
ã«ã¹ã¿ã ã¡ãã»ãŒãžã®ãµããŒã
ã©ãããïŒ
æåã¯ãéä¿¡ããããã¹ãŠã®ã¡ãã»ãŒãžã¯so_5 :: message_tã¯ã©ã¹ã®åå«ã¯ã©ã¹ã§ãããšæ³å®ãããŠããŸããã äŸïŒ
struct my_message : public so_5::message_t { ...
5çªç®ã®SObjectizerã¯ç§ãã¡ã ãã䜿çšããŸããããããã¯åé¡ãåŒãèµ·ãããŸããã§ããã ãŸãããã®ããã«ããã®ããã«ã
ãããããµãŒãããŒãã£ã®ãŠãŒã¶ãŒãSObjectizerã«èå³ãæã¡å§ãããšããã«ããso_5 :: message_tããã¡ãã»ãŒãžãç¶æ¿ããå¿
èŠããããŸããïŒããšãã宿çã«ç¹°ãè¿ããã質åã«ããã«ééããŸããããŠãŒã¶ãŒããŸã£ãã圱é¿ãäžããããªãã£ãã¿ã€ãã ãŠãŒã¶ãŒãSObjectizerãšä»ã®å€éšã©ã€ãã©ãªã䜿çšãããšããŸãã ãããŠããã®å€éšã©ã€ãã©ãªã«ã¯ããŠãŒã¶ãŒãã¡ãã»ãŒãžãšããŠéä¿¡ããããªããžã§ã¯ãã§ããç¹å®ã®ã¿ã€ãMããããŸãã ããŠãã©ã®ããã«å人ãMãšso_5 :: message_tãå
¥åãããããªæ¡ä»¶ã§ïŒ ãŠãŒã¶ãŒãæåã§èšè¿°ããå¿
èŠããã£ã远å ã®ã©ãããŒã®ã¿ã
äœã«ãªã£ãã®ïŒ
ã¡ãã»ãŒãžã¿ã€ããso_5 :: message_tããç¶æ¿ãããªãå Žåã§ããSObjectizer-5.5ã«ã¡ãã»ãŒãžãéä¿¡ããæ©èœã远å ããŸããã ã€ãŸã ããã§ããŠãŒã¶ãŒã¯ç°¡åã«èšè¿°ã§ããŸãã
so_5::send<std::string>(mbox, "Hello, World!");
So_5 :: message_tã¯ããã³ãã¬ãŒãããžãã¯sendïŒïŒããstd :: stringãso_5 :: message_tããç¶æ¿ãããŠããããstd :: stringãsendå
ã«æ§ç¯ãããŠããã®ã§ã¯ãªããso_5ããã®ç¹å¥ãªç¶æ¿è
ã§ããããã :: message_tãå
éšã«ã¯æ¢ã«ãŠãŒã¶ãŒãå¿
èŠãšããæåå::æååãå
¥ã£ãŠããŸãã
åæ§ã®ãã³ãã¬ãŒãããžãã¯ããµãã¹ã¯ãªãã·ã§ã³ã«é©çšãããŸãã SObjectizerãæ¬¡ã®åœ¢åŒã®ã¡ãã»ãŒãžãã³ãã©ãèŠã€ããå ŽåïŒ
void evt_handler(mhood_t<std::string> cmd) {...}
SObjectizerã¯ãå®éã«ã¯ç¹å¥ãªã¡ãã»ãŒãžã«ã¯std :: stringãªããžã§ã¯ããå«ãŸããããšãçè§£ããŠããŸãã ãããŠããã®ç¹å¥ãªã¡ãã»ãŒãžããstd :: stringãžã®ãªã³ã¯ãæž¡ããŠãã³ãã©ãŒãåŒã³åºãå¿
èŠããããŸãã
ã©ã®ãããªåœ±é¿ããããŸãããïŒ
SObjectizerã®äœ¿çšãç°¡åã«ãªããŸãããç¹ã«ãç¬èªã®ã¿ã€ãã®ãªããžã§ã¯ããã¡ãã»ãŒãžãšããŠéä¿¡ããã ãã§ãªããå€éšã©ã€ãã©ãªã®ã¿ã€ããªããžã§ã¯ããéä¿¡ããå¿
èŠãããå Žåã«äŸ¿å©ã§ãã äœäººãã®äººã
ã¯ããã®æ©èœã«ç¹å¥ãªæè¬ãèšãããã«æéãè²»ãããŸããã
å¯å€ã¡ãã»ãŒãž
ã©ãããïŒ
åœåãSObjectizer-5ã§ã¯ã1ïŒNçžäºäœçšã¢ãã«ã®ã¿ã䜿çšãããŠããŸããã ã€ãŸã éä¿¡ã¡ãã»ãŒãžã«ã¯è€æ°ã®åä¿¡è
ãããå¯èœæ§ããããŸãïŒãŸãã¯è€æ°ã®åä¿¡è
ãããå¯èœæ§ããããŸãïŒã ãšãŒãžã§ã³ãã1ïŒ1ã¢ãŒãã§å¯Ÿè©±ããå¿
èŠãããå Žåã§ãããã«ããããã¥ãŒãµãŒ/ãã«ãã³ã³ã·ã¥ãŒããŒã¡ãŒã«ããã¯ã¹ãä»ããŠéä¿¡ããŸãã ã€ãŸã 1ïŒNã¢ãŒãã§ã¯ããã®å Žåã®Nã®ã¿ãå³å¯ã«åäœã§ããã
è€æ°ã®åä¿¡è
ãšãŒãžã§ã³ããã¡ãã»ãŒãžãåä¿¡ã§ããç¶æ³ã§ã¯ãéä¿¡ãããã¡ãã»ãŒãžã¯äžå€ã§ãªããã°ãªããŸããã ãã®ãããã¡ãã»ãŒãžãã³ãã©ãŒã®åœ¢åŒã¯æ¬¡ã®ãšããã§ãã
äžè¬çã«ãã·ã³ãã«ã§çè§£å¯èœãªã¢ãããŒãã ãã ãããšãŒãžã§ã³ãã1ïŒ1ã¢ãŒãã§çžäºã«éä¿¡ããããšãã°äžéšã®ããŒã¿ã®æææš©ãçžäºã«è»¢éããå¿
èŠãããå Žåã¯ãããŸã䟿å©ã§ã¯ãããŸããã ãã¹ãŠã®ã¡ãã»ãŒãžãå³å¯ã«äžå€ã®ãªããžã§ã¯ãã§ããå Žåããã®ãããªåçŽãªã¡ãã»ãŒãžã¯å®è¡ã§ããŸããã
struct process_image : public so_5::message_t { std::unique_ptr<gif_image> image_; process_image(std::unique_ptr<gif_image> image) : image_{std::move(image)) {} };
ããæ£ç¢ºã«ã¯ããã®ãããªã¡ãã»ãŒãžãéä¿¡ã§ããŸãã ããããããã宿°ãªããžã§ã¯ããšããŠåãåã£ãå Žåãprocess_image :: image_ã®å
容ãããèªäœããåé€ããããšã¯ã§ããŸããã§ããã ãã®ãããªå±æ§ã倿Žå¯èœãšããŠããŒã¯ããå¿
èŠããããŸãã ããããprocess_imageãäœããã®çç±ã§1ïŒNã¢ãŒãã§éä¿¡ãããå Žåãã³ã³ãã€ã©ãŒåŽã®å¶åŸ¡ã倱ããŸãã
äœã«ãªã£ãã®ïŒ
SObjectizer-5.5ã§ã¯ãå¯å€ã¡ãã»ãŒãžãéåä¿¡ããæ©èœã远å ãããŸããã ãã®å ŽåããŠãŒã¶ãŒã¯ãéä¿¡æãšè³Œèªæã«ã¡ãã»ãŒãžã«ç¹å¥ãªããŒã¯ãä»ããå¿
èŠããããŸãã
äŸïŒ
SObjectizerã®å Žåãmy_messageãšmutable_msg <my_message>ã¯2çš®é¡ã®ã¡ãã»ãŒãžã§ãã
éä¿¡æ©èœã¯ã倿Žå¯èœãªã¡ãã»ãŒãžãéä¿¡ããããèŠæ±ãããŠããããšã確èªãããšãéä¿¡æ©èœããã§ãã¯ããã©ã®ã¡ãŒã«ããã¯ã¹ã«ãã®ã¡ãã»ãŒãžãéä¿¡ããããšããŸãã ãã«ãã³ã³ã·ã¥ãŒãããã¯ã¹ã®å Žåãéä¿¡ã¯å®è¡ãããŸãããã察å¿ãããšã©ãŒã³ãŒããšå
±ã«äŸå€ãã¹ããŒãããŸãã ã€ãŸã SObjectizerã¯ã1ïŒ1ã¢ãŒãã§å¯Ÿè©±ããå Žåã«ã®ã¿ãåäžã¡ãã»ãŒãžã¡ãŒã«ããã¯ã¹ãŸãã¯åäžãã§ãŒã³ã¡ãŒã«ããã¯ã¹ã®åœ¢åŒã§ããmchainsã䜿çšããŠãå¯å€ã¡ãã»ãŒãžã䜿çšã§ããããã«ããŸãã ãšããã§ããã®ä¿èšŒã確å®ã«ããããã«ãSObjectizerã¯ã宿çãªã¡ãã»ãŒãžã®åœ¢åŒã§å€æŽå¯èœãªã¡ãã»ãŒãžãéä¿¡ããããšãçŠæ¢ããŠããŸãã
ã©ã®ãããªåœ±é¿ããããŸãããïŒ
å¯å€ã¡ãã»ãŒãžã§ã¯ãäºæ³å€ã«å€æããŸããã
C ++ Russia-2017ã§ã®SObjectizerã«é¢ããã¬ããŒãã®å¯æ¬¡çãªè°è«ã®çµæãšããŠãããããSObjectizerã«è¿œå ããŸããã ããŸããå°ããã誰ãããããå¿
èŠãšããã®ã§ã詊ããŠã¿ã䟡å€ã¯ãããŸããã ãŸãã圌ãã¯åºç¯ãªéèŠã®å€ãã®åžæãªãã§ãã£ãã ãã®ãããäºææ§ãæãªãããšãªãSO-5.5ã«å¯å€ã¡ãã»ãŒãžã远å ããæ¹æ³ãèããåã«ãéåžžã«é·ãéã竹ãåžããå¿
èŠããããŸããã
ããããSObjectizerã§å€æŽå¯èœãªã¡ãã»ãŒãžã衚瀺ããããšãããããã®ã¢ããªã±ãŒã·ã§ã³ã¯ããã»ã©å€ããªãããšã倿ããŸããã ãããŠããã®å¯å€ã¡ãã»ãŒãžã¯é©ãã»ã©é »ç¹ã«äœ¿çšãããŸãïŒããã«ã€ããŠã®èšåã¯
ãShrimpãã¢ãããžã§ã¯ãã«é¢ããã¹ããŒãªãŒã®2çªç®ã®éšåã«ãããŸã ïŒã ãããã£ãŠãå®éã«ã¯ããã®æ©èœã¯éåžžã«äŸ¿å©ã§ããã SObjectizerã¬ãã«ã§å€æŽå¯èœãªã¡ãã»ãŒãžã®ãµããŒãããªããã°ãéåžžã®è§£æ±ºçããªãã£ãåé¡ã解決ã§ããŸãã
éå±€ç¶æ
ãã·ã³ãšãŒãžã§ã³ã
ã©ãããïŒ
SObjectizerã®ãšãŒãžã§ã³ãã¯ããšããšã¹ããŒããã·ã³ã§ããã ãšãŒãžã§ã³ãã¯ãç¶æ
ãæç€ºçã«èšè¿°ããç¹å®ã®ç¶æ
ã®ã¡ãã»ãŒãžããµãã¹ã¯ã©ã€ãããå¿
èŠããããŸããã
äŸïŒ
class worker : public so_5::agent_t { state_t st_free{this, "free"}; state_t st_bufy{this, "busy"}; ... void so_define_agent() override {
ãããããããã¯åçŽãªç¶æ
ãã·ã³ã§ããã ç¶æ
ãäºãã«å
¥ãåã«ããããšã¯ã§ããŸããã§ããã ç¶æ
ã®éå§ããã³çµäºãã³ãã©ãŒã¯ãµããŒããããŠããŸããã å·ã§éãããæéã«å¶éã¯ãããŸããã§ããã
ã¹ããŒããã·ã³ã«å¯Ÿãããã®ãããªéå®çãªãµããŒãã§ãã䟿å©ã§ããã1幎以äžäœ¿çšããŸããã ããããããæç¹ã§ããã£ã𿬲ããã£ãã
äœã«ãªã£ãã®ïŒ
SObjectizerã¯ãéå±€ç¶æ
ãã·ã³ã®ãµããŒããå°å
¥ããŸãã
ããã§ãã¹ããŒããçžäºã«ãã¹ãã§ããŸãã èŠªç¶æ
ã®ã€ãã³ããã³ãã©ãŒã¯ãåç¶æ
ã«ãã£ãŠèªåçã«ãç¶æ¿ããããŸãã
ç¶æ
ã®å
¥ãå£ãšåºå£ã®ãã³ãã©ãŒããµããŒããããŠããŸãã
ãšãŒãžã§ã³ããç¶æ
ãç¶æããæéã«å¶éãèšå®ããããšãã§ããŸãã
ç¶æ
ã®å±¥æŽãä¿æããããšãå¯èœã§ãã
æ ¹æ ããªãããã«ãè€éãªéå±€ç¶æ
ãã·ã³ã§ã¯ãªããšãŒãžã§ã³ãã®äŸã次ã«ç€ºããŸãïŒæšæºçãªäŸã®ã³ãŒãã¯blinking_ledã§ãïŒã
class blinking_led final : public so_5::agent_t { state_t off{ this }, blinking{ this }, blink_on{ initial_substate_of{ blinking } }, blink_off{ substate_of{ blinking } }; public : struct turn_on_off final : public so_5::signal_t {}; blinking_led( context_t ctx ) : so_5::agent_t{ ctx } { this >>= off; off.just_switch_to< turn_on_off >( blinking ); blinking.just_switch_to< turn_on_off >( off ); blink_on .on_enter( []{ std::cout << "ON" << std::endl; } ) .on_exit( []{ std::cout << "off" << std::endl; } ) .time_limit( std::chrono::milliseconds{1250}, blink_off ); blink_off .time_limit( std::chrono::milliseconds{750}, blink_on ); } };
ããã«ã€ããŠã¯ãã§ã«
å¥ã®èšäºã§èª¬æããŠããŸãããç¹°ãè¿ãå¿
èŠã¯ãããŸããã
çŸåšãçŽäº€ç¶æ
ã®ãµããŒãã¯ãããŸããã ãããããã®äºå®ã«ã¯2ã€ã®èª¬æããããŸãã ãŸããç§ãã¡ã¯ãã®ãµããŒããããããšããŸããããå€ãã®å°é£ã«çŽé¢ããŸãããããããå
æããããšã¯ã³ã¹ããããããããããã«æãããŸããã ãããŠã第äºã«ã誰ããŸã çŽäº€ç¶æ
ãèŠæ±ããŠããŸããã å°ãããããããã®ãããã¯ã«æ»ããŸãã
ã©ã®ãããªåœ±é¿ããããŸãããïŒ
ããã¯éåžžã«æ·±å»ã§ãããšããæèŠããããŸãïŒãã¡ããã䞻芳çã§åèŠããããŸãïŒã çµå±ã®ãšããããµããžã§ã¯ãé åã§è€éãªæéç¶æ
ãã·ã³ã«çŽé¢ãããšããåé¿çãæ¢ãå§ããäœããåçŽåããäœãã«äœåãªåãè²»ããã®ã¯ãäžã€ã®ããšã§ãã ãŸããã¢ããªã±ãŒã·ã§ã³ãããªããžã§ã¯ããC ++ã³ãŒãã«ã»ãŒ1察1ã§ãããã³ã°ã§ããå Žåã¯ããŸã£ããå¥ã®åé¡ã§ãã
ããã«ãããšãã°ãç¶æ
ãžã®/ããã®å
¥å/åºåãã³ãã©ãŒã®åäœã«ãã£ãŠå°ãããã質åã«ãã£ãŠå€æããŠããã®æ©èœã䜿çšãããŸãã
mchainã®
ã©ãããïŒ
è峿·±ãç¶æ³ã§ããã ã¢ããªã±ãŒã·ã§ã³ã®äžéšã®ã¿ãSObjectizerã§èšè¿°ãããããã«ãSObjectizerããã䜿çšãããŸããã ã¢ããªã±ãŒã·ã§ã³ã®æ®ãã®ã³ãŒãã¯ãäžè¬çã«ã¯ã¢ã¯ã¿ãŒãšã¯é¢ä¿ãªããç¹ã«SObjectizerãšã¯é¢ä¿ãããŸããã ããšãã°ãSObjectizerãããã€ãã®ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ã«äœ¿çšãããã¡ã€ã³äœæ¥ãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ã¹ã¬ããã§å®è¡ãããGUIã¢ããªã±ãŒã·ã§ã³ã
ãããŠããã®ãããªå ŽåãéSObjectizeréšåããSObjectizeréšåãŸã§ãæ
å ±ã®éä¿¡ã¯åçŽã§ããããšãããããŸãããéåžžã®éä¿¡é¢æ°ãåŒã³åºãã ãã§ååã§ãã ããããå察æ¹åãžã®æ
å ±ã®åºããã¯ããã»ã©åçŽã§ã¯ãããŸããã ããã¯è¯ããªãããã§ãã¢ããªã±ãŒã·ã§ã³ã®SObjectizerããŒããšéSObjectizerããŒãã®éã«ãããã«äœ¿ãã䟿å©ãªéä¿¡ãã£ãã«ãããã¯ãã§ãã
äœã«ãªã£ãã®ïŒ
ãã®ãããã¡ãã»ãŒãžãã§ãŒã³ããŸãã¯ãã銎æã¿ã®ãã衚èšã§ã¯ãmObjectãSObjectizerã«ç»å ŽããŸããã
Mchainã¯ãéåžžã®éä¿¡æ©èœã«ãã£ãŠã¡ãã»ãŒãžãéä¿¡ãããã·ã³ã°ã«ã³ã³ã·ã¥ãŒãã¡ãŒã«ããã¯ã¹ã®ç¹å®ã®ããŒãžã§ã³ã§ãã ãã ããmchainããã¡ãã»ãŒãžãæœåºããããã«ããšãŒãžã§ã³ããäœæããŠçœ²åããå¿
èŠã¯ãããŸããã ãšãŒãžã§ã³ãå
ã§ããšãŒãžã§ã³ãå€ã§ãåŒã³åºãããšãã§ãã2ã€ã®ç¹å¥ãªé¢æ°ããããŸãïŒreceiveïŒïŒããã³selectïŒïŒã 1ã€ç®ã¯1ã€ã®ãã£ãã«ããã®ã¿ã¡ãã»ãŒãžãèªã¿åãã2ã€ç®ã¯äžåºŠã«è€æ°ã®ãã£ãã«ããã¡ãã»ãŒãžãèªã¿åãããšãã§ããŸãã
using namespace so_5; mchain_t ch1 = env.create_mchain(...); mchain_t ch2 = env.create_mchain(...); select( from_all().handle_n(3).empty_timeout(200ms), case_(ch1, [](mhood_t<first_message_type> msg) { ... }, [](mhood_t<second_message_type> msg) { ... }), case_(ch2, [](mhood_t<third_message_type> msg ) { ... }, [](mhood_t<some_signal_type>){...}, ... ));
ãã§ã«ããã§äœåºŠãmchainã«ã€ããŠè©±ããŸããïŒ
2017幎8æãš
2018幎5æ ã ãããã£ãŠãç¹ã«mchainsã§ã®äœæ¥ãã©ã®ããã«èŠããããšãããããã¯ã«ã€ããŠã¯ãããã§ã¯è©³ãã説æããŸããã
ã©ã®ãããªåœ±é¿ããããŸãããïŒ
SObjectizer-5.5ã§mchainsãç»å ŽããåŸãå®éã«ã¯ãSObjectizerã¯ä»¥åããããã¢ã¯ã¿ãŒããã¬ãŒã ã¯ãŒã¯ã§ã¯ãªããªã£ãããšã倿ããŸããã SObjectizerã¯ãActor ModelãšPub / Subã®ãµããŒãã«å ããŠãCSPïŒé 次ããã»ã¹ã®éä¿¡ïŒã¢ãã«ã®ãµããŒãã远å ããŸããã Mchainsã䜿çšãããšãã¢ã¯ã¿ãŒããŸã£ãã䜿çšããã«ãSObjectizerã§ããªãè€éãªãã«ãã¹ã¬ããã¢ããªã±ãŒã·ã§ã³ãéçºã§ããŸãã ãŸããäžéšã®ã¿ã¹ã¯ã§ã¯ããã¯äŸ¿å©ã§ãã ç§ãã¡èªèº«ãæã
䜿çšãããã®ã
ã¡ãã»ãŒãžå¶éã¡ã«ããºã
ã©ãããïŒ
Model of Actorsã®æãæ·±å»ãªæ¬ ç¹ã®1ã€ã¯ãéè² è·ã®çºçã®çŽ å ã§ãã éä¿¡åŽã®ã¢ã¯ã¿ãŒãåä¿¡åŽã®ã¢ã¯ã¿ãŒã«ã¡ãã»ãŒãžãéä¿¡ããç¶æ³ã¯ãåä¿¡åŽã®ã¢ã¯ã¿ãŒãã¡ãã»ãŒãžãåŠçã§ããé床ãããéãããŒã¹ã§èªåãèŠã€ããã®ã¯éåžžã«ç°¡åã§ãã
ååãšããŠãã¢ã¯ã¿ãŒãã¬ãŒã ã¯ãŒã¯ã§ã¡ãã»ãŒãžãéä¿¡ããããšã¯éããããã³ã°æäœã§ãã ãããã£ãŠãã軜快ãªçç£è
ãšãªã¿ã¯æ¶è²»è
ãã®ãã¢ãçºçãããšãå°ãªããšãäœããã®çš®é¡ã®ç©ºãã¡ã¢ãªãååšããéãåä¿¡è
ã®ã¢ã¯ã¿ãŒã®ãã¥ãŒãå¢å ããŸãã
ãã®åé¡ã®äž»ãªé£ç¹ã¯ãé©çšãããã¿ã¹ã¯ãšå¯Ÿè±¡é åã®ç¹æ§ã«å¯ŸããŠãéè² è·ã«å¯Ÿããä¿è·ã®åªããã¡ã«ããºã ã匷åããå¿
èŠãããããšã§ãã ããšãã°ãã©ã®ã¡ãã»ãŒãžãè€è£œã§ããããçè§£ããïŒãããã£ãŠãè€è£œãå®å
šã«ç Žæ£ã§ããïŒã ã©ã®ã¡ãã»ãŒãžãç Žæ£ã§ããªãããšãçè§£ããã 誰ãã©ã®ãããã®é¡ã§åè·ããããšãã§ãã誰ã¯ãŸã£ããèš±å¯ãããŸããã ç
ãã1ã€ã®é£ç¹ã¯ãåžžã«åªããé²åŸ¡ã¡ã«ããºã ãå¿
èŠãªããã§ã¯ãªãããšã§ãã æã«ã¯ãåå§çã§ããã广çã§ã¢ã¯ã»ã¹ãããããç®±ããåºããŠã䜿ãããããã®ãããã°ååã§ãã overload control , «» - .
?
, , SObjectizer-5.5 .. message limits. , , , . äŸïŒ
class worker : public so_5::agent_t { public: worker(context_t ctx) : so_5::agent_t{ ctx
.
?
, message limits -, SObjectizer, . , . , , .
message delivery tracing
?
SObjectizer-5 « ». ⊠, .
, . : mbox, (, , ). , , , .
, SObjectizer Run-Time , , SObjectizer-, . , .
?
SObjectizer-5.5 , , message delivery tracing ( msg_tracing).
.
, , msg_tracing , .
?
SObjectizer .
.
env_infrastructure env_infrastructures
?
SObjectizer . SObjectizer-5 , .
SObjectizer- SObjectizer- . SObjectizer- ( , ).
ã€ãŸã SObjectizer . .
, SObjectizer- « » , , . , , , , .
: SObjectizer - ?
?
, .
, , . .
, environment infrastructure ( env_infrastructure ). Env_infrastructure SObjectizer-. , , , .
SObjectizer- env_infrastructures. SObjectizer , , .
.
?
, , â . SObjectizer . SObjectizer
. ! , SObjectizer- . .
run-time
?
SObjectizer-5 . , , , , ..
, 24/7. , / .
, , , SObjectizer .
?
SObjectizer-5.5 run-time SObjectizer- . run-time , , mbox , , , , ( , , ).
, . , - ( ).
?
run-time . , , . ( ) , [].
« », , , . ãªããªã « » . . , run-time ⊠.
-
SObjectizer-5.5 , , , . . , - .
SObjectizer-5.5 CMake.
SObjectizer-5 , .
SObjectizer-5.5 Android (
CrystaX NDK , Android NDK).
. , .
delivery filters. MPMC-mbox- , .
: introduce_coop/introduce_child_coop, make_agent/make_agent_with_binder .
lock- lock- ( mutex-, spinlock-, - ).
wrapped_env_t SObjectizer so_5::launch().
stop_guard- SObjectizer-. , SObjectizer- - .
, , (.. dead_letter_handlers).
«». - .
5.5.0 5.5.23
//. cloc SObjectizer-5.5.0:
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C/C++ Header 58 2119 5156 5762
C++ 39 1167 779 4759
Ruby 2 30 2 75
-------------------------------------------------------------------------------
SUM: 99 3316 5937 10596
-------------------------------------------------------------------------------
, v.5.5.23 ( 1147 â optional-lite):
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C/C++ Header 133 6279 22173 21068
C++ 53 2498 2760 10398
CMake 2 29 0 177
Ruby 4 53 2 129
-------------------------------------------------------------------------------
SUM: 192 8859 24935 31772
-------------------------------------------------------------------------------
v.5.5.0:
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C++ 84 2510 390 11540
Ruby 162 496 0 1054
C/C++ Header 1 11 0 32
-------------------------------------------------------------------------------
SUM: 247 3017 390 12626
-------------------------------------------------------------------------------
v.5.5.23:
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C++ 324 7345 1305 35231
Ruby 675 2353 0 4671
CMake 338 43 0 955
C/C++ Header 11 107 3 448
-------------------------------------------------------------------------------
SUM: 1348 9848 1308 41305
v.5.5.0:
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C++ 27 765 463 3322
Ruby 28 95 0 192
-------------------------------------------------------------------------------
SUM: 55 860 463 3514
, v.5.5.23:
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C++ 67 2141 2061 9341
Ruby 133 451 0 868
CMake 67 93 0 595
C/C++ Header 1 12 11 32
-------------------------------------------------------------------------------
SUM: 268 2697 2072 10836
.
SObjectizer-, , .
( )
SObjectizer- 5.5.23
. . , 5.6.0, 2019- , SObjectizer-. , 2019- SObjectizer 5.6 - .
, SO-5.5 , SO-5.6 , SO-5.7.
5.7, - SO-5.5 SO-5.6, 2019- . , , 2020- .
ãããã«
, SObjectizer- . , SObjectizer-. .
, SObjectizer- : . , .
- SObjectizer â . . , , .