From b1614dc3530a2167a4977075d9b0bada6e974457 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Wed, 11 Apr 2018 10:45:50 +0300 Subject: [PATCH] start architecture menu --- _layouts/project.html.haml | 20 ---------- _layouts/rubyx.html.haml | 20 ---------- _layouts/site.html.haml | 41 ------------------- app/helpers/application_helper.rb | 13 ++++++ app/views/pages/project/_menu.html.haml | 10 +++++ app/views/pages/rubyx/_menu.haml | 10 +++++ app/views/pages/rubyx/layers.html.haml | 53 +++++++++++++++---------- 7 files changed, 66 insertions(+), 101 deletions(-) delete mode 100644 _layouts/project.html.haml delete mode 100644 _layouts/rubyx.html.haml delete mode 100644 _layouts/site.html.haml create mode 100644 app/views/pages/project/_menu.html.haml create mode 100644 app/views/pages/rubyx/_menu.haml diff --git a/_layouts/project.html.haml b/_layouts/project.html.haml deleted file mode 100644 index f48287c..0000000 --- a/_layouts/project.html.haml +++ /dev/null @@ -1,20 +0,0 @@ -\--- -layout: site -\--- -.row - %div - %h1.center - {{page.title}} - %p.center - %span {{page.sub-title}} - %ul.nav - %li - %a{:href => "/project/motivation.html"} Motivation - %li - %a{:href => "/project/ideas.html"} Ideas - %li - %a{:href => "/project/history.html"} History - %li - %a{:href => "/project/contribute.html"} Contribute - %div - {{content}} diff --git a/_layouts/rubyx.html.haml b/_layouts/rubyx.html.haml deleted file mode 100644 index 360bdb4..0000000 --- a/_layouts/rubyx.html.haml +++ /dev/null @@ -1,20 +0,0 @@ -\--- -layout: site -\--- -.row - %div - %h1.center - {{page.title}} - %p.center - %span {{page.sub-title}} - %ul.nav - %li - %a{:href => "/rubyx/layers.html"} Layers of RubyX - %li - %a{:href => "/rubyx/memory.html"} Memory - %li - %a{:href => "/rubyx/threads.html"} Threads - %li - %a{:href => "/rubyx/optimisations.html"} Optimisation ideas - %div - {{content}} diff --git a/_layouts/site.html.haml b/_layouts/site.html.haml deleted file mode 100644 index b558635..0000000 --- a/_layouts/site.html.haml +++ /dev/null @@ -1,41 +0,0 @@ -!!! -/[if IE 8] -/ [if gt IE 8]> "en"} - / "https://github.com/ruby-x"} - %img{:alt => "Fork me on GitHub", "data-canonical-src" => "https://s3.amazonaws.com/github/ribbons/forkme_left_orange_ff7600.png", :src => "https://camo.githubusercontent.com/8b6b8ccc6da3aa5722903da7b58eb5ab1081adee/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f6c6566745f6f72616e67655f6666373630302e706e67", :style => "position: absolute; top: 0; left: 0; border: 0;"}/ - %ul.nav - %li - %a{:href => "/"} Home - %li - %a{:href => "/rubyx/layers.html"} Architecture - %li - %a{:href => "/typed/typed.html"} Typed layer - %li - %a{:href => "/arm/overview.html"} Arm Resources - %li - %a{:href => "/project/motivation.html"} About - %li - %a{:href => "{{site.posts.first.url}}"} News - %a{:href => "https://github.com/ruby-x"} - %img{:alt => "Logo", :src => "/assets/images/x-small.png", :style => "position: absolute; top: 15px; right: 15px; border: 0; width: 70px"}/ - .container - {{ content }} - %footer - .container - .row.center - %p © Copyright Torsten Ruger 2013-7 - :javascript - (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ - (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), - m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) - })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); - var the_id = 'UA-61481839-1'; - ga('create', the_id.replace("-1" , "-2") , 'auto'); - ga('send', 'pageview'); diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 84dbf31..4d58f64 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -6,4 +6,17 @@ module ApplicationHelper link += link_to( post.title , blog_post_url(post.slug)) link.html_safe end + + + def ext_link(name = nil, options = nil, html_options = nil, &block) + target_blank = {target: "_blank"} + if block_given? + options ||= {} + options = options.merge(target_blank) + else + html_options ||= {} + html_options = html_options.merge(target_blank) + end + link_to(name, options, html_options, &block) + end end diff --git a/app/views/pages/project/_menu.html.haml b/app/views/pages/project/_menu.html.haml new file mode 100644 index 0000000..d0b676f --- /dev/null +++ b/app/views/pages/project/_menu.html.haml @@ -0,0 +1,10 @@ +.row + %ul.nav + %li + %a{:href => "/project/motivation.html"} Motivation + %li + %a{:href => "/project/ideas.html"} Ideas + %li + %a{:href => "/project/history.html"} History + %li + %a{:href => "/project/contribute.html"} Contribute diff --git a/app/views/pages/rubyx/_menu.haml b/app/views/pages/rubyx/_menu.haml new file mode 100644 index 0000000..8c34bbd --- /dev/null +++ b/app/views/pages/rubyx/_menu.haml @@ -0,0 +1,10 @@ +.row + %ul.nav + %li + %a{:href => "/rubyx/layers.html"} Layers of RubyX + %li + %a{:href => "/rubyx/memory.html"} Memory + %li + %a{:href => "/rubyx/threads.html"} Threads + %li + %a{:href => "/rubyx/optimisations.html"} Optimisation ideas diff --git a/app/views/pages/rubyx/layers.html.haml b/app/views/pages/rubyx/layers.html.haml index 694a2be..63bafdd 100644 --- a/app/views/pages/rubyx/layers.html.haml +++ b/app/views/pages/rubyx/layers.html.haml @@ -1,5 +1,7 @@ - title = "RubyX architectural layers" += render "pages/rubyx/menu" + %h1#main-layers Main Layers %p To implement an object system to execute object oriented languages takes a large system. @@ -13,18 +15,20 @@ just push more functionality into the “virtual machine” and it is in fact only the compiling to binaries that gives static languages their speed. This is the reason to compile ruby. -%p - %img{:alt => "Architectural layers", :src => "/assets/layers.jpg"}/ +%p.center + = image_tag "layers.jpg" , alt: "Architectural layers" + %h3#ruby Ruby %p To compile and run ruby, we first need to parse ruby. While parsing ruby is quite a difficult task, it has already been implemented in pure ruby - %a{:href => "https://github.com/whitequark/parser"}> here - \. The output of the parser is + = succeed "." do + =ext_link "here" ,"https://github.com/whitequark/parser" + The output of the parser is an ast, which holds information about the code in instances of a single %em Node class. - Nodes have a type (which you sometimes see in s-expressions) and a list of children. + Nodes have a type attribute (which you sometimes see in s-expressions) and a list of children. %p There are two basic problems when working with ruby ast: one is the a in ast, the other is ruby. %p Since an abstract syntax tree only has one base class, one needs to employ the visitor @@ -34,12 +38,13 @@ The second, possibly bigger problem, is ruby itself: Ruby is full of programmer happiness, three ways to do this, five to do that. To simplify that, remove the duplication and make analyis easier, Vool was created. + %h3#virtual-object-oriented-language Virtual Object Oriented Language %p Virtual, in this context, means that there is no syntax for this language; it is an intermediate representation which %em could - be targeted by several languages. + be targeted by several real languages. %p The main purpose is to simplify existing oo languages down to it’s core components: mostly calling, assignment, continuations and exceptions. Typed classes for each language construct @@ -47,8 +52,14 @@ %p Examples for things that exist in ruby but are broken down in Vool are %em unless - , ternary operator, - do while or for loops and other similar syntactic sugar. + , + %em ternary operator + , + %em do while + or + %em for + loops and other similar syntactic sugar. + %h3#minimal-object-machine Minimal Object machine %p We compile Vool statements into Mom instructions. Mom is a machine, which means it has @@ -61,19 +72,18 @@ functionality is expressed through instructions. Methods are in fact defined (as vool) on classes and then compiled to Mom/Risc/Arm and the results stored in the method object. %p - Compilation to Mom happens in two stages: - 1. The linear statements/code is translated to Mom instructions. - 2. Control statements are translated to jumps and labels. -%p - The second step leaves a linked list of machine instructions as the input for the next stage. - In the future a more elaborate system of optimisations is envisioned between these stages. + The Mom level exists to make the transition to Risc easier. It has a very abstract, + high level instruction set, where each single instruction may resolve to many tens + of lower level instructions. But it breaks down Vool's tree into an instruction + list, which is conceptually a much easier input for the next layer. + %h3#risc Risc %p The Register machine layer is a relatively close abstraction of risc hardware, but without the quirks. %p The Risc machine has registers, indexed addressing, operators, branches and everything - needed for the next layer. It does not try to abstract every possible machine feature + needed to implement Mom. It does not try to abstract every possible machine feature (like llvm), but rather “objectifies” the general risc view to provide what is needed for the Mom layer, the next layer up. %p @@ -93,6 +103,7 @@ Visualizing the control flow and being able to see values updated immediately helped tremendously in creating this layer. And the interpreter helps in testing, ie keeping it working in the face of developer change. + %h3#binary--arm-and-elf Binary , Arm and Elf %p A physical machine will run binaries containing instructions that the cpu understands, in a @@ -100,9 +111,11 @@ these layers. %p Arm is a risc architecture, but anyone who knows it will attest, with it’s own quirks. - For example any instruction may be executed conditionally in arm. Or there is no 32bit - register load instruction. It is possible to create very dense code using all the arm - special features, but this is not implemented yet. + For example any instruction may be executed conditionally, ie + %em every + instruction carries bits to make it check the status register. Or the fact that there + is no 32bit register load instruction. It is possible to create very dense code using + all the arm special features, but this is not implemented yet. %p - All Arm instructions are (ie derive from) Register instruction and there is an ArmTranslator - that translates RegisterInstructions to ArmInstructions. + The Arm::Translator translates that translates RegisterInstructions to ArmInstructions, + and the Elf::ObjectWriter creates Linux binaries.