# HG changeset patch # User anatofuz # Date 1612694536 -32400 # Node ID e1e0a87b98f8f07b0db8ab12e0f78bc75a6d4df8 # Parent 62aca38647e8abb1e95d35bfc87c19a25c347b12 update diff -r 62aca38647e8 -r e1e0a87b98f8 slide/index.html --- a/slide/index.html Sun Feb 07 17:02:45 2021 +0900 +++ b/slide/index.html Sun Feb 07 19:42:16 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%}
+ /* 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%}

GearsOSのメタ計算

  • 清水 隆博 @@ -20,7 +20,7 @@
-
+

研究発表の構成

  • 研究目的
  • @@ -34,7 +34,7 @@
-
+

研究目的

  • OSとアプリケーションの信頼性の保証したい
  • @@ -55,7 +55,7 @@
-
+

ノーマルレベルとメタレベルを用いた信頼性の向上

  • プログラムの実行部分は以下の2つからなる @@ -76,7 +76,7 @@
  • メタレベルの計算として信頼性を保証する
-
+

メタレベルの計算とGearsOS

  • ノーマルレベル、メタレベルを一貫して記述できる言語CbCを用いてGearsOSを開発している
  • @@ -98,15 +98,15 @@
-
+

GearsOSのメタ計算フレームワーク

    -
  • 従来もPerlを中心としたメタコード生成のフレームワークを構築していた +
  • GearsOSはPerlを中心としたメタコード生成のフレームワークが構築されている
    • 計算に必要なデータの入出力のメタ計算を主に生成していた
  • -
  • しかしGearsOSのメタレベルの処理は従来のものは手動で行う方が多かった +
  • メタレベルの処理は従来のものは手動で作る方が多かった
    • 計算で使うすべてのデータ構造の管理
    • 別のInterfaceの出力を受けるメタレベルのデータ管理など
    • @@ -120,20 +120,18 @@
-
-

GearsOSのプログラミングフレームワーク

+
+

GearsOSのメタ計算フレームワークとInterface

    -
  • GearsOSはCbCには無いモジュール化の仕組みとしてInterfaceがある +
  • CbCには無いモジュール化の仕組みとしてInterfaceがある
      -
    • Perlフレームワーク上に構築されている
    • -
    • 変換時に等価な純粋なCbCに変換される
    • +
    • Perlフレームワーク上に構築
    • +
    • コンパイル時に等価な純粋なCbCに変換する
  • Interfaceの機能が他の言語のInterfaceの機能とギャップがあった
      -
    • 実装していないAPIがあっても、変換前の時点でエラーが出ない
    • -
    • 引数の値が揃っていなくても、変換前の時点でエラーが出ない
    • -
    • 存在していないAPIを呼んでも、変換前の時点でエラーが出ない
    • +
    • 実装していないAPIがあっても、変換前の時点でエラーが出ないなど
  • Interfaceの定義ファイルもあるものと無いものがあった @@ -143,7 +141,7 @@
-
+

Perlを中心としたフレームワークによるメタ計算の生成

  • GearsOSの例題を作製する場合も、コピペや手書きが多発していた @@ -157,19 +155,18 @@
  • コード変換(トランスパイル)を行うために必要な環境の整備もする必要がある
  • -
  • 本研究ではPerlを中心としたトランスパイルシステムの整備、拡張を行った +
  • Perlを中心としたトランスパイルシステムの整備、拡張を行った
    • GearsOSのメタ計算の生成がより柔軟かつ高い信頼性で可能となった
  • -
    +

    GearsOSの基礎概念

    • CodeGear、DataGear
    • Interface
    • -
    • par goto
    • GearsOSのビルドシステム
      • cmake
      • @@ -178,15 +175,21 @@
    -
    +

    CbCとCodeGear(ノーマルレベル)

    • 軽量継続で表現する単位をCodeGearと呼ぶ
    • CodeGearはCの関数とアセンブラの中間の様に使える
    • CodeGearは返り値の型の代わりに__codeで宣言する
    +
    __code insertTest2(struct StackTestImpl3* stackTest, struct Stack* stack, __code next(...)) {
    +    String* str = &ALLOCATE(context, String)->String;
    +    str->size = 100;
    +    goto stack->push((union Data*)str, pop2Test);
    +}
    +
    -
    +

    DataGear

    • GearsOSで扱うデータの単位
    • @@ -202,7 +205,7 @@
    • DataGearの定義ではInterfaceシステムが使用できる
    -
    +

    Context(1)

    • 従来のOSのプロセスに相当する機能(MetaDataGear)
    • @@ -224,7 +227,7 @@
    -
    +

    Context(2)

    • GearsOSでのプログラム実行に必要な情報を持っている @@ -238,20 +241,7 @@
    -
    -

    StubCodeGear

    -
      -
    • 実行したいCodeGearの直前に実行されるMetaCodeGear
    • -
    • contextからDataGearを取り出す操作をする
    • -
    • すべてのノーマルレベルのCodeGearに付随する -
        -
      • Perlトランスパイラでビルド時に自動生成
        -w:532 h:10cm
      • -
      -
    • -
    -
    -
    +

    Interface

    • GearsOSのモジュール化の仕組み
    • @@ -262,9 +252,15 @@
    • goto時にStubCodeGearでデータをとってくる
    +
  • goto interfaceName->method()のようにAPIを呼び出す +
      +
    • Perlトランスパイラがgoto meta()に書き直す
    • +
    • goto metaはcontextから引数を取り出すMetaCodeGearに継続させるもの
    • +
    +
  • -
    +

    GearsOSのビルドシステム

    • CMakeとPerlを使ってビルドする @@ -281,16 +277,17 @@
    -
    +

    GearsOSのビルドシステム

    • generate_stub.pl
        -
      • GearsOSで拡張したCbCを受け取り、純粋なCbCに変形したものを生成する
      • +
      • GearsOSで拡張したCbCを1行ずつ読む
      • +
      • 純粋なCbCに変形したものを生成する
      • CbCコンパイラがコンパイルする前にコードを変換する
        • ユーザーが書いたGearsOSのソースコードにメタ情報をつける
        • -
        • コードからコードを生成するので、トランスパイラと言える
        • +
        • コードからコードを生成する、トランスパイラ
      @@ -309,30 +306,16 @@
    -
    -

    GearsOSに導入された新機能

    -
      -
    • ARMクロスコンパイル用のCMakeの定義 +
      +

      主なGearsOSに導入された新機能

        -
      • ARM用のアーキテクチャに向けてクロスコンパイルするCMakeを定義
      • -
      • GearsOSのビルドシステムに手を加えずにクロスコンパイルが可能
      • -
      - -
    • Interface構文の簡素化 -
        -
      • より簡潔に明確に記述できるように定義した
      • -
      -
    • -
    • Interfaceの実装の型の導入 -
        -
      • GearsOSでの型定義の方法に一貫性が生まれた
      • -
      -
    • +
    • Interfaceシステムの強化
    • +
    • 手書きからの解放
    • +
    • MetaCodeGearの入れ替え機能の追加
    • -
      -

      GearsOSに導入された新機能

      -

      Interfaceシステムの強化

      +
      +

      Interfaceシステムの強化

      • Interface構文の簡素化
          @@ -353,9 +336,8 @@
      -
      -

      GearsOSに導入された新機能

      -

      手書きからの解放

      +
      +

      手書きからの解放

      • Interfaceの雛形ファイルの作製スクリプトの導入
      • 別のInterfaceからの出力を取得するStubの自動生成
      • @@ -368,7 +350,7 @@
      • GearsOSの初期化ルーチンの自動生成
      -
      +

      GearsOSの新機能

      • 自由なMetaCodeGearの作製、継続の入れ替え機能
      • @@ -376,7 +358,7 @@
      • ジェネリクスのサポート
      -
      +

      Interfaceの改良

      • 従来のInterfaceにまつわるPerlのフレームワークを改良した @@ -386,7 +368,7 @@
      -
      +

      Interfaceの定義構文の改良

      • 従来は引数とCodeGearの定義を別けて記述していた @@ -403,7 +385,7 @@
      • シンタックスをgolangやJavaのInterfaceを参考に簡潔なものにした
      -
      +

      従来のInterface

      • 引数の組とAPI(CodeGear)は別けて記述する必要があった
      • @@ -426,7 +408,7 @@ } Stack;
      -
      +

      定義し直したInterface構文

      • APIのみを記述すれば良くなった
      • @@ -444,7 +426,7 @@ } Stack;
      -
      +

      Implementの型定義ファイルの導入

      • Interfaceは型定義ファイルがあったが、実装側はなかった
      • @@ -461,7 +443,7 @@
      -
      +

      Implementの型定義

      • 基本はInterfaceと同じシンタックス @@ -480,32 +462,144 @@ } PhilsImpl;
      -
      -

      Interfaceの実装

      +
      +

      Interfaceの実装時の型名の省略

      +
        +
      • 従来は型名を必ず書かなければならなかった
          -
        • 定義したInterfaceは実装する必要がある +
        • これはメタ情報なので変換時に書き換える
        • +
        +
      • +
      +

      従来

      +
      __code pickup_lforkPhilsImpl(struct PhilsImpl* phils, __code next(...)) {
      +    struct AtomicT_int* left_fork = phils->Leftfork;
      +    goto left_fork->checkAndSet(-1, phils->self, pickup_rforkPhilsImpl, eatingPhilsImpl);
      +
      +}
      +
      +

      現在

      +
      __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);
      +
      +}
      +
      +
      +
      +

      トランスパイル前

      +
      __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);
      +
      +}
      +
      +

      トランスパイル後

      +
      __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)->oldData = -1;
      +    Gearef(context, AtomicT_int)->newData = phils->self;
      +    Gearef(context, AtomicT_int)->next = C_pickup_rforkPhilsImpl;
      +    Gearef(context, AtomicT_int)->fail = C_eatingPhilsImpl;
      +    goto meta(context, left_fork->checkAndSet);
      +
      +}
      +
      +
      +
      +

      Interfaceのパーサーの導入

        -
      • Stack Interfaceの場合はSingleLinkedStackなど
      • +
      • PerlでのInterfaceの情報の取得は、CbC自体のファイルの解析処理と共通だった +
          +
        • Interfaceならではの情報が取れない
        • +
        • スクリプトに直接書かれているので他のツールが使えない
        • +
        +
      • +
      • モジュール化したInterfaceのパーサーを導入した +
          +
        • Perlフレームワークを使う一連のツールの作製が可能になった +
            +
          • InterfaceとImplを見た実装の雛形ファイルの作製ツール
          • +
          • コード変換時にInterfaceのAPIに関連するチェック機能
          • +
          +
      • -
      • cbcファイルにCodeGearやコンストラクタを定義し、 型はcontext.hに直接書く
      • +
      +
      +
      +

      Interfaceの実装の雛形生成コマンドの実装

      +
        +
      • Interfaceと実装する型が決まると、最低限書かないといけないCodeGearが決まる
      • +
      • 従来は手作業でCbCファイルにCodeGearの定義を書いて実装していた +
          +
        • コンストラクタも手書き
        • +
        +
      • +
      • JavaはIDEで、golangはコマンドとして雛形を生成するものを用意している +
          +
        • GearsOSでも導入した
        • +
        +
      • +
      • 実装の型ファイルを引数で渡すと雛形を生成する
      -
      __code popSingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, ...)) {
      -    if (stack->top) {
      -        data = stack->top->data;
      -        stack->top = stack->top->next;
      -    } else {
      -        data = NULL;
      -    }
      -    goto next(data, ...);
      +
      $perl too/impl2cbc.pl SingleLinkedStack.h
      +
      + +
      +

      生成された雛形cbcの一部

      +
        +
      • 各CodeGearに実装したい内容をすぐに書き始めることが可能になった +
          +
        • 自動生成されるのでエラーの発生も抑えられる
        • +
        +
      • +
      +
      #include "../../../context.h"
      +#interface "Stack.h"
      +
      +Stack* createSingleLinkedStack(struct Context* context) {
      +    struct Stack* stack  = new Stack();
      +    struct SingleLinkedStack* single_linked_stack = new SingleLinkedStack();
      +    stack->stack = (union Data*)single_linked_stack;
      +    ...
      +    stack->pop2 = C_pop2SingleLinkedStack;
      +    stack->get2 = C_get2SingleLinkedStack;
      +    return stack;
      +}
      +...
      +
      +__code push(struct SingleLinkedStack* stack,union Data* data, __code next(...)) {
      +
      +    goto next(...);
       }
       
      -
          struct SingleLinkedStack {
      -        struct Element* top;
      -    } SingleLinkedStack;
      -
      -
      +
      +

      PerlトランスパイラでのInterfaceのエラー生成

      +
        +
      • Interfaceの実装時に様々なミスをする可能性がある +
          +
        • APIを完全に実装していない
        • +
        • 呼び出しの引数を間違えている
        • +
        • 無いAPIを呼び出している
        • +
        +
      • +
      • 従来は変換した後CbCコンパイラがコンパイルする際や、実行時にしかエラーが出なかった +
          +
        • どの記述でエラーが出たのかの特定が困難
        • +
        • CbCコンパイラがコンパイルする前にトランスパイラで検知したい
        • +
        +
      • +
      • Perlトランスパイラ内でInterfaceのパーサーを呼び出しエラーを生成させられた +
          +
        • 変換する前にエラーが完全に検知できた
        • +
        +
      • +
      +
      +

      Context定義ファイルの自動生成

      • ContextはすべてのDataGearの型情報をunion Dataとして持つ必要がある @@ -530,29 +624,91 @@ }
      -
      -

      Interfaceのパーサーの導入

      -
        -
      • PerlでのInterfaceの情報の取得は、CbC自体のファイルの解析処理と共通だった +
        +

        StubCodeGear

          -
        • Interfaceならではの情報が取れない
        • -
        • スクリプトに直接書かれているので他のツールが使えない
        • -
        - -
      • モジュール化したInterfaceのパーサーを導入した +
      • 実行したいCodeGearの直前に実行されるMetaCodeGear
      • +
      • contextからDataGearを取り出す操作をする
      • +
      • すべてのノーマルレベルのCodeGearに付随する
          -
        • Perlフレームワークを使う一連のツールの作製が可能になった -
            -
          • InterfaceとImplを見た実装の雛形ファイルの作製ツール
          • -
          • コード変換時にInterfaceのAPIに関連するチェック機能
          • -
          -
        • +
        • Perlトランスパイラでビルド時に自動生成
          +w:632 h:10cm
      • -
        -

        メタ計算の切り替え機能

        +
        +

        別のInterfaceの出力を受けるCodeGearのメタ計算部分の自動生成

        +
          +
        • Stackからdatadata1を受け取ろうとする例 +
            +
          • 意図した通りに動かない
          • +
          +
        • +
        +
        __code pop2Test(struct StackTestImpl3* stackTest, struct Stack* stack, __code next(...)) {
        +    goto stack->pop2(pop2Test1);
        +}
        +
        +
        +__code pop2Test1(struct StackTestImpl3* stackTest, union Data* data, union Data* data1, struct Stack* stack, __code next(...)) {
        +    String* str = (String*)data;
        +    String* str2 = (String*)data1;
        +
        +    printf("%d\n", str->size);
        +    printf("%d\n", str2->size);
        +    goto next(...);
        +}
        +
        +
        +
        +

        別のInterfaceの出力を受けるCodeGearのメタ計算部分の自動生成

        +
          +
        • Interfaceの継続に別のInterfaceを渡すと値の受け渡しが上手くいかない +
            +
          • StubCodeGearがおかしい
          • +
          +
        • +
        +
        __code pop2Test1StackTestImpl3_stub(struct Context* context) {
        +  StackTestImpl3* stackTest = (StackTestImpl3*)GearImpl(context, StackTest, stackTest);
        +  Data* data = Gearef(context, StackTest)->data;
        +  Data* data1 = Gearef(context, StackTest)->data1;
        +  Stack* stack = Gearef(context, StackTest)->stack;
        +  enum Code next = Gearef(context, StackTest)->next;
        +  goto pop2Test1StackTestImpl3(context, stackTest, data, data1, stack, next);
        +}
        +
        +
        +
        +
          +
        • メタ計算部分で取得するcontextの場所が異なっているのが問題 +
            +
          • 取得する場所を手書きする必要があった
          • +
          +
        • +
        +

        w:732 h:13cm

        +
        +
        +

        別のInterfaceの出力を受けるCodeGearのメタ計算部分の自動生成

        +
          +
        • goto interface->method()している箇所を読み取る +
            +
          • interfaceがどのInterfaceなのかをPerlトランスパイラで特定させた
          • +
          • 特定したInterfaceをパーサーを呼び出して情報を取得
          • +
          • APIごとに出力があるかを調査
          • +
          +
        • +
        • 出力があったら、継続で渡しているCodeGearの入力を、呼び出しているInterfaceからとるように修正 +
            +
          • データの取り出しはStubでしているので、新たなStubを作製した
          • +
          +
        • +
        +
        +
        +

        メタ計算の切り替えAPI

        • CodeGearが継続するMetaCodeGearを自由に選択できるPerlモジュールを導入した
            @@ -562,19 +718,24 @@
          • 様々な処理をMetaCodeGearですることが可能になった
              -
            • すでにモデル検査用のメタ計算を入れることが出来た(東恩納さんの修論)
            • +
            • すでにモデル検査用のメタ計算を入れることが出来た

          w:932 h:10cm

        -
        +

        まとめ

        • Perlトランスパイラのフレームワークの機能を充実させた
        • -
        • 型定義ファイルの導入、呼び出しシンタックスの導入を行った +
        • Interfaceシステムを改良した +
            +
          • 型定義ファイルの導入を行った
              -
            • DataGearの定義方法に一貫性が出た
            • +
            • 定義方法に一貫性が出た
            • +
            +
          • +
          • Perlトランスパイラで警告を発生させるようになった
        • 従来手書きしていたメタな定義をビルド時に自動的に生成するようにした @@ -587,14 +748,9 @@
        • モデル検査をメタ計算として自在に組み込むことが可能となった
        -
      • Interfaceシステムを改良し、Perlトランスパイラで警告を発生させるようになった -
          -
        • 他言語のInterfaceと同様に使うことができた
        • -
        -
      • -
        +
        sub replaceMeta {
           return (
             [qr/PhilsImpl/ => \&generateMcMeta],
        diff -r 62aca38647e8 -r e1e0a87b98f8 slide/index.md
        --- a/slide/index.md	Sun Feb 07 17:02:45 2021 +0900
        +++ b/slide/index.md	Sun Feb 07 19:42:16 2021 +0900
        @@ -62,9 +62,9 @@
         
         ---
         # GearsOSのメタ計算フレームワーク
        -- 従来もPerlを中心としたメタコード生成のフレームワークを構築していた
        +- GearsOSはPerlを中心としたメタコード生成のフレームワークが構築されている
             - 計算に必要なデータの入出力のメタ計算を主に生成していた
        -- しかしGearsOSのメタレベルの処理は従来のものは手動で行う方が多かった
        +- メタレベルの処理は従来のものは手動で作る方が多かった
             - 計算で使うすべてのデータ構造の管理
             - 別のInterfaceの出力を受けるメタレベルのデータ管理など
         - Perlでメタレベルに変換された後で気づくエラーも多い
        @@ -72,14 +72,12 @@
             - 変換されてしまった後なのでコードを見比べないと原因が不明
         
         ---
        -# GearsOSのプログラミングフレームワーク
        -- GearsOSはCbCには無いモジュール化の仕組みとしてInterfaceがある
        -    - Perlフレームワーク上に構築されている
        -    - 変換時に等価な純粋なCbCに変換される
        +# GearsOSのメタ計算フレームワークとInterface
        +- CbCには無いモジュール化の仕組みとしてInterfaceがある
        +    - Perlフレームワーク上に構築
        +    - コンパイル時に等価な純粋なCbCに変換する
         - Interfaceの機能が他の言語のInterfaceの機能とギャップがあった
        -    - 実装していないAPIがあっても、変換前の時点でエラーが出ない
        -    - 引数の値が揃っていなくても、変換前の時点でエラーが出ない
        -    - 存在していないAPIを呼んでも、変換前の時点でエラーが出ない
        +    - 実装していないAPIがあっても、変換前の時点でエラーが出ないなど
         - Interfaceの定義ファイルもあるものと無いものがあった
             - トランスパイラで統一な処理が出来ない
         
        @@ -90,14 +88,13 @@
         - Interfaceの機能充実も、 メタ計算の生成もCbCで行うのは難しい
             - Perlを中心としたフレームワークを活用したい
         - コード変換(トランスパイル)を行うために必要な環境の整備もする必要がある
        -- 本研究ではPerlを中心としたトランスパイルシステムの整備、拡張を行った
        +- Perlを中心としたトランスパイルシステムの整備、拡張を行った
             - GearsOSのメタ計算の生成がより柔軟かつ高い信頼性で可能となった
         
         ---
         # GearsOSの基礎概念
         - CodeGear、DataGear
         - Interface
        -- par goto
         - GearsOSのビルドシステム
             - cmake
             - Perlトランスパイラ
        @@ -108,6 +105,14 @@
         - CodeGearはCの関数とアセンブラの中間の様に使える
         - CodeGearは返り値の型の代わりに`__code`で宣言する
         
        +```c
        +__code insertTest2(struct StackTestImpl3* stackTest, struct Stack* stack, __code next(...)) {
        +    String* str = &ALLOCATE(context, String)->String;
        +    str->size = 100;
        +    goto stack->push((union Data*)str, pop2Test);
        +}
        +```
        +
         
         ---
         # DataGear
        @@ -139,13 +144,6 @@
             - DataGearを管理するヒープ情報
         ![w:532 h:10cm](./context.svg)
         
        ----
        -# StubCodeGear
        -- 実行したいCodeGearの直前に実行されるMetaCodeGear
        -- contextからDataGearを取り出す操作をする
        -- すべてのノーマルレベルのCodeGearに付随する
        -    - Perlトランスパイラでビルド時に自動生成
        -![w:532 h:10cm](./stubCodeGear.svg)
         
         ---
         # Interface
        @@ -154,6 +152,9 @@
         - JavaのInteface、Haskellの型クラスに相当する
         - ContextにInterfaceの引数の保存場所がある
             - goto時にStubCodeGearでデータをとってくる
        +- `goto interfaceName->method()`のようにAPIを呼び出す
        +    - Perlトランスパイラが`goto meta()`に書き直す
        +    - `goto meta`はcontextから引数を取り出すMetaCodeGearに継続させるもの
         
         ---
         # GearsOSのビルドシステム
        @@ -167,10 +168,11 @@
         ---
         # GearsOSのビルドシステム
         - generate_stub.pl
        -    - GearsOSで拡張したCbCを受け取り、純粋なCbCに変形したものを生成する
        +    - GearsOSで拡張したCbCを1行ずつ読む
        +    - 純粋なCbCに変形したものを生成する
             - CbCコンパイラがコンパイルする前にコードを変換する
                 - ユーザーが書いたGearsOSのソースコードにメタ情報をつける
        -        - コードからコードを生成するので、トランスパイラと言える
        +        - コードからコードを生成する、トランスパイラ
         - generate\_context.pl
             - Contextに関係するファイルを生成する
                 - Contextの初期化ルーチン
        @@ -181,19 +183,13 @@
         
         
         ---
        -# GearsOSに導入された新機能
        -
        -- ARMクロスコンパイル用のCMakeの定義
        -  - ARM用のアーキテクチャに向けてクロスコンパイルするCMakeを定義
        -  - GearsOSのビルドシステムに手を加えずにクロスコンパイルが可能
        -- **Interface構文の簡素化**
        -    - より簡潔に明確に記述できるように定義した
        -- **Interfaceの実装の型の導入**
        -    - GearsOSでの型定義の方法に一貫性が生まれた
        +# 主なGearsOSに導入された新機能
        +- Interfaceシステムの強化
        +- 手書きからの解放
        +- MetaCodeGearの入れ替え機能の追加
         
         ---
        -# GearsOSに導入された新機能
        -## Interfaceシステムの強化
        +# Interfaceシステムの強化
         - Interface構文の簡素化
             - より簡潔に明確に記述できるように定義した。
         - Interfaceの実装の型の導入
        @@ -203,8 +199,7 @@
         - InterfaceにないAPIの呼び出しの検知
             - コード変換前にPerlレベルでエラーを発生させた
         ---
        -# GearsOSに導入された新機能
        -## 手書きからの解放
        +# 手書きからの解放
         - Interfaceの雛形ファイルの作製スクリプトの導入
         - 別のInterfaceからの出力を取得するStubの自動生成
         - 実装のCodeGear名からメタ情報の切り離し
        @@ -297,28 +292,111 @@
         } PhilsImpl;
         ```
         ---
        -# Interfaceの実装
        -- 定義したInterfaceは実装する必要がある
        -    - Stack Interfaceの場合はSingleLinkedStackなど
        -- cbcファイルにCodeGearやコンストラクタを定義し、 型はcontext.hに直接書く
        +# Interfaceの実装時の型名の省略
        +- 従来は型名を必ず書かなければならなかった
        +    - これはメタ情報なので変換時に書き換える
        +### 従来
         
         ```c
        -__code popSingleLinkedStack(struct SingleLinkedStack* stack, __code next(union Data* data, ...)) {
        -    if (stack->top) {
        -        data = stack->top->data;
        -        stack->top = stack->top->next;
        -    } else {
        -        data = NULL;
        -    }
        -    goto next(data, ...);
        +__code pickup_lforkPhilsImpl(struct PhilsImpl* phils, __code next(...)) {
        +    struct AtomicT_int* left_fork = phils->Leftfork;
        +    goto left_fork->checkAndSet(-1, phils->self, pickup_rforkPhilsImpl, eatingPhilsImpl);
        +
        +}
        +```
        +### 現在
        +
        +```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
        -    struct SingleLinkedStack {
        -        struct Element* top;
        -    } SingleLinkedStack;
        +__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)->oldData = -1;
        +    Gearef(context, AtomicT_int)->newData = phils->self;
        +    Gearef(context, AtomicT_int)->next = C_pickup_rforkPhilsImpl;
        +    Gearef(context, AtomicT_int)->fail = C_eatingPhilsImpl;
        +    goto meta(context, left_fork->checkAndSet);
        +
        +}
         ```
        +---
        +# Interfaceのパーサーの導入
        +- PerlでのInterfaceの情報の取得は、CbC自体のファイルの解析処理と共通だった
        +    - Interfaceならではの情報が取れない
        +    - スクリプトに直接書かれているので他のツールが使えない
        +- モジュール化したInterfaceのパーサーを導入した
        +    - Perlフレームワークを使う一連のツールの作製が可能になった
        +        - InterfaceとImplを見た実装の雛形ファイルの作製ツール
        +        - コード変換時にInterfaceのAPIに関連するチェック機能
        +
        +
        +---
        +# Interfaceの実装の雛形生成コマンドの実装
        +- Interfaceと実装する型が決まると、最低限書かないといけないCodeGearが決まる
        +- 従来は手作業でCbCファイルにCodeGearの定義を書いて実装していた
        +    - コンストラクタも手書き
        +- JavaはIDEで、golangはコマンドとして雛形を生成するものを用意している
        +    - GearsOSでも導入した
        +- 実装の型ファイルを引数で渡すと雛形を生成する
        +```shell
        +$perl too/impl2cbc.pl SingleLinkedStack.h
        +```
        +
        +---
        +# 生成された雛形cbcの一部
        +- 各CodeGearに実装したい内容をすぐに書き始めることが可能になった
        +    - 自動生成されるのでエラーの発生も抑えられる
        +
        +```c
        +#include "../../../context.h"
        +#interface "Stack.h"
        +
        +Stack* createSingleLinkedStack(struct Context* context) {
        +    struct Stack* stack  = new Stack();
        +    struct SingleLinkedStack* single_linked_stack = new SingleLinkedStack();
        +    stack->stack = (union Data*)single_linked_stack;
        +    ...
        +    stack->pop2 = C_pop2SingleLinkedStack;
        +    stack->get2 = C_get2SingleLinkedStack;
        +    return stack;
        +}
        +...
        +
        +__code push(struct SingleLinkedStack* stack,union Data* data, __code next(...)) {
        +
        +    goto next(...);
        +}
        +```
        +
        +---
        +# PerlトランスパイラでのInterfaceのエラー生成
        +- Interfaceの実装時に様々なミスをする可能性がある
        +    - APIを完全に実装していない
        +    - 呼び出しの引数を間違えている
        +    - 無いAPIを呼び出している
        +- 従来は変換した後CbCコンパイラがコンパイルする際や、実行時にしかエラーが出なかった
        +    - どの記述でエラーが出たのかの特定が困難
        +    - CbCコンパイラがコンパイルする前にトランスパイラで検知したい
        +- Perlトランスパイラ内でInterfaceのパーサーを呼び出しエラーを生成させられた
        +    - 変換する前にエラーが完全に検知できた
        +
         
         ---
         # Context定義ファイルの自動生成
        @@ -337,24 +415,74 @@
             } SingleLinkedStack;
         }
         ```
        +---
        +# StubCodeGear
        +- 実行したいCodeGearの直前に実行されるMetaCodeGear
        +- contextからDataGearを取り出す操作をする
        +- すべてのノーマルレベルのCodeGearに付随する
        +    - Perlトランスパイラでビルド時に自動生成
        +![w:632 h:10cm](./stubCodeGear.svg)
        +
        +---
        +## 別のInterfaceの出力を受けるCodeGearのメタ計算部分の自動生成
        +- Stackから`data`と`data1`を受け取ろうとする例
        +    - 意図した通りに動かない
        +
        +```c
        +__code pop2Test(struct StackTestImpl3* stackTest, struct Stack* stack, __code next(...)) {
        +    goto stack->pop2(pop2Test1);
        +}
        +
        +
        +__code pop2Test1(struct StackTestImpl3* stackTest, union Data* data, union Data* data1, struct Stack* stack, __code next(...)) {
        +    String* str = (String*)data;
        +    String* str2 = (String*)data1;
        +
        +    printf("%d\n", str->size);
        +    printf("%d\n", str2->size);
        +    goto next(...);
        +}
        +```
         
         ---
        -# Interfaceのパーサーの導入
        -- PerlでのInterfaceの情報の取得は、CbC自体のファイルの解析処理と共通だった
        -    - Interfaceならではの情報が取れない
        -    - スクリプトに直接書かれているので他のツールが使えない
        -- モジュール化したInterfaceのパーサーを導入した
        -    - Perlフレームワークを使う一連のツールの作製が可能になった
        -        - InterfaceとImplを見た実装の雛形ファイルの作製ツール
        -        - コード変換時にInterfaceのAPIに関連するチェック機能
        +## 別のInterfaceの出力を受けるCodeGearのメタ計算部分の自動生成
        +- Interfaceの継続に別のInterfaceを渡すと値の受け渡しが上手くいかない
        +    - StubCodeGearがおかしい
        +
        +```c
        +__code pop2Test1StackTestImpl3_stub(struct Context* context) {
        +  StackTestImpl3* stackTest = (StackTestImpl3*)GearImpl(context, StackTest, stackTest);
        +  Data* data = Gearef(context, StackTest)->data;
        +  Data* data1 = Gearef(context, StackTest)->data1;
        +  Stack* stack = Gearef(context, StackTest)->stack;
        +  enum Code next = Gearef(context, StackTest)->next;
        +  goto pop2Test1StackTestImpl3(context, stackTest, data, data1, stack, next);
        +}
        +```
        +
         
         ---
        -# メタ計算の切り替え機能
        +- メタ計算部分で取得するcontextの場所が異なっているのが問題
        +    - 取得する場所を手書きする必要があった
        +
        +![w:732 h:13cm](./stackTest1.svg)
        +
        +---
        +## 別のInterfaceの出力を受けるCodeGearのメタ計算部分の自動生成
        +- `goto interface->method()`している箇所を読み取る
        +    - `interface`がどのInterfaceなのかをPerlトランスパイラで特定させた
        +    - 特定したInterfaceをパーサーを呼び出して情報を取得
        +    - APIごとに出力があるかを調査
        +- 出力があったら、継続で渡しているCodeGearの入力を、呼び出しているInterfaceからとるように修正
        +    - データの取り出しはStubでしているので、新たなStubを作製した
        +
        +---
        +# メタ計算の切り替えAPI
         - CodeGearが継続するMetaCodeGearを自由に選択できるPerlモジュールを導入した
             - 従来はデフォルトで設定されるMetaCodeGearにしか継続しなかった
             - Perlモジュールを書くことで特定のCodeGearの継続先を変更可能にした
         - 様々な処理をMetaCodeGearですることが可能になった
        -    - すでにモデル検査用のメタ計算を入れることが出来た(東恩納さんの修論)
        +    - すでにモデル検査用のメタ計算を入れることが出来た
         
         ![w:932 h:10cm](./metapm.svg)
         
        @@ -362,14 +490,14 @@
         ---
         # まとめ
         - Perlトランスパイラのフレームワークの機能を充実させた
        -- 型定義ファイルの導入、呼び出しシンタックスの導入を行った
        -    - DataGearの定義方法に一貫性が出た
        +- Interfaceシステムを改良した
        +    - 型定義ファイルの導入を行った
        +        - 定義方法に一貫性が出た
        +    - Perlトランスパイラで警告を発生させるようになった
         - 従来手書きしていたメタな定義をビルド時に自動的に生成するようにした
             - 煩雑な処理や手で実装することによるバグの混入を回避
         - MetaCodeGearの制御をユーザー側で行えるようにした
             - モデル検査をメタ計算として自在に組み込むことが可能となった
        -- Interfaceシステムを改良し、Perlトランスパイラで警告を発生させるようになった
        -    - 他言語のInterfaceと同様に使うことができた
         
         ---