commit b3f00e14ab87271eb483b3318b6fb086b8384f5f Author: Antranig Vartanian Date: Wed Sep 11 16:42:43 2024 +0400 initial diff --git a/README.md b/README.md new file mode 100644 index 0000000..1fd62cb --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# website diff --git a/assets/css/simple.css b/assets/css/simple.css new file mode 100644 index 0000000..b9b6e1f --- /dev/null +++ b/assets/css/simple.css @@ -0,0 +1,715 @@ +/* Global variables. */ +:root, +::backdrop { + /* Set sans-serif & mono fonts */ + --sans-font: -apple-system, BlinkMacSystemFont, "Avenir Next", Avenir, + "Nimbus Sans L", Roboto, "Noto Sans", "Segoe UI", Arial, Helvetica, + "Helvetica Neue", sans-serif; + --mono-font: Consolas, Menlo, Monaco, "Andale Mono", "Ubuntu Mono", monospace; + --standard-border-radius: 5px; + + /* Default (light) theme */ + --bg: #fff; + --accent-bg: #f5f7ff; + --text: #212121; + --text-light: #585858; + --border: #898EA4; + --accent: #0d47a1; + --accent-hover: #1266e2; + --accent-text: var(--bg); + --code: #d81b60; + --preformatted: #444; + --marked: #ffdd33; + --disabled: #efefef; +} + +/* Dark theme */ +@media (prefers-color-scheme: dark) { + :root, + ::backdrop { + color-scheme: dark; + --bg: #212121; + --accent-bg: #2b2b2b; + --text: #dcdcdc; + --text-light: #ababab; + --accent: #ffb300; + --accent-hover: #ffe099; + --accent-text: var(--bg); + --code: #f06292; + --preformatted: #ccc; + --disabled: #111; + } + /* Add a bit of transparency so light media isn't so glaring in dark mode */ + img, + video { + opacity: 0.8; + } + .logo { + filter: invert(1); + } +} + +/* Reset box-sizing */ +*, *::before, *::after { + box-sizing: border-box; +} + +/* Reset default appearance */ +textarea, +select, +input, +progress { + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; +} + +html { + /* Set the font globally */ + font-family: var(--sans-font); + scroll-behavior: smooth; +} + +/* Make the body a nice central block */ +body { + color: var(--text); + background-color: var(--bg); + font-size: 1.15rem; + line-height: 1.5; + display: grid; + grid-template-columns: 1fr min(45rem, 90%) 1fr; + margin: 0; +} +body > * { + grid-column: 2; +} + +/* Make the header bg full width, but the content inline with body */ +body > header { + background-color: var(--accent-bg); + border-bottom: 1px solid var(--border); + text-align: center; + padding: 0 0.5rem 2rem 0.5rem; + grid-column: 1 / -1; +} + +body > header > *:only-child { + margin-block-start: 2rem; +} + +body > header h1 { + max-width: 1200px; + margin: 1rem auto; +} + +body > header p { + max-width: 40rem; + margin: 1rem auto; +} + +/* Add a little padding to ensure spacing is correct between content and header > nav */ +main { + padding-top: 1.5rem; +} + +body > footer { + margin-top: 4rem; + padding: 2rem 1rem 1.5rem 1rem; + color: var(--text-light); + font-size: 0.9rem; + text-align: center; + border-top: 1px solid var(--border); +} + +/* Format headers */ +h1 { + font-size: 3rem; +} + +h2 { + font-size: 2.6rem; + margin-top: 3rem; +} + +h3 { + font-size: 2rem; + margin-top: 3rem; +} + +h4 { + font-size: 1.44rem; +} + +h5 { + font-size: 1.15rem; +} + +h6 { + font-size: 0.96rem; +} + +p { + margin: 1.5rem 0; +} + +/* Prevent long strings from overflowing container */ +p, h1, h2, h3, h4, h5, h6 { + overflow-wrap: break-word; +} + +/* Fix line height when title wraps */ +h1, +h2, +h3 { + line-height: 1.1; +} + +/* Reduce header size on mobile */ +@media only screen and (max-width: 720px) { + h1 { + font-size: 2.5rem; + } + + h2 { + font-size: 2.1rem; + } + + h3 { + font-size: 1.75rem; + } + + h4 { + font-size: 1.25rem; + } +} + +/* Format links & buttons */ +a, +a:visited { + color: var(--accent); +} + +a:hover { + text-decoration: none; +} + +button, +.button, +a.button, /* extra specificity to override a */ +input[type="submit"], +input[type="reset"], +input[type="button"], +label[type="button"] { + border: 1px solid var(--accent); + background-color: var(--accent); + color: var(--accent-text); + padding: 0.5rem 0.9rem; + text-decoration: none; + line-height: normal; +} + +.button[aria-disabled="true"], +input:disabled, +textarea:disabled, +select:disabled, +button[disabled] { + cursor: not-allowed; + background-color: var(--disabled); + border-color: var(--disabled); + color: var(--text-light); +} + +input[type="range"] { + padding: 0; +} + +/* Set the cursor to '?' on an abbreviation and style the abbreviation to show that there is more information underneath */ +abbr[title] { + cursor: help; + text-decoration-line: underline; + text-decoration-style: dotted; +} + +button:enabled:hover, +.button:not([aria-disabled="true"]):hover, +input[type="submit"]:enabled:hover, +input[type="reset"]:enabled:hover, +input[type="button"]:enabled:hover, +label[type="button"]:hover { + background-color: var(--accent-hover); + border-color: var(--accent-hover); + cursor: pointer; +} + +.button:focus-visible, +button:focus-visible:where(:enabled), +input:enabled:focus-visible:where( + [type="submit"], + [type="reset"], + [type="button"] +) { + outline: 2px solid var(--accent); + outline-offset: 1px; +} + +/* Format navigation */ +header > nav { + font-size: 1rem; + line-height: 2; + padding: 1rem 0 0 0; +} + +/* Use flexbox to allow items to wrap, as needed */ +header > nav ul, +header > nav ol { + align-content: space-around; + align-items: center; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + list-style-type: none; + margin: 0; + padding: 0; +} + +/* List items are inline elements, make them behave more like blocks */ +header > nav ul li, +header > nav ol li { + display: inline-block; +} + +header > nav a, +header > nav a:visited { + margin: 0 0.5rem 1rem 0.5rem; + border: 1px solid var(--border); + border-radius: var(--standard-border-radius); + color: var(--text); + display: inline-block; + padding: 0.1rem 1rem; + text-decoration: none; +} + +header > nav a:hover, +header > nav a.current, +header > nav a[aria-current="page"], +header > nav a[aria-current="true"] { + border-color: var(--accent); + color: var(--accent); + cursor: pointer; +} + +/* Reduce nav side on mobile */ +@media only screen and (max-width: 720px) { + header > nav a { + border: none; + padding: 0; + text-decoration: underline; + line-height: 1; + } +} + +/* Consolidate box styling */ +aside, details, pre, progress { + background-color: var(--accent-bg); + border: 1px solid var(--border); + border-radius: var(--standard-border-radius); + margin-bottom: 1rem; +} + +aside { + font-size: 1rem; + width: 30%; + padding: 0 15px; + margin-inline-start: 15px; + float: right; +} +*[dir="rtl"] aside { + float: left; +} + +/* Make aside full-width on mobile */ +@media only screen and (max-width: 720px) { + aside { + width: 100%; + float: none; + margin-inline-start: 0; + } +} + +article, fieldset, dialog { + border: 1px solid var(--border); + padding: 1rem; + border-radius: var(--standard-border-radius); + margin-bottom: 1rem; +} + +article h2:first-child, +section h2:first-child, +article h3:first-child, +section h3:first-child { + margin-top: 1rem; +} + +section { + border-top: 1px solid var(--border); + border-bottom: 1px solid var(--border); + padding: 2rem 1rem; + margin: 3rem 0; +} + +/* Don't double separators when chaining sections */ +section + section, +section:first-child { + border-top: 0; + padding-top: 0; +} + +section + section { + margin-top: 0; +} + +section:last-child { + border-bottom: 0; + padding-bottom: 0; +} + +details { + padding: 0.7rem 1rem; +} + +summary { + cursor: pointer; + font-weight: bold; + padding: 0.7rem 1rem; + margin: -0.7rem -1rem; + word-break: break-all; +} + +details[open] > summary + * { + margin-top: 0; +} + +details[open] > summary { + margin-bottom: 0.5rem; +} + +details[open] > :last-child { + margin-bottom: 0; +} + +/* Format tables */ +table { + border-collapse: collapse; + margin: 1.5rem 0; +} + +figure > table { + width: max-content; + margin: 0; +} + +td, +th { + border: 1px solid var(--border); + text-align: start; + padding: 0.5rem; +} + +th { + background-color: var(--accent-bg); + font-weight: bold; +} + +tr:nth-child(even) { + /* Set every other cell slightly darker. Improves readability. */ + background-color: var(--accent-bg); +} + +table caption { + font-weight: bold; + margin-bottom: 0.5rem; +} + +/* Format forms */ +textarea, +select, +input, +button, +.button { + font-size: inherit; + font-family: inherit; + padding: 0.5rem; + margin-bottom: 0.5rem; + border-radius: var(--standard-border-radius); + box-shadow: none; + max-width: 100%; + display: inline-block; +} +textarea, +select, +input { + color: var(--text); + background-color: var(--bg); + border: 1px solid var(--border); +} +label { + display: block; +} +textarea:not([cols]) { + width: 100%; +} + +/* Add arrow to drop-down */ +select:not([multiple]) { + background-image: linear-gradient(45deg, transparent 49%, var(--text) 51%), + linear-gradient(135deg, var(--text) 51%, transparent 49%); + background-position: calc(100% - 15px), calc(100% - 10px); + background-size: 5px 5px, 5px 5px; + background-repeat: no-repeat; + padding-inline-end: 25px; +} +*[dir="rtl"] select:not([multiple]) { + background-position: 10px, 15px; +} + +/* checkbox and radio button style */ +input[type="checkbox"], +input[type="radio"] { + vertical-align: middle; + position: relative; + width: min-content; +} + +input[type="checkbox"] + label, +input[type="radio"] + label { + display: inline-block; +} + +input[type="radio"] { + border-radius: 100%; +} + +input[type="checkbox"]:checked, +input[type="radio"]:checked { + background-color: var(--accent); +} + +input[type="checkbox"]:checked::after { + /* Creates a rectangle with colored right and bottom borders which is rotated to look like a check mark */ + content: " "; + width: 0.18em; + height: 0.32em; + border-radius: 0; + position: absolute; + top: 0.05em; + left: 0.17em; + background-color: transparent; + border-right: solid var(--bg) 0.08em; + border-bottom: solid var(--bg) 0.08em; + font-size: 1.8em; + transform: rotate(45deg); +} +input[type="radio"]:checked::after { + /* creates a colored circle for the checked radio button */ + content: " "; + width: 0.25em; + height: 0.25em; + border-radius: 100%; + position: absolute; + top: 0.125em; + background-color: var(--bg); + left: 0.125em; + font-size: 32px; +} + +/* Makes input fields wider on smaller screens */ +@media only screen and (max-width: 720px) { + textarea, + select, + input { + width: 100%; + } +} + +/* Set a height for color input */ +input[type="color"] { + height: 2.5rem; + padding: 0.2rem; +} + +/* do not show border around file selector button */ +input[type="file"] { + border: 0; +} + +/* Misc body elements */ +hr { + border: none; + height: 1px; + background: var(--border); + margin: 1rem auto; +} + +mark { + padding: 2px 5px; + border-radius: var(--standard-border-radius); + background-color: var(--marked); + color: black; +} + +mark a { + color: #0d47a1; +} + +img, +video { + max-width: 100%; + height: auto; + border-radius: var(--standard-border-radius); +} + +figure { + margin: 0; + display: block; + overflow-x: auto; +} + +figure > img, +figure > picture > img { + display: block; + margin-inline: auto; +} + +figcaption { + text-align: center; + font-size: 0.9rem; + color: var(--text-light); + margin-block: 1rem; +} + +blockquote { + margin-inline-start: 2rem; + margin-inline-end: 0; + margin-block: 2rem; + padding: 0.4rem 0.8rem; + border-inline-start: 0.35rem solid var(--accent); + color: var(--text-light); + font-style: italic; +} + +cite { + font-size: 0.9rem; + color: var(--text-light); + font-style: normal; +} + +dt { + color: var(--text-light); +} + +/* Use mono font for code elements */ +code, +pre, +pre span, +kbd, +samp { + font-family: var(--mono-font); + color: var(--code); +} + +kbd { + color: var(--preformatted); + border: 1px solid var(--preformatted); + border-bottom: 3px solid var(--preformatted); + border-radius: var(--standard-border-radius); + padding: 0.1rem 0.4rem; +} + +pre { + padding: 1rem 1.4rem; + max-width: 100%; + overflow: auto; + color: var(--preformatted); +} + +/* Fix embedded code within pre */ +pre code { + color: var(--preformatted); + background: none; + margin: 0; + padding: 0; +} + +/* Progress bars */ +/* Declarations are repeated because you */ +/* cannot combine vendor-specific selectors */ +progress { + width: 100%; +} + +progress:indeterminate { + background-color: var(--accent-bg); +} + +progress::-webkit-progress-bar { + border-radius: var(--standard-border-radius); + background-color: var(--accent-bg); +} + +progress::-webkit-progress-value { + border-radius: var(--standard-border-radius); + background-color: var(--accent); +} + +progress::-moz-progress-bar { + border-radius: var(--standard-border-radius); + background-color: var(--accent); + transition-property: width; + transition-duration: 0.3s; +} + +progress:indeterminate::-moz-progress-bar { + background-color: var(--accent-bg); +} + +dialog { + max-width: 40rem; + margin: auto; +} + +dialog::backdrop { + background-color: var(--bg); + opacity: 0.8; +} + +@media only screen and (max-width: 720px) { + dialog { + max-width: 100%; + margin: auto 1em; + } +} + +/* Superscript & Subscript */ +/* Prevent scripts from affecting line-height. */ +sup, sub { + vertical-align: baseline; + position: relative; +} + +sup { + top: -0.4em; +} + +sub { + top: 0.3em; +} + +/* Classes for notices */ +.notice { + background: var(--accent-bg); + border: 2px solid var(--border); + border-radius: var(--standard-border-radius); + padding: 1.5rem; + margin: 2rem 0; +} diff --git a/assets/css/style.css b/assets/css/style.css new file mode 100644 index 0000000..5883d4c --- /dev/null +++ b/assets/css/style.css @@ -0,0 +1,42 @@ +.post-link { + font-size: 1.6rem; + font-weight: bold; +} + +.meta { + color: var(--text-light); + font-size: 1rem; +} + +.blog-item { + margin-bottom: 4rem; +} + +nav a.current { + color: var(--accent) !important; + border-color: var(--accent) !important; +} + +.medium { + font-size: 1.4rem; +} + +.small { + font-size: 1rem; +} + +.icon { + vertical-align: sub; + padding-right: .25rem; + display: inline-block; + width: 1em; + height: 1.3em; + margin-right: 0.2rem; + stroke-width: 0; + stroke: currentColor; + fill: currentColor; +} + +.under { + text-decoration: underline; +} diff --git a/assets/images/vishap.png b/assets/images/vishap.png new file mode 100644 index 0000000..6c7e05b Binary files /dev/null and b/assets/images/vishap.png differ diff --git a/assets/pdf/Oberon-Report.pdf b/assets/pdf/Oberon-Report.pdf new file mode 100644 index 0000000..3d001b9 Binary files /dev/null and b/assets/pdf/Oberon-Report.pdf differ diff --git a/assets/pdf/Oberon07-Report.pdf b/assets/pdf/Oberon07-Report.pdf new file mode 100644 index 0000000..2bcb834 Binary files /dev/null and b/assets/pdf/Oberon07-Report.pdf differ diff --git a/assets/pdf/Oberon2-Report.pdf b/assets/pdf/Oberon2-Report.pdf new file mode 100644 index 0000000..f077027 Binary files /dev/null and b/assets/pdf/Oberon2-Report.pdf differ diff --git a/assets/pdf/Oberon2.OOP.pdf b/assets/pdf/Oberon2.OOP.pdf new file mode 100644 index 0000000..5064e96 Binary files /dev/null and b/assets/pdf/Oberon2.OOP.pdf differ diff --git a/assets/pdf/ProgrammingInOberon.pdf b/assets/pdf/ProgrammingInOberon.pdf new file mode 100644 index 0000000..0a723b8 Binary files /dev/null and b/assets/pdf/ProgrammingInOberon.pdf differ diff --git a/assets/pdf/oakwood-guidelines.pdf b/assets/pdf/oakwood-guidelines.pdf new file mode 100644 index 0000000..d854fde Binary files /dev/null and b/assets/pdf/oakwood-guidelines.pdf differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..34ad419 --- /dev/null +++ b/index.html @@ -0,0 +1,402 @@ + + + + + + + + +Vishap Oberon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +

Vishap Oberon Compiler

+

Make it as simple as possible, but not simpler — A. Einstein

+ + +

Oberon-2 Compiler, Libraries and Tooling

+ +
+ + + +
+ +
+

Vishap Oberon Compiler

+

Vishaps are dragons from the Armenian Highlands. We named the project 'Vishap' due to the long-standing tradition between dragons and compilers.

+
+ +
+

Vishap Oberon Compiler

+

Oberon is a general-purpose programming language first published in 1987 by Niklaus Wirth and the latest member of the Wirthian family of ALGOL-like languages (Euler, ALGOL W, Pascal, Modula, and Modula-2).

+

Oberon's design goals are

+
    +
  • Simplicity
  • +
  • Support for system programming
  • +
  • Isolation of unsafe code
  • +
  • Modules and separate compilation
  • +
  • Type-extension with runtime type test
  • +
+ +

Oberon is designed around the following principles:

+
+

Make it as simple as possible, but not simpler.

+

– Albert Einstein

+
+ +
+

Perfection is finally attained not when there is no longer anything to add, but when there is no longer anything to take away.

+

– Antoine de Saint-Exupéry

+
+ +

To learn more about Oberon, check examples.

+
+ +
+

Vishap Oberon Compiler

+

Ѵishap Oberon is a free and open source (GPLv3) implementation of the Oberon-2 language and libraries for use on conventional operating systems.

+ +

Vishaps Oberon Compiler (voc) uses a C backend (gcc, clang, tcc or msc) to compile Oberon programs under Unix, Mac or Windows. Vishap Oberon includes libraries from the Ulm, oo2c and Ofront Oberon compilers, as well as default libraries complying with the Oakwood Guidelines for Oberon-2 compilers.

+ +

Vishap Oberon Compiler runs on

+
    +
  • Linux
  • +
  • macOS
  • +
  • Cygwin under Windows, MingW under Cygwin, WSL on Windows
  • +
  • FreeBSD
  • +
  • OpenBSD
  • +
  • Android
  • +
  • ReactOS
  • +
  • illumos (with limited support, at the moment)
  • +
+ +

Work on native backends for x86_64(amd64) and arm64(aarch64) is in progress.

+ +
+ +
+

Examples

+ +

Hello, World!

+ hello.Mod +

+MODULE hello;
+IMPORT Out;
+BEGIN
+  Out.String("Hello, World"); Out.Ln
+END hello.
+        
+ +

+$ voc -m hello.Mod 
+hello.Mod  Compiling hello.  Main program.  380 chars.
+
+$ ./hello  +Hello, World +
+

Basic Arithmetic

+ Arithmetic.Mod +

+MODULE arithmetic;
+IMPORT Out;
+
+VAR
+  a, b, result: INTEGER;
+(* This is a comment, by the way :) *)
+BEGIN
+  a := 15;
+  b := 5;
+
+  result := a + b;
+  Out.Int(result, 0); Out.Ln;
+
+  result := a * b;
+  Out.Int(result, 0); Out.Ln;
+
+  result := a DIV b;
+  Out.Int(result, 0); Out.Ln;
+END arithmetic.
+        
+ +

+$ voc -m Arithmetic.Mod 
+Arithmetic.Mod  Compiling arithmetic.  Main program.  718 chars.
+
+$ ./arithmetic  +20 +75 +3 +
+ +

Procedures

+ Proc.Mod +

+MODULE Procedures;
+IMPORT Out;
+
+(*
+  Comments can be multi-line
+
+  Add takes in `a` and `b` integers, and returns an integer
+
+  (* comments can also be nested, unlike most other languages *)
+*)
+PROCEDURE Add(a, b: INTEGER): INTEGER;
+BEGIN
+  RETURN a + b;
+END Add;
+
+BEGIN
+  Out.Int(Add(3, 7), 0); Out.Ln; (* Output: 10 *)
+END Procedures.
+        
+ +

+$ voc -m Proc.Mod 
+Proc.Mod  Compiling Procedures.  Main program.  495 chars.
+
+$ ./Procedures +10 +
+

Pass by Value vs Reference

+ ValVsRef.Mod +

+MODULE ValVsRef;
+IMPORT Out;
+
+VAR
+  number: INTEGER;
+
+
+PROCEDURE IncrementValue(i: INTEGER);
+BEGIN
+  i := i + 1;
+  Out.String("During IncrementValue (pass by value),           in function scope: "); Out.Int(i, 0); Out.Ln;
+END IncrementValue;
+
+PROCEDURE IncrementByReference(VAR i: INTEGER);
+BEGIN
+  i := i + 1;
+  Out.String("During IncrementByReference (pass by reference), in function scope: "); Out.Int(i, 0); Out.Ln;
+END IncrementByReference;
+
+BEGIN
+  (* Pass by Value *)
+  number := 5;
+  Out.String("Initial value of number: "); Out.Int(number, 0); Out.Ln;
+
+  IncrementValue(number);
+  Out.String("After  IncrementValue (pass by value),           in main scope: "); Out.Int(number, 0); Out.Ln;
+
+  (* Pass by Reference *)
+  IncrementByReference(number);
+  Out.String("After  IncrementByReference (pass by reference), in main scope: "); Out.Int(number, 0); Out.Ln;
+END ValVsRef.
+        
+ +

+$ voc -m ValVsRef.Mod 
+ValVsRef.Mod  Compiling ValVsRef.  Main program.  1320 chars.
+
+$ ./ValVsRef  +Initial value of number: 5 +During IncrementValue (pass by value),           in function scope: 6 +After  IncrementValue (pass by value),           in main scope: 5 +During IncrementByReference (pass by reference), in function scope: 6 +After  IncrementByReference (pass by reference), in main scope: 6 +
+ +

Records and Type Extension

+ Students.Mod +

+MODULE Students;
+IMPORT Out;
+
+TYPE
+  Person = RECORD
+    name: ARRAY 32 OF CHAR;
+    age: INTEGER;
+  END;
+
+  Student = RECORD(Person)
+    id: INTEGER;
+  END;
+
+VAR
+  s0: Student;
+
+BEGIN
+  s0.name := "John Doe";
+  s0.age  := 42;
+  s0.id   := 1337;
+  Out.String(s0.name); Out.Ln;
+  Out.Int(s0.age, 0);  Out.Ln;
+  Out.Int(s0.id, 0);   Out.Ln;
+END Students.
+        
+ +

+$ voc -m Students.Mod 
+Students.Mod  Compiling Students.  Main program.  1075 chars.
+
+$ ./Students  +John Doe +42 +1337 +
+
+ + +
+

Resources

+ +
+
+

Timeline

+
    +
  • May 2022 v2.1.2 release
  • +
  • Nov 2016 v2.0 release
  • +
  • Sep 2014 v1.0 release
  • +
  • Sep 2013 voc initial commit
  • +
  • 2012 Josef Templ’s Ofront compiler relicense to BSDL
  • +
  • 1991 Oberon-2
  • +
  • 1986/1987 Oberon Report published
  • +
+
+
+ + + +