Mercurial > hg > Papers > 2021 > anatofuz-master
changeset 138:19715b2b8aea
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 08 Feb 2021 11:45:33 +0900 |
parents | c6247127e7f4 |
children | 2e4b5488f802 |
files | slide/index.html slide/index.md |
diffstat | 2 files changed, 479 insertions(+), 491 deletions(-) [+] |
line wrap: on
line diff
--- a/slide/index.html Mon Feb 08 11:02:28 2021 +0900 +++ b/slide/index.html Mon Feb 08 11:45:33 2021 +0900 @@ -8,7 +8,7 @@ * @auto-scaling true * @size 4:3 960px 720px */div#p>svg>foreignObject>section .octicon{display:inline-block;fill:currentColor;vertical-align:text-bottom}div#p>svg>foreignObject>section .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}div#p>svg>foreignObject>section .anchor:focus{outline:none}div#p>svg>foreignObject>section h1 .octicon-link,div#p>svg>foreignObject>section h2 .octicon-link,div#p>svg>foreignObject>section h3 .octicon-link,div#p>svg>foreignObject>section h4 .octicon-link,div#p>svg>foreignObject>section h5 .octicon-link,div#p>svg>foreignObject>section h6 .octicon-link{color:#1b1f23;vertical-align:middle;visibility:hidden}div#p>svg>foreignObject>section h1:hover .anchor,div#p>svg>foreignObject>section h2:hover .anchor,div#p>svg>foreignObject>section h3:hover .anchor,div#p>svg>foreignObject>section h4:hover .anchor,div#p>svg>foreignObject>section h5:hover .anchor,div#p>svg>foreignObject>section h6:hover .anchor{text-decoration:none}div#p>svg>foreignObject>section h1:hover .anchor .octicon-link,div#p>svg>foreignObject>section h2:hover .anchor .octicon-link,div#p>svg>foreignObject>section h3:hover .anchor .octicon-link,div#p>svg>foreignObject>section h4:hover .anchor .octicon-link,div#p>svg>foreignObject>section h5:hover .anchor .octicon-link,div#p>svg>foreignObject>section h6:hover .anchor .octicon-link{visibility:visible}div#p>svg>foreignObject>section h1:hover .anchor .octicon-link:before,div#p>svg>foreignObject>section h2:hover .anchor .octicon-link:before,div#p>svg>foreignObject>section h3:hover .anchor .octicon-link:before,div#p>svg>foreignObject>section h4:hover .anchor .octicon-link:before,div#p>svg>foreignObject>section h5:hover .anchor .octicon-link:before,div#p>svg>foreignObject>section h6:hover .anchor .octicon-link:before{width:16px;height:16px;content:" ";display:inline-block;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' aria-hidden='true'%3E%3Cpath fill-rule='evenodd' d='M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z'/%3E%3C/svg%3E")}div#p>svg>foreignObject>section{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;color:#24292e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;font-size:16px;line-height:1.5;word-wrap:break-word}div#p>svg>foreignObject>section{--marpit-root-font-size:16px}div#p>svg>foreignObject>section details{display:block}div#p>svg>foreignObject>section summary{display:list-item}div#p>svg>foreignObject>section a{background-color:initial}div#p>svg>foreignObject>section a:active,div#p>svg>foreignObject>section a:hover{outline-width:0}div#p>svg>foreignObject>section strong{font-weight:inherit;font-weight:bolder}div#p>svg>foreignObject>section h1{margin:.67em 0}div#p>svg>foreignObject>section img{border-style:none}div#p>svg>foreignObject>section code,div#p>svg>foreignObject>section kbd,div#p>svg>foreignObject>section pre{font-family:monospace,monospace;font-size:1em}div#p>svg>foreignObject>section hr{box-sizing:initial;overflow:visible}div#p>svg>foreignObject>section input{font:inherit;margin:0;overflow:visible}div#p>svg>foreignObject>section [type=checkbox]{padding:0}div#p>svg>foreignObject>section *,div#p>svg>foreignObject>section [type=checkbox]{box-sizing:border-box}div#p>svg>foreignObject>section input{font-family:inherit;font-size:inherit;line-height:inherit}div#p>svg>foreignObject>section a{color:#0366d6;text-decoration:none}div#p>svg>foreignObject>section a:hover{text-decoration:underline}div#p>svg>foreignObject>section strong{font-weight:600}div#p>svg>foreignObject>section hr{height:0;margin:15px 0;overflow:hidden;background:transparent;border-bottom:1px solid #dfe2e5}div#p>svg>foreignObject>section hr:after,div#p>svg>foreignObject>section hr:before{display:table;content:""}div#p>svg>foreignObject>section hr:after{clear:both}div#p>svg>foreignObject>section table{border-spacing:0;border-collapse:collapse}div#p>svg>foreignObject>section td,div#p>svg>foreignObject>section th{padding:0}div#p>svg>foreignObject>section details summary{cursor:pointer}div#p>svg>foreignObject>section h1,div#p>svg>foreignObject>section h2,div#p>svg>foreignObject>section h3,div#p>svg>foreignObject>section h4,div#p>svg>foreignObject>section h5,div#p>svg>foreignObject>section h6{margin-top:0;margin-bottom:0}div#p>svg>foreignObject>section h1{font-size:32px}div#p>svg>foreignObject>section h1,div#p>svg>foreignObject>section h2{font-weight:600}div#p>svg>foreignObject>section h2{font-size:24px}div#p>svg>foreignObject>section h3{font-size:20px}div#p>svg>foreignObject>section h3,div#p>svg>foreignObject>section h4{font-weight:600}div#p>svg>foreignObject>section h4{font-size:16px}div#p>svg>foreignObject>section h5{font-size:14px}div#p>svg>foreignObject>section h5,div#p>svg>foreignObject>section h6{font-weight:600}div#p>svg>foreignObject>section h6{font-size:12px}div#p>svg>foreignObject>section p{margin-top:0;margin-bottom:10px}div#p>svg>foreignObject>section blockquote{margin:0}div#p>svg>foreignObject>section ol,div#p>svg>foreignObject>section ul{padding-left:0;margin-top:0;margin-bottom:0}div#p>svg>foreignObject>section ol ol,div#p>svg>foreignObject>section ul ol{list-style-type:lower-roman}div#p>svg>foreignObject>section ol ol ol,div#p>svg>foreignObject>section ol ul ol,div#p>svg>foreignObject>section ul ol ol,div#p>svg>foreignObject>section ul ul ol{list-style-type:lower-alpha}div#p>svg>foreignObject>section dd{margin-left:0}div#p>svg>foreignObject>section code,div#p>svg>foreignObject>section pre{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:12px}div#p>svg>foreignObject>section pre{margin-top:0;margin-bottom:0}div#p>svg>foreignObject>section input::-webkit-inner-spin-button,div#p>svg>foreignObject>section input::-webkit-outer-spin-button{margin:0;-webkit-appearance:none;appearance:none}div#p>svg>foreignObject>section :checked+.radio-label{position:relative;z-index:1;border-color:#0366d6}div#p>svg>foreignObject>section .border{border:1px solid #e1e4e8!important}div#p>svg>foreignObject>section .border-0{border:0!important}div#p>svg>foreignObject>section .border-bottom{border-bottom:1px solid #e1e4e8!important}div#p>svg>foreignObject>section .rounded-1{border-radius:3px!important}div#p>svg>foreignObject>section .bg-white{background-color:#fff!important}div#p>svg>foreignObject>section .bg-gray-light{background-color:#fafbfc!important}div#p>svg>foreignObject>section .text-gray-light{color:#6a737d!important}div#p>svg>foreignObject>section .pl-3,div#p>svg>foreignObject>section .px-3{padding-left:16px!important}div#p>svg>foreignObject>section .px-3{padding-right:16px!important}div#p>svg>foreignObject>section .f6{font-size:12px!important}div#p>svg>foreignObject>section div#p>svg>foreignObject>section section.f6{--marpit-root-font-size:12px!important}div#p>svg>foreignObject>section .lh-condensed{line-height:1.25!important}div#p>svg>foreignObject>section .text-bold{font-weight:600!important}div#p>svg>foreignObject>section .pl-c{color:#6a737d}div#p>svg>foreignObject>section .pl-c1,div#p>svg>foreignObject>section .pl-s .pl-v{color:#005cc5}div#p>svg>foreignObject>section .pl-e,div#p>svg>foreignObject>section .pl-en{color:#6f42c1}div#p>svg>foreignObject>section .pl-s .pl-s1,div#p>svg>foreignObject>section .pl-smi{color:#24292e}div#p>svg>foreignObject>section .pl-ent{color:#22863a}div#p>svg>foreignObject>section .pl-k{color:#d73a49}div#p>svg>foreignObject>section .pl-pds,div#p>svg>foreignObject>section .pl-s,div#p>svg>foreignObject>section .pl-s .pl-pse .pl-s1,div#p>svg>foreignObject>section .pl-sr,div#p>svg>foreignObject>section .pl-sr .pl-cce,div#p>svg>foreignObject>section .pl-sr .pl-sra,div#p>svg>foreignObject>section .pl-sr .pl-sre{color:#032f62}div#p>svg>foreignObject>section .pl-smw,div#p>svg>foreignObject>section .pl-v{color:#e36209}div#p>svg>foreignObject>section .pl-bu{color:#b31d28}div#p>svg>foreignObject>section .pl-ii{color:#fafbfc;background-color:#b31d28}div#p>svg>foreignObject>section .pl-c2{color:#fafbfc;background-color:#d73a49}div#p>svg>foreignObject>section .pl-c2:before{content:"^M"}div#p>svg>foreignObject>section .pl-sr .pl-cce{font-weight:700;color:#22863a}div#p>svg>foreignObject>section .pl-ml{color:#735c0f}div#p>svg>foreignObject>section .pl-mh,div#p>svg>foreignObject>section .pl-mh .pl-en,div#p>svg>foreignObject>section .pl-ms{font-weight:700;color:#005cc5}div#p>svg>foreignObject>section .pl-mi{font-style:italic;color:#24292e}div#p>svg>foreignObject>section .pl-mb{font-weight:700;color:#24292e}div#p>svg>foreignObject>section .pl-md{color:#b31d28;background-color:#ffeef0}div#p>svg>foreignObject>section .pl-mi1{color:#22863a;background-color:#f0fff4}div#p>svg>foreignObject>section .pl-mc{color:#e36209;background-color:#ffebda}div#p>svg>foreignObject>section .pl-mi2{color:#f6f8fa;background-color:#005cc5}div#p>svg>foreignObject>section .pl-mdr{font-weight:700;color:#6f42c1}div#p>svg>foreignObject>section .pl-ba{color:#586069}div#p>svg>foreignObject>section .pl-sg{color:#959da5}div#p>svg>foreignObject>section .pl-corl{text-decoration:underline;color:#032f62}div#p>svg>foreignObject>section .mb-0{margin-bottom:0!important}div#p>svg>foreignObject>section .my-2{margin-bottom:8px!important;margin-top:8px!important}div#p>svg>foreignObject>section .pl-0{padding-left:0!important}div#p>svg>foreignObject>section .py-0{padding-top:0!important;padding-bottom:0!important}div#p>svg>foreignObject>section .pl-1{padding-left:4px!important}div#p>svg>foreignObject>section .pl-2{padding-left:8px!important}div#p>svg>foreignObject>section .py-2{padding-top:8px!important;padding-bottom:8px!important}div#p>svg>foreignObject>section .pl-3{padding-left:16px!important}div#p>svg>foreignObject>section .pl-4{padding-left:24px!important}div#p>svg>foreignObject>section .pl-5{padding-left:32px!important}div#p>svg>foreignObject>section .pl-6{padding-left:40px!important}div#p>svg>foreignObject>section .pl-7{padding-left:48px!important}div#p>svg>foreignObject>section .pl-8{padding-left:64px!important}div#p>svg>foreignObject>section .pl-9{padding-left:80px!important}div#p>svg>foreignObject>section .pl-10{padding-left:96px!important}div#p>svg>foreignObject>section .pl-11{padding-left:112px!important}div#p>svg>foreignObject>section .pl-12{padding-left:128px!important}div#p>svg>foreignObject>section hr{border-bottom-color:#eee}div#p>svg>foreignObject>section kbd{display:inline-block;padding:3px 5px;font:11px SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;line-height:10px;color:#444d56;vertical-align:middle;background-color:#fafbfc;border:1px solid #d1d5da;border-radius:3px;box-shadow:inset 0 -1px 0 #d1d5da}div#p>svg>foreignObject>section:after,div#p>svg>foreignObject>section:before{display:table - /* content:""; */}div#p>svg>foreignObject>section:after{clear:both}div#p>svg>foreignObject>section>:first-child{margin-top:0!important}div#p>svg>foreignObject>section>:last-child{margin-bottom:0!important}div#p>svg>foreignObject>section a:not([href]){color:inherit;text-decoration:none}div#p>svg>foreignObject>section blockquote,div#p>svg>foreignObject>section details,div#p>svg>foreignObject>section dl,div#p>svg>foreignObject>section ol,div#p>svg>foreignObject>section p,div#p>svg>foreignObject>section pre,div#p>svg>foreignObject>section table,div#p>svg>foreignObject>section ul{margin-top:0;margin-bottom:16px}div#p>svg>foreignObject>section hr{height:.25em;padding:0;margin:24px 0;background-color:#e1e4e8;border:0}div#p>svg>foreignObject>section blockquote{padding:0 1em;color:#6a737d;border-left:.25em solid #dfe2e5}div#p>svg>foreignObject>section blockquote>:first-child{margin-top:0}div#p>svg>foreignObject>section blockquote>:last-child{margin-bottom:0}div#p>svg>foreignObject>section h1,div#p>svg>foreignObject>section h2,div#p>svg>foreignObject>section h3,div#p>svg>foreignObject>section h4,div#p>svg>foreignObject>section h5,div#p>svg>foreignObject>section h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}div#p>svg>foreignObject>section h1{font-size:2em}div#p>svg>foreignObject>section h1,div#p>svg>foreignObject>section h2{padding-bottom:.3em;border-bottom:1px solid #eaecef}div#p>svg>foreignObject>section h2{font-size:1.5em}div#p>svg>foreignObject>section h3{font-size:1.25em}div#p>svg>foreignObject>section h4{font-size:1em}div#p>svg>foreignObject>section h5{font-size:.875em}div#p>svg>foreignObject>section h6{font-size:.85em;color:#6a737d}div#p>svg>foreignObject>section ol,div#p>svg>foreignObject>section ul{padding-left:2em}div#p>svg>foreignObject>section ol ol,div#p>svg>foreignObject>section ol ul,div#p>svg>foreignObject>section ul ol,div#p>svg>foreignObject>section ul ul{margin-top:0;margin-bottom:0}div#p>svg>foreignObject>section li{word-wrap:break-all}div#p>svg>foreignObject>section li>p{margin-top:16px}div#p>svg>foreignObject>section li+li{margin-top:.25em}div#p>svg>foreignObject>section dl{padding:0}div#p>svg>foreignObject>section dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:600}div#p>svg>foreignObject>section dl dd{padding:0 16px;margin-bottom:16px}div#p>svg>foreignObject>section table{display:block;width:100%;overflow:auto}div#p>svg>foreignObject>section table th{font-weight:600}div#p>svg>foreignObject>section table td,div#p>svg>foreignObject>section table th{padding:6px 13px;border:1px solid #dfe2e5}div#p>svg>foreignObject>section table tr{background-color:#fff;border-top:1px solid #c6cbd1}div#p>svg>foreignObject>section table tr:nth-child(2n){background-color:#f6f8fa}div#p>svg>foreignObject>section img{max-width:100%;box-sizing:initial;background-color:#fff}div#p>svg>foreignObject>section img[align=right]{padding-left:20px}div#p>svg>foreignObject>section img[align=left]{padding-right:20px}div#p>svg>foreignObject>section code{padding:.2em .4em;margin:0;font-size:85%;background-color:rgba(27,31,35,.05);border-radius:3px}div#p>svg>foreignObject>section pre{word-wrap:normal}div#p>svg>foreignObject>section pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}div#p>svg>foreignObject>section .highlight{margin-bottom:16px}div#p>svg>foreignObject>section .highlight pre{margin-bottom:0;word-break:normal}div#p>svg>foreignObject>section pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f6f8fa;border-radius:3px}div#p>svg>foreignObject>section pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:initial;border:0}div#p>svg>foreignObject>section .commit-tease-sha{display:inline-block;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:90%;color:#444d56}div#p>svg>foreignObject>section div#p>svg>foreignObject>section section.commit-tease-sha{--marpit-root-font-size:90%}div#p>svg>foreignObject>section .full-commit .btn-outline:not(:disabled):hover{color:#005cc5;border-color:#005cc5}div#p>svg>foreignObject>section .blob-wrapper{overflow-x:auto;overflow-y:hidden}div#p>svg>foreignObject>section .blob-wrapper-embedded{max-height:240px;overflow-y:auto}div#p>svg>foreignObject>section .blob-num{width:1%;min-width:50px;padding-right:10px;padding-left:10px;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:12px;line-height:20px;color:rgba(27,31,35,.3);text-align:right;white-space:nowrap;vertical-align:top;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div#p>svg>foreignObject>section div#p>svg>foreignObject>section section.blob-num{--marpit-root-font-size:12px}div#p>svg>foreignObject>section .blob-num:hover{color:rgba(27,31,35,.6)}div#p>svg>foreignObject>section .blob-num:before{content:attr(data-line-number)}div#p>svg>foreignObject>section .blob-code{position:relative;padding-right:10px;padding-left:10px;line-height:20px;vertical-align:top}div#p>svg>foreignObject>section .blob-code-inner{overflow:visible;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:12px;color:#24292e;word-wrap:normal;white-space:pre}div#p>svg>foreignObject>section div#p>svg>foreignObject>section section.blob-code-inner{--marpit-root-font-size:12px}div#p>svg>foreignObject>section .pl-token.active,div#p>svg>foreignObject>section .pl-token:hover{cursor:pointer;background:#ffea7f}div#p>svg>foreignObject>section .tab-size[data-tab-size="1"]{-moz-tab-size:1;-o-tab-size:1;tab-size:1}div#p>svg>foreignObject>section .tab-size[data-tab-size="2"]{-moz-tab-size:2;-o-tab-size:2;tab-size:2}div#p>svg>foreignObject>section .tab-size[data-tab-size="3"]{-moz-tab-size:3;-o-tab-size:3;tab-size:3}div#p>svg>foreignObject>section .tab-size[data-tab-size="4"]{-moz-tab-size:4;-o-tab-size:4;tab-size:4}div#p>svg>foreignObject>section .tab-size[data-tab-size="5"]{-moz-tab-size:5;-o-tab-size:5;tab-size:5}div#p>svg>foreignObject>section .tab-size[data-tab-size="6"]{-moz-tab-size:6;-o-tab-size:6;tab-size:6}div#p>svg>foreignObject>section .tab-size[data-tab-size="7"]{-moz-tab-size:7;-o-tab-size:7;tab-size:7}div#p>svg>foreignObject>section .tab-size[data-tab-size="8"]{-moz-tab-size:8;-o-tab-size:8;tab-size:8}div#p>svg>foreignObject>section .tab-size[data-tab-size="9"]{-moz-tab-size:9;-o-tab-size:9;tab-size:9}div#p>svg>foreignObject>section .tab-size[data-tab-size="10"]{-moz-tab-size:10;-o-tab-size:10;tab-size:10}div#p>svg>foreignObject>section .tab-size[data-tab-size="11"]{-moz-tab-size:11;-o-tab-size:11;tab-size:11}div#p>svg>foreignObject>section .tab-size[data-tab-size="12"]{-moz-tab-size:12;-o-tab-size:12;tab-size:12}div#p>svg>foreignObject>section .task-list-item{list-style-type:none}div#p>svg>foreignObject>section .task-list-item+.task-list-item{margin-top:3px}div#p>svg>foreignObject>section .task-list-item input{margin:0 .2em .25em -1.6em;vertical-align:middle}div#p>svg>foreignObject>section .hljs{display:block;background:#fff;padding:.5em;color:#333;overflow-x:auto}div#p>svg>foreignObject>section .hljs-comment,div#p>svg>foreignObject>section .hljs-meta{color:#969896}div#p>svg>foreignObject>section .hljs-emphasis,div#p>svg>foreignObject>section .hljs-quote,div#p>svg>foreignObject>section .hljs-strong,div#p>svg>foreignObject>section .hljs-template-variable,div#p>svg>foreignObject>section .hljs-variable{color:#df5000}div#p>svg>foreignObject>section .hljs-keyword,div#p>svg>foreignObject>section .hljs-selector-tag,div#p>svg>foreignObject>section .hljs-type{color:#d73a49}div#p>svg>foreignObject>section .hljs-attribute,div#p>svg>foreignObject>section .hljs-bullet,div#p>svg>foreignObject>section .hljs-literal,div#p>svg>foreignObject>section .hljs-symbol{color:#0086b3}div#p>svg>foreignObject>section .hljs-name,div#p>svg>foreignObject>section .hljs-section{color:#63a35c}div#p>svg>foreignObject>section .hljs-tag{color:#333}div#p>svg>foreignObject>section .hljs-attr,div#p>svg>foreignObject>section .hljs-selector-attr,div#p>svg>foreignObject>section .hljs-selector-class,div#p>svg>foreignObject>section .hljs-selector-id,div#p>svg>foreignObject>section .hljs-selector-pseudo,div#p>svg>foreignObject>section .hljs-title{color:#6f42c1}div#p>svg>foreignObject>section .hljs-addition{color:#55a532;background-color:#eaffea}div#p>svg>foreignObject>section .hljs-deletion{color:#bd2c00;background-color:#ffecec}div#p>svg>foreignObject>section .hljs-link{text-decoration:underline}div#p>svg>foreignObject>section .hljs-number{color:#005cc5}div#p>svg>foreignObject>section .hljs-string{color:#032f62}div#p>svg>foreignObject>section svg[data-marp-fitting=svg]{max-height:563px}div#p>svg>foreignObject>section h1{color:#246;font-size:1.6em}div#p>svg>foreignObject>section h1,div#p>svg>foreignObject>section h2{border-bottom:none}div#p>svg>foreignObject>section h2{font-size:1.3em}div#p>svg>foreignObject>section h3{font-size:1.1em}div#p>svg>foreignObject>section h4{font-size:1.05em}div#p>svg>foreignObject>section h5{font-size:1em}div#p>svg>foreignObject>section h6{font-size:.9em}div#p>svg>foreignObject>section h1 strong,div#p>svg>foreignObject>section h2 strong,div#p>svg>foreignObject>section h3 strong,div#p>svg>foreignObject>section h4 strong,div#p>svg>foreignObject>section h5 strong,div#p>svg>foreignObject>section h6 strong{font-weight:inherit;color:#48c}div#p>svg>foreignObject>section hr{height:0;padding-top:.25em}div#p>svg>foreignObject>section pre{border:1px solid #999;line-height:1.15;overflow:visible}div#p>svg>foreignObject>section pre code svg[data-marp-fitting=svg]{max-height:529px}div#p>svg>foreignObject>section footer,div#p>svg>foreignObject>section header{margin:0;position:absolute;left:30px;color:hsla(0,0%,40%,.75);font-size:18px}div#p>svg>foreignObject>section header{top:21px}div#p>svg>foreignObject>section footer{bottom:21px}div#p>svg>foreignObject>section{align-items:stretch;background:#fff;display:flex;flex-direction:column;flex-wrap:nowrap;font-size:29px;height:720px;justify-content:center;padding:78.5px;width:1280px}div#p>svg>foreignObject>section{--marpit-root-font-size:29px}div#p>svg>foreignObject>section>:last-child,div#p>svg>foreignObject>section[data-footer]>:nth-last-child(2){margin-bottom:0}div#p>svg>foreignObject>section>:first-child,div#p>svg>foreignObject>section>header:first-child+*{margin-top:0}div#p>svg>foreignObject>section:after{position:absolute;padding:0;right:30px;bottom:21px;font-size:24px;color:#777}div#p>svg>foreignObject>section:after{--marpit-root-font-size:24px}div#p>svg>foreignObject>section.invert{background-color:#222;color:#e6eaf0}div#p>svg>foreignObject>section.invert:after{color:#999}div#p>svg>foreignObject>section.invert img{background-color:transparent}div#p>svg>foreignObject>section.invert a{color:#50b3ff}div#p>svg>foreignObject>section.invert h1{color:#a3c5e7}div#p>svg>foreignObject>section.invert h2,div#p>svg>foreignObject>section.invert h3,div#p>svg>foreignObject>section.invert h4,div#p>svg>foreignObject>section.invert h5{color:#ebeff5}div#p>svg>foreignObject>section.invert blockquote,div#p>svg>foreignObject>section.invert h6{border-color:#3d3f43;color:#939699}div#p>svg>foreignObject>section.invert h1 strong,div#p>svg>foreignObject>section.invert h2 strong,div#p>svg>foreignObject>section.invert h3 strong,div#p>svg>foreignObject>section.invert h4 strong,div#p>svg>foreignObject>section.invert h5 strong,div#p>svg>foreignObject>section.invert h6 strong{color:#7bf}div#p>svg>foreignObject>section.invert hr{background-color:#3d3f43}div#p>svg>foreignObject>section.invert footer,div#p>svg>foreignObject>section.invert header{color:hsla(0,0%,60%,.75)}div#p>svg>foreignObject>section.invert code,div#p>svg>foreignObject>section.invert kbd{background-color:#111}div#p>svg>foreignObject>section.invert kbd{border-color:#666;box-shadow:inset 0 -1px 0 #555;color:#e6eaf0}div#p>svg>foreignObject>section.invert table tr{background-color:#12181d;border-color:#60657b}div#p>svg>foreignObject>section.invert table tr:nth-child(2n){background-color:#1b2024}div#p>svg>foreignObject>section.invert table td,div#p>svg>foreignObject>section.invert table th{border-color:#5b5e61}div#p>svg>foreignObject>section.invert pre{background-color:#0a0e12;border-color:#777}div#p>svg>foreignObject>section.invert pre code{background-color:transparent}div#p>svg>foreignObject>section[data-color] h1,div#p>svg>foreignObject>section[data-color] h2,div#p>svg>foreignObject>section[data-color] h3,div#p>svg>foreignObject>section[data-color] h4,div#p>svg>foreignObject>section[data-color] h5,div#p>svg>foreignObject>section[data-color] h6{color:currentColor}div#p>svg>foreignObject>section[data-marpit-advanced-background=background]{display:block!important;padding:0!important}div#p>svg>foreignObject>section[data-marpit-advanced-background=background]:after,div#p>svg>foreignObject>section[data-marpit-advanced-background=background]:before,div#p>svg>foreignObject>section[data-marpit-advanced-background=content]:after,div#p>svg>foreignObject>section[data-marpit-advanced-background=content]:before{display:none!important}div#p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container]{all:initial;display:flex;flex-direction:row;height:100%;overflow:hidden;width:100%}div#p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container][data-marpit-advanced-background-direction=vertical]{flex-direction:column}div#p>svg>foreignObject>section[data-marpit-advanced-background=background][data-marpit-advanced-background-split]>div[data-marpit-advanced-background-container]{width:var(--marpit-advanced-background-split,50%)}div#p>svg>foreignObject>section[data-marpit-advanced-background=background][data-marpit-advanced-background-split=right]>div[data-marpit-advanced-background-container]{margin-left:calc(100% - var(--marpit-advanced-background-split, 50%))}div#p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container]>figure{all:initial;background-position:center;background-repeat:no-repeat;background-size:cover;flex:auto;margin:0}div#p>svg>foreignObject>section[data-marpit-advanced-background=content],div#p>svg>foreignObject>section[data-marpit-advanced-background=pseudo]{background:transparent!important}div#p>svg>foreignObject>section[data-marpit-advanced-background=pseudo],div#p>svg[data-marpit-svg]>foreignObject[data-marpit-advanced-background=pseudo]{pointer-events:none!important}div#p>svg>foreignObject>section[data-marpit-advanced-background-split]{width:100%;height:100%}</style></head><body><div class="bespoke-marp-osc"><button data-bespoke-marp-osc="prev" tabindex="-1" title="Previous slide">Previous slide</button><span data-bespoke-marp-osc="page"></span><button data-bespoke-marp-osc="next" tabindex="-1" title="Next slide">Next slide</button><button data-bespoke-marp-osc="fullscreen" tabindex="-1" title="Toggle fullscreen (f)">Toggle fullscreen</button><button data-bespoke-marp-osc="presenter" tabindex="-1" title="Open presenter view (p)">Open presenter view</button></div><div id="p"><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="1" data-paginate="true" data-marpit-pagination="1" data-marpit-pagination-total="63" style="--paginate:true;"> + /* content:""; */}div#p>svg>foreignObject>section:after{clear:both}div#p>svg>foreignObject>section>:first-child{margin-top:0!important}div#p>svg>foreignObject>section>:last-child{margin-bottom:0!important}div#p>svg>foreignObject>section a:not([href]){color:inherit;text-decoration:none}div#p>svg>foreignObject>section blockquote,div#p>svg>foreignObject>section details,div#p>svg>foreignObject>section dl,div#p>svg>foreignObject>section ol,div#p>svg>foreignObject>section p,div#p>svg>foreignObject>section pre,div#p>svg>foreignObject>section table,div#p>svg>foreignObject>section ul{margin-top:0;margin-bottom:16px}div#p>svg>foreignObject>section hr{height:.25em;padding:0;margin:24px 0;background-color:#e1e4e8;border:0}div#p>svg>foreignObject>section blockquote{padding:0 1em;color:#6a737d;border-left:.25em solid #dfe2e5}div#p>svg>foreignObject>section blockquote>:first-child{margin-top:0}div#p>svg>foreignObject>section blockquote>:last-child{margin-bottom:0}div#p>svg>foreignObject>section h1,div#p>svg>foreignObject>section h2,div#p>svg>foreignObject>section h3,div#p>svg>foreignObject>section h4,div#p>svg>foreignObject>section h5,div#p>svg>foreignObject>section h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}div#p>svg>foreignObject>section h1{font-size:2em}div#p>svg>foreignObject>section h1,div#p>svg>foreignObject>section h2{padding-bottom:.3em;border-bottom:1px solid #eaecef}div#p>svg>foreignObject>section h2{font-size:1.5em}div#p>svg>foreignObject>section h3{font-size:1.25em}div#p>svg>foreignObject>section h4{font-size:1em}div#p>svg>foreignObject>section h5{font-size:.875em}div#p>svg>foreignObject>section h6{font-size:.85em;color:#6a737d}div#p>svg>foreignObject>section ol,div#p>svg>foreignObject>section ul{padding-left:2em}div#p>svg>foreignObject>section ol ol,div#p>svg>foreignObject>section ol ul,div#p>svg>foreignObject>section ul ol,div#p>svg>foreignObject>section ul ul{margin-top:0;margin-bottom:0}div#p>svg>foreignObject>section li{word-wrap:break-all}div#p>svg>foreignObject>section li>p{margin-top:16px}div#p>svg>foreignObject>section li+li{margin-top:.25em}div#p>svg>foreignObject>section dl{padding:0}div#p>svg>foreignObject>section dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:600}div#p>svg>foreignObject>section dl dd{padding:0 16px;margin-bottom:16px}div#p>svg>foreignObject>section table{display:block;width:100%;overflow:auto}div#p>svg>foreignObject>section table th{font-weight:600}div#p>svg>foreignObject>section table td,div#p>svg>foreignObject>section table th{padding:6px 13px;border:1px solid #dfe2e5}div#p>svg>foreignObject>section table tr{background-color:#fff;border-top:1px solid #c6cbd1}div#p>svg>foreignObject>section table tr:nth-child(2n){background-color:#f6f8fa}div#p>svg>foreignObject>section img{max-width:100%;box-sizing:initial;background-color:#fff}div#p>svg>foreignObject>section img[align=right]{padding-left:20px}div#p>svg>foreignObject>section img[align=left]{padding-right:20px}div#p>svg>foreignObject>section code{padding:.2em .4em;margin:0;font-size:85%;background-color:rgba(27,31,35,.05);border-radius:3px}div#p>svg>foreignObject>section pre{word-wrap:normal}div#p>svg>foreignObject>section pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}div#p>svg>foreignObject>section .highlight{margin-bottom:16px}div#p>svg>foreignObject>section .highlight pre{margin-bottom:0;word-break:normal}div#p>svg>foreignObject>section pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f6f8fa;border-radius:3px}div#p>svg>foreignObject>section pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:initial;border:0}div#p>svg>foreignObject>section .commit-tease-sha{display:inline-block;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:90%;color:#444d56}div#p>svg>foreignObject>section div#p>svg>foreignObject>section section.commit-tease-sha{--marpit-root-font-size:90%}div#p>svg>foreignObject>section .full-commit .btn-outline:not(:disabled):hover{color:#005cc5;border-color:#005cc5}div#p>svg>foreignObject>section .blob-wrapper{overflow-x:auto;overflow-y:hidden}div#p>svg>foreignObject>section .blob-wrapper-embedded{max-height:240px;overflow-y:auto}div#p>svg>foreignObject>section .blob-num{width:1%;min-width:50px;padding-right:10px;padding-left:10px;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:12px;line-height:20px;color:rgba(27,31,35,.3);text-align:right;white-space:nowrap;vertical-align:top;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div#p>svg>foreignObject>section div#p>svg>foreignObject>section section.blob-num{--marpit-root-font-size:12px}div#p>svg>foreignObject>section .blob-num:hover{color:rgba(27,31,35,.6)}div#p>svg>foreignObject>section .blob-num:before{content:attr(data-line-number)}div#p>svg>foreignObject>section .blob-code{position:relative;padding-right:10px;padding-left:10px;line-height:20px;vertical-align:top}div#p>svg>foreignObject>section .blob-code-inner{overflow:visible;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:12px;color:#24292e;word-wrap:normal;white-space:pre}div#p>svg>foreignObject>section div#p>svg>foreignObject>section section.blob-code-inner{--marpit-root-font-size:12px}div#p>svg>foreignObject>section .pl-token.active,div#p>svg>foreignObject>section .pl-token:hover{cursor:pointer;background:#ffea7f}div#p>svg>foreignObject>section .tab-size[data-tab-size="1"]{-moz-tab-size:1;-o-tab-size:1;tab-size:1}div#p>svg>foreignObject>section .tab-size[data-tab-size="2"]{-moz-tab-size:2;-o-tab-size:2;tab-size:2}div#p>svg>foreignObject>section .tab-size[data-tab-size="3"]{-moz-tab-size:3;-o-tab-size:3;tab-size:3}div#p>svg>foreignObject>section .tab-size[data-tab-size="4"]{-moz-tab-size:4;-o-tab-size:4;tab-size:4}div#p>svg>foreignObject>section .tab-size[data-tab-size="5"]{-moz-tab-size:5;-o-tab-size:5;tab-size:5}div#p>svg>foreignObject>section .tab-size[data-tab-size="6"]{-moz-tab-size:6;-o-tab-size:6;tab-size:6}div#p>svg>foreignObject>section .tab-size[data-tab-size="7"]{-moz-tab-size:7;-o-tab-size:7;tab-size:7}div#p>svg>foreignObject>section .tab-size[data-tab-size="8"]{-moz-tab-size:8;-o-tab-size:8;tab-size:8}div#p>svg>foreignObject>section .tab-size[data-tab-size="9"]{-moz-tab-size:9;-o-tab-size:9;tab-size:9}div#p>svg>foreignObject>section .tab-size[data-tab-size="10"]{-moz-tab-size:10;-o-tab-size:10;tab-size:10}div#p>svg>foreignObject>section .tab-size[data-tab-size="11"]{-moz-tab-size:11;-o-tab-size:11;tab-size:11}div#p>svg>foreignObject>section .tab-size[data-tab-size="12"]{-moz-tab-size:12;-o-tab-size:12;tab-size:12}div#p>svg>foreignObject>section .task-list-item{list-style-type:none}div#p>svg>foreignObject>section .task-list-item+.task-list-item{margin-top:3px}div#p>svg>foreignObject>section .task-list-item input{margin:0 .2em .25em -1.6em;vertical-align:middle}div#p>svg>foreignObject>section .hljs{display:block;background:#fff;padding:.5em;color:#333;overflow-x:auto}div#p>svg>foreignObject>section .hljs-comment,div#p>svg>foreignObject>section .hljs-meta{color:#969896}div#p>svg>foreignObject>section .hljs-emphasis,div#p>svg>foreignObject>section .hljs-quote,div#p>svg>foreignObject>section .hljs-strong,div#p>svg>foreignObject>section .hljs-template-variable,div#p>svg>foreignObject>section .hljs-variable{color:#df5000}div#p>svg>foreignObject>section .hljs-keyword,div#p>svg>foreignObject>section .hljs-selector-tag,div#p>svg>foreignObject>section .hljs-type{color:#d73a49}div#p>svg>foreignObject>section .hljs-attribute,div#p>svg>foreignObject>section .hljs-bullet,div#p>svg>foreignObject>section .hljs-literal,div#p>svg>foreignObject>section .hljs-symbol{color:#0086b3}div#p>svg>foreignObject>section .hljs-name,div#p>svg>foreignObject>section .hljs-section{color:#63a35c}div#p>svg>foreignObject>section .hljs-tag{color:#333}div#p>svg>foreignObject>section .hljs-attr,div#p>svg>foreignObject>section .hljs-selector-attr,div#p>svg>foreignObject>section .hljs-selector-class,div#p>svg>foreignObject>section .hljs-selector-id,div#p>svg>foreignObject>section .hljs-selector-pseudo,div#p>svg>foreignObject>section .hljs-title{color:#6f42c1}div#p>svg>foreignObject>section .hljs-addition{color:#55a532;background-color:#eaffea}div#p>svg>foreignObject>section .hljs-deletion{color:#bd2c00;background-color:#ffecec}div#p>svg>foreignObject>section .hljs-link{text-decoration:underline}div#p>svg>foreignObject>section .hljs-number{color:#005cc5}div#p>svg>foreignObject>section .hljs-string{color:#032f62}div#p>svg>foreignObject>section svg[data-marp-fitting=svg]{max-height:563px}div#p>svg>foreignObject>section h1{color:#246;font-size:1.6em}div#p>svg>foreignObject>section h1,div#p>svg>foreignObject>section h2{border-bottom:none}div#p>svg>foreignObject>section h2{font-size:1.3em}div#p>svg>foreignObject>section h3{font-size:1.1em}div#p>svg>foreignObject>section h4{font-size:1.05em}div#p>svg>foreignObject>section h5{font-size:1em}div#p>svg>foreignObject>section h6{font-size:.9em}div#p>svg>foreignObject>section h1 strong,div#p>svg>foreignObject>section h2 strong,div#p>svg>foreignObject>section h3 strong,div#p>svg>foreignObject>section h4 strong,div#p>svg>foreignObject>section h5 strong,div#p>svg>foreignObject>section h6 strong{font-weight:inherit;color:#48c}div#p>svg>foreignObject>section hr{height:0;padding-top:.25em}div#p>svg>foreignObject>section pre{border:1px solid #999;line-height:1.15;overflow:visible}div#p>svg>foreignObject>section pre code svg[data-marp-fitting=svg]{max-height:529px}div#p>svg>foreignObject>section footer,div#p>svg>foreignObject>section header{margin:0;position:absolute;left:30px;color:hsla(0,0%,40%,.75);font-size:18px}div#p>svg>foreignObject>section header{top:21px}div#p>svg>foreignObject>section footer{bottom:21px}div#p>svg>foreignObject>section{align-items:stretch;background:#fff;display:flex;flex-direction:column;flex-wrap:nowrap;font-size:29px;height:720px;justify-content:center;padding:78.5px;width:1280px}div#p>svg>foreignObject>section{--marpit-root-font-size:29px}div#p>svg>foreignObject>section>:last-child,div#p>svg>foreignObject>section[data-footer]>:nth-last-child(2){margin-bottom:0}div#p>svg>foreignObject>section>:first-child,div#p>svg>foreignObject>section>header:first-child+*{margin-top:0}div#p>svg>foreignObject>section:after{position:absolute;padding:0;right:30px;bottom:21px;font-size:24px;color:#777}div#p>svg>foreignObject>section:after{--marpit-root-font-size:24px}div#p>svg>foreignObject>section.invert{background-color:#222;color:#e6eaf0}div#p>svg>foreignObject>section.invert:after{color:#999}div#p>svg>foreignObject>section.invert img{background-color:transparent}div#p>svg>foreignObject>section.invert a{color:#50b3ff}div#p>svg>foreignObject>section.invert h1{color:#a3c5e7}div#p>svg>foreignObject>section.invert h2,div#p>svg>foreignObject>section.invert h3,div#p>svg>foreignObject>section.invert h4,div#p>svg>foreignObject>section.invert h5{color:#ebeff5}div#p>svg>foreignObject>section.invert blockquote,div#p>svg>foreignObject>section.invert h6{border-color:#3d3f43;color:#939699}div#p>svg>foreignObject>section.invert h1 strong,div#p>svg>foreignObject>section.invert h2 strong,div#p>svg>foreignObject>section.invert h3 strong,div#p>svg>foreignObject>section.invert h4 strong,div#p>svg>foreignObject>section.invert h5 strong,div#p>svg>foreignObject>section.invert h6 strong{color:#7bf}div#p>svg>foreignObject>section.invert hr{background-color:#3d3f43}div#p>svg>foreignObject>section.invert footer,div#p>svg>foreignObject>section.invert header{color:hsla(0,0%,60%,.75)}div#p>svg>foreignObject>section.invert code,div#p>svg>foreignObject>section.invert kbd{background-color:#111}div#p>svg>foreignObject>section.invert kbd{border-color:#666;box-shadow:inset 0 -1px 0 #555;color:#e6eaf0}div#p>svg>foreignObject>section.invert table tr{background-color:#12181d;border-color:#60657b}div#p>svg>foreignObject>section.invert table tr:nth-child(2n){background-color:#1b2024}div#p>svg>foreignObject>section.invert table td,div#p>svg>foreignObject>section.invert table th{border-color:#5b5e61}div#p>svg>foreignObject>section.invert pre{background-color:#0a0e12;border-color:#777}div#p>svg>foreignObject>section.invert pre code{background-color:transparent}div#p>svg>foreignObject>section[data-color] h1,div#p>svg>foreignObject>section[data-color] h2,div#p>svg>foreignObject>section[data-color] h3,div#p>svg>foreignObject>section[data-color] h4,div#p>svg>foreignObject>section[data-color] h5,div#p>svg>foreignObject>section[data-color] h6{color:currentColor}div#p>svg>foreignObject>section[data-marpit-advanced-background=background]{display:block!important;padding:0!important}div#p>svg>foreignObject>section[data-marpit-advanced-background=background]:after,div#p>svg>foreignObject>section[data-marpit-advanced-background=background]:before,div#p>svg>foreignObject>section[data-marpit-advanced-background=content]:after,div#p>svg>foreignObject>section[data-marpit-advanced-background=content]:before{display:none!important}div#p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container]{all:initial;display:flex;flex-direction:row;height:100%;overflow:hidden;width:100%}div#p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container][data-marpit-advanced-background-direction=vertical]{flex-direction:column}div#p>svg>foreignObject>section[data-marpit-advanced-background=background][data-marpit-advanced-background-split]>div[data-marpit-advanced-background-container]{width:var(--marpit-advanced-background-split,50%)}div#p>svg>foreignObject>section[data-marpit-advanced-background=background][data-marpit-advanced-background-split=right]>div[data-marpit-advanced-background-container]{margin-left:calc(100% - var(--marpit-advanced-background-split, 50%))}div#p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container]>figure{all:initial;background-position:center;background-repeat:no-repeat;background-size:cover;flex:auto;margin:0}div#p>svg>foreignObject>section[data-marpit-advanced-background=content],div#p>svg>foreignObject>section[data-marpit-advanced-background=pseudo]{background:transparent!important}div#p>svg>foreignObject>section[data-marpit-advanced-background=pseudo],div#p>svg[data-marpit-svg]>foreignObject[data-marpit-advanced-background=pseudo]{pointer-events:none!important}div#p>svg>foreignObject>section[data-marpit-advanced-background-split]{width:100%;height:100%}</style></head><body><div class="bespoke-marp-osc"><button data-bespoke-marp-osc="prev" tabindex="-1" title="Previous slide">Previous slide</button><span data-bespoke-marp-osc="page"></span><button data-bespoke-marp-osc="next" tabindex="-1" title="Next slide">Next slide</button><button data-bespoke-marp-osc="fullscreen" tabindex="-1" title="Toggle fullscreen (f)">Toggle fullscreen</button><button data-bespoke-marp-osc="presenter" tabindex="-1" title="Open presenter view (p)">Open presenter view</button></div><div id="p"><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="1" data-paginate="true" data-marpit-pagination="1" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>GearsOSのメタ計算</h1> <ul> <li>清水 隆博 @@ -20,7 +20,7 @@ </li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="2" data-paginate="true" data-marpit-pagination="2" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="2" data-paginate="true" data-marpit-pagination="2" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>研究発表の構成</h1> <ul> <li>研究目的</li> @@ -34,7 +34,7 @@ </li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="3" data-paginate="true" data-marpit-pagination="3" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="3" data-paginate="true" data-marpit-pagination="3" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>研究目的</h1> <ul> <li>OSとアプリケーションの信頼性の保証したい</li> @@ -55,7 +55,7 @@ </li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="4" data-paginate="true" data-marpit-pagination="4" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="4" data-paginate="true" data-marpit-pagination="4" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>ノーマルレベルとメタレベルを用いた信頼性の向上</h1> <ul> <li>プログラムの実行部分は以下の2つからなる @@ -76,7 +76,7 @@ <li>メタレベルの計算として信頼性を保証する</li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="5" data-paginate="true" data-marpit-pagination="5" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="5" data-paginate="true" data-marpit-pagination="5" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>ノーマル、メタレベルの計算とGearsOS</h1> <ul> <li>ノーマル/メタレベルを一貫して記述できる言語にContinuation Based Cがある @@ -94,7 +94,7 @@ </li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="6" data-paginate="true" data-marpit-pagination="6" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="6" data-paginate="true" data-marpit-pagination="6" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>GearsOSのビルドシステム</h1> <ul> <li>CMakeとPerlを使ってビルドする @@ -111,7 +111,7 @@ </li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="7" data-paginate="true" data-marpit-pagination="7" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="7" data-paginate="true" data-marpit-pagination="7" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>GearsOSのビルドシステム</h1> <ul> <li>Perlスクリプトはファイルの変換・生成を行う @@ -127,7 +127,7 @@ </ul> <p><img src="./geasflow1.svg" alt="w:632 h:10cm" style="width:632px;height:10cm;" /></p> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="8" data-paginate="true" data-marpit-pagination="8" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="8" data-paginate="true" data-marpit-pagination="8" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>ノーマル、メタレベルの計算とGearsOS</h1> <ul> <li>トランスパイラで生成するメタレベルの計算をより拡張したい @@ -149,10 +149,10 @@ </ul> <p>まずGearsOSについて確認をしてから、新機能の解説を行う</p> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="9" data-paginate="true" data-marpit-pagination="9" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="9" data-paginate="true" data-marpit-pagination="9" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>ノーマルレベルから見たGearsOSの構成</h1> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="10" data-paginate="true" data-marpit-pagination="10" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="10" data-paginate="true" data-marpit-pagination="10" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>CodeGear</h1> <ul> <li>CbCで定義する軽量継続で表現する単位をCodeGearと呼ぶ @@ -165,7 +165,7 @@ <li><code>goto CodeGear()</code>でCodeGearに継続する</li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="11" data-paginate="true" data-marpit-pagination="11" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="11" data-paginate="true" data-marpit-pagination="11" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>DataGear</h1> <ul> <li>GearsOSで扱うデータの単位</li> @@ -174,7 +174,7 @@ <li>Cの構造体の形でメタレベルでは表現される</li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="12" data-paginate="true" data-marpit-pagination="12" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="12" data-paginate="true" data-marpit-pagination="12" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>ノーマルレベル/メタレベルのCodeGear</h1> <ul> <li>ノーマルレベルのCodeGearから見ると、直接別のCodeGearに継続している</li> @@ -186,7 +186,7 @@ </ul> <p><img src="./metacg.svg" alt="h:220 w:800" style="width:800px;height:220px;" /></p> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="13" data-paginate="true" data-marpit-pagination="13" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="13" data-paginate="true" data-marpit-pagination="13" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>ノーマルレベルでのGearsOSの実装</h1> <ul> <li>次に継続するCodeGearを引数で受け取れる @@ -206,7 +206,7 @@ } </span></span></foreignObject></svg></code></pre> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="14" data-paginate="true" data-marpit-pagination="14" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="14" data-paginate="true" data-marpit-pagination="14" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>ノーマルレベルでのGearsOSの実装</h1> <ul> <li>通常のプログラミング言語のように引数を受け取れる</li> @@ -222,7 +222,7 @@ } </span></span></foreignObject></svg></code></pre> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="15" data-paginate="true" data-marpit-pagination="15" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="15" data-paginate="true" data-marpit-pagination="15" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>Interface</h1> <ul> <li>GearsOSのモジュール化の仕組み</li> @@ -235,7 +235,7 @@ </li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="16" data-paginate="true" data-marpit-pagination="16" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="16" data-paginate="true" data-marpit-pagination="16" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>ノーマルレベルでのInterface(ノーマルレベル)</h1> <ul> <li>実装したいInterfaceのCodeGearの名前と引数を列挙する</li> @@ -253,7 +253,7 @@ } Stack; </span></span></foreignObject></svg></code></pre> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="17" data-paginate="true" data-marpit-pagination="17" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="17" data-paginate="true" data-marpit-pagination="17" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>Interfaceの実装(ノーマルレベル)</h1> <ul> <li>実装したいInterfaceで定義されたAPIを実装する @@ -276,7 +276,7 @@ } </span></span></foreignObject></svg></code></pre> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="18" data-paginate="true" data-marpit-pagination="18" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="18" data-paginate="true" data-marpit-pagination="18" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>InterfaceのAPI呼び出し(ノーマルレベル)</h1> <ul> <li><code>goto interfaceName->method()</code>のようにAPIを呼び出す</li> @@ -292,7 +292,7 @@ <span class="hljs-keyword">goto</span> stackTest->insertTest1(<span class="hljs-built_in">stack</span>, shutdown); </span></span></foreignObject></svg></code></pre> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="19" data-paginate="true" data-marpit-pagination="19" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="19" data-paginate="true" data-marpit-pagination="19" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>par goto</h1> <ul> <li>GearsOSの並行呼び出し構文</li> @@ -311,7 +311,7 @@ par <span class="hljs-keyword">goto</span> phils4->thinking(exit_code); </span></span></foreignObject></svg></code></pre> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="20" data-paginate="true" data-marpit-pagination="20" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="20" data-paginate="true" data-marpit-pagination="20" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>ノーマルレベルのまとめ</h1> <ul> <li><code>goto next</code>などで次の継続に飛ぶ @@ -328,14 +328,14 @@ <li><code>par goto</code>で並列実行</li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="21" data-paginate="true" data-marpit-pagination="21" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="21" data-paginate="true" data-marpit-pagination="21" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>GearsOSのメタレベルの計算とMetaDataGear</h1> <ul> <li>GearsOSのメタレベルの計算は、GearsOSの基本構造と関わりが深い</li> <li>GearsOSの基本構造はメタなCodeGear/DataGearで表現される</li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="22" data-paginate="true" data-marpit-pagination="22" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="22" data-paginate="true" data-marpit-pagination="22" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>MetaDataGear</h1> <ul> <li>ノーマルレベルのCodeGearの前後でMetaCodeGearが実行される @@ -346,14 +346,14 @@ </li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="23" data-paginate="true" data-marpit-pagination="23" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="23" data-paginate="true" data-marpit-pagination="23" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>GearsOSのシステム構成</h1> <ul> <li>MetaDataGearであるContext, TaskManager, Workerによって構成</li> </ul> <p><img src="./gears_structure.svg" alt="" /></p> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="24" data-paginate="true" data-marpit-pagination="24" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="24" data-paginate="true" data-marpit-pagination="24" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>Context</h1> <ul> <li>従来のOSのプロセスに相当するMetaDataGear</li> @@ -367,7 +367,7 @@ </li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="25" data-paginate="true" data-marpit-pagination="25" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="25" data-paginate="true" data-marpit-pagination="25" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>Context</h1> <ul> <li>GearsOSでcontextを触るのはメタ計算部分だけ @@ -380,7 +380,7 @@ <img src="./context.svg" alt="w:532 h:10cm" style="width:532px;height:10cm;" /></li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="26" data-paginate="true" data-marpit-pagination="26" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="26" data-paginate="true" data-marpit-pagination="26" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>メタレベルでのDataGearの管理</h1> <ul> <li>メタレベルではDataGearを纏めて管理する必要がある</li> @@ -408,7 +408,7 @@ } </span></span></foreignObject></svg></code></pre> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="27" data-paginate="true" data-marpit-pagination="27" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="27" data-paginate="true" data-marpit-pagination="27" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>union Dataの定義</h1> <ul> <li>union Data型はcontext.hに定義されている</li> @@ -432,7 +432,7 @@ </li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="28" data-paginate="true" data-marpit-pagination="28" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="28" data-paginate="true" data-marpit-pagination="28" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>メタレベルに変換されたGearsOSの実装</h1> <ul> <li> @@ -452,7 +452,7 @@ </li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="29" data-paginate="true" data-marpit-pagination="29" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="29" data-paginate="true" data-marpit-pagination="29" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>CodeGear、DataGearの番号</h1> <ul> <li>Perlで変換するとCodeGear/DataGear番号の形に抽象化される @@ -467,7 +467,7 @@ </li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="30" data-paginate="true" data-marpit-pagination="30" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="30" data-paginate="true" data-marpit-pagination="30" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>CodeGearの番号</h1> <ul> <li>ビルドするCbCファイルをPerlで解析し、<code>__code</code>を数え上げる @@ -493,7 +493,7 @@ }; </span></span></foreignObject></svg></code></pre> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="31" data-paginate="true" data-marpit-pagination="31" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="31" data-paginate="true" data-marpit-pagination="31" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>DataGearの番号</h1> <ul> <li>union Dataで定義されている構造体一覧からPerlで生成される @@ -513,7 +513,7 @@ }; </span></span></foreignObject></svg></code></pre> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="32" data-paginate="true" data-marpit-pagination="32" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="32" data-paginate="true" data-marpit-pagination="32" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>StubCodeGear</h1> <ul> <li>DataGearにアクセスするにはContextから番号を指定して行う</li> @@ -526,7 +526,7 @@ </ul> <p><img src="./contextContinuation.svg" alt="w:540 h:400" style="width:540px;height:400px;" /></p> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="33" data-paginate="true" data-marpit-pagination="33" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="33" data-paginate="true" data-marpit-pagination="33" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>ノーマルレベルのpopの確認</h1> <pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pop</span><span class="hljs-params">(struct SingleLinkedStack* <span class="hljs-built_in">stack</span>, __code next(<span class="hljs-keyword">union</span> Data* data, ...))</span> </span>{ <span class="hljs-keyword">if</span> (<span class="hljs-built_in">stack</span>->top) { @@ -539,7 +539,7 @@ } </span></span></foreignObject></svg></code></pre> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="34" data-paginate="true" data-marpit-pagination="34" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="34" data-paginate="true" data-marpit-pagination="34" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>メタレベルに変換されたGearsOSの実装</h1> <ul> <li>継続先は<code>goto meta</code>に変更されている @@ -567,7 +567,7 @@ } </span></span></foreignObject></svg></code></pre> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="35" data-paginate="true" data-marpit-pagination="35" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="35" data-paginate="true" data-marpit-pagination="35" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>popのStubCodeGear</h1> <ul> <li>CodeGearで必要なデータをContextから取り出す操作 @@ -585,80 +585,10 @@ } </span></span></foreignObject></svg></code></pre> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="36" data-paginate="true" data-marpit-pagination="36" data-marpit-pagination-total="63" style="--paginate:true;"> -<h1>メタに変換されたGearsOSの実装</h1> -<ul> -<li>直接checkAndSetに行かずにmetaに飛ぶ</li> -<li>もとのコードは<code>goto right_fork->checkAndSet()</code>なので、Interfaceを使った継続 -<ul> -<li>context内の継続先のInterfaceの引数格納用の配列に書き込まれる</li> -<li><code>right_fork->checkAndSet</code>には数値が入ってる</li> -</ul> -</li> -</ul> -<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pickup_rforkPhilsImpl</span><span class="hljs-params">(struct Context *context,struct PhilsImpl* phils, <span class="hljs-keyword">enum</span> Code next)</span> </span>{ - <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">AtomicT_int</span>* <span class="hljs-title">right_fork</span> =</span> phils->Rightfork; - Gearef(context, AtomicT_int)->atomicT_int = (<span class="hljs-keyword">union</span> Data*) right_fork; - Gearef(context, AtomicT_int)->oldData = <span class="hljs-number">-1</span>; - Gearef(context, AtomicT_int)->newData = phils->self; - Gearef(context, AtomicT_int)->next = C_pickup_lforkPhilsImpl; - (cGearefontext, AtomicT_int)->fail = C_pickup_rforkPhilsImpl; - <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">meta</span><span class="hljs-params">(context, right_fork->checkAndSet)</span></span>; -} -</span></span></foreignObject></svg></code></pre> -</section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="37" data-paginate="true" data-marpit-pagination="37" data-marpit-pagination-total="63" style="--paginate:true;"> -<h1>メタに変換されたGearsOSの実装</h1> -<ul> -<li>変換前</li> -</ul> -<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pickup_rfork</span><span class="hljs-params">(struct PhilsImpl* phils, __code next(...))</span> </span>{ - <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">AtomicT_int</span>* <span class="hljs-title">right_fork</span> =</span> phils->Rightfork; - <span class="hljs-keyword">goto</span> right_fork->checkAndSet(<span class="hljs-number">-1</span>, phils->self, pickup_lfork, pickup_rfork); -} -</span></span></foreignObject></svg></code></pre> -<ul> -<li>変換後</li> -</ul> -<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pickup_rforkPhilsImpl</span><span class="hljs-params">(struct Context *context,struct PhilsImpl* phils, <span class="hljs-keyword">enum</span> Code next)</span> </span>{ - <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">AtomicT_int</span>* <span class="hljs-title">right_fork</span> =</span> phils->Rightfork; - Gearef(context, AtomicT_int)->atomicT_int = (<span class="hljs-keyword">union</span> Data*) right_fork; - Gearef(context, AtomicT_int)->oldData = <span class="hljs-number">-1</span>; - Gearef(context, AtomicT_int)->newData = phils->self; - Gearef(context, AtomicT_int)->next = C_pickup_lforkPhilsImpl; - (cGearefontext, AtomicT_int)->fail = C_pickup_rforkPhilsImpl; - <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">meta</span><span class="hljs-params">(context, right_fork->checkAndSet)</span></span>; -} -</span></span></foreignObject></svg></code></pre> -</section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="38" data-paginate="true" data-marpit-pagination="38" data-marpit-pagination-total="63" style="--paginate:true;"> -<h1>データを取り出すStubCodeGear</h1> -<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pickup_rforkPhilsImpl_stub</span><span class="hljs-params">(struct Context* context)</span> </span>{ - PhilsImpl* phils = (PhilsImpl*)GearImpl(context, Phils, phils); - <span class="hljs-class"><span class="hljs-keyword">enum</span> <span class="hljs-title">Code</span> <span class="hljs-title">next</span> =</span> Gearef(context, Phils)->next; - <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">pickup_rforkPhilsImpl</span><span class="hljs-params">(context, phils, next)</span></span>; -} -</span></span></foreignObject></svg></code></pre> -</section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="39" data-paginate="true" data-marpit-pagination="39" data-marpit-pagination-total="63" style="--paginate:true;"> -<h1>GearsOSのビルドシステム</h1> -<ul> -<li>Perlスクリプトはファイルの変換・生成を行う -<ul> -<li>メタ計算の変換・自動生成も行う</li> -</ul> -</li> -<li>メタ計算で必要なファイル、データ構造も生成する -<ul> -<li>CodeGear/DataGearの番号など</li> -</ul> -</li> -</ul> -<p><img src="./geasflow1.svg" alt="w:632 h:10cm" style="width:632px;height:10cm;" /></p> -</section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="40" data-paginate="true" data-marpit-pagination="40" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="36" data-paginate="true" data-marpit-pagination="36" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>Perlトランスパイラが生成するファイル</h1> <ul> +<li>メタレベルの計算で使うファイルは、Perlトランスパイラが生成するのが多い</li> <li>context.hの中身をもとに生成するファイルが多い <ul> <li>このファイルで定義した内容をもとにメタレベルの計算をするので重要</li> @@ -712,7 +642,7 @@ </tbody> </table> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="41" data-paginate="true" data-marpit-pagination="41" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="37" data-paginate="true" data-marpit-pagination="37" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>GearsOSのメタレベルについてのまとめ</h1> <ul> <li>ノーマルレベルで書いたCodeGearにはContextの操作が付け加わる</li> @@ -730,7 +660,7 @@ </li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="42" data-paginate="true" data-marpit-pagination="42" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="38" data-paginate="true" data-marpit-pagination="38" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>Perlを中心としたフレームワークによるメタ計算の生成</h1> <ul> <li>GearsOSの例題を作製する場合も、コピペや手書きが多発していた @@ -751,7 +681,7 @@ </li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="43" data-paginate="true" data-marpit-pagination="43" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="39" data-paginate="true" data-marpit-pagination="39" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>主なGearsOSに導入された新機能</h1> <ul> <li>Interfaceシステムの強化</li> @@ -759,7 +689,7 @@ <li>MetaCodeGearの入れ替え機能の追加</li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="44" data-paginate="true" data-marpit-pagination="44" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="40" data-paginate="true" data-marpit-pagination="40" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>Interfaceシステムの強化</h1> <ul> <li>Interface構文の簡素化 @@ -783,103 +713,7 @@ </li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="45" data-paginate="true" data-marpit-pagination="45" data-marpit-pagination-total="63" style="--paginate:true;"> -<h1>手書きからの解放</h1> -<ul> -<li>Interfaceの雛形ファイルの作製スクリプトの導入</li> -<li>別のInterfaceからの出力を取得するStubの自動生成</li> -<li>実装のCodeGear名からメタ情報の切り離し -<ul> -<li>メタな型情報はビルド時に付与される</li> -</ul> -</li> -<li>DataGearの型集合ファイルであるcontext.hの自動生成</li> -<li>GearsOSの初期化ルーチンの自動生成</li> -</ul> -</section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="46" data-paginate="true" data-marpit-pagination="46" data-marpit-pagination-total="63" style="--paginate:true;"> -<h1>GearsOSの新機能</h1> -<ul> -<li><strong>自由なMetaCodeGearの作製、継続の入れ替え機能</strong></li> -<li>Perlトランスパイラの変換ルーチンのデバッグ機能の追加 -<ul> -<li>トランスパイラそのもののデバッグが困難であった</li> -</ul> -</li> -<li>ジェネリクスのサポート</li> -</ul> -</section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="47" data-paginate="true" data-marpit-pagination="47" data-marpit-pagination-total="63" style="--paginate:true;"> -<h1>Interfaceの改良</h1> -<ul> -<li>従来のInterfaceにまつわるPerlのフレームワークを改良した -<ul> -<li>CbCの変換後のコードでなく、Perlレベルでエラー検知可能になった</li> -</ul> -</li> -</ul> -</section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="48" data-paginate="true" data-marpit-pagination="48" data-marpit-pagination-total="63" style="--paginate:true;"> -<h1>Implementの型定義ファイルの導入</h1> -<ul> -<li>Interfaceは型定義ファイルがあったが、実装側はなかった</li> -<li>context.h上のunion Dataの定義に型定義を書いていた -<ul> -<li>メタな構造体に直した実装の型を手書き</li> -<li>型定義の一貫性がない(Intefaceはファイルが導入)</li> -<li>これはメタ情報なので手で書きたくない</li> -</ul> -</li> -<li>実装側にも型定義ファイルを導入して一貫性を持たせたい -<ul> -<li>PerlトランスパイラフレームワークでInterface/Implの定義ファイルを纏めて扱える</li> -</ul> -</li> -</ul> -</section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="49" data-paginate="true" data-marpit-pagination="49" data-marpit-pagination-total="63" style="--paginate:true;"> -<h1>Implementの型定義</h1> -<ul> -<li>基本はInterfaceと同じシンタックス -<ul> -<li>どのInterfaceを実装しているかを<code>Impl</code>の後ろに書く</li> -</ul> -</li> -<li>Implの場合はフィールド変数を定義できる</li> -<li><code>実装名.h</code>の命名規則 (<code>PhilsImp.h</code> )</li> -</ul> -<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-keyword">typedef</span> <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">PhilsImpl</span> <</span>> impl Phils { - <span class="hljs-keyword">int</span> self; - <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">AtomicT_int</span>* <span class="hljs-title">Leftfork</span>;</span> - <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">AtomicT_int</span>* <span class="hljs-title">Rightfork</span>;</span> - <span class="hljs-function">__code <span class="hljs-title">next</span><span class="hljs-params">(...)</span></span>; -} PhilsImpl; -</span></span></foreignObject></svg></code></pre> -</section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="50" data-paginate="true" data-marpit-pagination="50" data-marpit-pagination-total="63" style="--paginate:true;"> -<h1>Interfaceの実装時の型名の省略</h1> -<ul> -<li>APIのCodeGearには、トランスパイル時に具体的な型が名前につけられる</li> -</ul> -<h3>トランスパイル前</h3> -<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pickup_lfork</span><span class="hljs-params">(struct PhilsImpl* phils, __code next(...))</span> </span>{ - <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">AtomicT_int</span>* <span class="hljs-title">left_fork</span> =</span> phils->Leftfork; - <span class="hljs-keyword">goto</span> left_fork->checkAndSet(<span class="hljs-number">-1</span>, phils->self, pickup_rfork, eating); - -} -</span></span></foreignObject></svg></code></pre> -<h3>トランスパイル後</h3> -<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pickup_lforkPhilsImpl</span><span class="hljs-params">(struct Context *context,struct PhilsImpl* phils, <span class="hljs-keyword">enum</span> Code next)</span> </span>{ - <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">AtomicT_int</span>* <span class="hljs-title">left_fork</span> =</span> phils->Leftfork; - Gearef(context, AtomicT_int)->atomicT_int = (<span class="hljs-keyword">union</span> Data*) left_fork; - ... - Gearef(context, AtomicT_int)->next = C_pickup_rforkPhilsImpl; - Gearef(context, AtomicT_int)->fail = C_eatingPhilsImpl; - <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">meta</span><span class="hljs-params">(context, left_fork->checkAndSet)</span></span>; -} -</span></span></foreignObject></svg></code></pre> -</section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="51" data-paginate="true" data-marpit-pagination="51" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="41" data-paginate="true" data-marpit-pagination="41" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>PerlトランスパイラでのInterfaceのエラー生成</h1> <ul> <li>CbCコンパイラがコンパイルする前にトランスパイラで検知可能になった</li> @@ -900,7 +734,80 @@ make: *** [Makefile:293: DPP2] Error 2 </span></span></foreignObject></svg></code></pre> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="52" data-paginate="true" data-marpit-pagination="52" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="42" data-paginate="true" data-marpit-pagination="42" data-marpit-pagination-total="62" style="--paginate:true;"> +<h1>手書きからの解放</h1> +<ul> +<li>Interfaceの雛形ファイルの作製スクリプトの導入</li> +<li>別のInterfaceからの出力を取得するStubの自動生成</li> +<li>実装のCodeGear名からメタ情報の切り離し +<ul> +<li>メタな型情報はビルド時に付与される</li> +</ul> +</li> +<li>DataGearの型集合ファイルであるcontext.hの自動生成</li> +<li>GearsOSの初期化ルーチンの自動生成</li> +</ul> +</section> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="43" data-paginate="true" data-marpit-pagination="43" data-marpit-pagination-total="62" style="--paginate:true;"> +<h1>GearsOSの新機能</h1> +<ul> +<li><strong>自由なMetaCodeGearの作製、継続の入れ替え機能</strong></li> +<li>Perlトランスパイラの変換ルーチンのデバッグ機能の追加 +<ul> +<li>トランスパイラそのもののデバッグが困難であった</li> +</ul> +</li> +<li>ジェネリクスのサポート</li> +</ul> +</section> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="44" data-paginate="true" data-marpit-pagination="44" data-marpit-pagination-total="62" style="--paginate:true;"> +<h1>Interfaceの改良</h1> +<ul> +<li>従来のInterfaceにまつわるPerlのフレームワークを改良した +<ul> +<li>CbCの変換後のコードでなく、Perlレベルでエラー検知可能になった</li> +</ul> +</li> +</ul> +</section> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="45" data-paginate="true" data-marpit-pagination="45" data-marpit-pagination-total="62" style="--paginate:true;"> +<h1>Implementの型定義ファイルの導入</h1> +<ul> +<li>Interfaceは型定義ファイルがあったが、実装側はなかった</li> +<li>context.h上のunion Dataの定義に型定義を書いていた +<ul> +<li>メタな構造体に直した実装の型を手書き</li> +<li>型定義の一貫性がない(Intefaceはファイルが導入)</li> +<li>これはメタ情報なので手で書きたくない</li> +</ul> +</li> +<li>実装側にも型定義ファイルを導入して一貫性を持たせたい +<ul> +<li>PerlトランスパイラフレームワークでInterface/Implの定義ファイルを纏めて扱える</li> +</ul> +</li> +</ul> +</section> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="46" data-paginate="true" data-marpit-pagination="46" data-marpit-pagination-total="62" style="--paginate:true;"> +<h1>Implementの型定義</h1> +<ul> +<li>基本はInterfaceと同じシンタックス +<ul> +<li>どのInterfaceを実装しているかを<code>Impl</code>の後ろに書く</li> +</ul> +</li> +<li>Implの場合はフィールド変数を定義できる</li> +<li><code>実装名.h</code>の命名規則 (<code>PhilsImp.h</code> )</li> +</ul> +<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-keyword">typedef</span> <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">PhilsImpl</span> <</span>> impl Phils { + <span class="hljs-keyword">int</span> self; + <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">AtomicT_int</span>* <span class="hljs-title">Leftfork</span>;</span> + <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">AtomicT_int</span>* <span class="hljs-title">Rightfork</span>;</span> + <span class="hljs-function">__code <span class="hljs-title">next</span><span class="hljs-params">(...)</span></span>; +} PhilsImpl; +</span></span></foreignObject></svg></code></pre> +</section> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="47" data-paginate="true" data-marpit-pagination="47" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>手書きからの解放</h1> <ul> <li>従来はメタレベルの計算に関係する処理・ファイルを手書きするケースが多々あった @@ -911,7 +818,7 @@ </li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="53" data-paginate="true" data-marpit-pagination="53" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="48" data-paginate="true" data-marpit-pagination="48" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>今回の修論での変更点/追加点の一覧</h1> <table> <thead> @@ -933,6 +840,11 @@ <td>自動生成</td> </tr> <tr> +<td>context.h</td> +<td>手書き</td> +<td>自動生成</td> +</tr> +<tr> <td>実装のCodeGearの型名</td> <td>手書き</td> <td>自動生成</td> @@ -970,7 +882,7 @@ </tbody> </table> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="54" data-paginate="true" data-marpit-pagination="54" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="49" data-paginate="true" data-marpit-pagination="49" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>Context定義ファイルの自動生成</h1> <ul> <li>ContextはすべてのDataGearの型情報をunion Dataとして持つ必要がある @@ -986,117 +898,53 @@ <li>ビルド時に使用しているDataGearを回収し、 context.hを作製する</li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="55" data-paginate="true" data-marpit-pagination="55" data-marpit-pagination-total="63" style="--paginate:true;"> -<h1>出力があるIntefaceのAPIの問題</h1> -<h2>Stackから値を2つ取得するpop2 APIの定義の一部</h2> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="50" data-paginate="true" data-marpit-pagination="50" data-marpit-pagination-total="62" style="--paginate:true;"> +<h1>メタ計算の切り替えAPI</h1> <ul> -<li>値を2つとってくるのがGearsOSだと煩雑なので定義したAPI +<li>通常だとCodeGearの実行後、<code>goto meta</code>に継続するようにPerlで変換される <ul> -<li>継続先に値を2つ書き込む</li> +<li>継続するMetaCodeGearを自由に選択したい</li> </ul> </li> </ul> -<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pop2</span><span class="hljs-params">(struct SingleLinkedStack* <span class="hljs-built_in">stack</span>, __code next(<span class="hljs-keyword">union</span> Data* data, <span class="hljs-keyword">union</span> Data* data1, ...))</span> </span>{ - <span class="hljs-keyword">if</span> (<span class="hljs-built_in">stack</span>->top) { - data = <span class="hljs-built_in">stack</span>->top->data; - <span class="hljs-built_in">stack</span>->top = <span class="hljs-built_in">stack</span>->top->next; - } <span class="hljs-keyword">else</span> { - data = <span class="hljs-literal">NULL</span>; - } - <span class="hljs-keyword">if</span> (<span class="hljs-built_in">stack</span>->top) { - data1 = <span class="hljs-built_in">stack</span>->top->data; - <span class="hljs-built_in">stack</span>->top = <span class="hljs-built_in">stack</span>->top->next; - } <span class="hljs-keyword">else</span> { - data1 = <span class="hljs-literal">NULL</span>; - } - <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">next</span><span class="hljs-params">(data, data1, ...)</span></span>; +<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">thinkingPhilsImpl</span><span class="hljs-params">(struct Context *context,struct PhilsImpl* phils, + struct Fork* fork, <span class="hljs-keyword">enum</span> Code next)</span> </span>{ + <span class="hljs-built_in">printf</span>(<span class="hljs-string">"%d: thinking\n"</span>, phils->self); + <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">meta</span><span class="hljs-params">(context, C_pickup_lforkPhilsImpl)</span></span>; } </span></span></foreignObject></svg></code></pre> -</section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="56" data-paginate="true" data-marpit-pagination="56" data-marpit-pagination-total="63" style="--paginate:true;"> -<h2>pop2 APIの呼び出し</h2> <ul> -<li>pop2を呼び出して、Stackの中身を2つ<code>pop2Test1</code>で受け取る</li> +<li>例えばモデル検査用のMetaCodeGear(<code>mcMeta</code>)にgotoさせたい</li> </ul> -<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pop2Test</span><span class="hljs-params">(struct StackTestImpl3* stackTest, struct Stack* <span class="hljs-built_in">stack</span>, __code next(...))</span> </span>{ - <span class="hljs-keyword">goto</span> <span class="hljs-built_in">stack</span>->pop2(pop2Test1); -} -</span></span></foreignObject></svg></code></pre> -<h2>pop2 APIからデータの受け取り(ノーマルレベル)</h2> -<ul> -<li>Stackからデータを2つ受け取る継続</li> -</ul> -<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pop2Test1</span><span class="hljs-params">(struct StackTestImpl3* stackTest, <span class="hljs-keyword">union</span> Data* data, - <span class="hljs-keyword">union</span> Data* data1, struct Stack* <span class="hljs-built_in">stack</span>, __code next(...))</span> </span>{ - String* str = (String*)data; - String* str2 = (String*)data1; - - <span class="hljs-built_in">printf</span>(<span class="hljs-string">"%d\n"</span>, str->size); - <span class="hljs-built_in">printf</span>(<span class="hljs-string">"%d\n"</span>, str2->size); - <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">next</span><span class="hljs-params">(...)</span></span>; +<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">thinkingPhilsImpl</span><span class="hljs-params">(struct Context *context,struct PhilsImpl* phils, + struct Fork* fork, <span class="hljs-keyword">enum</span> Code next)</span> </span>{ + <span class="hljs-built_in">printf</span>(<span class="hljs-string">"%d: thinking\n"</span>, phils->self); + <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">mcMeta</span><span class="hljs-params">(context, C_pickup_lforkPhilsImpl)</span></span>; } </span></span></foreignObject></svg></code></pre> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="57" data-paginate="true" data-marpit-pagination="57" data-marpit-pagination-total="63" style="--paginate:true;"> -<h1>出力があるIntefaceのAPIの問題</h1> -<ul> -<li>従来は別のInterfaceからの出力を受け取るCodeGearのStubは手で書かないといけなかった +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="51" data-paginate="true" data-marpit-pagination="51" data-marpit-pagination-total="62" style="--paginate:true;"> +<h1><a href="http://mta.pm">mta.pm</a></h1> <ul> -<li>Contextにあるデータの場所がずれているので、StubCodeGearがデータをとってきてくれない +<li>CodeGearが継続するMetaCodeGearを自由に選択できるPerlモジュールを導入した</li> +<li>APIに沿ってPerlモジュールを書くことで特定のCodeGearの継続先を変更可能 <ul> -<li>Interfaceが値をとるContextの場所</li> -<li>Stackがdataを書き込むContextの場所</li> +<li>Perlトランスパイラがコード変換時に自動ロードして実行する<br /> +<img src="./metapm.svg" alt="w:932 h:10cm" style="width:932px;height:10cm;" /></li> </ul> </li> </ul> -</li> -<li>Perlトランスパイラで呼び出しているAPIのInterfaceを解析し、Contextの場所を明確に指定するStubCodeGearを自動で作製するようにした</li> -</ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="58" data-paginate="true" data-marpit-pagination="58" data-marpit-pagination-total="63" style="--paginate:true;"> -<h2>元のStub</h2> -<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pop2Test1StackTestImpl3_stub</span><span class="hljs-params">(struct Context* context)</span> </span>{ - StackTestImpl3* stackTest = (StackTestImpl3*)GearImpl(context, StackTest, stackTest); - Data* data = Gearef(context, StackTest)->data; - Data* data1 = Gearef(context, StackTest)->data1; - Stack* <span class="hljs-built_in">stack</span> = Gearef(context, StackTest)-><span class="hljs-built_in">stack</span>; - <span class="hljs-class"><span class="hljs-keyword">enum</span> <span class="hljs-title">Code</span> <span class="hljs-title">next</span> =</span> Gearef(context, StackTest)->next; - <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">pop2Test1StackTestImpl3</span><span class="hljs-params">(context, stackTest, data, data1, <span class="hljs-built_in">stack</span>, next)</span></span>; -} -</span></span></foreignObject></svg></code></pre> -<h2>自動生成したStub(従来は手書き)</h2> -<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pop2Test1StackTestImpl3_1_stub</span><span class="hljs-params">(struct Context* context)</span> </span>{ - StackTestImpl3* stackTest = (StackTestImpl3*)GearImpl(context, StackTest, stackTest); - Data* data = Gearef(context, Stack)->data; - Data* data1 = Gearef(context, Stack)->data1; - Stack* <span class="hljs-built_in">stack</span> = Gearef(context, StackTest)-><span class="hljs-built_in">stack</span>; - <span class="hljs-class"><span class="hljs-keyword">enum</span> <span class="hljs-title">Code</span> <span class="hljs-title">next</span> =</span> Gearef(context, StackTest)->next; - <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">pop2Test1StackTestImpl3</span><span class="hljs-params">(context, stackTest, data, data1, <span class="hljs-built_in">stack</span>, next)</span></span>; -} -</span></span></foreignObject></svg></code></pre> -</section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="59" data-paginate="true" data-marpit-pagination="59" data-marpit-pagination-total="63" style="--paginate:true;"> -<h1>メタ計算の切り替えAPI</h1> -<ul> -<li>CodeGearが継続するMetaCodeGearを自由に選択できるPerlモジュールを導入した -<ul> -<li>従来はデフォルトで設定されるMetaCodeGearにしか継続しなかった</li> -<li>Perlモジュールを書くことで特定のCodeGearの継続先を変更可能にした</li> -</ul> -</li> -<li>AspectJのポイントカットが類似機能<br /> -<img src="./metapm.svg" alt="w:932 h:10cm" style="width:932px;height:10cm;" /></li> -</ul> -</section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="60" data-paginate="true" data-marpit-pagination="60" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="52" data-paginate="true" data-marpit-pagination="52" data-marpit-pagination-total="62" style="--paginate:true;"> <h1><a href="http://meta.pm">meta.pm</a></h1> <ul> -<li><code>replaceMeta</code>関数に置換対象を登録 +<li><code>replaceMeta</code>関数に置換対象と生成する<code>goto</code>の組をリストで登録 <ul> <li><code>qr//</code>に正規表現リテラルで置換対象のCodeGearの名前を指定</li> <li><code>=></code>の先に対応するgoto文の生成関数を指定する</li> </ul> </li> +<li>この例では<code>PhilsImpl</code>が名前についているCodeGearが一括で<code>goto mcMeta</code>になる</li> </ul> <pre><code class="language-perl"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-keyword">package</span> meta; @@ -1112,28 +960,7 @@ } </span></span></foreignObject></svg></code></pre> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="61" data-paginate="true" data-marpit-pagination="61" data-marpit-pagination-total="63" style="--paginate:true;"> -<h1>Perlトランスパイルで生成されたメタ部分の比較</h1> -<h2>meta.pm導入前</h2> -<ul> -<li>通常の<code>goto meta</code></li> -</ul> -<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">thinkingPhilsImpl</span><span class="hljs-params">(struct Context *context,struct PhilsImpl* phils, struct Fork* fork, <span class="hljs-keyword">enum</span> Code next)</span> </span>{ - <span class="hljs-built_in">printf</span>(<span class="hljs-string">"%d: thinking\n"</span>, phils->self); - <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">meta</span><span class="hljs-params">(context, C_pickup_lforkPhilsImpl)</span></span>; -} -</span></span></foreignObject></svg></code></pre> -<h2>meta.pm導入後</h2> -<ul> -<li>モデル検査用のMetaCodeGear<code>mcMeta</code>に<code>goto</code>する</li> -</ul> -<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">thinkingPhilsImpl</span><span class="hljs-params">(struct Context *context,struct PhilsImpl* phils, struct Fork* fork, <span class="hljs-keyword">enum</span> Code next)</span> </span>{ - <span class="hljs-built_in">printf</span>(<span class="hljs-string">"%d: thinking\n"</span>, phils->self); - <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">mcMeta</span><span class="hljs-params">(context, C_pickup_lforkPhilsImpl)</span></span>; -} -</span></span></foreignObject></svg></code></pre> -</section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="62" data-paginate="true" data-marpit-pagination="62" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="53" data-paginate="true" data-marpit-pagination="53" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>今後の課題</h1> <ul> <li>Perlトランスパイラのリファクタリング・GearsOSのビルド方法の見直し @@ -1161,7 +988,7 @@ </li> </ul> </section> -</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="63" data-paginate="true" data-marpit-pagination="63" data-marpit-pagination-total="63" style="--paginate:true;"> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="54" data-paginate="true" data-marpit-pagination="54" data-marpit-pagination-total="62" style="--paginate:true;"> <h1>まとめ</h1> <ul> <li>Perlトランスパイラのフレームワークの機能を充実させた</li> @@ -1187,6 +1014,173 @@ </li> </ul> </section> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="55" data-paginate="true" data-marpit-pagination="55" data-marpit-pagination-total="62" style="--paginate:true;"> +<h1>出力があるIntefaceのAPIの問題</h1> +<h2>Stackから値を2つ取得するpop2 APIの定義の一部</h2> +<ul> +<li>値を2つとってくるのがGearsOSだと煩雑なので定義したAPI +<ul> +<li>継続先に値を2つ書き込む</li> +</ul> +</li> +</ul> +<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pop2</span><span class="hljs-params">(struct SingleLinkedStack* <span class="hljs-built_in">stack</span>, __code next(<span class="hljs-keyword">union</span> Data* data, <span class="hljs-keyword">union</span> Data* data1, ...))</span> </span>{ + <span class="hljs-keyword">if</span> (<span class="hljs-built_in">stack</span>->top) { + data = <span class="hljs-built_in">stack</span>->top->data; + <span class="hljs-built_in">stack</span>->top = <span class="hljs-built_in">stack</span>->top->next; + } <span class="hljs-keyword">else</span> { + data = <span class="hljs-literal">NULL</span>; + } + <span class="hljs-keyword">if</span> (<span class="hljs-built_in">stack</span>->top) { + data1 = <span class="hljs-built_in">stack</span>->top->data; + <span class="hljs-built_in">stack</span>->top = <span class="hljs-built_in">stack</span>->top->next; + } <span class="hljs-keyword">else</span> { + data1 = <span class="hljs-literal">NULL</span>; + } + <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">next</span><span class="hljs-params">(data, data1, ...)</span></span>; +} +</span></span></foreignObject></svg></code></pre> +</section> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="56" data-paginate="true" data-marpit-pagination="56" data-marpit-pagination-total="62" style="--paginate:true;"> +<h2>pop2 APIの呼び出し</h2> +<ul> +<li>pop2を呼び出して、Stackの中身を2つ<code>pop2Test1</code>で受け取る</li> +</ul> +<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pop2Test</span><span class="hljs-params">(struct StackTestImpl3* stackTest, struct Stack* <span class="hljs-built_in">stack</span>, __code next(...))</span> </span>{ + <span class="hljs-keyword">goto</span> <span class="hljs-built_in">stack</span>->pop2(pop2Test1); +} +</span></span></foreignObject></svg></code></pre> +<h2>pop2 APIからデータの受け取り(ノーマルレベル)</h2> +<ul> +<li>Stackからデータを2つ受け取る継続</li> +</ul> +<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pop2Test1</span><span class="hljs-params">(struct StackTestImpl3* stackTest, <span class="hljs-keyword">union</span> Data* data, + <span class="hljs-keyword">union</span> Data* data1, struct Stack* <span class="hljs-built_in">stack</span>, __code next(...))</span> </span>{ + String* str = (String*)data; + String* str2 = (String*)data1; + + <span class="hljs-built_in">printf</span>(<span class="hljs-string">"%d\n"</span>, str->size); + <span class="hljs-built_in">printf</span>(<span class="hljs-string">"%d\n"</span>, str2->size); + <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">next</span><span class="hljs-params">(...)</span></span>; +} +</span></span></foreignObject></svg></code></pre> +</section> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="57" data-paginate="true" data-marpit-pagination="57" data-marpit-pagination-total="62" style="--paginate:true;"> +<h1>出力があるIntefaceのAPIの問題</h1> +<ul> +<li>従来は別のInterfaceからの出力を受け取るCodeGearのStubは手で書かないといけなかった +<ul> +<li>Contextにあるデータの場所がずれているので、StubCodeGearがデータをとってきてくれない +<ul> +<li>Interfaceが値をとるContextの場所</li> +<li>Stackがdataを書き込むContextの場所</li> +</ul> +</li> +</ul> +</li> +<li>Perlトランスパイラで呼び出しているAPIのInterfaceを解析し、Contextの場所を明確に指定するStubCodeGearを自動で作製するようにした</li> +</ul> +</section> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="58" data-paginate="true" data-marpit-pagination="58" data-marpit-pagination-total="62" style="--paginate:true;"> +<h2>元のStub</h2> +<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pop2Test1StackTestImpl3_stub</span><span class="hljs-params">(struct Context* context)</span> </span>{ + StackTestImpl3* stackTest = (StackTestImpl3*)GearImpl(context, StackTest, stackTest); + Data* data = Gearef(context, StackTest)->data; + Data* data1 = Gearef(context, StackTest)->data1; + Stack* <span class="hljs-built_in">stack</span> = Gearef(context, StackTest)-><span class="hljs-built_in">stack</span>; + <span class="hljs-class"><span class="hljs-keyword">enum</span> <span class="hljs-title">Code</span> <span class="hljs-title">next</span> =</span> Gearef(context, StackTest)->next; + <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">pop2Test1StackTestImpl3</span><span class="hljs-params">(context, stackTest, data, data1, <span class="hljs-built_in">stack</span>, next)</span></span>; +} +</span></span></foreignObject></svg></code></pre> +<h2>自動生成したStub(従来は手書き)</h2> +<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pop2Test1StackTestImpl3_1_stub</span><span class="hljs-params">(struct Context* context)</span> </span>{ + StackTestImpl3* stackTest = (StackTestImpl3*)GearImpl(context, StackTest, stackTest); + Data* data = Gearef(context, Stack)->data; + Data* data1 = Gearef(context, Stack)->data1; + Stack* <span class="hljs-built_in">stack</span> = Gearef(context, StackTest)-><span class="hljs-built_in">stack</span>; + <span class="hljs-class"><span class="hljs-keyword">enum</span> <span class="hljs-title">Code</span> <span class="hljs-title">next</span> =</span> Gearef(context, StackTest)->next; + <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">pop2Test1StackTestImpl3</span><span class="hljs-params">(context, stackTest, data, data1, <span class="hljs-built_in">stack</span>, next)</span></span>; +} +</span></span></foreignObject></svg></code></pre> +</section> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="59" data-paginate="true" data-marpit-pagination="59" data-marpit-pagination-total="62" style="--paginate:true;"> +<h1>メタに変換されたGearsOSの実装</h1> +<ul> +<li>直接checkAndSetに行かずにmetaに飛ぶ</li> +<li>もとのコードは<code>goto right_fork->checkAndSet()</code>なので、Interfaceを使った継続 +<ul> +<li>context内の継続先のInterfaceの引数格納用の配列に書き込まれる</li> +<li><code>right_fork->checkAndSet</code>には数値が入ってる</li> +</ul> +</li> +</ul> +<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pickup_rforkPhilsImpl</span><span class="hljs-params">(struct Context *context,struct PhilsImpl* phils, <span class="hljs-keyword">enum</span> Code next)</span> </span>{ + <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">AtomicT_int</span>* <span class="hljs-title">right_fork</span> =</span> phils->Rightfork; + Gearef(context, AtomicT_int)->atomicT_int = (<span class="hljs-keyword">union</span> Data*) right_fork; + Gearef(context, AtomicT_int)->oldData = <span class="hljs-number">-1</span>; + Gearef(context, AtomicT_int)->newData = phils->self; + Gearef(context, AtomicT_int)->next = C_pickup_lforkPhilsImpl; + (cGearefontext, AtomicT_int)->fail = C_pickup_rforkPhilsImpl; + <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">meta</span><span class="hljs-params">(context, right_fork->checkAndSet)</span></span>; +} +</span></span></foreignObject></svg></code></pre> +</section> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="60" data-paginate="true" data-marpit-pagination="60" data-marpit-pagination-total="62" style="--paginate:true;"> +<h1>メタに変換されたGearsOSの実装</h1> +<ul> +<li>変換前</li> +</ul> +<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pickup_rfork</span><span class="hljs-params">(struct PhilsImpl* phils, __code next(...))</span> </span>{ + <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">AtomicT_int</span>* <span class="hljs-title">right_fork</span> =</span> phils->Rightfork; + <span class="hljs-keyword">goto</span> right_fork->checkAndSet(<span class="hljs-number">-1</span>, phils->self, pickup_lfork, pickup_rfork); +} +</span></span></foreignObject></svg></code></pre> +<ul> +<li>変換後</li> +</ul> +<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pickup_rforkPhilsImpl</span><span class="hljs-params">(struct Context *context,struct PhilsImpl* phils, <span class="hljs-keyword">enum</span> Code next)</span> </span>{ + <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">AtomicT_int</span>* <span class="hljs-title">right_fork</span> =</span> phils->Rightfork; + Gearef(context, AtomicT_int)->atomicT_int = (<span class="hljs-keyword">union</span> Data*) right_fork; + Gearef(context, AtomicT_int)->oldData = <span class="hljs-number">-1</span>; + Gearef(context, AtomicT_int)->newData = phils->self; + Gearef(context, AtomicT_int)->next = C_pickup_lforkPhilsImpl; + (cGearefontext, AtomicT_int)->fail = C_pickup_rforkPhilsImpl; + <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">meta</span><span class="hljs-params">(context, right_fork->checkAndSet)</span></span>; +} +</span></span></foreignObject></svg></code></pre> +</section> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="61" data-paginate="true" data-marpit-pagination="61" data-marpit-pagination-total="62" style="--paginate:true;"> +<h1>データを取り出すStubCodeGear</h1> +<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pickup_rforkPhilsImpl_stub</span><span class="hljs-params">(struct Context* context)</span> </span>{ + PhilsImpl* phils = (PhilsImpl*)GearImpl(context, Phils, phils); + <span class="hljs-class"><span class="hljs-keyword">enum</span> <span class="hljs-title">Code</span> <span class="hljs-title">next</span> =</span> Gearef(context, Phils)->next; + <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">pickup_rforkPhilsImpl</span><span class="hljs-params">(context, phils, next)</span></span>; +} +</span></span></foreignObject></svg></code></pre> +</section> +</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="62" data-paginate="true" data-marpit-pagination="62" data-marpit-pagination-total="62" style="--paginate:true;"> +<h1>Interfaceの実装時の型名の省略</h1> +<ul> +<li>APIのCodeGearには、トランスパイル時に具体的な型が名前につけられる</li> +</ul> +<h3>トランスパイル前</h3> +<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pickup_lfork</span><span class="hljs-params">(struct PhilsImpl* phils, __code next(...))</span> </span>{ + <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">AtomicT_int</span>* <span class="hljs-title">left_fork</span> =</span> phils->Leftfork; + <span class="hljs-keyword">goto</span> left_fork->checkAndSet(<span class="hljs-number">-1</span>, phils->self, pickup_rfork, eating); + +} +</span></span></foreignObject></svg></code></pre> +<h3>トランスパイル後</h3> +<pre><code class="language-c"><svg data-marp-fitting="svg" data-marp-fitting-code><foreignObject><span data-marp-fitting-svg-content><span data-marp-fitting-svg-content-wrap><span class="hljs-function">__code <span class="hljs-title">pickup_lforkPhilsImpl</span><span class="hljs-params">(struct Context *context,struct PhilsImpl* phils, <span class="hljs-keyword">enum</span> Code next)</span> </span>{ + <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">AtomicT_int</span>* <span class="hljs-title">left_fork</span> =</span> phils->Leftfork; + Gearef(context, AtomicT_int)->atomicT_int = (<span class="hljs-keyword">union</span> Data*) left_fork; + ... + Gearef(context, AtomicT_int)->next = C_pickup_rforkPhilsImpl; + Gearef(context, AtomicT_int)->fail = C_eatingPhilsImpl; + <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">meta</span><span class="hljs-params">(context, left_fork->checkAndSet)</span></span>; +} +</span></span></foreignObject></svg></code></pre> +</section> <script>!function(){"use strict";const t="marpitSVGPolyfill:setZoomFactor,",e=Symbol();let r,o;function n(n){const i="object"==typeof n&&n.target||document,a="object"==typeof n?n.zoom:n;window[e]||(Object.defineProperty(window,e,{configurable:!0,value:!0}),window.addEventListener("message",(({data:e,origin:r})=>{if(r===window.origin)try{if(e&&"string"==typeof e&&e.startsWith(t)){const[,t]=e.split(","),r=Number.parseFloat(t);Number.isNaN(r)||(o=r)}}catch(t){console.error(t)}})));let l=!1;Array.from(i.querySelectorAll("svg[data-marpit-svg]"),(t=>{var e,n,i,s;t.style.transform||(t.style.transform="translateZ(0)");const c=a||o||t.currentScale||1;r!==c&&(r=c,l=c);const d=t.getBoundingClientRect(),{length:u}=t.children;for(let r=0;r<u;r+=1){const o=t.children[r],a=o.getScreenCTM();if(a){const t=null!==(n=null===(e=o.x)||void 0===e?void 0:e.baseVal.value)&&void 0!==n?n:0,r=null!==(s=null===(i=o.y)||void 0===i?void 0:i.baseVal.value)&&void 0!==s?s:0,l=o.firstChild,{style:u}=l;u.transformOrigin||(u.transformOrigin=`${-t}px ${-r}px`),u.transform=`scale(${c}) matrix(${a.a}, ${a.b}, ${a.c}, ${a.d}, ${a.e-d.left}, ${a.f-d.top}) translateZ(0.0001px)`}}})),!1!==l&&Array.from(i.querySelectorAll("iframe"),(({contentWindow:e})=>{null==e||e.postMessage(`${t}${l}`,"null"===window.origin?"*":window.origin)}))}r=1,o=void 0;const i=(t,e,r)=>{if(t.getAttribute(e)!==r)return t.setAttribute(e,r),!0};function a({once:t=!1,target:e=document}={}){const r="Apple Computer, Inc."===navigator.vendor?[n]:[];let o=!t;const a=()=>{for(const t of r)t({target:e});!function(t=document){Array.from(t.querySelectorAll('svg[data-marp-fitting="svg"]'),(t=>{var e;const r=t.firstChild,o=r.firstChild,{scrollWidth:n,scrollHeight:a}=o;let l,s=1;if(t.hasAttribute("data-marp-fitting-code")&&(l=null===(e=t.parentElement)||void 0===e?void 0:e.parentElement),t.hasAttribute("data-marp-fitting-math")&&(l=t.parentElement),l){const t=getComputedStyle(l),e=Math.ceil(l.clientWidth-parseFloat(t.paddingLeft||"0")-parseFloat(t.paddingRight||"0"));e&&(s=e)}const c=Math.max(n,s),d=Math.max(a,1),u=`0 0 ${c} ${d}`;i(r,"width",`${c}`),i(r,"height",`${d}`),i(t,"preserveAspectRatio",getComputedStyle(t).getPropertyValue("--preserve-aspect-ratio")||"xMinYMin meet"),i(t,"viewBox",u)&&t.classList.toggle("__reflow__")}))}(e),o&&window.requestAnimationFrame(a)};return a(),()=>{o=!1}}const l=Symbol(),s=document.currentScript;((t=document)=>{if("undefined"==typeof window)throw new Error("Marp Core's browser script is valid only in browser context.");if(t[l])return t[l];const e=a({target:t}),r=()=>{e(),delete t[l]};Object.defineProperty(t,l,{configurable:!0,value:r})})(s?s.getRootNode():document)}(); </script></foreignObject></svg></div><script>!function(){"use strict";var e=function(e,t){var n,r=1===(e.parent||e).nodeType?e.parent||e:document.querySelector(e.parent||e),s=[].filter.call("string"==typeof e.slides?r.querySelectorAll(e.slides):e.slides||r.children,(function(e){return"SCRIPT"!==e.nodeName})),a={},i=function(e,t){return(t=t||{}).index=s.indexOf(e),t.slide=e,t},o=function(e,t){a[e]=(a[e]||[]).filter((function(e){return e!==t}))},l=function(e,t){return(a[e]||[]).reduce((function(e,n){return e&&!1!==n(t)}),!0)},c=function(e,t){s[e]&&(n&&l("deactivate",i(n,t)),n=s[e],l("activate",i(n,t)))},d=function(e,t){var r=s.indexOf(n)+e;l(e>0?"next":"prev",i(n,t))&&c(r,t)},u={off:o,on:function(e,t){return(a[e]||(a[e]=[])).push(t),o.bind(null,e,t)},fire:l,slide:function(e,t){if(!arguments.length)return s.indexOf(n);l("slide",i(s[e],t))&&c(e,t)},next:d.bind(null,1),prev:d.bind(null,-1),parent:r,slides:s,destroy:function(e){l("destroy",i(n,e)),a={}}};return(t||[]).forEach((function(e){e(u)})),n||c(0),u};function t(e){e.parent.classList.add("bespoke-marp-parent"),e.slides.forEach((e=>e.classList.add("bespoke-marp-slide"))),e.on("activate",(t=>{const n=t.slide,r=!n.classList.contains("bespoke-marp-active");e.slides.forEach((e=>{e.classList.remove("bespoke-marp-active"),e.setAttribute("aria-hidden","true")})),n.classList.add("bespoke-marp-active"),n.removeAttribute("aria-hidden"),r&&(n.classList.add("bespoke-marp-active-ready"),document.body.clientHeight,n.classList.remove("bespoke-marp-active-ready"))}))}function n(e){let t=0,n=0;Object.defineProperty(e,"fragments",{enumerable:!0,value:e.slides.map((e=>[null,...e.querySelectorAll("[data-marpit-fragment]")]))});const r=r=>void 0!==e.fragments[t][n+r],s=(r,s)=>{t=r,n=s,e.fragments.forEach(((e,t)=>{e.forEach(((e,n)=>{if(null==e)return;const a=t<r||t===r&&n<=s;e.setAttribute("data-bespoke-marp-fragment",a?"active":"inactive"),t===r&&n===s?e.setAttribute("data-bespoke-marp-current-fragment","current"):e.removeAttribute("data-bespoke-marp-current-fragment")}))})),e.fragmentIndex=s;const a={slide:e.slides[r],index:r,fragments:e.fragments[r],fragmentIndex:s};e.fire("fragment",a)};e.on("next",(({fragment:a=!0})=>{if(a){if(r(1))return s(t,n+1),!1;const a=t+1;e.fragments[a]&&s(a,0)}else{const r=e.fragments[t].length;if(n+1<r)return s(t,r-1),!1;const a=e.fragments[t+1];a&&s(t+1,a.length-1)}})),e.on("prev",(({fragment:a=!0})=>{if(r(-1)&&a)return s(t,n-1),!1;const i=t-1;e.fragments[i]&&s(i,e.fragments[i].length-1)})),e.on("slide",(({index:t,fragment:n})=>{let r=0;if(void 0!==n){const s=e.fragments[t];if(s){const{length:e}=s;r=-1===n?e-1:Math.min(Math.max(n,0),e-1)}}s(t,r)})),s(0,0)} /*!
--- a/slide/index.md Mon Feb 08 11:02:28 2021 +0900 +++ b/slide/index.md Mon Feb 08 11:45:33 2021 +0900 @@ -432,78 +432,12 @@ } ``` ---- -# メタに変換されたGearsOSの実装 -- 直接checkAndSetに行かずにmetaに飛ぶ -- もとのコードは`goto right_fork->checkAndSet()`なので、Interfaceを使った継続 - - context内の継続先のInterfaceの引数格納用の配列に書き込まれる - - `right_fork->checkAndSet`には数値が入ってる - -```c -__code pickup_rforkPhilsImpl(struct Context *context,struct PhilsImpl* phils, enum Code next) { - struct AtomicT_int* right_fork = phils->Rightfork; - Gearef(context, AtomicT_int)->atomicT_int = (union Data*) right_fork; - Gearef(context, AtomicT_int)->oldData = -1; - Gearef(context, AtomicT_int)->newData = phils->self; - Gearef(context, AtomicT_int)->next = C_pickup_lforkPhilsImpl; - (cGearefontext, AtomicT_int)->fail = C_pickup_rforkPhilsImpl; - goto meta(context, right_fork->checkAndSet); -} -``` ---- -# メタに変換されたGearsOSの実装 -- 変換前 -```c -__code pickup_rfork(struct PhilsImpl* phils, __code next(...)) { - struct AtomicT_int* right_fork = phils->Rightfork; - goto right_fork->checkAndSet(-1, phils->self, pickup_lfork, pickup_rfork); -} -``` - -- 変換後 - -```c -__code pickup_rforkPhilsImpl(struct Context *context,struct PhilsImpl* phils, enum Code next) { - struct AtomicT_int* right_fork = phils->Rightfork; - Gearef(context, AtomicT_int)->atomicT_int = (union Data*) right_fork; - Gearef(context, AtomicT_int)->oldData = -1; - Gearef(context, AtomicT_int)->newData = phils->self; - Gearef(context, AtomicT_int)->next = C_pickup_lforkPhilsImpl; - (cGearefontext, AtomicT_int)->fail = C_pickup_rforkPhilsImpl; - goto meta(context, right_fork->checkAndSet); -} -``` - - - ---- -# データを取り出すStubCodeGear - -```c -__code pickup_rforkPhilsImpl_stub(struct Context* context) { - PhilsImpl* phils = (PhilsImpl*)GearImpl(context, Phils, phils); - enum Code next = Gearef(context, Phils)->next; - goto pickup_rforkPhilsImpl(context, phils, next); -} -``` - - - - ---- -# GearsOSのビルドシステム -- Perlスクリプトはファイルの変換・生成を行う - - メタ計算の変換・自動生成も行う -- メタ計算で必要なファイル、データ構造も生成する - - CodeGear/DataGearの番号など - -![w:632 h:10cm](./geasflow1.svg) - --- # Perlトランスパイラが生成するファイル +- メタレベルの計算で使うファイルは、Perlトランスパイラが生成するのが多い - context.hの中身をもとに生成するファイルが多い - このファイルで定義した内容をもとにメタレベルの計算をするので重要 @@ -557,6 +491,22 @@ - InterfaceにないAPIの呼び出しの検知 - 他の言語のいわゆるInterfaceの機能が強化 - コード変換前にPerlレベルでエラーを発生させた + +--- +# PerlトランスパイラでのInterfaceのエラー生成 +- CbCコンパイラがコンパイルする前にトランスパイラで検知可能になった +## 実装をし忘れているAPIがあった場合のエラー終了 +- PerlトランスパイラでのInterfaceのエラー生成 + - CbCコンパイラが動く前にエラーを検知 + +``` +[ 33%] Generating c/examples/DPP2/PhilsImpl.c +[ERROR] Not define eating at examples/DPP2/PhilsImpl.cbc +make[3]: *** [CMakeFiles/DPP2.dir/build.make:101: c/examples/DPP2/PhilsImpl.c] Error 25 +make[2]: *** [CMakeFiles/Makefile2:442: CMakeFiles/DPP2.dir/all] Error 2 +make[1]: *** [CMakeFiles/Makefile2:450: CMakeFiles/DPP2.dir/rule] Error 2 +make: *** [Makefile:293: DPP2] Error 2 +``` --- # 手書きからの解放 - Interfaceの雛形ファイルの作製スクリプトの導入 @@ -603,46 +553,9 @@ __code next(...); } PhilsImpl; ``` ---- -# Interfaceの実装時の型名の省略 -- APIのCodeGearには、トランスパイル時に具体的な型が名前につけられる -### トランスパイル前 -```c -__code pickup_lfork(struct PhilsImpl* phils, __code next(...)) { - struct AtomicT_int* left_fork = phils->Leftfork; - goto left_fork->checkAndSet(-1, phils->self, pickup_rfork, eating); - -} -``` -### トランスパイル後 -```c -__code pickup_lforkPhilsImpl(struct Context *context,struct PhilsImpl* phils, enum Code next) { - struct AtomicT_int* left_fork = phils->Leftfork; - Gearef(context, AtomicT_int)->atomicT_int = (union Data*) left_fork; - ... - Gearef(context, AtomicT_int)->next = C_pickup_rforkPhilsImpl; - Gearef(context, AtomicT_int)->fail = C_eatingPhilsImpl; - goto meta(context, left_fork->checkAndSet); -} -``` ---- -# PerlトランスパイラでのInterfaceのエラー生成 -- CbCコンパイラがコンパイルする前にトランスパイラで検知可能になった -## 実装をし忘れているAPIがあった場合のエラー終了 -- PerlトランスパイラでのInterfaceのエラー生成 - - CbCコンパイラが動く前にエラーを検知 - -``` -[ 33%] Generating c/examples/DPP2/PhilsImpl.c -[ERROR] Not define eating at examples/DPP2/PhilsImpl.cbc -make[3]: *** [CMakeFiles/DPP2.dir/build.make:101: c/examples/DPP2/PhilsImpl.c] Error 25 -make[2]: *** [CMakeFiles/Makefile2:442: CMakeFiles/DPP2.dir/all] Error 2 -make[1]: *** [CMakeFiles/Makefile2:450: CMakeFiles/DPP2.dir/rule] Error 2 -make: *** [Makefile:293: DPP2] Error 2 -``` --- # 手書きからの解放 @@ -658,6 +571,7 @@ |-|-|-| |実装の型ファイル|無し|新たに導入| |union Dataの定義|手書き|自動生成| +|context.h|手書き|自動生成| |実装のCodeGearの型名|手書き|自動生成| |実装のCbCファイル|手書き|雛形を自動生成| |別のInterfaceの出力を取得するStub|手書き|自動生成| @@ -677,6 +591,89 @@ - Interfaceの型定義ファイルを導入したので、自動生成が可能になった - ビルド時に使用しているDataGearを回収し、 context.hを作製する + +--- +# メタ計算の切り替えAPI +- 通常だとCodeGearの実行後、`goto meta`に継続するようにPerlで変換される + - 継続するMetaCodeGearを自由に選択したい +```c +__code thinkingPhilsImpl(struct Context *context,struct PhilsImpl* phils, + struct Fork* fork, enum Code next) { + printf("%d: thinking\n", phils->self); + goto meta(context, C_pickup_lforkPhilsImpl); +} +``` + +- 例えばモデル検査用のMetaCodeGear(`mcMeta`)にgotoさせたい + +```c +__code thinkingPhilsImpl(struct Context *context,struct PhilsImpl* phils, + struct Fork* fork, enum Code next) { + printf("%d: thinking\n", phils->self); + goto mcMeta(context, C_pickup_lforkPhilsImpl); +} +``` + + +--- +# mta.pm +- CodeGearが継続するMetaCodeGearを自由に選択できるPerlモジュールを導入した +- APIに沿ってPerlモジュールを書くことで特定のCodeGearの継続先を変更可能 + - Perlトランスパイラがコード変換時に自動ロードして実行する +![w:932 h:10cm](./metapm.svg) + + + +--- +# meta.pm + +- `replaceMeta`関数に置換対象と生成する`goto`の組をリストで登録 + - `qr//`に正規表現リテラルで置換対象のCodeGearの名前を指定 + - `=>`の先に対応するgoto文の生成関数を指定する +- この例では`PhilsImpl`が名前についているCodeGearが一括で`goto mcMeta`になる + +```perl +package meta; + +sub replaceMeta { + return ( + [qr/PhilsImpl/ => \&generateMcMeta], + ); +} + +sub generateMcMeta { + my ($context, $next) = @_; + return "goto mcMeta($context, $next);"; +} +``` + + + +--- +# 今後の課題 +- Perlトランスパイラのリファクタリング・GearsOSのビルド方法の見直し + - 機能が充実したが複雑度が全体的に増してしまった +- PerlトランスパイラのGearsOS本体への組み込み + - Perlトランスパイラが行っている処理はリンカ、ローダーに近い + - OSが機能としてサポートしていてほしい + - GearsOS自身で記述したい +- xv6への組み込み + - GearsOSを既存のUNIXの置き換えとして実行したい +- ノーマルレベルの記述の純粋関数化、別の言語での定義 + - CbC/Cベースの記述ではノーマルレベルの記述に限界がある + - Perlトランスパイラの機能をさらに拡張すると、PerlでCbCコンパイラを実装することに近くなってしまう +--- +# まとめ +- Perlトランスパイラのフレームワークの機能を充実させた +- Interfaceシステムを改良した + - 型定義ファイルの導入を行った + - 定義方法に一貫性が出た + - Perlトランスパイラで警告を発生させるようになった +- 従来手書きしていたメタな定義をビルド時に自動的に生成するようにした + - 煩雑な処理や手で実装することによるバグの混入を回避 +- MetaCodeGearの制御をユーザー側で行えるようにした + - モデル検査をメタ計算として自在に組み込むことが可能となった + --- # 出力があるIntefaceのAPIの問題 ## Stackから値を2つ取得するpop2 APIの定義の一部 @@ -763,82 +760,79 @@ goto pop2Test1StackTestImpl3(context, stackTest, data, data1, stack, next); } ``` - --- -# メタ計算の切り替えAPI -- CodeGearが継続するMetaCodeGearを自由に選択できるPerlモジュールを導入した - - 従来はデフォルトで設定されるMetaCodeGearにしか継続しなかった - - Perlモジュールを書くことで特定のCodeGearの継続先を変更可能にした -- AspectJのポイントカットが類似機能 -![w:932 h:10cm](./metapm.svg) - ---- -# meta.pm +# メタに変換されたGearsOSの実装 +- 直接checkAndSetに行かずにmetaに飛ぶ +- もとのコードは`goto right_fork->checkAndSet()`なので、Interfaceを使った継続 + - context内の継続先のInterfaceの引数格納用の配列に書き込まれる + - `right_fork->checkAndSet`には数値が入ってる -- `replaceMeta`関数に置換対象を登録 - - `qr//`に正規表現リテラルで置換対象のCodeGearの名前を指定 - - `=>`の先に対応するgoto文の生成関数を指定する - -```perl -package meta; +```c +__code pickup_rforkPhilsImpl(struct Context *context,struct PhilsImpl* phils, enum Code next) { + struct AtomicT_int* right_fork = phils->Rightfork; + Gearef(context, AtomicT_int)->atomicT_int = (union Data*) right_fork; + Gearef(context, AtomicT_int)->oldData = -1; + Gearef(context, AtomicT_int)->newData = phils->self; + Gearef(context, AtomicT_int)->next = C_pickup_lforkPhilsImpl; + (cGearefontext, AtomicT_int)->fail = C_pickup_rforkPhilsImpl; + goto meta(context, right_fork->checkAndSet); +} +``` +--- +# メタに変換されたGearsOSの実装 +- 変換前 +```c +__code pickup_rfork(struct PhilsImpl* phils, __code next(...)) { + struct AtomicT_int* right_fork = phils->Rightfork; + goto right_fork->checkAndSet(-1, phils->self, pickup_lfork, pickup_rfork); +} +``` -sub replaceMeta { - return ( - [qr/PhilsImpl/ => \&generateMcMeta], - ); -} +- 変換後 -sub generateMcMeta { - my ($context, $next) = @_; - return "goto mcMeta($context, $next);"; +```c +__code pickup_rforkPhilsImpl(struct Context *context,struct PhilsImpl* phils, enum Code next) { + struct AtomicT_int* right_fork = phils->Rightfork; + Gearef(context, AtomicT_int)->atomicT_int = (union Data*) right_fork; + Gearef(context, AtomicT_int)->oldData = -1; + Gearef(context, AtomicT_int)->newData = phils->self; + Gearef(context, AtomicT_int)->next = C_pickup_lforkPhilsImpl; + (cGearefontext, AtomicT_int)->fail = C_pickup_rforkPhilsImpl; + goto meta(context, right_fork->checkAndSet); } ``` ---- -# Perlトランスパイルで生成されたメタ部分の比較 -## meta.pm導入前 -- 通常の`goto meta` - -```c -__code thinkingPhilsImpl(struct Context *context,struct PhilsImpl* phils, struct Fork* fork, enum Code next) { - printf("%d: thinking\n", phils->self); - goto meta(context, C_pickup_lforkPhilsImpl); -} -``` - -## meta.pm導入後 -- モデル検査用のMetaCodeGear`mcMeta`に`goto`する - -```c -__code thinkingPhilsImpl(struct Context *context,struct PhilsImpl* phils, struct Fork* fork, enum Code next) { - printf("%d: thinking\n", phils->self); - goto mcMeta(context, C_pickup_lforkPhilsImpl); -} -``` --- -# 今後の課題 -- Perlトランスパイラのリファクタリング・GearsOSのビルド方法の見直し - - 機能が充実したが複雑度が全体的に増してしまった -- PerlトランスパイラのGearsOS本体への組み込み - - Perlトランスパイラが行っている処理はリンカ、ローダーに近い - - OSが機能としてサポートしていてほしい - - GearsOS自身で記述したい -- xv6への組み込み - - GearsOSを既存のUNIXの置き換えとして実行したい -- ノーマルレベルの記述の純粋関数化、別の言語での定義 - - CbC/Cベースの記述ではノーマルレベルの記述に限界がある - - Perlトランスパイラの機能をさらに拡張すると、PerlでCbCコンパイラを実装することに近くなってしまう +# データを取り出すStubCodeGear + +```c +__code pickup_rforkPhilsImpl_stub(struct Context* context) { + PhilsImpl* phils = (PhilsImpl*)GearImpl(context, Phils, phils); + enum Code next = Gearef(context, Phils)->next; + goto pickup_rforkPhilsImpl(context, phils, next); +} +``` --- -# まとめ -- Perlトランスパイラのフレームワークの機能を充実させた -- Interfaceシステムを改良した - - 型定義ファイルの導入を行った - - 定義方法に一貫性が出た - - Perlトランスパイラで警告を発生させるようになった -- 従来手書きしていたメタな定義をビルド時に自動的に生成するようにした - - 煩雑な処理や手で実装することによるバグの混入を回避 -- MetaCodeGearの制御をユーザー側で行えるようにした - - モデル検査をメタ計算として自在に組み込むことが可能となった +# Interfaceの実装時の型名の省略 +- APIのCodeGearには、トランスパイル時に具体的な型が名前につけられる +### トランスパイル前 +```c +__code pickup_lfork(struct PhilsImpl* phils, __code next(...)) { + struct AtomicT_int* left_fork = phils->Leftfork; + goto left_fork->checkAndSet(-1, phils->self, pickup_rfork, eating); +} +``` +### トランスパイル後 +```c +__code pickup_lforkPhilsImpl(struct Context *context,struct PhilsImpl* phils, enum Code next) { + struct AtomicT_int* left_fork = phils->Leftfork; + Gearef(context, AtomicT_int)->atomicT_int = (union Data*) left_fork; + ... + Gearef(context, AtomicT_int)->next = C_pickup_rforkPhilsImpl; + Gearef(context, AtomicT_int)->fail = C_eatingPhilsImpl; + goto meta(context, left_fork->checkAndSet); +} +```