docs: add early programming languages section (Fortran, ALGOL, Lisp) with references
This commit is contained in:
parent
1274a852c1
commit
8a25539f91
2 changed files with 180 additions and 20 deletions
128
main.typ
128
main.typ
|
|
@ -1,10 +1,14 @@
|
||||||
|
#let text-indentation = 1.25cm
|
||||||
|
#let text-size = 14pt
|
||||||
|
#let leading = 1em
|
||||||
|
|
||||||
#set text(
|
#set text(
|
||||||
font: "Times New Roman",
|
font: "Times New Roman",
|
||||||
size: 14pt,
|
size: text-size,
|
||||||
lang: "ru"
|
lang: "ru"
|
||||||
)
|
)
|
||||||
|
|
||||||
#show heading: set text(size: 14pt)
|
#show heading: set text(size: text-size)
|
||||||
|
|
||||||
#set page(
|
#set page(
|
||||||
paper: "a4",
|
paper: "a4",
|
||||||
|
|
@ -14,25 +18,28 @@
|
||||||
left: 3cm,
|
left: 3cm,
|
||||||
right: 1cm
|
right: 1cm
|
||||||
),
|
),
|
||||||
|
|
||||||
numbering: "1"
|
numbering: "1"
|
||||||
)
|
)
|
||||||
|
|
||||||
#set heading(
|
#set heading(
|
||||||
numbering: "1.1.1.1",
|
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(
|
#set par(
|
||||||
justify: true,
|
justify: true,
|
||||||
leading: 1em,
|
leading: leading,
|
||||||
first-line-indent: (
|
first-line-indent: (
|
||||||
amount: 1.25cm,
|
amount: text-indentation,
|
||||||
all: true
|
all: true
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
#show "〜": h(1.25cm)
|
#show "〜": h(text-indentation)
|
||||||
|
|
||||||
#align(
|
#align(
|
||||||
center,
|
center,
|
||||||
|
|
@ -45,11 +52,14 @@
|
||||||
|
|
||||||
#align(
|
#align(
|
||||||
center,
|
center,
|
||||||
|
pad(
|
||||||
|
left: -text-indentation,
|
||||||
heading(
|
heading(
|
||||||
numbering: none,
|
numbering: none,
|
||||||
"Введение"
|
"Введение"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
*Актуальность темы*: развитие технологий тесно связано с ростом объёмов обрабатываемых данных, особенно в сфере искусственного интеллекта. В связи с этим история высокопроизводительных вычислений становится как никогда актуальной. Рост массивов данных, развитие ИИ и необходимость ускорения вычислений делают историю языков и моделей программирования для HPC особенно важной. Эволюция подходов позволяет оптимизировать параллельные вычисления на суперкомпьютерах и ускорителях вроде GPU. Ограничения аппаратного обеспечения и растая сложность задач, требующих распределённой обработки, ведут к появлению новых вычислительных моделей.
|
*Актуальность темы*: развитие технологий тесно связано с ростом объёмов обрабатываемых данных, особенно в сфере искусственного интеллекта. В связи с этим история высокопроизводительных вычислений становится как никогда актуальной. Рост массивов данных, развитие ИИ и необходимость ускорения вычислений делают историю языков и моделей программирования для HPC особенно важной. Эволюция подходов позволяет оптимизировать параллельные вычисления на суперкомпьютерах и ускорителях вроде GPU. Ограничения аппаратного обеспечения и растая сложность задач, требующих распределённой обработки, ведут к появлению новых вычислительных моделей.
|
||||||
|
|
||||||
|
|
@ -63,13 +73,114 @@
|
||||||
|
|
||||||
#pagebreak()
|
#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]
|
||||||
|
) <listing-1>
|
||||||
|
|
||||||
|
Такой подход позволил уменьшить как объёмы кода, так и снизить количество ошибок при его написании.
|
||||||
|
|
||||||
|
Компиляторы 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(
|
#align(
|
||||||
center,
|
center,
|
||||||
|
pad(
|
||||||
|
left: -text-indentation,
|
||||||
heading(
|
heading(
|
||||||
numbering: none,
|
numbering: none,
|
||||||
"СПИСОК СОКРАЩЕНИЙ"
|
"СПИСОК СОКРАЩЕНИЙ"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
ИИ -- искуственный интеллект
|
ИИ -- искуственный интеллект
|
||||||
|
|
||||||
|
|
@ -81,11 +192,14 @@ GPU (Graphics Processing Unit) -- графический процессор
|
||||||
|
|
||||||
#align(
|
#align(
|
||||||
center,
|
center,
|
||||||
|
pad(
|
||||||
|
left: -text-indentation,
|
||||||
heading(
|
heading(
|
||||||
numbering: none,
|
numbering: none,
|
||||||
"СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ"
|
"СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
|
||||||
#bibliography(
|
#bibliography(
|
||||||
"references.bib",
|
"references.bib",
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
urldate = {2025-12-08},
|
urldate = {2025-12-08},
|
||||||
}
|
}
|
||||||
|
|
||||||
@misc{@noauthor_mpi_nodate,
|
@misc{noauthor_parallel_nodate,
|
||||||
title = {Parallel {Programming} - {HPC} {Wiki}},
|
title = {Parallel {Programming} - {HPC} {Wiki}},
|
||||||
url = {https://hpc-wiki.info/hpc/Parallel_Programming},
|
url = {https://hpc-wiki.info/hpc/Parallel_Programming},
|
||||||
urldate = {2025-12-08},
|
urldate = {2025-12-08},
|
||||||
|
|
@ -53,3 +53,49 @@
|
||||||
doi = {10.7551/mitpress/9486.003.0008},
|
doi = {10.7551/mitpress/9486.003.0008},
|
||||||
pages = {129--160},
|
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},
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue