ä¿¡é Œæ§ãéèŠããããã°ã©ãã³ã°èšèªãšããŠäž»åŒµãããŠããŸãã
ã¢ã«ãã¡ãããé -Active OberonãAdaãBetterCãIEC 61131-3 STãSafe-Cã
ããã«å 責äºé ïŒèšãèš³ïŒã¯æ±ºããŠããã¹ãŠãå·ŠåŽãã®ãã£ã³ããŒã³ã§ã¯ãªããã¬ãã¥ãŒã¯åŠè¡çãªãã®ã§ããå¯èœæ§ãé«ãã§ãã
äžæ¹ãåé¡ã®èšèªã«ã¯ãªãŒãã³ãœãŒã¹ã®ã³ã³ãã€ã©ããããçŸåšã®ã¬ãã«ã®ãœãããŠã§ã¢éçºã§ã¯-èå³æ·±ãããšã«ãããŸãè€éã§ãªãæ§æã䜿çšããŠå人çšã³ã³ãã€ã©ãäœæããããã¯ã©ã€ããšããŒãµãŒã䜿çšããŠäœããã®Eclipseã«çµ±åã§ããŸãã
èšèªã®æå¿«ãã®ææšãšããŠãé£äºã®å²åŠè ã«é¢ãããã€ã¯ã¹ãã©ã®æåãªãã«ãã¹ã¬ããã¿ã¹ã¯ã®å®è£ ãéžæããŸããã å®è£ ã¯èšèªãšãã©ãŒã©ã ã®æç§æžã«ããããããç§ã®ä»äºãä¿é²ããŸãã-é©å¿ããããã ãã«æ®ã£ãŠããŸãã ããšãã°ãæè¿ã®C ++ã«é¢ããhabrã®æè¿ã®èšäºã«ã¯ãæ¯èŒã®ããã«C ++ 17ã®å®è£ ãå«ãŸããŠããŸãã
ã¢ã¯ãã£ããªããã³ïŒ2004ïŒ
PascalãModulaã1988幎以éã®ä»¥åã®OberonsãJavaãCïŒãAdaã®çµéšãããã³ã¢ããªã±ãŒã·ã§ã³ã®å®éã®çµéšã念é ã«çœ®ããŠäœæãããŸããã OS A2ã®åœ¢åŒã®å®è£ ãããã* nixãŸãã¯Windowsäžã§ã©ã³ã¿ã€ã ãšããŠæ©èœã§ããŸãã ãœãŒã¹A2ããã³ãªã³ã¯ã®ã³ã³ãã€ã© ã
Oberonç°å¢ã«é¢é£ä»ããããŠããªãOberon2 to Cã³ã³ãã€ã©ïŒOOCïŒãããžã§ã¯ãããããŸãã ããã¯ãããã«ç°ãªãæ¹èšã§ãããéãã以äžã«èª¬æããŸãã
Oberonã®äž»èŠãªæ©èœã¯ãä»æ§ã®äŸå€çãªç°¡æœãã§ãã ãããã¯ãããŒã¹Oberon-2ã®16ããŒãžã«å ããŠããã«ãã¹ã¬ããActiveæ¡åŒµã®23ããŒãžã§ãã
æçœãªãšã©ãŒãæé€ããã·ã³ãã«ã§æ確ãªæ§æã
èå¥åã¯å€§æåãšå°æåãåºå¥ãããŸãã
ã¬ããŒãžã³ã¬ã¯ã¿ãŒïŒGCïŒã䜿çšããããŒãäžã®ãªããžã§ã¯ãã®OOPã
Instance.MethodïŒä»¥åã¯ã¡ãœããïŒã€ã³ã¹ã¿ã³ã¹ïŒã§ããïŒã®åœ¢åŒã®ãã銎æã¿ã®ããOOPæ§æãšãåæããªããã£ãã䜿çšãããã«ãã¹ã¬ããã®ãµããŒãããå身ãšã¯ç°ãªããŸãã
OOPå®è£ ã«ã¯åçãã£ã¹ãããã¯ãããŸãããããã¯ç¶æ³ãç°¡åã«åŒãèµ·ããå¯èœæ§ããããŸããæ°ããã¿ã€ãã®åŠçãè¿œå ããã®ãå¿ããŠããŸããã
ã¹ããªãŒã ã«ã¯ãGCã«ãã£ãŠäžæãããªãåªå 床ãšé«/ãªã¢ã«ã¿ã€ã ãå²ãåœãŠãããšãã§ããŸãã UTF-8é åã®åœ¢åŒã®æååã
RantimeïŒOberon SystemïŒã¯ãã©ã³ã¿ã€ã ãšã©ãŒïŒã¡ã¢ãªã¢ãã¬ã¹æå®ããŸãã¯æŽæ°ãªãŒããŒãããŒãªã©ïŒãçºçããå Žåã«ã倱æããããã·ãŒãžã£/ã¢ãžã¥ãŒã«/ã¹ã¬ãããåèµ·åããèå³æ·±ãæ©äŒãæäŸããŸãã
æ¬ ç¹ã¯ãRAIIã®æ¬ åŠãšäŸ¿å©ãªãšã©ãŒåŠçã§ãããã¹ãŠä»¥äžã®ãªãã·ã§ã³ãé€ãããªã¿ãŒã³ã³ãŒãã䜿çšããŸãã
Oberon-2 OOC
Oberonã¯OSãå¿ èŠãšããªããããå®éšã«äŸ¿å©ã§ããANSICã§ã³ã³ãã€ã«ãããçžäºéçšæ§ã®åé¡ã¯ãããŸããã ã¢ã¯ãã£ãããŒãžã§ã³ãšã®éã-çµã¿èŸŒã¿ã®ãã«ãã¹ã¬ããèšèªã¯ãããŸãã-代ããã«ãPThreadsãæäœããããã®ã¢ãžã¥ãŒã«ããããŸãããUTF16ãéå±€ã¢ãžã¥ãŒã«ãããã³äŸå€ãæäœããããã®ã·ã¹ãã ã¢ãžã¥ãŒã«ããããŸãã
ã¢ãžã¥ãŒã«3
ãŸããModula-3ã®åœ¢åŒã®ãããã«ç°ãªãéçºãã©ã³ãã®èŠªrelativeãããŸãã éå°ã«éçºããããšã€ããšã¯å¯Ÿç §çã«ããªããã³ã«åºã¥ããŠäœæãããŸããã å®è£ ã¯ãã¡ãã§ãã
Active Oberonãšæ¯èŒããŠããžã§ããªãã¯ãšäŸå€ãè¿œå ãããUnicodeãGUIãããã«ã¯Postgressã§ã®å®çšçãªäœæ¥ã®ããã®ã©ã€ãã©ãªããããŸãã Cãšã®çµ±åã®ç°¡çŽ åãä»ã®ãã«ãã¹ã¬ããã»ãã³ãã£ã¯ã¹ã RAII as WITHïŒCïŒã§ã®äœ¿çšãšåæ§ïŒã
ããããModula 3ã®éçºã¯2010幎ã«åæ¢ããããã§ãã
å 責äºé WinAOSãèµ·åãããšãããã«TRAPïŒå¥åabort / stacktraceãŸãã¯runtime errorïŒã«ééããŸãã-ã¿ã¹ã¯ãããŒãžã£ãŒã§ãããšã©ãŒã§åäœããã·ã¹ãã /ã©ã³ã¿ã€ã ã¯ã¯ã©ãã·ã¥ããŸããã§ããããã¢ããªã±ãŒã·ã§ã³ã ãã§ããããä¿¡é Œæ§ã¯èšèªã«ãã£ãŠæ±ºå®ããããšããçãããããŸããããã°ã©ãã³ã°=ïŒ
ãŸããAOCã¯ç¬èªã®éçºã¢ãããŒãã«ãããããªãèªå·±å®çµããŠããŸãã
é£äºå²åŠè
ã®æ
å ±æº
MODULE Philo; (* Dining Philosophers Example from Active Oberon Language Report by Patrik Reali *) (* Adapted for running in AOS by Siemargl *) IMPORT Semaphores := Example8, Out; CONST NofPhilo = 5; (* number of philosophers *) VAR fork: ARRAY NofPhilo OF Semaphores.Semaphore; i: LONGINT; TYPE Philosopher = OBJECT VAR first, second: LONGINT; (* forks used by this philosopher *) PROCEDURE & Init(id: LONGINT); BEGIN IF id # NofPhilo-1 THEN first := id; second := (id+1) ELSE first := 0; second := NofPhilo-1 END END Init; PROCEDURE Think; (* Need lock console output *) BEGIN {EXCLUSIVE} Out.Int(first); Out.String(".... Think...."); Out.Ln; END Think; PROCEDURE Eat; BEGIN {EXCLUSIVE} Out.Int(first); Out.String(".... Eat...."); Out.Ln; END Eat; BEGIN {ACTIVE} LOOP Think; fork[first].P; fork[second].P; Eat; fork[first].V; fork[second].V END END Philosopher; VAR philo: ARRAY NofPhilo OF Philosopher; BEGIN FOR i := 0 TO NofPhilo DO NEW(fork[i], INTEGER(i)); NEW(philo[i], i); END; END Philo. Philo.Philo1 ~
AdaïŒ1980ãæåŸã®æå¹ãª2016幎æšæºïŒ
å®éãäžèŠãããšç§ãæããã¹ãŠã®ãã®ããããŸãã
ããã«ããå°ã-æ£ç¢ºãªæµ®åå°æ°ç¹èšç®ã®æ°å€ããããŸãã ããšãã°ããªã¢ã«ã¿ã€ã ã¹ã¬ããã¹ã±ãžã¥ãŒã©ãã¯ãã¹ã¹ã¬ãã亀æãããã³æ£åŒã«æ€èšŒãããSPARKèšèªã®ãµãã»ããããããŸãã ãã®ä»ã
ãšã€ãã®ä¿¡é Œæ§ã«ãšãŠã€ããªãè§ã®ãããã®ãå¿ èŠã ãšããããé£ããç¶æ³ã§é»è©±ããããããã®æ瀺ãæ·»ä»ãããŠãããšæããŸã=ïŒ
å®è£ -GNUTaya Adaã¯éçºäžã§ããISO/ IECã«ãã£ãŠæšæºåãããŠããŸãã
ãã®æšæºã¯GCã«ããå®è£ ãæäŸããŸãããã³ã³ãã€ã«ããããªãã·ã§ã³ã®å Žåãå®è£ ãããªãããšããããããŸãã æåã®ã¡ã¢ãªç®¡çãå¿ èŠã§ã-ãããŠãããã°ã©ããŒã®ãšã©ãŒãçºçããå¯èœæ§ããããŸãã ãã ãããã®èšèªã¯ããã©ã«ãã¹ã¿ãã¯ã®äœ¿çšã察象ãšããŠããããã¹ãã©ã¯ã¿ãæã€ãããŒãžåã®æŠå¿µããããŸãã GCå®è£ ãèªåãªãªãŒã¹ããŸãã¯åããŒã¿åã®åç §ã«ãŠã³ããå®çŸ©ããããšãã§ããŸãã
Adaãªãã¡ã¬ã³ã¹ããã¥ã¢ã«2012ã«ã¯950ããŒãžãå«ãŸããŠããŸãã
Adaã®äžå©ãªç¹ã¯ãè€éãã®ã»ãã«ãé床ã®åé·æ§ã§ãããã ããèªã¿ãããã®ããã«èããããŸããã èšèªã»ãã¥ãªãã£ã¢ãã«ã®ç¹ç°æ§ã«ãããå€éšã©ã€ãã©ãªãšã®çµ±åã¯å°é£ã§ãã
Ada-ruãµã€ãã«ã¯ãè¯ãã¬ãã¥ãŒç¿»èš³èšäºããããŸã-æåã®ãªã³ã¯ã
é£äºå²åŠè
ã®æ
å ±æº
-- Code from https://rosettacode.org/wiki/Dining_philosophers#Ordered_mutexes -- ADA95 compatible so can run in ideone.com with Ada.Numerics.Float_Random; use Ada.Numerics.Float_Random; with Ada.Text_IO; use Ada.Text_IO; procedure Test_Dining_Philosophers is type Philosopher is (Aristotle, Kant, Spinoza, Marx, Russel); protected type Fork is entry Grab; procedure Put_Down; private Seized : Boolean := False; end Fork; protected body Fork is entry Grab when not Seized is begin Seized := True; end Grab; procedure Put_Down is begin Seized := False; end Put_Down; end Fork; Life_Span : constant := 20; -- In his life a philosopher eats 20 times task type Person (ID : Philosopher; First, Second : not null access Fork); task body Person is Dice : Generator; begin Reset (Dice); for Life_Cycle in 1..Life_Span loop Put_Line (Philosopher'Image (ID) & " is thinking"); delay Duration (Random (Dice) * 0.100); Put_Line (Philosopher'Image (ID) & " is hungry"); First.Grab; Second.Grab; Put_Line (Philosopher'Image (ID) & " is eating"); delay Duration (Random (Dice) * 0.100); Second.Put_Down; First.Put_Down; end loop; Put_Line (Philosopher'Image (ID) & " is leaving"); end Person; Forks : array (1..5) of aliased Fork; -- Forks for hungry philosophers -- Start philosophers Ph_1 : Person (Aristotle, Forks (1)'Access, Forks (2)'Access); Ph_2 : Person (Kant, Forks (2)'Access, Forks (3)'Access); Ph_3 : Person (Spinoza, Forks (3)'Access, Forks (4)'Access); Ph_4 : Person (Marx, Forks (4)'Access, Forks (5)'Access); Ph_5 : Person (Russel, Forks (1)'Access, Forks (5)'Access); begin null; -- Nothing to do in the main task, just sit and behold end Test_Dining_Philosophers;
BetterCïŒdlangãµãã»ãã2017ããªãªãžãã«D-2001ãD 2.0-2007ïŒ
èæ ®ã®æãè¿ä»£çãªå®è£ ã èšèªã®å®å šãªèª¬æã¯éåžžã«é·ãã649ããŒãžã§ãã å ã®ãµã€ããåç §ããŠãã ãã ã
å®éã«ã¯ãããã¯Dèšèªã§ããã-betterCã¹ã€ããã«å¶éããããŸãã ãªããããªã®ãïŒ
æšæºã©ã€ãã©ãªDã¯Phobosã§ãããAlexandrescuã«ãã£ãŠéçºãããéåžžã«å·§åŠã§ãå®å šã«ãã³ãã¬ãŒãã«åºã¥ããŠããããšãå€æããŸããã ãã®ãããã¯ã®éµã¯ãPhobosãã¡ã¢ãªæ¶è²»ã«é¢ããŠå¶åŸ¡ã§ããªãããšã§ãã
BetterCã¢ãŒãã§å€±ãããæãéèŠãªããšã¯ããã«ãã¹ã¬ãããGCãæååãã¯ã©ã¹ïŒæ§é ãæ®ã-ãããã¯æ©èœçã«è¿ã-ã¹ã¿ãã¯äžã®ã¿ïŒããã³äŸå€ïŒRAIIãštry-finallyãæ®ãïŒã§ãã
ãã ããããã°ã©ã ã®äžéšãå®å šãªDã§èšè¿°ããéèŠãªéšåãD-BetterCã§èšè¿°ããããšã¯å¯èœã§ãã å±éºãªå¹æã®äœ¿çšãå¶åŸ¡ããã·ã¹ãã å±æ§é¢æ°ããããŸãïŒçŽç²ã«å®å šãª @nogcã
èšèªã®äœæè ããã®äœå¶ã®æ£åœå ã
ãããŠãçµããŸã -äœãåæãããäœãå©çšå¯èœãªãŸãŸã«ãªããŸãã
æååã¯Phobosã«å«ãŸããŠããŸã-BetterCã§æååã䜿çšããããšãããšãæååãã³ã³ãœãŒã«ãŸãã¯é£çµã«åºåãããªã©ã®åºæ¬æäœã§ãã³ãã¬ãŒãã®ã€ã³ã¹ã¿ã³ã¹åã®ãšã©ãŒãçºçããŸãã ãŸãããã«Dã¢ãŒãã§ã¯ãããŒãäžã®è¡ãäžå€ã§ããããããããã®è¡ãæäœãããšã¡ã¢ãªãä¹±éã«ãªããŸãã
ã³ã³ãã€ã©ã®ãã°ã«é¢ããèŠæ ã«äœåºŠãäŒããªããã°ãªããŸããã§ããã ãã ããC ++ãšè€éãã競ãèšèªã«ãšã£ãŠã¯é©ãããšã§ã¯ãããŸããã èšäºãæºåãããšãã«ã4ã€ã®ãšã©ãŒã«çŽé¢ããªããã°ãªããŸããã§ãããæ°ããã³ã³ãã€ã©ã§dlangideããã«ãããããšãããšãã«2ã€ãå²åŠè ã®åé¡ã移æ€ãããšãã«2ã€çºçããŸããïŒããšãã°ãbeginthreadexã䜿çšãããšã¯ã©ãã·ã¥ããŸãïŒã
ãã®ã¢ãŒãã¯ããæè¿ç»å Žããã°ããã§ãBetterCã¢ãŒãã®å¶éã«èµ·å ãããšã©ãŒã¯ãªã³ã¯æ®µéã§ãã§ã«åºãŠããŸãã å€ãã®å Žåãäºåã«èšèªã®ã©ã®æ©èœãæ£ç¢ºã«ããªãã³ã°ãããŠããããäºåã«ç¥ãå¿ èŠããããŸãã
é£äºå²åŠè
ã®æ
å ±æº
// compile dmd -betterC import core.sys.windows.windows; import core.stdc.stdio; import core.stdc.stdlib : rand; //import std.typecons; // -impossible ( //import std.string; - impossible extern (Windows) alias btex_fptr = void function(void*) /*nothrow*/; //extern (C) uintptr_t _beginthreadex(void*, uint, btex_fptr, void*, uint, uint*) nothrow; /* Dining Philosophers example for a habr.com * by Siemargl, 2019 * BetterC variant. Compile >dmd -betterC Philo_BetterC.d */ extern (C) uintptr_t _beginthread(btex_fptr, uint stack_size, void *arglist) nothrow; alias HANDLE uintptr_t; alias HANDLE Fork; const philocount = 5; const cycles = 20; HANDLE[philocount] forks; struct Philosopher { const(char)* name; Fork left, right; HANDLE lifethread; } Philosopher[philocount] philos; extern (Windows) void PhilosopherLifeCycle(void* data) nothrow { Philosopher* philo = cast(Philosopher*)data; for (int age = 0; age++ < cycles;) { printf("%s is thinking\n", philo.name); Sleep(rand() % 100); printf("%s is hungry\n", philo.name); WaitForSingleObject(philo.left, INFINITE); WaitForSingleObject(philo.right, INFINITE); printf("%s is eating\n", philo.name); Sleep(rand() % 100); ReleaseMutex(philo.right); ReleaseMutex(philo.left); } printf("%s is leaving\n", philo.name); } extern (C) int main() { version(Windows){} else { static assert(false, "OS not supported"); } philos[0] = Philosopher ("Aristotlet".ptr, forks[0], forks[1], null); philos[1] = Philosopher ("Kant".ptr, forks[1], forks[2], null); philos[2] = Philosopher ("Spinoza".ptr, forks[2], forks[3], null); philos[3] = Philosopher ("Marx".ptr, forks[3], forks[4], null); philos[4] = Philosopher ("Russel".ptr, forks[0], forks[4], null); foreach(ref f; forks) { f = CreateMutex(null, false, null); assert(f); } foreach(ref ph; philos) { ph.lifethread = _beginthread(&PhilosopherLifeCycle, 0, &ph); assert(ph.lifethread); } foreach(ref ph; philos) WaitForSingleObject(ph.lifethread, INFINITE); // Close thread and mutex handles for( auto i = 0; i < philocount; i++ ) { CloseHandle(philos[i].lifethread); CloseHandle(forks[i]); } return 0; }
æ¯èŒã®ããã«ããœãŒã¹ã¯ãã«Dã§ãã
ããŒããã«ã¯ãä»ã®èšèªã®ãªãã·ã§ã³ã衚瀺ãããŸãã
IEC 61131-3 STïŒ1993ãææ°ã®æšæº2013ïŒ
ãã€ã¯ãã³ã³ãããŒã©çšã®ããããªããã°ã©ãã³ã°èšèªã ãã®æšæºã«ã¯5ã€ã®ããã°ã©ãã³ã°ãªãã·ã§ã³ãå«ãŸããŠããŸãããããšãã°ã©ããŒããžãã¯ã§ã¢ããªã±ãŒã·ã§ã³ãäœæããã®ã¯ãŸã åéºã§ãã ãããã£ãŠã1ã€ã®ãªãã·ã§ã³-æ§é åããã¹ãã«çŠç¹ãåœãŠãŸãã
æšæºGOST R IEC 61131-3-2016ã®ããã¹ã-230ããŒãžã
PC / x86ãšARMã®å®è£ ããããåçšå®è£ ããããŸãããã®äžã§æãæåãªã®ã¯CODESYS ïŒå€ãã®å Žåãå¥ã®ååã§ãµãã©ã€ã»ã³ã¹ãããŸãïŒãšCçµç±ã§æŸéãããBeremizã§ã
Cãšçµ±åãããŠãããããå¿çšããã°ã©ãã³ã°ã«å¿ èŠãªã©ã€ãã©ãªãæ¥ç¶ããããšã¯éåžžã«å¯èœã§ãã äžæ¹ããã®åéã§ã¯ãããžãã¯ãåå¥ã«å転ããå¥ã®ããã°ã©ã ãŸãã¯ã·ã¹ãã ã®ããŒã¿ãµãŒããŒãšããŠã®ã¿æ©èœããããšãèªããããŠããŸã-ãªãã¬ãŒã¿ãŒãŸãã¯DBMSãšã®ã€ã³ã¿ãŒãã§ãŒã¹ã§ãããæ¢ã«äœãã«æžã蟌ãããšãã§ããŸã-ãªã¢ã«ã¿ã€ã èŠä»¶ãäžæçã§ãããããŸããäžè¬çã«...
ãŠãŒã¶ãŒããã°ã©ã ã®ãã«ãã¹ã¬ããããã°ã©ãã³ã°ã¯æ¯èŒçæè¿ç»å ŽããŸããããã€ã¯ãã³ã³ãããŒã©ãŒã§ã¯ãããã¯ä»¥åã¯å¿ èŠãããŸããã§ããã
åå€æã¯ã»ãšãã©æ瀺çã§ãïŒææ°ã®æšæºã§ã¯ç·©åãããŠããŸãïŒã ãã ãããªãŒããŒãããŒå¶åŸ¡ã¯å®è£ ã«äŸåããŸãã
æšæºã®ææ°çã§ã¯ãOOPãç»å ŽããŸããã ãšã©ãŒåŠçã¯ãã«ã¹ã¿ã å²ã蟌ã¿ãã³ãã©ãŒã«ãã£ãŠè¡ãããŸãã
ãŠãŒã¶ãŒã«ã¯åçãªã¡ã¢ãªå²ãåœãŠããªããšèšããŸãã ããã¯æŽå²çã«èµ·ãããŸãã-ãã€ã¯ãã³ã³ãããŒã©ãŒã«ãã£ãŠåŠçãããããŒã¿ã®éã¯åžžã«äžããåžžã«å¶éãããŸãã
ãœãŒã¹ïŒæªæ€èšŒïŒ
(* Dining Philosophers example for a habr.com * by Siemargl, 2019 * ISO61131 ST language variant. Must be specialized 4 ur PLC * ) CONFIGURATION PLC_1 VAR_GLOBAL Forks : USINT; Philo_1: Philosopher; (* Instance block - static vars *) Philo_2: Philosopher; Philo_3: Philosopher; Philo_4: Philosopher; Philo_5: Philosopher; END_VAR RESOURCE Station_1 ON CPU_1 TASK Task_1 (INTERVAL := T#100MS, PRIORITY := 1); TASK Task_2 (INTERVAL := T#100MS, PRIORITY := 1); TASK Task_3 (INTERVAL := T#100MS, PRIORITY := 1); TASK Task_4 (INTERVAL := T#100MS, PRIORITY := 1); TASK Task_5 (INTERVAL := T#100MS, PRIORITY := 1); PROGRAM Life_1 WITH Task_1: Philo_1(Name := 'Kant', 0, 1, Forks); PROGRAM Life2 WITH Task_2: Philo_2(Name := 'Aristotel', 1, 2, Forks); PROGRAM Life3 WITH Task_3: Philo_3(Name := 'Spinoza', 2, 3, Forks); PROGRAM Life4 WITH Task_4: Philo_4(Name := 'Marx', 3, 4, Forks); PROGRAM Life5 WITH Task_5: Philo_5(Name := 'Russel', 4, 0, Forks); END_RESOURCE END_CONFIGURATION FUNCTION_BLOCK Philosopher; USING SysCpuHandling.library; VAR_INPUT Name: STRING; Left: UINT; Right: UINT; END_VAR VAR_IN_OUT Forks: USINT; END_VAR VAR Thinking: BOOL := TRUE; (* States *) Hungry: BOOL; Eating: BOOL; HaveLeftFork: BOOL; TmThink: TON; TmEating: TON; END_VAR TmThink(In := Thinking; PT := T#3s); TmEating(In := Eating; PT := T#5s); IF Thinking THEN (* Just waiting Timer *) Thinking := NOT TmThink.Q; Hungry := TmThink.Q; ELSIF Hungry (* Try Atomic Lock Forks *) IF HaveLeftFork IF SysCpuTestAndSetBit(Address := Forks, Len := 1, iBit := Right, bSet := 1) = ERR_OK THEN Hungry := FALSE; Eating := TRUE; ELSE RETURN; END_IF ELSIF IF SysCpuTestAndSetBit(Address := Forks, Len := 1, iBit := Left, bSet := 1) = ERR_OK THEN HaveLeftFork := TRUE; ELSE RETURN; END_IF END_IF ELSIF Eating (* Waiting Timer, then lay forks *) IF TmEating.Q THEN Thinking := TRUE; Eating := FALSE; HaveLeftFork := FALSE; SysCpuTestAndSetBit(Address := Forks, Len := 1, iBit := Right, bSet := 0); SysCpuTestAndSetBit(Address := Forks, Len := 1, iBit := Left, bSet := 0); END_IF END_IF END_FUNCTION_BLOCK
Safe-CïŒ2011ïŒ
å±éºãªããããåãé€ããã¢ãžã¥ãŒã«æ§ãšãã«ãã¹ã¬ãããè¿œå ããå®éšCã ãããžã§ã¯ããµã€ã
çŽ103ããŒãžã®èª¬æã Cãšã®éãã匷調ãããšã ã»ãšãã©10çšåºŠã§ãã
é åãšãã€ã³ã¿ãŒã®æäœã¯ãäºéåç §ãã§ãã¯ãšãã³ã°ãªã³ã°ãªã³ã¯ãåãããèªååç §ã«ãŠã³ããåããå®å šãªåçã¡ã¢ãªã§ãã
æšæºã©ã€ãã©ãªã«ã¯ãGUIããã«ãã¹ã¬ããããããã¯ãŒã¯æ©èœïŒhttpãµãŒããŒãå«ãïŒçšã®æå°éã®æ©èœã»ããããããŸãã
ããã-ãã®å®è£ ã¯Windows x86å°çšã§ãã ã³ã³ãã€ã©ãšã©ã€ãã©ãªã®ã³ãŒãã¯éããŠããŸããã
å¥ã®ç 究ã¿ã¹ã¯ã®äžç°ãšããŠãIoTã»ã³ãµãŒããããŒã¿ãåéããWebãµãŒããŒã¬ã€ã¢ãŠããäœæããŸããã75Kbãšã°ãŒã¯ãã£ãã¢ãžã¥ãŒã«ãš<1 MBã®éšåã¡ã¢ãªã»ããã§ãã
é£äºå²åŠè
ã®æ
å ±æº
/* Dining Philosophers example for a habr.com * by Siemargl, 2019 * Safe-C variant. Compile >mk.exe philosafec.c */ from std use console, thread, random; enum philos (ushort) { Aristotle, Kant, Spinoza, Marx, Russell, }; const int cycles = 10; const ushort NUM = 5; uint lived = NUM; packed struct philosopher // 32-bit { philos name; byte left, right; } philosopher philo_body[NUM]; SHARED_OBJECT forks[NUM]; void philosopher_life(philosopher philo) { int age; for (age = 0; age++ < cycles; ) { printf("%s is thinking\n", philo.name'string); delay((uint)rnd(1, 100)); printf("%s is hungry\n", philo.name'string); enter_shared_object(ref forks[philo.left]); enter_shared_object(ref forks[philo.right]); printf("%s is eating\n", philo.name'string); delay((uint)rnd(1, 100)); leave_shared_object(ref forks[philo.right]); leave_shared_object(ref forks[philo.left]); } printf("%s is leaving\n", philo.name'string); InterlockedExchange(ref lived, lived-1); } void main() { philos i; assert philosopher'size == 4; philo_body[0] = {Aristotle, 0, 1}; philo_body[1] = {Kant, 1, 2}; philo_body[2] = {Spinoza, 2, 3}; philo_body[3] = {Marx, 3, 4}; philo_body[4] = {Russell, 0, 4}; for (i = philos'first; i <= philos'last; i++) { assert run philosopher_life(philo_body[(uint)i]) == 0; } while (lived > 0) sleep 0; // until all dies for (i = philos'first; i <= philos'last; i++) { destroy_shared_object(ref forks[(uint)i]); } }
æåŸã«-æ©èœèŠä»¶ãžã®æºæ ã®æŠèŠè¡š ã
ãã£ãšç§ã¯äœããèŠéããã誀解ããã®ã§ããããä¿®æ£ããŠãã ããã
githubã®èšäºã®ãœãŒã¹ ã