{"id":26889758,"url":"https://github.com/zpnst/operational-semantics","last_synced_at":"2025-03-31T21:56:22.317Z","repository":{"id":284598129,"uuid":"955444923","full_name":"zpnst/operational-semantics","owner":"zpnst","description":"A simple implementation of the operational semantics of small and big steps in Ruby","archived":false,"fork":false,"pushed_at":"2025-03-26T18:25:21.000Z","size":5,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-26T18:26:01.477Z","etag":null,"topics":["interpreters","operational-semantics","ruby","semantics"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zpnst.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-03-26T16:43:48.000Z","updated_at":"2025-03-26T18:25:25.000Z","dependencies_parsed_at":"2025-03-26T18:36:12.760Z","dependency_job_id":null,"html_url":"https://github.com/zpnst/operational-semantics","commit_stats":null,"previous_names":["zpnst/operational-semantics"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zpnst%2Foperational-semantics","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zpnst%2Foperational-semantics/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zpnst%2Foperational-semantics/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zpnst%2Foperational-semantics/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zpnst","download_url":"https://codeload.github.com/zpnst/operational-semantics/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246547388,"owners_count":20794970,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["interpreters","operational-semantics","ruby","semantics"],"created_at":"2025-03-31T21:56:21.781Z","updated_at":"2025-03-31T21:56:22.307Z","avatar_url":"https://github.com/zpnst.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Предисловие\n\nКод программ был взят из книги, которая указана в конце в ссылках. В коде были исправлены ошибки(*так как по мере продвижения по примерам и изменения кода под них — предыдущие примеры работать переставали*), он был переделан в более понятный и приятный вид, а также были сделаны незначительные дополнения.\n\n# Операционная семантика \n\nСемантика языка программирования — это смысл, стоящий за синтаксическими конструкциями, или, проще говоря, за программой.\n\nТут рассматривается именно операционная семантика. \n\n*Цитата из книги № 1*\n```\nСамый практически полезный способ рассуждать о смысле про-\nграммы – задать вопрос «что она делает?»; что мы ожидаем получить\nв результате запуска программы? Как различные конструкции языка\nпрограммирования ведут себя во время выполнения и что происходит,\nкогда мы объединяем их для получения более крупной программы?\n```\n\nПрименив операционную семантику, мы можем строго и точно описать назначение различных конструкций языка. Существует два её вида — операционная семантика мелких шагов и операционная семантика крупных шагов.\n\n## Операционная семантика мелких шагов\n\nОперационная семантика мелких шагов направлена на определение правил исполнения или свёртывания программ на специфицируемом языке программирования. Под свёртыванием понимается уменьшение программы шаг за шагом, пока мы не дойдём до момента, когда свёртывать больше нечего. Можно сравнить этот процесс с накоплением в стеке рекурсивных вызовов и базой рекурсии.\n\nСвёртывания эти выполняет некая абстрактная машина, она и описана в этом репозитории на языке Ruby. Обычно для языка программирования с названием “\u003c(0_0)\u003e” такая машина называется “\u003c(0_0)\u003e машина” .\n\n*Цитата из книги № 2*\n```\nМы только что видели, как устроена операционная семантика\nмелких шагов: мы проектируем абстрактную машину, которая хра-\nнит некоторое состояние выполнения, а затем определяем правила\nсвертки, которые говорят, каким образом каждая программная кон-\nструкция может постепенно продвигаться к результату вычисления.\n```\n## Операционная семантика крупных шагов\n\nОперационная семантика крупных шагов призвана объяснить то же самое, но сделать это в  более непосредственной форме, сразу описав, что происходит при выполнении программы. То есть при таком подходе мы шаг за шагом не свёртываем исходных код программы, а сразу говорим что он делает.\n\n*Цитата из книги № 3*\n```\nПравила семантики крупных шагов описывают, как вы-\nчислить результат всей программы, обойдя его абстрактное синтак-\nсическое дерево в один заход, поэтому ни состояния, ни повторения\nне будет.\n```\n\n# Вывод программ \n\nСлева — вывод семантики крупных шагов, справа — мелких. Конечный результат идентичен, но в случае с малыми шагами мы подробно видим этапы вычисления, точнее даже свёртывания программы. Так как абстрактная машина в цикле переходит от состояния к состоянию пока есть что свёртывать. В случае же с крупными шагами как код, так и вывод получился намного короче, так как мы не нуждаемся в абстрактной машине и состояниях.\n\n\u003cimg src=\"images/listing.png\" alt=\"\" width=\"888\"\u003e\n\n# Наблюдения\n\nПо сути, описывая операционную семантику языка программирования не в математической нотации, а на другом языке – мы получаем интерпретатор :) \n\n*Цитата из книги № 4*\n```\nОт вашего внимания, наверное, не ускользнул тот факт, что при\nзаписи семантики мелких и крупных шагов языка SIMPLE на Ruby\nвместо математического формализма мы реализовали два разных\nинтерпретатора. Именно в этом и состоит существо операционной\nсемантики: объяснения смысла языка путем описания его интерпре-\nтатора.\n```\n\n# Запуск примеров\n\n```bash\ngit clone git@github.com:zpnst/operational-semantics.git\ncd operational-semantics\nmake run_big\nmake run_small\n```\n# Ссылки\n\n1. [Теория вычислений для программистов, глава 2](https://ftp.zhirov.kz/books/IT/Other/%D0%A2%D0%B5%D1%80%D0%B8%D1%8F%20%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B4%D0%BB%D1%8F%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%BE%D0%B2%20%28%D0%A2%D0%BE%D0%BC%20%D0%A1%D1%82%D1%8E%D0%B0%D1%80%D1%82%29.pdf)\n2. [wikipedia(без шуток)](https://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D0%BC%D0%B0%D0%BD%D1%82%D0%B8%D0%BA%D0%B0_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5))\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzpnst%2Foperational-semantics","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzpnst%2Foperational-semantics","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzpnst%2Foperational-semantics/lists"}