From 8a25539f91700110ce9cb758658c6b0df47ba81a Mon Sep 17 00:00:00 2001 From: Andrew G Date: Mon, 8 Dec 2025 16:42:53 +0700 Subject: [PATCH] docs: add early programming languages section (Fortran, ALGOL, Lisp) with references --- main.typ | 152 ++++++++++++++++++++++++++++++++++++++++++------- references.bib | 48 +++++++++++++++- 2 files changed, 180 insertions(+), 20 deletions(-) diff --git a/main.typ b/main.typ index 71a6a04..5cdeceb 100644 --- a/main.typ +++ b/main.typ @@ -1,10 +1,14 @@ +#let text-indentation = 1.25cm +#let text-size = 14pt +#let leading = 1em + #set text( font: "Times New Roman", - size: 14pt, + size: text-size, lang: "ru" ) -#show heading: set text(size: 14pt) +#show heading: set text(size: text-size) #set page( paper: "a4", @@ -14,25 +18,28 @@ left: 3cm, right: 1cm ), - numbering: "1" ) #set heading( numbering: "1.1.1.1", ) -#show heading.where(level: 1): set block(below: 2em) +#show heading.where(level: 1): set block(below: leading*2) +#show heading.where(level: 2): set block(above: leading*2, below: leading*2) +#show heading.where(level: 3): set block(above: leading*2, below: leading*2) +#show heading: it => pad(left: text-indentation, it) +#show figure: it => pad(top: leading, bottom: leading, it) #set par( justify: true, - leading: 1em, + leading: leading, first-line-indent: ( - amount: 1.25cm, + amount: text-indentation, all: true ), ) -#show "〜": h(1.25cm) +#show "〜": h(text-indentation) #align( center, @@ -44,10 +51,13 @@ #pagebreak() #align( - center, - heading( - numbering: none, - "Введение" + center, + pad( + left: -text-indentation, + heading( + numbering: none, + "Введение" + ) ) ) @@ -63,11 +73,112 @@ #pagebreak() += Ранние языки для научных расчётов + +== Fortran -- первый язык для научных вычислений + +Fortran (аббревиатура от *FOR*-mula *TRAN*-slation, "транслятор формул") разработан командой IBM под руководством Джона Бэкуса в 1954–1957 годах. Первая версия (Fortran I) выпущена в 1957 для компьютера IBM 704@noauthor_fortran_nodate. Проект начался из-за того, что написание программ в машинных кодах было крайне трудоёмким, как характеризовал этот процесс сам Бэкус: "Рукопашный бой с машиной@noauthor_fortran_nodate." + +Ключевой проблемой был разрыв между мышлением учёных и инженеров -- формулами -- и тем, что понимала машина -- машинные коды. Fortran был сделан так, что код на этом языке был довольно близок к математической нотации (@listing-1). + +#figure( + ```f90 + Y = A*X**2 + B*X + C + ```, + caption: [Пример кода на языке Fortran] +) + +Такой подход позволил уменьшить как объёмы кода, так и снизить количество ошибок при его написании. + +Компиляторы Fortran принесли новые виды оптимизации кода: развёртку циклов, распределение регистров, оптимизация повторяющихся подвыражений и другие. Что особенно важно -- генерируемый код был сопоставим по эффективности с ассемблерным кодом, написанным вручную, а иногда даже быстрее. + +Таким образом, Fortran стал фундаментом для высокопроизводительных вычислений: + +#list( + [ + стандартизация научных расчётов: общий язык для численного программирования; + ], + [ + библиотеки: BLAS, LINPACK/LAPACK и другие фундаментальные библиотеки написаны на Fortran; + ], + [ + портируемость: код можно было переносить между разными компьютерами, для которых был доступен компилятор Fortran; + ], + [ + долголетие: современные версии до сих пор используются в суперкомпьютерных центрах. + ], + marker: "-", + indent: text-indentation, +) + +При этом разработка и улучшение Fortran не остановилась, отдельные его модули и библиотеки до сих пор используются для высокопроизводительных вычислений, а последняя версия языка была выпущена в 2023 году. + +== Алгол, Лисп и компиляторы + +Но не Фортраном единым замыкается разработка программ. + +=== Algol + +В 1958 году комитетом европейских и американских учёных на съезде в институте ETH в Цюрихе был разработан язык программирования ALGOL (аббревиатура от *ALGO*-rithmic *L*-anguage, "алгоритмический язык"), точнее его вариант ALGOL 58 @noauthor_why_nodate. + +В ходе разработки языка были выведены его ключевые концепции: + +#list( + [ блочная структура программ; ], + [ разрешение рекурсии; ], + [ формальное описание синтаксиса в форме BNF-нотации. ], + marker: "-", + indent: text-indentation, +) + +Многи последующие императивные языки программирования позаимствовали синтаксис Алгола -- но стоит отметить, что сам язык широкого распространения за пределами научных вычислений не получил. + +=== Lisp + +В 1985 году Джон Маккарти представил миру Lisp (аббревиатура от *Lis*-t *P*-rocessing) -- язык программирования для символьных вычислений и ИИ @wexelblat_history_1978. + +Особенностями языка можно назвать: + +#list( + [ "функции первого класса" -- их можно передавать, возвращать и проводить композицию; ], + [ каррирование -- преобразование функции множества аргументов в набор вложенных функций; ], + [ отсутсвие циклов -- их заменили рекурсией; ], + [ универсальная структура данных -- список; ], + [ символьное дифференцирование; ], + marker: "-", + indent: text-indentation, +) + +Lisp позже повлияли на Python (list comprehensions), JavaScript (функции высшего порядка), языки типа Haskell, Scala и другие. + +Также этот язык является прародителем функционального программирования, хотя он и является мультипарадигменным. + +=== Оптимизирующая компиляция + +Как уже было сказано ранее, компилторы стали применять систематические оптимизации. + +Ключевые достижения: + +#list( + [ компилятор Fortran мог генерировать более эффективный ассемблерный код, по сравнению с человеком; ], + [ анализ потока данных @hecht_flow_1977; ], + [ алгоритмы оптимизации графов (например, "алгоритм Хайтина" для раскраски графов и последующего распределения регистров); ], + marker: "-", + indent: text-indentation, +) + +Для HPC оптимизирующие компиляторы стали критическим звеном между абстрактным кодом и эффективным использованием железа. Современные компиляторы (GCC, LLVM, Intel ICC) применяют сотни проходов оптимизации: векторизацию, предсказание переходов, межпроцедурную оптимизацию, полиэдрическую оптимизацию для вложенных циклов, однако база была заложена давно. + +#pagebreak() + #align( - center, - heading( - numbering: none, - "СПИСОК СОКРАЩЕНИЙ" + center, + pad( + left: -text-indentation, + heading( + numbering: none, + "СПИСОК СОКРАЩЕНИЙ" + ) ) ) @@ -80,10 +191,13 @@ GPU (Graphics Processing Unit) -- графический процессор #pagebreak() #align( - center, - heading( - numbering: none, - "СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ" + center, + pad( + left: -text-indentation, + heading( + numbering: none, + "СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ" + ) ) ) diff --git a/references.bib b/references.bib index 2e53d90..c27cefe 100644 --- a/references.bib +++ b/references.bib @@ -18,7 +18,7 @@ urldate = {2025-12-08}, } -@misc{@noauthor_mpi_nodate, +@misc{noauthor_parallel_nodate, title = {Parallel {Programming} - {HPC} {Wiki}}, url = {https://hpc-wiki.info/hpc/Parallel_Programming}, urldate = {2025-12-08}, @@ -53,3 +53,49 @@ doi = {10.7551/mitpress/9486.003.0008}, pages = {129--160}, } + +@misc{noauthor_fortran_nodate, + title = {Fortran {\textbar} {IBM}}, + url = {https://www.ibm.com/history/fortran}, + abstract = {The world’s first programming language standard opened the door to modern computing.}, + language = {en}, + urldate = {2025-12-08}, +} + +@misc{noauthor_why_nodate, + title = {Why {ALGOL} was an important programming language?}, + url = {https://bulldogjob.com/readme/why-algol-was-an-important-programming-language}, + abstract = {ALGOL is a more interesting language than you think, both in terms of its story and legacy.}, + language = {en}, + urldate = {2025-12-08}, +} + +@incollection{wexelblat_history_1978, + address = {New York, NY, USA}, + title = {History of {LISP}}, + copyright = {https://www.acm.org/publications/policies/copyright\_policy\#Background}, + isbn = {9780127450407}, + url = {http://dl.acm.org/doi/10.1145/800025.1198360}, + language = {en}, + urldate = {2025-12-08}, + booktitle = {History of programming languages}, + publisher = {ACM}, + author = {McCarthy, John}, + editor = {Wexelblat, Richard L.}, + month = jun, + year = {1978}, + doi = {10.1145/800025.1198360}, + pages = {173--185}, +} + +@book{hecht_flow_1977, + address = {New York, NY}, + series = {Programming languages series}, + title = {Flow analysis of computer programs}, + isbn = {9780444002105 9780444002167}, + language = {eng}, + number = {5}, + publisher = {North-Holland}, + author = {Hecht, Matthew S.}, + year = {1977}, +}