Читав про історію пайтона, як він змінювався, як ставав популярним і зацікавився а які ж були його перші версії.
Погуглив сорці та збілдив усе у докері, ось тут можна подивитись. На диво, скомпілювати проєкт 30-річної давнини виявилось відносно легко.
У підсумку для тесту я зібрав 3 версії:
- 0.9.1 (1991), тому що цікаво якою була найперша публічна версія Python (звісно першою була 0.9.0, але різниця лише у один патч)
- 1.0.1 (1994), бо цікаво що змінилось і яким був перший мажорний реліз
- 1.6.1 (2000), щоб подивитись на останній реліз 1 версії
Отже що мені здалось цікавим:
Привітання різне у всіх версіях:
0.9.1
>>>
1.0.1
Python 1.0.1 (Jan 8 2024)
Copyright 1991-1994 Stichting Mathematisch Centrum, Amsterdam
>>>
1.6.1
Python 1.6.1 (#1, Jan 8 2024, 18:22:00) [GCC 4.7.4] on linux6
Copyright (c) 1995-2001 Corporation for National Research Initiatives.
All Rights Reserved.
Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam.
All Rights Reserved.
>>>
Юнікод у змінних не підтримується (принаймні у REPL):
>>> ї = 1
Parsing error: file <stdin>, line 1:
��ї = 1
^
Unhandled exception: run-time error: syntax error
>>>
help у REPL ще немає ніде, але exit у 1.6.1 у наявності
>>> exit
'Use Ctrl-D (i.e. EOF) to exit.'
getattr, setattr наявні вже у 1.0.1, але delattr відсутній (у 1.6.1 вже є)Синтаксису
import foo as bar ще не існує, проте вже є from foo import *Немає
bool, замість нього використовують 1 та 0Особливості 0.9.1 (наявні лише у цій версії):
- не сприймає
" лапки, видає syntax error- при написанні класу треба обовʼзково вказувати () навіть якщо у нього немає суперкласу (
class Foo():)-
__init__ ще не існує- щось з наслідуванням, може його немає, бо методи суперкласу не доступні у його спадкоємцях
- ще немає
and, or та isВідчувається що 0.9.1 це ще не справжній реліз, але використовувати його для написання скриптів замість башу думаю було ок.
Далі я вирішив зробити більш показовий тест - узяв код який написав на 3.11 коли вирішував AOC і спробував його портувати на старі версії поступово.
Про очевідні речі типу f-strings чи відсутніх модулів писати не буду, хто захоче - дивіться gist, там більш докладно.
З 3.11 на 1.6.1:
- Генератори та включення зʼявились лише у 2 😢
- Змінної
__file__ ще не існує- Синтаксис
i += 1 ще не підтримується-
__eq__ та __slots__ також немаєЗрештою 1.6.1 відчувається дуже непогано, мені знадобилось зовсім мало часу щоб заставити код працювати, відчуття що це зовсім інша мова немає.
З 1.6.1 на 1.0.1:
- Мультилайн стрінги ще не завезли
- Стрінги здається що взагалі не обʼєкти, у них немає жодних методів чи атрибутів, усі операції над ними треба робити через модуль string
-
int("42") не працює, замість цього string.atoi("42")- Розпаковка (
a, b = func()) працює лише з таплами, а функції tuple() немає 😁- Немає
assert- У
"%s" % (val,) val не може бути числом, параметри не приводяться автоматично до типу string- Виключення це звичайні строки, тож user-defined виключення це
raise "My exception", ValueError (навідміну від Exception) існує, але це звичайна змінна яка зберігає строкуПортувати код на 1.0.1 вже було більшим викликом, довелось написати свої примітивні асерти, та підгледіти функцію tuple
Написання коду на 1.0 мені здалось схожим на написання коду на Go 😁. У тому сенсі що стдліб малий, сахару мало, багато дуже простих речей доводиться писати самому. Але як для релізу якому 30 років, ну прям дуже непогано.
Цікаво що перший реліз мови не так вже й кардинально відрізняється від актуального сьогодні. Багато концепцій існувало від самого початку і її розвиток відчувається як поступова еволюція. І я тепер розумію звідки у стдлібі зʼявився модуль string (він доступний досі) і нащо він треба був 😁
Якщо хтось хоче сам потикати у раритет - можете скористатись імейджами що я створив
Про історію Python:
- A brief history of Python
- How Python Became the Popular Choice