Elle çizilmiş bir piton yılanı, ekranında print("Merhaba") ve çıktısı yazan bir dizüstü bilgisayara sarılmış.
IEEE Hacettepe University Student Branch

Derslerde anlattığım tarih hikayeleri burada, ders ders ve kaynaklarıyla duruyor.

Ders 1 · Ders 2 · Ders 3 · Ders 4 · Ders 5

Ders 1

1945 tarihli First Draft of a Report on the EDVAC raporunun daktiloyla yazılmış içindekiler sayfasından 2.0 MAIN SUBDIVISIONS OF THE SYSTEM bölümü. Satırlar: 2.2 First: Central arithmetic part: CA; 2.3 Second: Centrol control part: CC; 2.5 Third: Memory: M; 2.7 Fourth: Input: I; 2.8 Fifth: Output: O. Sağda sayfa numaraları. First Draft of a Report on the EDVAC raporunun daktiloyla yazılmış kapak sayfası. Üstte Moore School of Elec. Eng. Library damgası; ortada altı çizili başlık, altında by John von Neumann; sonra Contract No. W-670-ORD-4926, United States Army Ordnance Department ile University of Pennsylvania arasında; en altta Moore School of Electrical Engineering, University of Pennsylvania, June 30, 1945.
Görsel: John von Neumann, First Draft of a Report on the EDVAC (Moore School of Electrical Engineering, University of Pennsylvania, 30 Haziran 1945), içindekiler, 2.0 bölümü; “VN First Draft Report EDVAC Moore Sch 1945”, Wikimedia Commons, kamu malı. Kırpıldı ve küçültüldü. Görsel: John von Neumann, First Draft of a Report on the EDVAC (Moore School of Electrical Engineering, University of Pennsylvania, 30 Haziran 1945), kapak; “VN First Draft Report EDVAC Moore Sch 1945”, Wikimedia Commons, kamu malı. Boyutu küçültüldü.

1A

First Draft of a Report on the EDVAC (30 Haziran 1945)

John von Neumann 1945'te, Pennsylvania Üniversitesi Moore School'da ENIAC'ı yapan ekibin yeni makine EDVAC için tartıştığı tasarımı yazıya geçirdi. Kapağında 30 Haziran 1945 tarihi ve yalnızca von Neumann'ın adı bulunan First Draft of a Report on the EDVAC, makineyi beş parçaya ayırır: aritmetik işlemleri yapan CA, işlemlerin sırasını yöneten CC, bellek M, girdi birimi I ve çıktı birimi O. CA ile CC'yi bugün birlikte CPU diye anıyoruz. Rapora göre bir problemi yöneten komutlar da bellekte tutulmalıdır (2.4. bölüm); program ile verinin aynı bellekte durması fikri bu raporla yayıldı. Tasarım ekipte birlikte geliştirildi: J. Presper Eckert ile John Mauchly bu fikirlerin bir kısmının sahibiydi ve Eckert, komutları veriyle aynı hızlı bellekte saklama fikrine von Neumann ekibe katılmadan önce ulaşmıştı. "von Neumann architecture" adı sonradan verildi; tarihçiler ortak bir işi tek kişiye bağladığı için bu adı yerinde bulmuyor.

Raporun beş parçası, derste çizdiğimiz bilgisayar diyagramının kutularıdır: CA ile CC bugünkü CPU, M memory, I input, O output. Run'a bastığınızda Python interpreter'ı ve .py dosyanız diskten memory'ye alınır; programınız ile üzerinde çalıştığı data aynı memory'de durur. Raporun 2.4. bölümündeki fikir budur.

Kaynaklar:
First Draft of a Report on the EDVAC, Moore School of Electrical Engineering, 30 Haziran 1945; Commons taraması (kapak, içindekiler, 2.2-2.8. bölümler)
Computer History Museum, This Day in History, 30 Haziran
T. Haigh, M. Priestley, C. Rope, Reconsidering the Stored-Program Concept, IEEE Annals of the History of Computing 36(1), 2014
B. J. Copeland, The Modern History of Computing, Stanford Encyclopedia of Philosophy
J. A. N. Lee, IEEE Computer Society, Computer Pioneers: John von Neumann

IEEE 754 kayan nokta standardının baş mimarı William Kahan, 2008'de Berkeley'de.
Fotoğraf: George M. Bergman, “William Kahan 2008”, Wikimedia Commons, CC BY-SA 4.0. Boyutu küçültüldü.

1B

IEEE 754 standardı (1985)

Bugün neredeyse bütün bilgisayarlar kayan noktalı sayıları IEEE 754 standardına göre saklar; standardın ilk sürümü IEEE 754-1985, 21 Mart 1985'te onaylandı. Standardın baş mimarı William Kahan'dır; Kahan 1989'da sayısal analize katkıları için ACM Turing Ödülü'nü aldı. Python belgelerine göre Python'un float type'ı da hemen her platformda IEEE 754 çift duyarlıklı (binary64) sayıdır.

float ikili tabanda saklandığı için 0.1 gibi sayılar tam tutulamaz: print(0.1 + 0.2) 0.30000000000000004 basar. Bu Python'a özgü bir hata değildir; Python belgeleri aynı durumun C, Java ve Fortran gibi dillerde de görüldüğünü belirtir. Standardı yayımlayan kuruluş, IEEE Hacettepe'nin de bağlı olduğu IEEE'dir.

Kaynaklar:
IEEE Standards Association, IEEE 754-1985 (onay tarihi 21 Mart 1985)
ACM A.M. Turing Award, William Kahan (1989)
Wikipedia, William Kahan (IEEE 754'ün baş mimarı)
The Python Tutorial, 15. Floating-Point Arithmetic: Issues and Limitations

İsteğe bağlı video: Floating Point Numbers - Computerphile (Computerphile, 9 dk 16 sn).

Manchester Baby'nin (Small-Scale Experimental Machine) Manchester'daki Museum of Science and Industry'de sergilenen çalışan kopyası: tuğla duvarın önünde yan yana dizilmiş, elektron tüpleri ve kablolarla dolu metal raflar. Üstte asılı yeşil levhalarda soldan sağa Power Control, Basic Timing, Vertical Deflection, Monitor and Control, Pulse Separator, Control and Arithmetic ve Storage yazıyor.
Fotoğraf: Racklever ve Ian Dunster (en.wikipedia kullanıcıları), “SSEM Replica”, Wikimedia Commons, kamu malı.

1A

Manchester Baby (21 Haziran 1948)

Programını yazılıp okunabilen elektronik bellekte saklayıp çalıştıran ilk bilgisayar, Manchester Üniversitesi'nde F. C. Williams, Tom Kilburn ve Geoff Tootill'in kurduğu Small-Scale Experimental Machine'dir; kısa adı Baby. 21 Haziran 1948'de ilk programını çalıştırdı. Belleği 32 sözcük × 32 bit tutan tek bir katot ışınlı tüptü (Williams-Kilburn tube); program da veri de bu tüpte duruyordu. Kilburn'ün 17 komutluk ilk programı bir sayının kendisinden küçük en büyük bölenini arıyordu: sayının bir eksiğinden başlayıp aşağı doğru her sayıyı deniyor, makinede yalnızca çıkarma devresi olduğu için bölmeyi art arda çıkarmayla yapıyordu. Birkaç gün içinde program 2¹⁸ = 262 144 için çalıştırıldı; yaklaşık 130 000 sayı denendi ve 52 dakikalık çalışmanın sonunda doğru cevap, 131 072 bulundu. Asıl makine, parçaları daha büyük bir bilgisayarda kullanılmak üzere söküldü. Fotoğraftaki çalışan kopyayı Computer Conservation Society yaptı ve 21 Haziran 1998'de, ilk çalışmanın 50. yılında, Manchester'daki Museum of Science and Industry'ye teslim etti. IEEE bu makineyi 2022'de IEEE Milestone olarak tanıdı.

Baby, derste çizdiğimiz modelin ilk çalışan örneğidir: program da data da aynı memory'de duruyordu ve makine komutları sırayla, birer birer çalıştırıyordu. Bugünkü bilgisayarlar da aynı fikirle çalışır.

Kaynaklar:
University of Manchester, Computer 50, The Baby (B. Napper)
University of Manchester, Computer 50, The First Program
University of Manchester, Computer 50, kopyanın teslim töreni
ETHW, IEEE Milestone, Manchester University "Baby" Computer and its Derivatives, 1948-1951
B. J. Copeland, The Modern History of Computing, Stanford Encyclopedia of Philosophy

Beyaz bir kumaşın üzerinde iki ince tel; birinin ortasında etiket var. Grace Hopper bu tellerle bir nanosaniyeyi gösterirdi.
Fotoğraf: Naval History and Heritage Command, “90-115-AG, AH, Wire Nanosecond”, Wikimedia Commons, CC BY 2.0. Boyutu küçültüldü.

1A

Grace Hopper'ın nanosaniyesi (1960'ların sonu)

Grace Hopper (1906-1992) matematikçi ve bilgisayar bilimcisiydi. 1960'ların sonundan itibaren konuşmalarında dinleyicilere yaklaşık 30 cm uzunluğunda teller dağıttı. Her tel, bir elektrik sinyalinin bir nanosaniyede, yani saniyenin milyarda birinde gidebileceği en uzun yolu gösteriyordu. Hopper bununla parçalar küçüldükçe bilgisayarın neden hızlandığını anlatıyordu: sinyalin gideceği yol kısaldıkça iş de kısa sürer. 30 cm aslında ışığın boşlukta bir nanosaniyede aldığı yoldur; gerçek bir telde sinyal biraz daha yavaş gider. Washington'daki National Museum of American History, Hopper'ın Mart 1985'te müzede dağıttığı yaklaşık yüz telden oluşan bir desteyi saklıyor.

Bugün 3 GHz'lik bir CPU'nun tek bir saat adımında ışık yalnızca 10 cm kadar yol alır. CPU bu hızda çalışır, ama kendiliğinden hiçbir şey yapmaz; komutları sırayla, birer birer çalıştırır. Işık saniyede 299 792 458 metre yol alır; bu sayıyı bölmek, bir nanosaniyedeki ve 3 GHz'lik bir CPU'nun tek adımındaki yolu metre olarak verir.

print(299792458 / 1000000000)
print(299792458 / 3000000000)
Çıktı
0.299792458
0.09993081933333334

Kaynaklar:
Smithsonian, National Museum of American History, Nanoseconds Associated with Grace Hopper, 1985.3088.01
The White House blog, Honoring Grace Hopper, 22 Aralık 2014 (11.8 inçlik teller)
Naval History and Heritage Command, 90-115-AG, AH, Wire Nanosecond (Commons açıklaması)

Brian Kernighan'ın imzalı, çerçeveli bilgisayar kağıdı baskısı: iki satırlık C programı main() { printf("hello, world\n"); }.
Görsel: Brian Kernighan, “Hello World Brian Kernighan 1978”, Wikimedia Commons, CC BY-SA 3.0. Boyutu küçültüldü.

1A

İlk hello, world programı (1973)

Kernighan ile Ritchie'nin hatırladığı kadarıyla ilk "hello, world" programı, Brian Kernighan'ın Bell Labs'te B dili için yazdığı öğreticide yer alır; öğretici Ocak 1973 tarihli teknik rapor CSTR #8 içinde dağıtıldı. B'de tek bir karakter sabitesi en fazla dört ASCII karakter tutabildiği için metin 'hell', 'o, w' ve 'orld' diye üç variable'a bölünmüştü. Kernighan 1974'teki C öğreticisinde aynı örneği printf("hello, world") ile tek satıra indirdi; 1978'de Kernighan ile Ritchie'nin The C Programming Language kitabı da ilk program olarak bunu verdi.

Python'da aynı program tek satırdır: print("hello, world"). Tırnak içindeki metin olduğu gibi basılır; tırnakların kendisi basılmaz.

Kaynaklar:
D. M. Ritchie, B dilinin tanıtım sayfası (bintro.html): CSTR #8, Ocak 1973; "so far as Brian and I can remember, the Tutorial contains the first instance of a 'Hello, world' program"
B. W. Kernighan, A Tutorial Introduction to the Language B (btut.html), §6 ("one to four ascii characters") ve §7
B. W. Kernighan, Programming in C: A Tutorial (ctut.pdf), §2 (1974)

İsteğe bağlı video: Original Hello World in "B" Programming Language - Computerphile (Computerphile, 9 dk 9 sn).

Latince el yazması sayfası; ilk satır 'Dixit algorizmi' (Algorizmi dedi ki) sözleriyle başlıyor.
Görsel: Cambridge University Library, MS Ii.6.5 (el-Harezmi'nin aritmetik kitabının Latince çevirisi), “Dixit algorizmi”, Wikimedia Commons, kamu malı.

1A

El-Harezmi ve "algorithm" kelimesi (9. yüzyıl)

'Algorithm' kelimesi, 9. yüzyılda Bağdat'taki Beytülhikme'de çalışan Muhammed bin Musa el-Harezmi'nin (yaklaşık 780-850) adından gelir. Hint-Arap rakamlarıyla hesap yapmayı anlatan kitabının Arapça aslı kayıptır; Latince çevirisi 'Dixit Algorizmi' (Algorizmi dedi ki) sözleriyle başlar ve kelime, el-Harezmi'nin bu Latinceleşmiş adından türemiştir. Görseldeki sayfa Cambridge Üniversitesi Kütüphanesi'ndeki Ii.6.5 numaralı el yazmasındandır.

Bir Python programı, yukarıdan aşağıya sırayla çalışan statement'lardan oluşur; yani bir algoritmanın Python ile yazılmış halidir.

Kaynaklar:
MacTutor History of Mathematics, Abu Ja'far Muhammad ibn Musa Al-Khwarizmi
Cambridge Digital Library, MS Ii.6.5 (MS-II-00006-00005)
J. P. Hogendijk, al-Khwarizmi sayfası

Mantıkçı Gottlob Frege'nin 1879 dolaylarında çekilmiş portresi.
Fotoğraf: Bilinmeyen fotoğrafçı, “Young frege”, Wikimedia Commons, kamu malı.

1A

Frege ve tırnak işareti (1892)

Mantıkçı Gottlob Frege 1892'de yayımlanan 'Über Sinn und Bedeutung' makalesinde, kelimelerin gösterdiği şeyden değil kelimelerin kendisinden söz etmek istediğimizde yazıda onları tırnak içine aldığımızı ve tırnak içindeki kelimenin olağan anlamıyla alınmaması gerektiğini yazdı. Felsefede bu ayrım bugün 'use-mention' (kullanma ve anma) ayrımı adıyla tartışılır.

print(7 + 3) expression'ı kullanır ve 10 basar; print("7 + 3") metnin kendisini anar ve 7 + 3 basar. Tırnak, Python'a bunu hesaplamamasını, harf harf almasını söyler. Bu bir benzetmedir: Python'un tırnak kuralı Frege'den gelmez, yalnızca aynı ayrımı yapar.

Kaynaklar:
G. Frege, On Sense and Reference (Wikisource, M. Black çevirisi): "In writing, the words are in this case enclosed in quotation marks"
Stanford Encyclopedia of Philosophy, Quotation (use-mention ayrımı, Frege 1892)

Donald Knuth, 2011'de Computer History Museum'daki bir açılışta.
Fotoğraf: Alex Handy, “Donald Ervin Knuth (cropped)”, Wikimedia Commons, CC BY-SA 2.0.

1A

Knuth ve Literate Programming (1984)

Donald Knuth 1984'te The Computer Journal'da yayımlanan 'Literate Programming' makalesinde, program yazarken asıl işin bilgisayara ne yapacağını söylemek değil, bilgisayara ne yaptırmak istediğimizi insanlara açıklamak olduğunu savundu. Bu yöntemde açıklama ve kod aynı dosyada, insanın okuyup anlayacağı sırayla yazılır. Knuth bunun için WEB adlı bir sistem geliştirdi; aynı makalede TeX dizgi sisteminin de WEB ile yazıldığını belirtir.

Python # işaretinden sonrasını okumaz; comment, kodu okuyacak insan için yazılır. Bir satırın ne yaptığını ya da ne basmasını beklediğinizi yanına comment olarak yazmak, kodu sonradan okuyanın işini kolaylaştırır.

Kaynaklar:
D. E. Knuth, Literate Programming, The Computer Journal 27(2), 1984, doi:10.1093/comjnl/27.2.97 ("explaining to human beings what we want a computer to do")
D. E. Knuth, Literate Programming sayfası (lp.html)

İsteğe bağlı video: Donald Knuth - Literate programming (66/97) (Web of Stories - Life Stories of Remarkable People, 4 dk 6 sn).

Harvard Mark II'nin 9 Eylül 1947 tarihli kayıt defteri sayfası: 15.45 kaydının yanına bantla yapıştırılmış bir güve ve altında 'First actual case of bug being found' notu.
Fotoğraf: U.S. Naval History and Heritage Command, NH 96566-KN (Courtesy of the Naval Surface Warfare Center, Dahlgren, VA, 1988), “First Computer Bug, 1947”, Wikimedia Commons, kamu malı. Boyutu küçültüldü.

1A

Mark II'nin kayıt defterindeki güve (1947)

9 Eylül 1947'de Harvard'da test edilen Mark II röleli hesap makinesinde, F panelindeki 70 numaralı rölenin kontakları arasında sıkışmış bir güve bulundu. Operatörler güveyi makinenin kayıt defterine bantlayıp yanına 'First actual case of bug being found' (gerçek bir böcek bulunan ilk vaka) notunu yazdı. Not bir espridir: 'bug' mühendislikte arıza anlamında zaten kullanılıyordu; Edison 1878'de Theodore Puskas'a yazdığı bir mektupta küçük kusurlara ve aksaklıklara 'bug' dendiğini anlatır. Grace Hopper bu ekipteydi ve hikayeyi sonraki yıllarda anlatarak yaygınlaştırdı. Defter sayfası bugün Smithsonian'a bağlı National Museum of American History'nin koleksiyonundadır.

Hatayı bulup düzeltmeye debugging denir. Python'da bu iş traceback'in son satırını okumakla başlar: hatanın adı ve kısa açıklaması orada yazar. Print("Merhaba") yazılırsa son satır şudur: NameError: name 'Print' is not defined. Did you mean: 'print'?

Kaynaklar:
Naval History and Heritage Command, NH 96566-KN fotoğraf açıklaması (açıklamadaki "introducing the term debugging" ifadesi yanlıştır)
JSTOR Daily, The Bug in the Computer Bug Story (Shapiro 1987'ye dayanır)
IEEE Spectrum, Did You Know? Edison Coined the Term "Bug" (Puskas'a mektup, Kasım 1878)

İsteğe bağlı video: Capt. Grace Hopper on Future Possibilities: Data, Hardware, Software, and People (Part One, 1982) (National Security Agency, 48 dk 40 sn), 17:47-19:16 arası.

Maurice Wilkes, EDSAC'ın cıvalı gecikme hattı (mercury delay line) bellek ünitesinin yanında çömelmiş.
Fotoğraf: Copyright Computer Laboratory, University of Cambridge. Reproduced by permission. “EDSAC (9)”, Wikimedia Commons, CC BY 2.0 UK.

1A

Wilkes ve hata ayıklama (EDSAC, 1949)

Cambridge'deki EDSAC ilk programını 6 Mayıs 1949'da çalıştırdı. Makinenin yapımını yöneten Maurice Wilkes, aynı yıl üst kattaki EDSAC odasıyla bir alt kattaki şerit delme makineleri arasında merdivenleri inip çıkarken, hayatının geri kalanının büyük bölümünü kendi programlarındaki hataları bulmakla geçireceğini fark ettiğini anlatır. Bunu 23 Eylül 1979'da Massachusetts'in Marlboro kentinde açılan Digital Computer Museum'un açılış konuşmasında söyledi; 1985'te yayımlanan anılarında da yazdı (Memoirs of a Computer Pioneer, s. 145).

Kırmızı altı çizili bir satır ya da uzun bir traceback, bilgisayarın bozuk olduğunu ya da sizin bu işe yatkın olmadığınızı göstermez. İlk bilgisayarlardan birini yapan kişi de zamanının büyük kısmını hata ayıklamaya ayırdı.

Kaynaklar:
University of Cambridge Computer Laboratory, EDSAC 99 sayfası
D. Spinellis, 2018: 23 Eylül 1979 konuşması, yaklaşık 25. dakika
The Computer Museum Archive, The Computer Museum at DEC Marlboro ("On September 23rd, 1979, the Digital Computer Museum opened with a lecture on the EDSAC by Maurice Wilkes")
M. Campbell-Kelly, EDSAC Tutorial Guide, §4 (Memoirs, s. 145'ten alıntı)

İsteğe bağlı video: The Birth and Growth of the Digital Computer, lecture by Professor Maurice Wilkes (Computer History Museum, 1 sa 32 dk 2 sn).

Danimarkalı bilgisayar bilimci Peter Naur mikrofonla konuşurken.
Fotoğraf: Eriktj (English Wikipedia), “Peternaur”, Wikimedia Commons, CC BY-SA 3.0.

1A

ALGOL 60 raporu ve Backus-Naur Form (1960)

Bir programlama dilinin syntax kurallarını biçimsel bir gösterimle yazmak ALGOL çalışmalarıyla yerleşti. John Backus 1959'da Paris'teki UNESCO bilgi işlem konferansında (ICIP) bunun için bir gösterim önerdi; Peter Naur'un editörlüğünü yaptığı ALGOL 60 raporu (Mayıs 1960) dilin syntax'ını bu gösterimin Naur'un düzenlediği biçimiyle verdi. Donald Knuth 1964'te CACM'ye yazdığı mektupta gösterime 'Backus-Naur Form' (BNF) adını önerdi. Python'un Language Reference'ı da dilin tam dilbilgisini yayımlar; bu metin, CPython'da kodu okuyup çözümleyen parser'ı üreten dilbilgisi dosyasından türetilmiştir.

SyntaxError, yani söz dizimi hatası, yazdığınız metnin Python'un dilbilgisine uymadığını söyler. Python ne demek istediğinizi tahmin etmez ve dosyada tek bir SyntaxError varsa hiçbir satırı çalıştırmaz. print("Merhaba" yazılırsa şu hata alınır: SyntaxError: '(' was never closed

Kaynaklar:
J. Backus, ICIP 1959 bildirisi (Computer History Museum, Software Preservation)
Report on the Algorithmic Language ALGOL 60, CACM 3(5), 1960, doi:10.1145/367236.367262
D. E. Knuth, Backus Normal Form vs. Backus Naur Form, CACM 7(12), 1964, doi:10.1145/355588.365140
Python Language Reference, Full Grammar specification ("derived directly from the grammar used to generate the CPython parser")

Gauss'un Disquisitiones Arithmeticae kitabının 1801 tarihli ilk baskısının kapak sayfası.
Görsel: Carl Friedrich Gauss (kitabın baskısı, Leipzig 1801), “Disqvisitiones-800”, Wikimedia Commons, kamu malı.

1B

Gauss ve modüler aritmetik (1801)

Carl Friedrich Gauss 1801'de Leipzig'de yayımlanan Disquisitiones Arithmeticae'nin ilk bölümünde denklik kavramını tanımladı ve bugün de kullanılan ≡ işaretini getirdi: a ile b'nin m'ye bölümünden kalanlar aynıysa a ≡ b (mod m) yazılır. Saat aritmetiği bunun gündelik örneğidir: saat 10'dan 5 saat sonra saat 3 olur.

Python'daki % bu kalanı verir: 17 % 5 sonucu 2, (10 + 5) % 12 sonucu 3'tür. % yüzde değildir, bölmeden kalandır; // ise bölümün tam kısmıdır: 17 // 5 sonucu 3'tür.

Kaynaklar:
K. Conrad, Modular Arithmetic, §2
J. Miller, Earliest Uses of Symbols of Number Theory (MacTutor), madde 2: "Numerorum congruentiam hoc signo, ≡, in posterum denotabimus"

Zaman çizgisi. Python 2'de 7 / 2 sonucu 3'tü (eski kural, gri kesikli çerçeve, çalıştırılmadı). Mart 2001'de PEP 238. Python 3.0'dan beri 7 / 2 sonucu 3.5 (float, hardal sarısı, vurgulu), 7 // 2 sonucu 3 (int, turuncu).
Çizim: kursun kendi çizimi.

1B

PEP 238 ve / operator'ı (2001)

Python 2'de iki int bölündüğünde / kesirli kısmı atardı: 7 / 2 sonucu 3'tü. Float bekleyen bir hesaba int girince sonuç sessizce yanlış çıkıyordu. 11 Mart 2001'de Moshe Zadka ve Guido van Rossum PEP 238'i yazdı: / gerçek bölme yapacak, tam bölme için ayrı bir işaret, // kullanılacaktı. // Python 2.2'den beri var; Aralık 2008'de çıkan Python 3.0'da / kalıcı olarak gerçek bölme oldu. PEP, Python Enhancement Proposal'ın kısaltmasıdır; Python'daki büyük değişiklikler böyle bir belgeyle önerilir.

Bugün iki ayrı operator olmasının nedeni budur: / her zaman float verir, // ise bölümün tam kısmını verir.

print(7 / 2)
print(7 // 2)
Çıktı
3.5
3

Kaynaklar:
PEP 238, Changing the Division Operator (Moshe Zadka, Guido van Rossum; 11 Mart 2001)
What's New In Python 3.0 ("An expression like 1/2 returns a float. Use 1//2 to get the truncating behavior")

Bilgisayar ekranındaki Java kodunun önünde duran sarı bir lastik ördek.
Fotoğraf: Tom Morris, “Rubber duck assisting with debugging”, Wikimedia Commons, CC BY-SA 3.0.

1B

Rubber duck debugging (1999)

Andrew Hunt ile David Thomas'ın 1999'da yayımlanan The Pragmatic Programmer kitabı, hata ayıklama için çok basit bir yöntem anlatır: sorunu başka birine satır satır anlatmak. Dinleyenin bir şey söylemesi gerekmez; kodun ne yapması gerektiğini yüksek sesle anlatırken sorun çoğu zaman kendiliğinden görünür. Kitaptaki hikayede bu dinleyici bir lastik ördektir ve yöntemin adı buradan gelir. Aynı yıl çıkan The Practice of Programming kitabında Brian Kernighan ile Rob Pike da benzer bir öğüt verir: hatayı bir oyuncak ayıya anlatın.

Yöntem en çok error message vermeyen hatalarda işe yarar. Aşağıdaki ilk satır hata vermez, ama iki notun ortalaması 110.0 olamaz. Satırı yüksek sesle okuyan kişi önce 80'in 2'ye bölündüğünü, sonra 70'in eklendiğini söyler ve ortalama için parantez gerektiğini görür; parantezli ikinci satır 75.0 verir.

print(70 + 80 / 2)
print((70 + 80) / 2)
Çıktı
110.0
75.0

Kaynaklar:
Wikipedia, Rubber duck debugging (The Pragmatic Programmer, Hunt ve Thomas)
Michelle Duke, What's with all the ducks?, GitHub Blog, 23 Aralık 2022 ("Our story starts back in 1999")
D. White, Imperial College, The Practice of Programming incelemesi ("tell it to the Teddy Bear")

Leibniz'in 1703 tarihli makalesinden sayfa: solda 0'dan 32'ye kadar sayıların ikili yazılışı, sağda ikili toplama, çıkarma, çarpma ve bölme örnekleri.
Görsel: Gottfried Wilhelm Leibniz, “Leibniz binary system 1703”, Wikimedia Commons, kamu malı.

1B

Leibniz ve ikili sayı sistemi (1703)

Gottfried Wilhelm Leibniz yalnızca 0 ve 1 kullanan ikili sayı sistemini 'Explication de l'arithmétique binaire' makalesinde anlattı; makale Paris Bilimler Akademisi'nin 1703 yılı Mémoires cildinde (1705'te basıldı) yayımlandı. Görseldeki sayfada 0'dan 32'ye kadar sayıların ikili yazılışı ile ikili toplama, çıkarma, çarpma ve bölme örnekleri var.

Bilgisayar int değerlerini ikili tabanda saklar. Python'da bin(13) '0b1101' verir; int("1101", 2) aynı yazıyı 13'e geri çevirir.

Kaynaklar:
Gallica, Mémoires de l'Académie royale des sciences, 1703, s. 85-89 (makale), s. 86 (görseldeki sayfa)
C. I. Gerhardt (yay.), Leibnizens mathematische Schriften, c. 7, s. 224
historyofinformation.com (1703 cildi, 1705 baskısı)

Münih'teki Deutsches Museum'da duran Zuse Z3 kopyası: röle dolapları ve önündeki kumanda masası.
Fotoğraf: Venusianer (German Wikipedia), “Z3 Deutsches Museum”, Wikimedia Commons, CC BY-SA 3.0. Boyutu küçültüldü.

1B

Zuse'nin Z3'ü ve kayan nokta (1941)

Konrad Zuse'nin 1941'de Berlin'de tamamladığı Z3, programla denetlenen ve tam olarak çalışan ilk elektromekanik bilgisayarlardan biridir. Sayıları ikili kayan nokta biçiminde tutuyordu: 22 bitlik bir sözcükte 1 bit işaret, 7 bit üs, 14 bit mantis. Özgün makine bugün yok; fotoğraftaki kopya 1960'ların başında yapıldı ve Münih'teki Deutsches Museum'dadır.

Python'un float'ı da aynı fikirle çalışır: sayı işaret, üs ve anlamlı basamaklar olarak saklanır. / işleminin sonucu her zaman float'tır: 6 / 2 sonucu 3.0'dır.

Kaynaklar:
IEEE Computer Society, Computer Pioneers: Konrad Zuse (1/7/14 bit; kopya 1960)
R. Rojas, IEEE Annals of the History of Computing, doi:10.1109/85.586067
Wikipedia, Z3 (kopya 1961); iki kaynak yıl konusunda ayrıştığı için metin "1960'ların başında" diyor

İsteğe bağlı video: Some Remarks on the History of Computing in Germany by Konrad Zuse (Computer History Museum, 12 dk 23 sn).

Robert Recorde'un 1557 tarihli kitabından gotik harfli bir paragraf; = işaretinin uzun iki paralel çizgi olarak ilk kullanıldığı yer.
Görsel: Robert Recorde, “Equals sign in Robert Recorde, The Whetstone of Witte, London 1557, p.238”, Wikimedia Commons, kamu malı.

1B

Recorde'un = işareti (1557)

= işaretinin bilinen ilk kullanımı Galli matematikçi Robert Recorde'un 1557'de yayımlanan The Whetstone of Witte kitabındadır. Recorde, 'eşittir' sözünü tekrar tekrar yazmamak için eşit uzunlukta iki paralel çizgi seçtiğini, çünkü hiçbir iki şeyin bundan daha eşit olamayacağını yazar. İşaret hemen yerleşmedi; başka gösterimler 1700'lere kadar kullanıldı.

Matematikte = iki yönlüdür: x = 5 ile 5 = x aynı şeyi söyler. Python'da = bir assignment'tır ve tek yönlüdür; 5 = x yazılırsa Python 3.14 şu hatayı verir: SyntaxError: cannot assign to literal here. Maybe you meant '==' instead of '='? Eşitliği sormak için Ders 2'de == kullanılacak.

Kaynaklar:
MacTutor History of Mathematics, Robert Recorde
J. Miller, Earliest Uses of Symbols of Relation (MacTutor)
Wikipedia, Equals sign

Ders 2

Ariane 5'in 501 uçuşundan kurtarılan, uydu taşıyıcı yapısına ait yanık bir destek parçası; önünde 'Support strut of the satellite structure' etiketi.
Fotoğraf: Deadpan (Wikimedia Commons kullanıcısı), “Ariane 501 Fragment”, Wikimedia Commons, kamu malı. Boyutu küçültüldü.

2A

Ariane 5, 501 uçuşu (1996)

Ariane 5 roketinin ilk uçuşu 4 Haziran 1996'da, uçuş dizisi başladıktan yaklaşık 40 saniye sonra, 3.700 metre yükseklikte roketin rotadan çıkıp parçalanmasıyla sona erdi. Soruşturma kurulunun 19 Temmuz 1996 tarihli raporuna göre, roketin konumunu ve hareketini ölçen ataletsel referans sisteminin (SRI) Ariane 4'tekiyle neredeyse aynı olan yazılımı, yatay hızla ilgili BH değerini 64 bitlik kayan noktalı bir sayıdan 16 bitlik işaretli bir tam sayıya çevirmeye çalıştı; sayı bu aralığa sığmadı ve Operand Error oluştu. Koddaki benzer dönüşümler bu hataya karşı korunmuştu, bu dönüşüm korunmamıştı. Hata iki SRI birimini de durdurdu; yedek birim aynı nedenle 72 milisaniye önce durmuştu.

Type conversion her zaman güvenli değildir. Python'un int'i gerektiği kadar büyür: int(64000.0) 64000 verir, oysa 16 bitlik işaretli bir tam sayı en fazla 32767 tutar. Python'da tehlike başka yerdedir: int("3.5") şu hatayı verir: ValueError: invalid literal for int() with base 10: '3.5'. Bu hataları Ders 4'ün ikinci yarısında try/except ile yakalayacağız.

Kaynaklar:
Ariane 5 Flight 501 Failure, Report by the Inquiry Board (başkan J. L. Lions), Paris, 19 Temmuz 1996
ESA basın bülteni N° 33-1996, Ariane 501, Presentation of Inquiry Board report, 23 Temmuz 1996

İsteğe bağlı video: Ariane Launch failure (Ian Sommerville, 10 dk 5 sn).

George Boole'un An Investigation of the Laws of Thought kitabının 1854 tarihli ilk baskısının kapak sayfası; yazarın altında 'Professor of Mathematics in Queen's College, Cork' yazıyor.
Görsel: George Boole (London: Walton and Maberly), “Boole Laws of Thought 1854”, Wikimedia Commons, kamu malı.

2B

Boole ve The Laws of Thought (1854)

George Boole 1847'de The Mathematical Analysis of Logic'te başladığı fikri 1854'te An Investigation of the Laws of Thought'ta genişletti: mantıksal önermeler, cebirdeki gibi sembollerle ve kurallarla işlenebilir. Boole o sırada Cork'taki Queen's College'ın (bugün University College Cork) matematik profesörüydü; kitabın kapağında da bu unvan yazar. Doğru ve yanlış değerleriyle çalışan cebire bu yüzden Boolean denir; Python'daki bool type'ının adı buradan gelir. Bu type Python'a 2002'de PEP 285 ile önerildi ve Python 2.3 ile geldi.

x > 5 gibi her karşılaştırma bir bool üretir: True ya da False. while da her turdan önce devam şartını hesaplar: sonuç True ise gövde bir kez daha çalışır, False ise loop biter.

Kaynaklar:
Computer History Museum, Revolution, Boolean Logic
MacTutor History of Mathematics, George Boole (Cork kürsüsü, 1849)
PEP 285, Adding a bool type (8 Mart 2002, Python 2.3)

Amsterdam'daki Centrum Wiskunde & Informatica (CWI) binasının girişi.
Fotoğraf: Robvanroo, “Entree CWI”, Wikimedia Commons, CC BY-SA 4.0. Boyutu küçültüldü.

2B

Landin'in offside rule'u (1966) ve ABC dili

Block'ları indentation ile belirleme kuralına adını Peter Landin verdi: 1966'da CACM'de yayımlanan 'The Next 700 Programming Languages' makalesinde buna 'offside rule' dedi. Python indentation kuralını doğrudan ABC dilinden aldı; ABC 1980'lerin başında Amsterdam'daki CWI'de tasarlandı ve Guido van Rossum Python'a başlamadan önce bu projede çalışmıştı. Guido'nun anlattığına göre ABC'nin ilk kullanıcı testlerinde iki nokta (:) yokken yeni başlayanlar indentation'ın ne anlama geldiğini kavrayamamış; iki nokta bu yüzden eklenmiş.

while satırının sonundaki : bir block'un başladığını söyler, indentation da block'un nerede bittiğini gösterir. Indentation Python'da süs değil, kuraldır: ikinci satırdaki while'ın altındaki satır indentation olmadan yazılırsa şu hata alınır: IndentationError: expected an indented block after 'while' statement on line 2

Kaynaklar:
G. van Rossum, Early Language Design and Development, The History of Python, 2009
Python Design and History FAQ
P. J. Landin, The Next 700 Programming Languages, CACM 9(3), 1966, doi:10.1145/365230.365257
Wikipedia, Off-side rule

İsteğe bağlı video: Oral History of Guido van Rossum, part 1 (Computer History Museum, 3 sa 11 dk 59 sn).

1957'de NACA Langley'de IBM 704 bilgisayarı başında çalışan iki kişi; biri konsolda oturuyor, diğeri dolapların önünde ayakta.
Fotoğraf: NASA (NACA Langley), “IBM Electronic Data Processing Machine - GPN-2000-001881”, Wikimedia Commons, kamu malı. Boyutu küçültüldü.

2A

FORTRAN'da = işareti (1956)

IBM'in 15 Ekim 1956 tarihli FORTRAN başvuru kılavuzu, bu dilde = işaretinin 'yerine konur' anlamına geldiğini yazar: önce sağ taraf hesaplanır, sonuç sol taraftaki variable'ın bellekteki yerine yazılır. Kılavuz I=I+1 örneğini 'I'ya 1 ekle ve I'ya yaz' diye açıklar ve bu örneğin bir denklem değil, bir değeri değiştirme komutu olduğunu gösterdiğini belirtir. FORTRAN IBM 704 için geliştirildi ve 1957'de kullanıcılara sunuldu; aynı kılavuz üs alma için ** işaretini tanımlar.

Python'daki = de aynı işi yapar: x = x + 1 önce x'in eski değerini okur, 1 ekler, sonra x ismi yeni değeri gösterir. Bu yüzden = işaretini "eşittir" diye değil "olsun" diye okuyun. Üs alma da hala ** ile yazılır: 2 ** 10 sonucu 1024'tür. 2 ^ 3 ise hata vermeden 1 verir, çünkü ^ Python'da üs alma operator'ı değildir.

Kaynaklar:
IBM, The FORTRAN Automatic Coding System for the IBM 704 EDPM, Programmer's Reference Manual, 15 Ekim 1956, s. 12, 15, 16 ("is to be replaced by"; "not an equation but a command to replace a value")
IBM Heritage, Fortran
J. Backus, The History of FORTRAN I, II, and III, doi:10.1145/960118.808380

Ada Lovelace'ın Note G tablosu: her satır bir işlem; sağdaki sütunların her biri V1, V2, V3 gibi bir variable'a ayrılmış ve o işlemden sonra variable'da duran değeri gösteriyor.
Görsel: Ada Lovelace, “Diagram for the computation of Bernoulli numbers”, Wikimedia Commons, kamu malı. Boyutu küçültüldü.

2A

Lovelace'ın Note G tablosu (1843)

Ada Lovelace, 1843'te Luigi Menabrea'nın Analytical Engine makalesini İngilizceye çevirirken eklediği notların sonuncusunda (Note G), makinenin Bernoulli sayılarını hesaplaması için adım adım bir tablo verdi. Tablonun her satırı bir işlemdir; sağdaki sütunların her biri bir variable'a (V1, V2, V3 ...) ayrılmıştır ve hücreler o işlemden sonra variable'da hangi değerin durduğunu gösterir. Note D'de anlattığı gibi V'nin sol üstündeki küçük sayı değerdeki değişikliği izler: variable'a ilk değer konunca ¹V olur, bu değer yerini yenisine bırakınca ²V olur.

Bir programı satır satır izlerken kurulan tablo da aynı düzendedir: her satırdan sonra her variable'ın o anki değeri yazılır ve yeni bir assignment eski değerin yerine yenisini koyar. PyCharm debugger'ının Variables paneli de her adımdan sonra aynı bilgiyi gösterir.

Kaynaklar:
L. F. Menabrea, Sketch of the Analytical Engine, A. A. Lovelace'ın notlarıyla (1843), Note D ve Note G; Fourmilab metni
Encyclopaedia Britannica, Ada Lovelace

İsteğe bağlı video: Charles Babbage and Ada Lovelace - Professor Raymond Flood (Gresham College, 44 dk 49 sn).

EDSAC'ın üç izleme ekranı: soldakinin üstünde COUNTER, sağdakinin üstünde SEQUENCE CONTROL yazıyor; ortadaki ekranda bellekteki sözcükler satır satır görünüyor.
Fotoğraf: Copyright Computer Laboratory, University of Cambridge. Reproduced by permission. “EDSAC (5)”, Wikimedia Commons, CC BY 2.0 UK.

2A

EDSAC'ın ekranları ve Gill'in checking routine'leri (1949-1951)

Cambridge'deki EDSAC'ta program yazanlar makinenin içindeki değerleri önce ekranlarda izliyordu: fotoğraftaki üç katot ışınlı tüpten soldaki sayacı, ortadaki bir bellek bölümündeki 32 sözcüğü, sağdaki sıradaki komutun adresini gösterir. Bu yöntem makine zamanı harcadığı için kısa sürede yazılım araçları geliştirildi: araştırma öğrencisi Stanley Gill, hatalı programı onu adım adım yorumlayan başka bir programın içinden çalıştıran 'checking routine'ler yazdı; bu programlar çalışma sırasında tanı bilgisi basıyordu. Gill yöntemi 1951'de Proceedings of the Royal Society'de yayımladı; bugün bu tür araçlara 'trace' deniyor.

PyCharm'ın debugger'ı aynı işi yapar: programı satır satır yürütür (Step Over) ve Variables panelinde her variable'ın o anki değerini gösterir. Bir programı satır satır izlemenin bugünkü aracı budur.

Kaynaklar:
S. Gill, The Diagnosis of Mistakes in Programmes on the EDSAC, Proceedings of the Royal Society A 206, 1951, doi:10.1098/rspa.1951.0087
M. Campbell-Kelly, EDSAC Tutorial Guide, §2 (monitör tüpleri) ve §4.3 ("Checking routines were invented by Stanley Gill")

Computer History Museum'da sergilenen Teletype ASR-33 terminali: klavye, kağıt rulo ve yanda delikli şerit okuyucu.
Fotoğraf: Arnold Reinhold, “ASR-33 at CHM”, Wikimedia Commons, CC BY-SA 3.0. Boyutu küçültüldü.

2A

Teletype Model 33 ve BASIC'in INPUT komutu (1963-1966)

1960'larda bilgisayarla konuşmanın yaygın yolu, 1963'te piyasaya çıkan Teletype Model 33 gibi elektromekanik terminallerdi: klavyeden yazılan satır bilgisayara gider, cevap aynı kağıt ruloya basılırdı. Dartmouth'ta 1 Mayıs 1964'te çalışan ilk BASIC'in komutları arasında kullanıcıdan veri isteyen bir komut yoktu; veriler programın içindeki DATA satırlarından READ ile okunuyordu. Programın kullanıcıdan yazı almasını sağlayan INPUT komutu, dilin 1966'daki üçüncü sürümüyle geldi.

Python'daki input() aynı işi yapar: soruyu yazar, Enter'a basılana kadar bekler ve yazılanı her zaman str olarak döndürür; kullanıcı 20 yazsa da type(age) <class 'str'> verir. Terminale Unix'te hala 'tty' (teletypewriter) denir; Python'daki isatty() method'unun adı da buradan gelir.

Kaynaklar:
Computer History Museum, katalog 102752152 (yaklaşık 1963)
Wikipedia, Teletype Model 33 (1963)
Dartmouth College, BASIC Commands (READ ve DATA)
TIME, Fifty Years of BASIC (1 Mayıs 1964; INPUT üçüncü sürümde, 1966)
Python belgeleri, io.IOBase.isatty

İsteğe bağlı video: Birth of BASIC (Dartmouth, 38 dk 13 sn).

Vancouver Borsası endeksi için üç çubuk: Ocak 1982 başlangıcı 1000, 25 Kasım 1983 kesilerek hesaplanan değer 524,811, 28 Kasım 1983 doğru hesap 1098,892.
Çizim: kursun kendi çizimi.

2A

Vancouver Borsası endeksi (1982-1983)

Vancouver Borsası Ocak 1982'de 1000 puanla bir endeks başlattı. Endeks her fiyat değişiminde, ortalama bir günde 2800 kez yeniden hesaplanıyor ve üçüncü ondalık basamaktan sonrası yuvarlanmadan atılıyordu. Wall Street Journal'a göre kaybolan küçük farklar birikerek endeksi günde bir iki puan aşağı çekti. 22 ay sonra, 25 Kasım 1983 Cuma kapanışında endeks 524,811'deydi; doğru yöntemle yeniden hesaplanınca 28 Kasım 1983 Pazartesi 1098,892 olarak açıklandı.

int(3.9) 3 verir, round(3.9) 4 verir: int() keser, yuvarlamaz. Tek bir kesme önemsiz görünür; binlerce kez tekrarlanınca sonuç anlamını yitirir.

Kaynaklar:
Wall Street Journal, 8 Kasım 1983, s. 37
Toronto Star, 29 Kasım 1983
B. D. McCullough, H. D. Vinod, Journal of Economic Literature 37, 1999, s. 639
Üç kaynağın metni: T. Huckle (TU München), Vancouv.pdf

C dilinin tasarımcısı Dennis Ritchie, 2011'de Japan Prize töreninde.
Fotoğraf: Denise Panyik-Dale, “Dennis Ritchie 2011”, Wikimedia Commons, CC BY 2.0.

2A

C'nin printf'i ve %.2f biçimi (1970'ler)

Dennis Ritchie'nin 1970'lerin başında Bell Labs'te geliştirdiği C dilinde sayılar printf ile biçimlendirilir: %.2f biçimi bir sayıyı ondalık noktadan sonra iki basamakla yazar. Python bu gösterimi önce % operator'ıyla aldı; Python belgeleri bu operator'ı C'deki sprintf() function'ına benzetir. f-string'ler Ağustos 2015'te PEP 498 ile önerildi, Python 3.6 ile geldi ve aynı biçim kodlarını % yerine iki noktadan sonra yazar.

f"{average:.2f}" içindeki .2 basamak sayısını, f ise Python belgelerinin fixed-point notation dediği sabit noktalı gösterimi belirtir: f"{3.14159:.2f}" de "%.2f" % 3.14159 da 3.14 verir. Aynı harfler yarım yüzyıldır C'de, Python'da ve başka dillerde aynı anlamı taşır.

Kaynaklar:
Python belgeleri, printf-style String Formatting
Python belgeleri, Format Specification Mini-Language ('f' Fixed-point notation)
PEP 498, Literal String Interpolation (1 Ağustos 2015, Python 3.6)
D. M. Ritchie, The Development of the C Language

Mustafa Kemal Atatürk, 20 Eylül 1928'de Kayseri'de açık havada bir yazı tahtasının önünde yeni Türk harflerini halka tanıtırken.
Fotoğraf: Türkiye Cumhuriyeti Cumhurbaşkanlığı, “Ataturk-September 20, 1928”, Wikimedia Commons, kamu malı.

2A

Yeni Türk alfabesi ve noktalı i (1928)

Türkçe, 1 Kasım 1928'de kabul edilen 1353 sayılı Türk Harflerinin Kabul ve Tatbiki Hakkında Kanun ile Latin harfleriyle yazılmaya başlandı; yeni alfabede noktalı ve noktasız i ayrı harflerdir (i/İ ve ı/I). Fotoğraf, kanundan yaklaşık altı hafta önce, 20 Eylül 1928'de Kayseri'de yeni harflerin halka tanıtıldığı gündendir. Unicode'un büyük ve küçük harf tablosu (SpecialCasing.txt) Türkçe ve Azericeyi dile bağlı istisna olarak ayrıca listeler; dilden bağımsız varsayılan kuralda i'nin büyüğü I'dır.

Python'un upper() ve lower() method'ları bu varsayılan kuralı uygular: "i".upper() "I" verir, "İ" değil; "İ".lower() ise iki karakterlik "i̇" (i ve birleşik nokta, U+0307) döndürür. Türkçe girdiyi büyük ve küçük harfe göre karşılaştırırken bunu hesaba katmak gerekir.

Kaynaklar:
1353 sayılı Kanun (kabul 1 Kasım 1928; Resmi Gazete 3 Kasım 1928)
NYU Abu Dhabi Akkasah arşivi ve Milliyet (Kayseri, 20 Eylül 1928)
Unicode, SpecialCasing.txt (tr ve az eşlemeleri)
Python belgeleri, str.lower

1967 tarihli US-ASCII kod tablosu: sütunlarda bit desenleri, büyük harfler 4. ve 5. sütunda, küçük harfler hemen yanlarında 6. ve 7. sütunda.
Görsel: ABD hükümeti (MIL-STD-188-100, 1972), “USASCII code chart”, Wikimedia Commons, kamu malı. Boyutu küçültüldü.

2A

ASCII'de büyük ve küçük harf arasındaki tek bit (1963-1967)

ASCII'nin 1963'te yayımlanan ilk sürümünde küçük harfler yoktu; tablonun son iki sütunundaki 28 konum ileride kullanılmak üzere boş bırakılmıştı. 1965'te CACM'de yayımlanan revizyon önerisi küçük harfleri bu boş alana yerleştirdi ve bir harfin büyüğü ile küçüğü arasında tek bir bit fark olmasını bilerek istedi: yalnızca 64 karakter basabilen cihazlar böylece iki hali aynı işaretle basabilecekti. Revizyon 1967'de standart oldu. IEEE, ASCII'yi 2016'da bir IEEE Milestone olarak tanıdı.

'A' 65, 'a' 97'dir; ord("a") - ord("A") 32 verir. 32 ikili tabanda tek bir bittir: bin(65) '0b1000001', bin(97) '0b1100001'. ç, ş, ğ, ı gibi harfler ASCII'de yoktur; onlar Unicode ile gelir.

Kaynaklar:
Proposed Revised American Standard Code for Information Interchange, CACM 8(4), 1965, doi:10.1145/363831.363839 (§4.1.1 ve A6.4)
ETHW, IEEE Milestone, ASCII, 1963 (19 Mayıs 2016)

İsteğe bağlı video: Characters, Symbols and the Unicode Miracle - Computerphile (Computerphile, 9 dk 37 sn).

ELIZA programını yazan Joseph Weizenbaum, 1982'de oturmuş, ellerini birleştirmiş halde.
Fotoğraf: Rochester Institute of Technology (News & Events bülteni), “Weizenbaum 1982”, Wikimedia Commons, kamu malı.

2A

Weizenbaum'un ELIZA programı (1966)

Joseph Weizenbaum'un MIT'te yazdığı ELIZA programı Ocak 1966'da Communications of the ACM'de yayımlandı. Program, kullanıcının yazdığı cümlede anahtar kelimeler arıyor, cümleyi bu kelimelere bağlı ayrıştırma kurallarıyla parçalara ayırıyor ve hazır yeniden birleştirme kurallarıyla cevap üretiyordu; 'my boyfriend made me come here' cümlesine 'YOUR BOYFRIEND MADE YOU COME HERE' diye karşılık vermesi bu yüzdendir. Weizenbaum, insanların bu kadar basit metin işlemlerine anlayış atfetmesinden rahatsız oldu ve 1976'da bunu eleştiren Computer Power and Human Reason kitabını yazdı.

replace() method'u ELIZA'nın kelime değiştirme işinin en küçük halidir: "ben yoruldum".replace("ben", "sen") "sen yoruldum" verir. Fiil eki değişmedi, çünkü replace() cümleyi anlamaz, yalnızca harf dizisini değiştirir.

Kaynaklar:
J. Weizenbaum, ELIZA, CACM 9(1), 1966, doi:10.1145/365153.365168
IEEE Computer Society, Computer Pioneers: Joseph Weizenbaum (1976 kitabı)

Simon Stevin'in 1585'te Leiden'da basılan De Thiende kitabının kapak sayfası.
Görsel: Simon Stevin (Leiden: Christoffel Plantijn), “De Thiende (title page)”, Wikimedia Commons, kamu malı.

2A

Stevin'in De Thiende'si ve ondalık ayırıcı (1585)

Simon Stevin ondalık kesirleri icat etmedi, ama 1585'te Leiden'da yayımladığı 29 sayfalık De Thiende onları Avrupa matematiğine soktu; kapaktaki alt başlık, insanların ihtiyaç duyduğu bütün hesapların kesirsiz, tam sayılarla yapılabileceğini vaat eder. Stevin'in gösterimini Clavius ve Napier geliştirdi ve bugünkü biçim oradan çıktı. Ondalık ayırıcı olarak nokta ve virgül bölgelere göre ayrıştı; Uluslararası Ağırlıklar ve Ölçüler Genel Konferansı (CGPM) 2003'te ikisini de geçerli ondalık işareti olarak kabul etti.

Python yalnızca noktayı tanır: float("3,5") şu hatayı verir: ValueError: could not convert string to float: '3,5'. Kullanıcı virgül yazarsa float(s.replace(",", ".")) önce virgülü noktaya çevirir ve 3.5 elde edilir.

Kaynaklar:
MacTutor History of Mathematics, Simon Stevin
De Thiende'nin kapak sayfası ("Tot Leyden, By Christoffel Plantijn, 1585")
BIPM, 22. CGPM (2003), Karar 10

ARPANET'te başka bilgisayarlara e-posta gönderen ilk programı yazan Ray Tomlinson, 2004'te.
Fotoğraf: Andreu Veà, WiWiW.org, “Ray Tomlinson”, Wikimedia Commons, CC BY-SA 3.0.

2B

Tomlinson'ın @ işareti (1971)

Ray Tomlinson 1971'de BBN'de SNDMSG ve CPYNET programlarını birleştirerek ARPANET'te başka bilgisayarlardaki kullanıcılara mesaj gönderebilen ilk e-posta uygulamasını yazdı ve kullanıcı adını bilgisayar adından ayırmak için @ işaretini seçti. kullanici@bilgisayar biçimi o günden beri e-posta adreslerinin temelidir; Tomlinson 2012'de Internet Hall of Fame'in ilk üyeleri arasına seçildi.

"@" in email ifadesi metinde @ olup olmadığını sorar ve True ya da False döndürür: "@" in "ali@example.com" True verir. Bu kontrol yalnızca @ işaretine bakar; bir adresin gerçekten geçerli olup olmadığını tek başına söylemez.

Kaynaklar:
Lemelson-MIT, Ray Tomlinson
Raytheon basın bülteni, 2012
Internet Hall of Fame (2012'nin ilk üyeleri)

Claude Shannon'ın siyah-beyaz portresi.
Fotoğraf: Tekniska museet (fotoğrafçı bilinmiyor), “C.E. Shannon. Tekniska museet 43069”, Wikimedia Commons, CC BY 2.0. Boyutu küçültüldü.

2B

Shannon'ın yüksek lisans tezi (1937)

Claude Shannon 1937'de MIT'de yazdığı yüksek lisans tezinde Boole cebirinin röleli anahtarlama devrelerine uygulanabileceğini gösterdi; bugünkü ifadeyle seri bağlı iki anahtar and, paralel bağlı iki anahtar or gibi davranır. Tezin kısaltılmış hali 1938'de 'A Symbolic Analysis of Relay and Switching Circuits' başlığıyla, 1963'te IRE ile birleşerek IEEE'yi oluşturan AIEE'nin Transactions dergisinde yayımlandı.

a and b yalnızca iki taraf da True ise True olur (seri anahtarlar); a or b en az biri True ise True olur (paralel anahtarlar); not değeri ters çevirir: print(True and False, True or False, not True) False True False yazar.

Kaynaklar:
Computer History Museum, Revolution (1937 tezi)
MIT DSpace kaydı (derece tarihi 1940)
C. E. Shannon, A Symbolic Analysis of Relay and Switching Circuits, Transactions of the AIEE 57(12), 1938, doi:10.1109/T-AIEE.1938.5057767
IEEE History (AIEE ile IRE 1 Ocak 1963'te birleşti)

İsteğe bağlı video: Claude Shannon - Father of the Information Age (University of California Television (UCTV), 29 dk 32 sn).

2B

Gregoryen takvimde artık yıl kuralı (1582)

Bugün kullandığımız Gregoryen takvim 24 Şubat 1582'de getirildi. Kural: 4'e bölünen yıllar artık yıldır, ama yüzyıl yılları ancak 400'e de bölünüyorsa artık yıldır; böylece 400 yılda 97 artık gün olur. Türkiye'de resmi takvimde miladi yıl sayımına 698 sayılı kanunla 1 Ocak 1926'da geçildi.

Kural tek bir karşılaştırmayla yazılamaz; and ile or birlikte, parantezle kullanılmalıdır. 1900 artık yıl değildir, 2000 artık yıldır: artık yıl expression'ını yazdığınızda onu bu iki yılla sınayın.

Kaynaklar:
U.S. Naval Observatory, Leap Years (400 yılda 97 artık gün)
Wikipedia, Inter gravissimas (24 Şubat 1582)
Linda Hall Library
698 sayılı Kanun (31 Aralık 1341'in ertesi günü 1 Ocak 1926)

Lovelace'ın Note G tablosundan 13-25. işlemler: 13-23 köşeli parantezle gruplanmış, altında 'Here follows a repetition of Operations thirteen to twenty-three' yazıyor; V10 sütununda n − 3 görülüyor.
Görsel: Ada Lovelace, “Diagram for the computation of Bernoulli numbers”, Wikimedia Commons, kamu malı. Kırpıldı.

2B

Note G'de tekrarlanan işlemler (Lovelace, 1843)

Ada Lovelace'ın 1843'te yayımlanan Note G tablosu, Analytical Engine'in bir Bernoulli sayısını nasıl hesaplayacağını işlem işlem gösterir. 23. işlemin altında 'Here follows a repetition of Operations thirteen to twenty-three' yazar. Tekrarın ne zaman biteceğine V10 karar verir: 23. işlem V10'dan 1 çıkarır; tablodaki örnekte (n = 4) ilk turdan sonra V10 = 1'dir, tekrar bittiğinde 0 olur. Lovelace'ın ifadesiyle V10, bir çıkarma işlemiyle n'in değerini yoklayarak sonraki işlemlerin hangi yoldan gideceğine karar verir.

while loop'unun üç parçası bu tabloda görülür: başlangıç değeri, her turdaki güncelleme (V10'dan 1 çıkarmak) ve tekrarın bittiği durum (V10 = 0). Güncelleme olmasaydı tekrar hiç bitmezdi.

Kaynaklar:
L. F. Menabrea, Sketch of the Analytical Engine, A. A. Lovelace'ın notlarıyla, Scientific Memoirs 3 (1843), Note G; Fourmilab metni
T. J. Misa, Comment on: Was Ada Lovelace Actually the First Programmer?, arXiv:2402.00749

İsteğe bağlı video: The Scientific Life of Ada Lovelace - Professor Ursula Martin (Gresham College, 52 dk 39 sn).

Goldstine ve von Neumann'ın raporundan el çizimi akış diyagramı (Şekil 12.1): numaralı kutular ve oklar; III, IV, VI, VII ve X numaralı kutulardan + ve − işaretli iki ayrı ok çıkıyor.
Görsel: Herman H. Goldstine, John von Neumann (Institute for Advanced Study), “Flow chart of Planning and coding of problems for an electronic computing instrument, 1947”, Wikimedia Commons, kamu malı.

2B

Goldstine ve von Neumann'ın akış diyagramları (1947-1948)

Herman Goldstine ve John von Neumann, Princeton'daki Institute for Advanced Study'nin bilgisayarı için 1947-1948'de yayımladıkları 'Planning and Coding of Problems for an Electronic Computing Instrument' raporlarında programları akış diyagramlarıyla planladı. Morris ve Gotel'e göre bu diyagramların en kalıcı yeniliği 'alternative box' oldu: bir girişi ve iki çıkışı olan, içindeki testin sonucuna göre + ya da - ile işaretli iki yoldan birini seçen kutu. Görseldeki diyagram aynı rapor dizisindendir (Şekil 12.1); III, IV, VI, VII ve X numaralı kutular bu türdendir.

if/else'in akış şemasındaki karşılığı budur: condition doğruysa bir yol, değilse öteki. elif zinciri bu kutuların art arda dizilmesidir; ilk doğru condition'ın yolu seçilir, gerisine bakılmaz.

Kaynaklar:
S. J. Morris, O. C. Z. Gotel, Flow Diagrams: Rise and Fall of the First Software Engineering Notation, 2006 ("The most long-lasting innovation in the GvN type was the introduction an 'alternative box'")
Internet Archive, planningcodingof0103inst (1947, Part II, cilt 1-3)

Ders 3

Heinz Rutishauser'in 1960 dolaylarında çekilmiş siyah beyaz portresi.
Fotoğraf: ETH-Bibliothek Zürich, Bildarchiv / fotoğrafçı bilinmiyor / Portr_10843, “ETH-BIB-Rutishauser, Heinz (1918-1970)-Portr 10843”, Wikimedia Commons, CC BY-SA 4.0. Boyutu küçültüldü.

3A

Rutishauser'in dilinde for (1952)

ETH Zürich'te Z4 bilgisayarıyla çalışan Heinz Rutishauser, 1949-1951 arasında yürütüp 1952'de yayımladığı çalışmada basit bir cebirsel dil ve bu dil için iki compiler (derleyici) tasarımının akış şemalarını tanımladı. Knuth ve Trabb Pardo'ya göre bu dilde sırayla çalışmayı bozan tek yapı for loop'uydu ve bu yapı programlama dillerinin sonraki gelişimine önemli bir katkıydı. Knuth ve Trabb Pardo'nun 1976'da bu dille yazdığı örnek programda loop Für i = 10(-1)0 satırıyla başlar, Ende Index i satırıyla biter ve i'yi 10'dan 0'a birer azaltarak sayar. Rutishauser sonra ALGOL 60 raporunun yazarları arasında yer aldı; ALGOL 60'ta aynı yapı for sözcüğüyle yazılır.

for i in range(10, -1, -1): aynı sayımı yapar ve 10, 9, ..., 0 verir. Fark şu: Rutishauser'in gösteriminde bitiş değeri (0) dahildir, Python'da dahil değildir; 0'a kadar saymak için bitiş -1 yazılır.

Kaynaklar:
D. E. Knuth, L. Trabb Pardo, The Early Development of Programming Languages, STAN-CS-76-562, 1976, Rutishauser bölümü
Revised Report on the Algorithmic Language Algol 60, §4.6 for statements

Edsger W. Dijkstra'nın siyah beyaz portresi.
Fotoğraf: Hamilton Richards, “Edsger Wybe Dijkstra”, Wikimedia Commons, CC BY-SA 3.0. Boyutu küçültüldü.

3B

Dijkstra'nın EWD831 notu (1982)

Edsger W. Dijkstra 11 Ağustos 1982 tarihli EWD831 notunda 2, 3, ..., 12 dizisini yazmanın dört yolunu karşılaştırdı ve 2 ≤ i < 13 biçimini seçti: alt sınır dahil, üst sınır hariç. Bu biçimde sınırların farkı dizinin uzunluğuna eşittir (13 - 2 = 11); numaralandırma 0'dan başlarsa N elemanlı bir dizinin index'leri 0 ≤ i < N olur. Guido van Rossum 23 Ekim 2013'te yazdığı notta, Python'da 0'dan başlama kararında slicing gösteriminin etkili olduğunu anlattı: a[:n] ilk n elemanı, a[i:i+n] i'den başlayan n elemanı verir ve yan yana iki slice'ta birincinin bitişi ikincinin başlangıcıdır.

range(2, 13) 13'ü içermez ve tam 11 sayı üretir; s[0:4] 4 karakter verir. Bitiş hariç olduğu için uzunluk her zaman bitiş eksi başlangıçtır: len(range(2, 13)) 11'dir.

Kaynaklar:
E. W. Dijkstra, EWD831, Why numbering should start at zero, 11 Ağustos 1982
G. van Rossum, Why Python uses 0-based indexing, 23 Ekim 2013 (arşiv)
The History of Python, Why Python uses 0-based indexing

Pennsylvania Üniversitesi'nde cam vitrinde sergilenen ENIAC parçaları: solda tekerlekli bir function table, arkada kablolarla bağlı dört panel; soldan üçüncüsü, etiketinde 'Accumulator' yazan bir accumulator.
Fotoğraf: Paul W. Shaffer, University of Pennsylvania (Commons'a yükleyen: TexasDex), “ENIAC Penn1”, Wikimedia Commons, CC BY-SA 3.0. Boyutu küçültüldü.

3A

ENIAC'ın 20 accumulator'ı (1946)

Şubat 1946'da kamuoyuna tanıtılan ENIAC'ta toplama ve çıkarmayı yapan ana birimler 20 accumulator'dı; her biri on basamaklı tek bir sayı tutardı. Bir accumulator'a gönderilen sayı, içinde duran sayıya eklenir ve sonuç yine orada kalırdı. Fotoğraf, Pennsylvania Üniversitesi'nin Moore School binasında sergilenen dört ENIAC panelini ve bir function table'ı gösteriyor; soldan üçüncü panelin etiketinde Accumulator yazıyor.

total += i satırı bir accumulator'ın yaptığı işin aynısıdır: total loop'tan önce 0 yapılır, her turda üzerine eklenir, sonuç loop bittikten sonra okunur. total = 0 loop'un içine yazılırsa her turda sıfırlanır; 1'den 5'e kadar toplamada sonuç 15 yerine 5 çıkar.

i = 1
total = 0
while i <= 5:
    total += i
    i += 1
print(total)
Çıktı
15

Kaynaklar:
Penn Engineering, ENIAC ("twenty accumulators for addition and subtraction")
Computer History Museum, Revolution, ENIAC ("The 20 single-number accumulators were its primary functional units")

İsteğe bağlı video: CHM Live | Working on ENIAC: Rethinking Innovation Myths with Author Thomas Haigh (Computer History Museum, 1 sa 31 dk 24 sn).

IBM'in 1956 tarihli FORTRAN kılavuzunun kapağı: 'Programmer's Reference Manual', büyük harflerle 'Fortran', altında 'Automatic Coding System for the IBM 704'.
Görsel: IBM, Applied Science Division ve Programming Research Department, “Fortran acs cover”, Wikimedia Commons, kamu malı.

3A

FORTRAN'ın DO loop'unda bitiş dahil (1956)

IBM'in 15 Ekim 1956 tarihli FORTRAN kılavuzu DO statement'ını (örnek: DO 30 I = 1,10) şöyle tanımlar: gövde ilk kez I = 1 ile çalışır, I her seferinde artırılır ve gövde, I'nın 10'u aşmayan en büyük değeriyle de çalıştıktan sonra loop biter; yani bitiş değeri dahildir. FORTRAN 1957'de IBM 704 kullanıcılarına sunuldu; programcılar makine kodu yerine formüle yakın bir dille yazabildi.

Python'da range(1, 11) aynı on değeri verir; bitiş dahil olmadığı için 10 değil 11 yazılır. range(1, 10) yazan biri 10'u kaçırır; bu off-by-one hatası bitişin dahil olup olmamasındaki farktan doğar.

Kaynaklar:
IBM, The FORTRAN Automatic Coding System for the IBM 704 EDPM, Programmer's Reference Manual, 15 Ekim 1956, DO statement ("the highest of this sequence of values which does not exceed m2")
IBM Heritage, Fortran

İsteğe bağlı video: Programming in America in the 1950s: Some Personal Impressions by John Backus (Computer History Museum, 34 dk 34 sn).

Brian Kernighan ve Ken Thompson, 4 Mayıs 2019'da VCF East'teki söyleşide sahnede oturuyor.
Fotoğraf: A.C.Diller, “Brian Kernighan and Ken Thompson”, Wikimedia Commons, CC BY-SA 4.0.

3A

B dilinde = ve == (1970'ler)

Ken Thompson'ın Unix'in ilk yıllarında Bell Labs'te tasarladığı B dilinde assignment tek = ile, eşitlik testi == ile yazılıyordu; B'nin öncülü BCPL'de assignment := idi. Dennis Ritchie 1993'te yazdığı C tarihçesinde := yerine tek = seçiminin bir zevk meselesi olduğunu ve hala tartışıldığını belirtir. Kernighan'ın B öğreticisi de okuru uyarır: eşitlik testi == ile yapılır, tek = yazmak şu ya da bu şekilde felakete yol açar.

C bu kuralı B'den aldı, Python da sürdürdü: = saklar, == sorar. if x = 5: yazılırsa Python 3.14 durumu yakalar: SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?

Kaynaklar:
D. M. Ritchie, The Development of the C Language, HOPL-II, 1993 ("= for assignment instead of :=")
B. W. Kernighan, A Tutorial Introduction to the Language B, §10 ("using just one '=' leads to disaster of one sort or another")

İsteğe bağlı video: VCF East: Ken Thompson interviewed by Brian Kernighan (Vintage Computer Federation, 1 sa 3 dk 51 sn), 38:40'tan itibaren (Languages and Evolution).

Heath'in 1908 tarihli Elementler çevirisinin 298. sayfası: VII. kitabın 2. önermesi, iki sayının en büyük ortak ölçüsünü bulma problemi, küçük sayının büyükten art arda çıkarıldığını anlatan paragraf ve yanında AB ile CD doğru parçaları.
Görsel: T. L. Heath'in 1908 tarihli Elementler çevirisi, s. 298 (Google Books taraması, Commons'a yükleyen Wvbailey), “Euclid's algorithm Book VII Proposition 2 1”, Wikimedia Commons, kamu malı. Kırpıldı.

3A

Öklid'in algoritması (Elementler, VII. kitap, MÖ yaklaşık 300)

Öklid'in Elementler'inde (MÖ yaklaşık 300) VII. kitabın 2. önermesi iki sayının en büyük ortak bölenini (Öklid'in deyişiyle en büyük ortak ölçüsünü) bulur. Yöntem 1. önermede kurulur: küçük sayı büyükten art arda çıkarılır ve bu, kalan sayı bir öncekini tam bölene kadar sürer. Kaç adım gerektiği önceden belli değildir; her adımdan sonra yeniden bakılır. Knuth bu yöntemi günümüze ulaşmış en eski basit olmayan algoritma olarak anar.

while a != b: loop'u aynı yöntemi izler: devam şartı her turun başında kontrol edilir, büyük sayıdan küçük olan çıkarılır, a ile b eşitlenince loop biter ve kalan sayı en büyük ortak bölendir. 1071 ve 462 ile başlayınca loop 11 tur döner ve sonuç 21 çıkar.

a, b = 1071, 462
while a != b:
    if a > b:
        a = a - b
    else:
        b = b - a
print(a)
Çıktı
21

Kaynaklar:
D. E. Joyce (Clark University), Euclid's Elements, Book VII, Prop. 1 ve 2
T. L. Heath, The Thirteen Books of Euclid's Elements, c. II, Cambridge University Press, 1908, s. 298
D. E. Knuth, The Art of Computer Programming, c. 2, §4.5.2 ("the oldest nontrivial algorithm that has survived to the present day")

İsteğe bağlı video: Euclid's Algorithm - Numberphile (Numberphile, 12 dk 45 sn).

Matematikçi Lothar Collatz 1984'te bir resepsiyonda.
Fotoğraf: Wikipeter-HH (Wikimedia Commons kullanıcısı), “Lothar Collatz 1984”, Wikimedia Commons, CC BY-SA 3.0.

3B

Collatz problemi (1930'lar)

Kural şu: sayı çiftse 2'ye böl, tekse 3 ile çarpıp 1 ekle; 1'e ulaşınca dur. Problem Lothar Collatz'a atfedilir: Collatz 1930'lardaki defterlerinde aritmetik fonksiyonların yinelenmesi üzerine benzer sorular yazmıştı; problemi 1950'de Cambridge'deki (Massachusetts) Uluslararası Matematikçiler Kongresi'nde sözlü olarak yaydığı söylenir. Her başlangıç sayısının 1'e ulaştığı hala kanıtlanmadı; 2025'te yayımlanan bir çalışmada 2^71'den küçük bütün sayılar için bilgisayarla doğrulandı.

Kaç turda biteceği önceden bilinmeyen tekrar için while kullanılır: 27 ile başlayan dizi 111 adımda 1'e iner ve yolda 9232'ye kadar çıkar.

Kaynaklar:
J. C. Lagarias, The 3x+1 Problem: An Overview, arXiv:2111.02635, bölüm 2
D. Bařina, Improved verification limit for the convergence of the Collatz conjecture, The Journal of Supercomputing 81, 2025, doi:10.1007/s11227-025-07337-0

İsteğe bağlı video: UNCRACKABLE? The Collatz Conjecture - Numberphile (Numberphile, 7 dk 52 sn).

Scientific American'ın 1890 tarihli gravürü: bir kadın operatör Hollerith makinesinde kart okutuyor, önündeki dolapta sayaç kadranları, yanında kart desteleri.
Gravür: Scientific American, 30 Ağustos 1890 (çizer belirtilmemiş), “1890 Census Hollerith Electrical Counting Machines Sci Amer”, Wikimedia Commons, kamu malı.

3A

Hollerith'in sayım makinesi ve 1890 ABD nüfus sayımı

1890 ABD nüfus sayımında her kişinin bilgisi bir delikli karta işlendi. Herman Hollerith'in makinesinde kartın üstüne inen metal iğneler deliklerden geçip devreyi tamamlıyor, devresi tamamlanan özelliğin sayaç kadranı bir artıyordu. Nüfus Sayım Bürosu'na göre sayım planlanandan aylar önce ve bütçenin çok altında bitti. Hollerith'in 1896'da kurduğu Tabulating Machine Company 1911'de bir birleşmeyle Computing-Tabulating-Recording Company'nin parçası oldu; bu şirket 1924'te IBM adını aldı.

loop içinde if ile saymak aynı iştir: her kayda bakılır, condition'ı sağlayan kayıt için counter bir artar. 1'den 30'a kadar 3'ün katlarını sayan loop'ta if n % 3 == 0: count += 1 satırıyla count loop bitince 10 olur.

count = 0
n = 1
while n <= 30:
    if n % 3 == 0:
        count += 1
    n += 1
print(count)
Çıktı
10

Kaynaklar:
U.S. Census Bureau, Tabulation and Processing ("finished months ahead of schedule and far under budget")
IBM, The punched card tabulator

İsteğe bağlı video: The 1890 US Census and the history of punchcard computing [feat. Grant of 3blue1brown fame] (Stand-up Maths, 20 dk 47 sn).

Yan yana dizilmiş 21 bambu şerit; bazıları kırık, üzerlerine siyah mürekkeple yazılmış Çince rakamlar satır ve sütunlardan oluşan bir tablo oluşturuyor.
Görsel: Tsinghua bambu şeritleri, MÖ yaklaşık 305 (fotoğraf kaynağı Xinhua, 2014), “Qinghuajian, Suan Biao”, Wikimedia Commons, kamu malı. Boyutu küçültüldü.

3B

Tsinghua bambu şeritlerindeki çarpım tablosu (MÖ yaklaşık 305)

Tsinghua Üniversitesi 2008'de yaklaşık 2.500 bambu şeritten oluşan bir bağış aldı; karbon tarihlemesi şeritlerin MÖ yaklaşık 305'ten kaldığını gösteriyor. Bunlardan 21'i yalnızca sayı içeriyordu. Şeritler doğru sıraya konunca bir tablo ortaya çıkıyor: en üst satırda ve en sağ sütunda aynı 19 sayı (0,5; 1'den 9'a tam sayılar; 10, 20, ..., 90) var, her satır ile sütunun kesiştiği yerde ikisinin çarpımı yazılı. Nature'daki habere göre matematik tarihçisi Joseph Dauben bunu dünyadaki en eski onluk çarpım tablosu olarak değerlendiriyor; Guinness World Records da aynı unvanla kaydetti.

Böyle bir tablo nested loops ile üretilir: dış loop 19 satırı, iç loop her satırda 19 sütunu dolaşır ve toplam 19 × 19 = 361 çarpım yapılır. İç loop, dış loop'un her turunda baştan sona çalışır.

Kaynaklar:
J. Qiu, Ancient times table hidden in Chinese bamboo strips, Nature News, 7 Ocak 2014, doi:10.1038/nature.2014.14482
Guinness World Records, Oldest decimal multiplication table

Ada Lovelace'ın 1840 dolaylarına tarihlenen, Alfred Edward Chalon'a atfedilen suluboya portresi.
Resim: Alfred Edward Chalon'a atfedilir, yaklaşık 1840 (Science Museum Group koleksiyonu), “Ada Lovelace portrait”, Wikimedia Commons, kamu malı. Boyutu küçültüldü.

3B

Lovelace'ın "cycle of cycles" ifadesi (Note E, 1843)

Lovelace 1843'teki Note E'de, birden fazla kez tekrarlanan işlem grubuna cycle dedi ve tekrarlanan grupların da tekrar edilebileceğini yazdı: 'a cycle of a cycle, or a cycle of cycles'. Note G'deki Bernoulli hesabında bu yapı somuttur: 13-23. işlemler bir Bernoulli sayısı için gerektiği kadar tekrarlanır, aynı işlem grubu sırayla her yeni Bernoulli sayısı için yeniden kullanılır ve Lovelace bunu da 'a cycle of a cycle' diye adlandırır. Bu tekrarları kısaca yazmak için integral hesabındaki gösterimden (Σ ve sınırlar) yararlandı.

Nested loops'un tanımı budur: iç loop (13-23. işlemler) dış loop'un (her yeni Bernoulli sayısı) her turunda baştan sona çalışır. Lovelace'ın 'varying cycle' dediği durumda iç loop'un tur sayısı dış loop ilerledikçe değişir; Python'da bunun karşılığı iç loop'ta range(i) gibi dış variable'a bağlı bir sınırdır.

Kaynaklar:
L. F. Menabrea, A. A. Lovelace, Sketch of the Analytical Engine (1843), Note E ve Note G; Fourmilab metni
T. J. Misa, arXiv:2402.00749

İsteğe bağlı video: Charles Babbage and Ada Lovelace - Professor Raymond Flood (Gresham College, 44 dk 49 sn).

Marshall Nirenberg'in laboratuvar defterinden elle doldurulmuş tablo: solda UUU, UUC, UUA, UUG, UCU ... sırasıyla 64 üçlü, üstte ALA, ARG, ASP gibi 20 amino asit kısaltması, hücrelerde ölçüm değerleri, bazıları kırmızıyla çerçevelenmiş.
Görsel: Marshall Nirenberg (NIH), “06 chart lg”, Wikimedia Commons, kamu malı. Boyutu küçültüldü.

3B

Nirenberg ve genetik kodun 64 üçlüsü (1961-1964)

Marshall Nirenberg ve Heinrich Matthaei 1961'de, yalnızca urasil içeren yapay bir RNA zincirinin (poli-U) yalnızca fenilalaninden oluşan bir protein zincirine çevrildiğini gösterdi; genetik kodun ilk üçlüsü (UUU) böyle çözüldü. Nirenberg ve Philip Leder 1964'te bir bağlanma deneyi geliştirdi; sonraki yıllarda bu deneyle 64 olası üçlü (kodon) 20 amino aside karşı tek tek sınandı. Nirenberg 1968 Nobel Fizyoloji veya Tıp Ödülü'nü Robert Holley ve Har Gobind Khorana ile paylaştı. Görseldeki defter sayfasında satırlar UUU, UUC, UUA, UUG, UCU, ... sırasıyla ilerler, sütunlarda 20 amino asidin kısaltmaları var.

Satırların sırası iç içe üç for loop'uyla aynen üretilir: for a in "UCAG":, for b in "UCAG": ve for c in "UCAG": ile 4 × 4 × 4 = 64 üçlü çıkar; ilk sekizi UUU UUC UUA UUG UCU UCC UCA UCG'dir. RNA'yı üçerli okumak için range(0, len(rna), 3) ve rna[i:i+3] kullanılır.

count = 0
for a in "UCAG":
    for b in "UCAG":
        for c in "UCAG":
            count += 1
            if count <= 8:
                print(a + b + c)
print(count)
Çıktı
UUU
UUC
UUA
UUG
UCU
UCC
UCA
UCG
64

Kaynaklar:
NLM Circulating Now, Deciphering the Genetic Code: A 50 Year Anniversary, 2015
M. Nirenberg, P. Leder, RNA Codewords and Protein Synthesis, Science 145, 1964, 1399-1407
NobelPrize.org, Marshall W. Nirenberg, Facts

İsteğe bağlı video: A Conversation with Dr. Marshall Nirenberg (National Institutes of Health (NIH), 34 dk 33 sn).

Donald Knuth 1965'te, Caltech yıllığındaki fotoğrafında.
Fotoğraf: fotoğrafçı bilinmiyor, The Big T (Caltech yıllığı, 1965), “Donald Knuth 1965”, Wikimedia Commons, kamu malı.

3B

Knuth ve ortasından çıkılan loop (1974)

Donald Knuth 1974'te ACM Computing Surveys'de yayımlanan Structured Programming with go to Statements makalesinde, çıkış şartı gövdenin ortasında olan loop'ları tartıştı; Dijkstra bu tür loop'a 'n buçuk kez' çalışan loop demişti. Knuth, Ole-Johan Dahl'ın loop; S; while B: T; repeat; önerisini bu soruna ilk gerçek çözüm olarak niteledi; makale exit, break ve leave gibi çıkış komutlarını da ele alır. Fotoğraf Knuth'u 1965'te, makaleden dokuz yıl önce gösteriyor.

while True: ile başlayıp ortadaki if ... break ile biten loop bu yapıdır: önce sayı okunur, 0 ise loop'tan çıkılır, değilse toplama eklenir. Knuth'un belirttiği gibi böyle bir çıkış olmadan okuma satırını loop'tan önce bir kez daha yazmak gerekir. 5, 7 ve 0 girilince toplam 12 çıkar.

total = 0
while True:
    number = int(input("Sayı (bitirmek için 0): "))
    if number == 0:
        break
    total += number
print(total)
Çıktı
Sayı (bitirmek için 0): 5
Sayı (bitirmek için 0): 7
Sayı (bitirmek için 0): 0
12

Kaynaklar:
D. E. Knuth, Structured Programming with go to Statements, ACM Computing Surveys 6(4), 1974, 261-301, doi:10.1145/356635.356640 (s. 278-279)
Python Language Reference, The break statement

Boston Museum of Science'ta pleksiglas vitrin içinde duran bir disket; arkadaki etikette 'The Morris Internet Worm source code' yazıyor.
Fotoğraf: Go Card USA, “Morris Worm”, Wikimedia Commons, CC BY-SA 2.0.

3B

Morris solucanı (1988)

2 Kasım 1988 akşamı internete salınan Morris solucanı, yayılma yollarından birinde fingerd sunucusuna 536 baytlık bir istek gönderdi. Sunucu isteği C library'sindeki gets() function'ıyla 512 baytlık bir alana okuyordu ve gets() alanın sonunu kontrol etmiyordu; fazladan gelen 24 bayt belleğin komşu bölümüne yazıldı ve solucanın gönderdiği kod çalıştı. RFC 1135'e göre bu saldırıdan yalnızca 4.3BSD çalıştıran VAX makineleri etkilendi.

Python her index'i kontrol eder: altı harfli "Python" str'inde word[6] IndexError: string index out of range verir. Ders 4'te görülecek list'lerde de aynı kontrol var: üç elemanlı bir list'te grades[3] = 60 IndexError: list assignment index out of range verir. Program durur, ama list'in dışındaki bir bellek bölgesine sessizce yazılmaz.

Kaynaklar:
J. K. Reynolds, RFC 1135: The Helminthiasis of the Internet, Aralık 1989 ("Only 4.3BSD VAX machines suffered from this attack")
D. Seeley, A Tour of the Worm, Winter 1989 USENIX Conference

İsteğe bağlı video: The First Internet Worm (Morris Worm) - Computerphile (Computerphile, 14 dk 21 sn).

Pompeii'deki Büyük Palaestra'da bir sütunun sıvasına kazınmış yazı, 1937 fotoğrafı: alt alta ROTAS, OPERA, TENET, AREPO, SATOR, altında SAUTRAN ve VALE.
Fotoğraf: Matteo Della Corte, 1937, “Sator Square Palestra Pompeii (CIL 8623 & 8622a-b)”, Wikimedia Commons, kamu malı.

3B

Pompeii'deki SATOR karesi (MS 79'dan önce)

SATOR AREPO TENET OPERA ROTAS kelime karesinin Pompeii'de bulunan iki örneği, kentin MS 79'daki Vezüv patlamasıyla gömülmesinden önceye aittir. Fotoğraftaki örnek, amfitiyatronun yanındaki Büyük Palaestra'da bir sütunun sıvasına kazınmış olarak 1930'ların ortasında bulundu; fotoğraf, örneği 1937'de yayımlayan arkeolog Matteo Della Corte'nindir. Karenin 25 harfi soldan sağa ve sağdan sola aynı okunur. Bu örnek ROTAS ile başlayan biçimdedir; altında SAUTRAN ve VALE yazıları var.

Palindrom kontrolü tek satırdır: s = "ROTASOPERATENETAREPOSATOR" için s == s[::-1] True verir. Adımı -1 olan slice, str'i sondan başa okur.

Kaynaklar:
C. J. Hemer, The Manchester Rotas-Sator Square, Faith and Thought 105, 1978, 36-40
R. Étienne, Le « carré magique » à Conimbriga, Itineraria hispanica, Ausonius, 2006

Ders 4

Descartes'ın 1637 tarihli La Géométrie'sinin 321. sayfası: üstte G, A, B, C, K, L harfleriyle etiketli doğrular ve noktalı bir eğri; altta CB ve BA uzunluklarına y ve x adını verdiği Fransızca metin.
Görsel: René Descartes, La Géométrie (Leiden, 1637), s. 321; tarama Bibliothèque nationale de France / Gallica, “Descartes - Discours de la méthode, éd. 1637”, Wikimedia Commons, kamu malı. Boyutu küçültüldü.

4A

Descartes'ın x ve y'si (La Géométrie, 1637)

René Descartes 1637'de Leiden'de yayımlanan La Géométrie'nin ikinci kitabında, bir eğri üzerindeki C noktasını iki uzunlukla belirledi ve bunlara ad verdi: 'ie les nomme l'vne y & l'autre x' (birine y, öbürüne x diyorum). Cebiri geometriye uygulayan bu çalışma, bugün Kartezyen geometri dediğimiz alanın kaynağıdır. Descartes noktayı bugünkü gibi (x, y) çifti olarak yazmadı; iki uzunluğa ad verdi. Şekilde x, A noktasından yukarı doğru BA boyunca, y ise yatay CB boyunca ölçülür.

Bir nokta iki sayıyla ve belli bir sırayla verilir: (3, 4) ile (4, 3) farklı noktalardır ve Python'da (3, 4) == (4, 3) False döner. x, y = (3, 4) satırı tuple'ı bu iki role ayırır: x 3, y 4 olur. Descartes'ın şeklinde x'in dikey ölçülmesi, hangi konumun ne anlama geldiğinin bir anlaşma olduğunu gösterir; tuple'da da konumların anlamını programı yazan belirler.

Kaynaklar:
MacTutor History of Mathematics, René Descartes
R. Descartes, Discours de la méthode ... La Géométrie, Leiden, 1637, s. 321 (Gallica btv1b86069594)

1948'de EDSAC'ta W. Renwick öne eğilmiş, elindeki delikli kağıt şeridi düzeltiyor; şerit soldaki tahta gövdeli şerit okuyucunun üzerinden geçiyor, önünde kağıdına sayılar basılmış Creed teleprinter.
Fotoğraf: Copyright Computer Laboratory, University of Cambridge. Reproduced by permission. “EDSAC (20)”, Wikimedia Commons, CC BY 2.0 UK.

4B

EDSAC'ın subroutine library'si (1949-1951)

Cambridge Üniversitesi'ndeki EDSAC ilk programını 6 Mayıs 1949'da çalıştırdı. Maurice Wilkes'in ekibi sık kullanılan hesapları subroutine'ler, yani başka programlara eklenebilen hazır program parçaları halinde delikli kağıt şeritlere geçirip bir library (kütüphane) içinde topladı: programcı katalogdan gereken subroutine'i seçer, o subroutine'in şeridi kendi program şeridine kopyalanırdı. Wilkes, Wheeler ve Gill'in 1951'de yayımladığı The Preparation of Programs for an Electronic Digital Computer bu library'yi anlatır; Cambridge'in EDSAC tarihçesi bu kitabı programlama üzerine yayımlanan ilk kitap olarak anar.

import math aynı işi görür: başkasının yazıp sınadığı kodu library'den alırsınız, math.sqrt(16) yazıp 4.0 sonucunu kendi programınızda kullanırsınız.

Kaynaklar:
Computer History Museum, This Day in History, 6 Mayıs
University of Cambridge Computer Laboratory, EDSAC 1 and after ("the first book on programming to be published")
The EDSAC Film, Wilkes'in 1976 anlatımı (0:20 "a library of sub routines")

İsteğe bağlı video: The EDSAC Film (CambridgeComputerLab, 10 dk 2 sn).

Cambridge Matematik Laboratuvarı ekibi, Mayıs 1949: üç sıra halinde poz veren yirmi kişi; ön sırada ortada Maurice Wilkes, sağdan ikinci gözlüklü ve açık yakalı David Wheeler.
Fotoğraf: Copyright Computer Laboratory, University of Cambridge. Reproduced by permission. “EDSAC (14)”, Wikimedia Commons, CC BY 2.0 UK.

4B

Wheeler jump (EDSAC, 1949-1952)

EDSAC'ta bir subroutine'e atlamak kolaydı, ama iş bitince call'un yapıldığı yere dönmeyi sağlayan bir donanım yoktu. David Wheeler'ın çözümünde çağıran program kendi adresini accumulator denen yazmaca koyup subroutine'e atlar. Subroutine'in ilk komutları bu adresten dönüş noktasını hesaplayıp subroutine'in son komutuna yazar, son komut da oraya atlar. Yöntem "Wheeler jump" adıyla anılır. Wheeler subroutine'lerin kullanımını 1952'de bir ACM toplantısında "The use of sub-routines in programmes" bildirisiyle anlattı; IEEE Computer Society'nin öncüler sayfası Wheeler jump'ı onun buluşu olarak anar.

say_hello("Mehmet") yazdığınızda dönüş yerini Python kendisi not eder; gövde bitince ya da return çalışınca program call'dan sonraki satırdan devam eder. PyCharm'da F7 (Step Into) ile bu gidişi ve dönüşü satır satır izleyebilirsiniz.

Kaynaklar:
IEEE Computer Society, Computer Pioneers: David J. Wheeler ("invented the subroutine (or mark place and return) 'jump,' then called the 'Wheeler jump'")
D. J. Wheeler, The use of sub-routines in programmes, Proceedings of the 1952 ACM national meeting (Pittsburgh), 235-236, doi:10.1145/609784.609816
University of Cambridge Computer Laboratory, EDSAC 99 ("closed subroutines (Wheeler)")

İsteğe bağlı video: Wheeler Jump - Computerphile (Computerphile, 10 dk 54 sn).

John McCarthy 2006'da.
Fotoğraf: Flickr kullanıcısı "null0", “John McCarthy Stanford”, Wikimedia Commons, CC BY-SA 2.0. Boyutu küçültüldü.

4A

McCarthy ve LISP (1958)

John McCarthy'nin anlattığına göre list işleyen cebirsel bir dil isteği 1956 yazında Dartmouth'taki yapay zeka çalışmasında doğdu; aynı toplantıda Newell, Shaw ve Simon list'lerle çalışan IPL 2 dilini anlattı. LISP'in (LISt Processor) uygulanmasına 1958 sonbaharında MIT'de başlandı, dil 1960'ta Communications of the ACM'de tanıtıldı. LISP'te verinin temel biçimi list'tir ve bir list başka list'ler de içerebilir.

Python'un list'i adını paylaşsa da farklı kurulmuştur: Python belgelerine göre CPython'da list, Lisp tarzı bağlı liste değil, değişken uzunluklu bir array'dir. Bu yüzden grades[i]'nin maliyeti list'in boyuna ve index'in değerine bağlı değildir; grades = [70, 85, 90] list'inde grades[2] ile grades[0] aynı hızda okunur.

Kaynaklar:
J. McCarthy, History of Lisp, 1979
J. McCarthy, Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I, CACM 3(4), 1960 ("LISP (for LISt Processor)")
Python Design and History FAQ, How are lists implemented in CPython?

İsteğe bağlı video: Oral History of John McCarthy (Computer History Museum, 1 sa 28 dk 7 sn).

Roberto Busa 2006'da Gallarate'te; arkasındaki raflarda Index Thomisticus ciltleri.
Fotoğraf: Antonio G Colombo, “Roberto busa e index thomisticus”, Wikimedia Commons, CC0 1.0.

4A

Roberto Busa ve Index Thomisticus (1946-1980)

İtalyan Cizvit rahibi Roberto Busa, Thomas Aquinas'ın eserlerindeki her kelimenin nerede geçtiğini gösterecek Index Thomisticus'u 1946'da planladı; 1949'da IBM'in New York ve Milano merkezlerinde makineyle dil işleme deneylerine başladı ve IBM'den Paul Tasman'la çalıştı. Busa'ya göre en büyük engel, edebi metnin ticari ve istatistik kayıtlardaki gibi belirli alanlara bölünmemiş olmasıydı: önce her cümlenin kelimelere ayrılması gerekiyordu. 1951'deki ilk raporunun alt başlığı, IBM delikli kart makineleriyle otomatik olarak derlenip basılmış ilk kelime dizini örneği olduğunu söylüyordu. Dizin 1974-1980 arasında 56 cilt ve yaklaşık 70.000 sayfa olarak basıldı.

text.split() bu işin ilk adımıdır: bir cümleyi kelime list'ine çevirir. Latince "in principio erat verbum" cümlesi (Vulgata, Yuhanna 1:1) için split() 4 kelimelik ['in', 'principio', 'erat', 'verbum'] list'ini verir.

Kaynaklar:
EADH, Father Roberto Busa
G. Rockwell, S. Sinclair, Tremendous Mechanical Labor: Father Busa's Algorithm, Digital Humanities Quarterly 14(3), 2020
R. Busa, The Annals of Humanities Computing: The Index Thomisticus, Computers and the Humanities 14(2), 1980, 83-90, doi:10.1007/BF02403798

İsteğe bağlı video: Roberto Busa (1913 - 2011) - Computational Linguist (Università Cattolica del Sacro Cuore, 18 dk 15 sn).

Horsley'in 1772 tarihli makalesinden tablo: 3'ten 157'ye kadar tek sayılar altı satırda dizili; 9, 15, 21, 25 gibi bileşik sayıların üstü çizilmiş, asallar çizilmeden kalmış.
Görsel: Samuel Horsley, Philosophical Transactions 62 (1772), s. 334, “Formula. or, The Sieve of Eratosthenes …”, Wikimedia Commons, kamu malı. Kırpıldı.

4A

Eratosthenes'in eleği ve Horsley'in 1772 tablosu

Eratosthenes'in (MÖ 3. yüzyıl) asal sayı eleğini anlatan bilinen en eski metin, Gerasalı Nikomakhos'un Aritmetiğe Giriş'idir (I.13). Samuel Horsley 1772'de Philosophical Transactions'ta yöntemi yeniden kurdu ve 3'ten 157'ye kadar tek sayıların tablosunu bastı: önce 3'ün katları silinir; sonra 5'in karesinden başlayarak 5'in, 7'nin karesinden başlayarak 7'nin, 11'in karesinden başlayarak 11'in katları silinir; silinmeden kalanlar asaldır. Tabloda liste yeniden yazılmaz, aynı listedeki sayıların üstü tek tek çizilir.

Python'da elek is_prime[k] = False satırıyla kurulur: list bir kez oluşturulur, elemanları yerinde değiştirilir. Horsley gibi her asalın karesinden başlanır: range(i * i, n, i). Tablodaki üstü çizili 42 sayı, kodun bulduğu 157'ye kadarki tek bileşik sayılarla birebir aynıdır; ilki 9, sonuncusu 155.

n = 158
is_prime = []
for i in range(n):
    is_prime.append(True)
is_prime[0] = False
is_prime[1] = False
for i in range(2, n):
    if is_prime[i]:
        for k in range(i * i, n, i):
            is_prime[k] = False
crossed_out = []
for s in range(3, n, 2):
    if not is_prime[s]:
        crossed_out.append(s)
print(len(crossed_out), crossed_out[0], crossed_out[-1])
Çıktı
42 9 155

Kaynaklar:
S. Horsley, The Sieve of Eratosthenes, Philosophical Transactions of the Royal Society 62, 1772, 327-347, doi:10.1098/rstl.1772.0023 (s. 328, 334-335)
Complete Dictionary of Scientific Biography, Nicomachus of Gerasa ("In I, 13, Nicomachus describes Eratosthenes' sieve")

Zhu Shijie'nin 1303 tarihli kitabından sayı üçgeni: daireler içinde çubuk rakamlarıyla yazılmış sayılar, en üstte 1, her satırda bir sayı daha; başlıkta 古法七乘方圖 yazıyor.
Görsel: Zhu Shijie, Siyuan yujian, 1303 (Commons'ta yazar: Yang Hui), “Yanghui triangle”, Wikimedia Commons, kamu malı.

4A

Zhu Shijie'nin sayı üçgeni (1303)

Bugün Pascal üçgeni denen sayı üçgeni Çin'de Yang Hui'nin 1261 tarihli kitabında altıncı satıra kadar verilir; Yang bunu 11. yüzyıl matematikçisi Jia Xian'ın eserinden öğrendiğini yazar. Görseldeki çizim Zhu Shijie'nin 1303 tarihli Siyuan yujian'ından; Zhu üçgeni sekizinci kuvvete kadar verir ve özgünlük iddia etmeden 'eski yöntem' tablosu olarak anar. Her sayı üstündeki iki sayının toplamıdır.

Her satır bir öncekinden kurulur: new_row = [1] ile başlanır, iç loop'ta komşu iki sayının toplamı append ile eklenir, sona 1 eklenir. Sekiz tur sonra list [1, 8, 28, 56, 70, 56, 28, 8, 1] olur; görseldeki en alt satır budur. Yedinci turda kod [1, 7, 21, 35, 35, 21, 7, 1] üretir; Commons açıklamasına göre görselin bu satırında bir sayı 35 yerine 34 yazılmış ve kodla karşılaştırınca hata görülür.

row = [1]
for step in range(8):
    new_row = [1]
    for i in range(len(row) - 1):
        new_row.append(row[i] + row[i + 1])
    new_row.append(1)
    row = new_row
print(row)
Çıktı
[1, 8, 28, 56, 70, 56, 28, 8, 1]

Kaynaklar:
MacTutor History of Mathematics, Zhu Shijie ("the table of the ancient method of powers up to the eighth")
MacTutor History of Mathematics, Yang Hui ("up to the sixth row, saying that he learnt it from Jia Xian's treatise")

İsteğe bağlı video: Pascal's Triangle - Numberphile (Numberphile, 12 dk 32 sn).

Budapeşte'deki Infopark teknoloji parkında John von Neumann'ın bronz büstü; taş kaidede Macarca ve İngilizce
Fotoğraf: Globetrotter19, “BUD InfoPark.JohnNeuman.1”, Wikimedia Commons, CC BY-SA 4.0; heykel: Szathmáry Gyöngyi (2003). Boyutu küçültüldü.

4A

von Neumann'ın birleştirme programı (1945) ve Timsort

John von Neumann 1945'te, henüz yapılmakta olan EDVAC için elle yazdığı bir el yazmasında sıralama ve iki sıralı diziyi tek sıralı dizide birleştirme ('meshing') için kod yazmayı amaçladığını belirtti; el yazmasında yalnızca birleştirme bölümü kodlanmıştır. Bu birleştirme bugün merge sort denen algoritmanın parçasıdır. Knuth 1970'te bu el yazmasını inceledi ve onu programı bellekte saklanan bir bilgisayar için yazılmış ve büyük olasılıkla günümüze ulaşmış en eski program olarak niteledi. Knuth'a göre von Neumann'ın sıralamayı seçmesinin bir nedeni, IBM'in sıralama makinelerinin hızı karşılaştırmak için hazır bir ölçü sunmasıydı.

Python'un list.sort() method'u Tim Peters'ın yazdığı ve Python 2.3'ten beri kullanılan Timsort'tur; CPython kaynaklarında 'adaptive, stable, natural mergesort' olarak tanımlanır, yani o da birleştirmeye dayanır. sort() işi list'in kendisi üzerinde yapar ve None döndürür: b = a.sort() sonrası a [1, 2, 3], b ise None olur.

a = [3, 1, 2]
b = a.sort()
print(a, b)
Çıktı
[1, 2, 3] None

Kaynaklar:
D. E. Knuth, Von Neumann's First Computer Program, ACM Computing Surveys 2(4), 1970, 247-260, doi:10.1145/356580.356581
M. Priestley, Routines of Substitution, Springer, 2018, doi:10.1007/978-3-319-91671-2
CPython, Objects/listsort.txt
What's New in Python 2.3

İsteğe bağlı video: Lecture 3: Insertion Sort, Merge Sort (MIT OpenCourseWare, 51 dk 19 sn).

Bir müzede sergilenen IBM 82 kart sıralayıcısı: önde yan yana 13 kart cebi, sağ üstte kartların konduğu besleme haznesi.
Fotoğraf: leighklotz, “IBM 82 Card Sorter”, Wikimedia Commons, CC BY 2.0. Boyutu küçültüldü.

4A

IBM kart sıralayıcısı (1967 kılavuzu)

Delikli kart kayıtları, bilgisayarlardan önce de sonra da elektromekanik sıralayıcılarla dizildi. IBM'in Aralık 1967 tarihli 82, 83 ve 84 sıralayıcı kılavuzuna göre makine bir geçişte tek bir sütuna bakar ve her kartı o sütundaki deliğe göre 13 cepten birine ayırır (12 delik konumu için birer cep ve bir ret cebi). Sayısal bir alan sıralanırken önce birler sütunu, sonra onlar sütunu işlenir; her geçişten sonra cepler sırayla toplanıp makineye yeniden konur. Kılavuz bu makinelerin hızını dakikada 450 ile 2.000 kart arasında verir.

Sıralama bir adımlar dizisidir; sort() bu adımları sizin yerinize yapar. Birler basamağından başlayıp sütun sütun ilerleyen bu yöntem bugün radix sort olarak bilinir: [57, 31, 52, 12, 38] önce birlere göre [31, 52, 12, 57, 38], sonra onlara göre [12, 31, 38, 52, 57] olur. Python'un sort()'u başka bir yöntem kullanır ama sonuç aynıdır.

Kaynaklar:
IBM, Reference Manual: IBM 82, 83 and 84 Sorters, A24-1034-3, Aralık 1967
D. E. Knuth, The Art of Computer Programming, c. 3, §5.2.5 (Sorting by distribution)

Barbara Liskov 2010'da.
Fotoğraf: Kenneth C. Zirkel, “Barbara Liskov MIT computer scientist 2010”, Wikimedia Commons, CC BY-SA 3.0. Boyutu küçültüldü.

4B

CLU dilinde exception (Liskov ve Snyder, 1979)

Barbara Liskov ve Alan Snyder 1979'da IEEE Transactions on Software Engineering'de yayımlanan Exception Handling in CLU makalesinde CLU dilinin hata mekanizmasını anlattı. CLU'da bir call ya normal biter ya da adı belli bir exception ile sonlanır; bu yaklaşıma termination model denir. Liskov'un A History of CLU yazısına göre, hatadan sonra kaldığı yerden devam etme modeli (resumption model) karmaşık bulunduğu ve çoğu durumda istenenin sonlanma olduğu düşünüldüğü için bilerek reddedildi. Liskov 2008 ACM Turing Ödülü'nü aldı.

Python da sonlanma modelini kullanır: try block'unda hata çıkan satırdan sonrası çalışmaz, except ValueError: kolu çalışır ve program try statement'ının sonrasından devam eder. Exception'ı adıyla yakalamak da CLU'daki adlandırılmış exception'lara benzer.

try:
    x = int("3.5")
    print("bu satır çalışmaz")
except ValueError:
    print("sayı değil")
print("program devam ediyor")
Çıktı
sayı değil
program devam ediyor

Kaynaklar:
B. Liskov, A. Snyder, Exception Handling in CLU, IEEE Transactions on Software Engineering SE-5(6), 1979, 546-558, doi:10.1109/TSE.1979.230191
B. Liskov, A History of CLU, MIT LCS TR-561 ("We considered and rejected the resumption model")

İsteğe bağlı video: Barbara Liskov, 2008 ACM A.M. Turing Award Lecture "The Power of Abstraction" (Association for Computing Machinery (ACM), 1 sa 18 dk 34 sn), 34:14-38:35 arası.

Budapeşte'deki Infopark teknoloji parkında John von Neumann'ın bronz büstü; taş kaidede Macarca ve İngilizce
Fotoğraf: Globetrotter19, “BUD InfoPark.JohnNeuman.1”, Wikimedia Commons, CC BY-SA 4.0; heykel: Szathmáry Gyöngyi (2003). Boyutu küçültüldü.

4B

von Neumann'ın middle-square yöntemi (1949)

Middle-square (orta kare) yönteminde sayının karesi alınır, ortadaki basamaklar sıradaki sayı olur: 1234² = 01522756, sıradaki sayı 5227. John von Neumann bu "tarif"i 1949'da Los Angeles'taki Monte Carlo sempozyumunda yaptığı, 1951'de yayımlanan konuşmasında önerdi. Aynı konuşmada, rastgele basamakları aritmetikle üretmeyi düşünen herkesin "state of sin" (günah hali) içinde olduğunu da söyledi: kesin bir hesapla üretilen sayılar gerçekten rastgele değildir. Python'un random module'ü bugün Matsumoto ve Nishimura'nın Mersenne Twister algoritmasını (1998) kullanır.

random.randint(1, 6) de bir formülle hesaplanır. random.seed(2026) ile başlayıp beş kez random.randint(1, 6) çağıran program her çalıştırmada aynı list'i verir: [1, 3, 5, 5, 6]. seed verilmezse başlangıç değeri her çalıştırmada değişir. Bu yüzden rastgele çıktılı sorularda tek bir değer değil, çıkabilecek değerler sorulur.

Kaynaklar:
J. von Neumann, Various techniques used in connection with random digits, NBS Applied Mathematics Series 12, 1951, 36-38
Python belgeleri, random ("Python uses the Mersenne Twister as the core generator")
M. Matsumoto, T. Nishimura, Mersenne Twister, ACM TOMACS 8(1), 1998, 3-30, doi:10.1145/272991.272995

İsteğe bağlı video: True Random Numbers - Computerphile (Computerphile, 12 dk 15 sn).

Leonhard Euler'in 1753 tarihli portresi: başında kumaş bir başlık, üzerinde mavi çizgili bir giysi, yüzü sola dönük.
Görsel: Jakob Emanuel Handmann, Leonhard Euler portresi (1753), Kunstmuseum Basel. “Leonhard Euler - Jakob Emanuel Handmann (Kunstmuseum Basel)”, Wikimedia Commons, Kamu malı (PD-art-old-100-expired). Boyutu küçültüldü.

4B

Euler ve f(x) yazımı (1734)

Matematikte bir fonksiyonu f harfiyle, değişkenini parantez içinde yazma alışkanlığı Leonhard Euler'e dayanır. Euler 1734'te Petersburg Bilimler Akademisi'nin Commentarii dergisi için yazdığı bir makalede (basımı 1740) f(x/a + c) yazdı ve bunu "x/a + c'nin herhangi bir fonksiyonu" diye tanımladı. Kelimenin kendisi daha eskidir: Leibniz functio sözcüğünü 1673 tarihli bir el yazmasında, eğrilere bağlı geometrik nicelikler için kullanmıştı.

def square(x): satırı bu yazımın programdaki karşılığıdır: square function'ın adı, x de parameter'ıdır. square(4) gövdeyi x = 4 ile çalıştırır; return x * x ile dönen 16 call'un yerine geçer. Benzetmenin sınırı: matematikte f(4) her zaman bir değerdir, Python'da return yazılmayan bir function None döndürür.

Kaynaklar:
J. Miller, Earliest Uses of Function Symbols (MacTutor, Cajori c. 2, s. 268'e dayanarak)
S. Shieber, Whence function notation?, 2015
J. Miller, Earliest Known Uses of Some of the Words of Mathematics (F)
I. Kleiner, Evolution of the Function Concept, College Mathematics Journal 20(4), 1989

Ders 5

Teletype ASR-33 klavyesinin yakın çekimi: yan yana LINE FEED ve RETURN tuşları; altlarında RUB OUT ve REPT, sağda BREAK, üstte HERE IS.
Fotoğraf: Wolfgang Stief. “ASR-33 Teletypewriter REPT, BREAK keys”, Wikimedia Commons, CC0 1.0.

5B

LINE FEED tuşu ve \n (Teletype Model 33 ASR, 1963)

1963'te çıkan Teletype Model 33 ASR'nin klavyesinde satır değiştirmek için iki ayrı tuş vardı: RETURN yazı kafasını satır başına götürür, LINE FEED kağıdı bir satır ilerletirdi. ASCII'de de bu iki hareket iki ayrı karakterdir: CR (13) ve LF (10). Unix satır sonu olarak yalnızca LF'yi kullandı. Python'daki \n, ASCII'de 10 numaralı karakter olan LF'dir.

Dosyadan okunan her satırın sonunda bu görünmez karakter durur ("Ali 70\n"); yalnızca dosya \n ile bitmiyorsa son satırda bulunmaz. print(row) kendi satır sonunu da eklediği için satırların arasına boş satır girer. row.strip() bu \n'i atar ve geriye "Ali 70" kalır. Windows'ta satırlar \r\n ile biter; Python metin modunda okurken bunu \n'e çevirir.

Kaynaklar:
Computer History Museum, katalog X1557.98, Teletype Model 33ASR (yaklaşık 1963)
V. Cerf, RFC 20, ASCII format for Network Interchange, 1969
D. M. Ritchie, K. Thompson, The UNIX Time-Sharing System, CACM 17(7), 1974, §3.1 ("lines demarcated by the new-line character")
Python Glossary, universal newlines; Built-in Functions, open()

Oslo Üniversitesi'nde 2017 IEEE Milestone töreni: soldan Lars Holden (Norsk Regnesentral), rektör Svein Stølen ve IEEE Norveç Şubesi'nden Kaveh Niayesh; arkada tuğla duvarda Dahl ve Nygaard'ı anan IEEE Milestone plaketi.
Fotoğraf: Eli Berge / UiO. “Simula 50 years - IEEE”, Wikimedia Commons, CC BY 4.0. Boyutu küçültüldü.

5B

Simula 67'de class ve object (Dahl ve Nygaard, 1967)

Ole-Johan Dahl ve Kristen Nygaard 1960'larda Oslo'daki Norveç Hesaplama Merkezi'nde (Norsk Regnesentral) benzetim için Simula dillerini geliştirdi. Dahl'ın 2001'de yazdığı tarihçeye göre "class" terimini ve class'lardan üretilen "object" terimini Simula 67'nin tasarımı sırasında seçtiler: programcı bir class tanımlar, program çalışırken ondan istediği kadar object üretir. IEEE Norveç Şubesi bu çalışmayı 27 Eylül 2017'de Oslo Üniversitesi'nde bir IEEE Milestone plaketiyle andı; plakette object-oriented dillere örnek olarak Smalltalk, C++, Java ve Python sayılır.

class Course: yazdığınızda bir kalıp tanımlarsınız; Course("MAT123", 4, "C1") o kalıptan bir object üretir. Python'da list ve dict de birer class'tır: type([]) <class 'list'> verir.

Kaynaklar:
ETHW, Milestones: Object-Oriented Programming, 1961-1967 (plaket metni, 27 Eylül 2017, IEEE Norway Section)
O.-J. Dahl, The Birth of Object Orientation: the Simula Languages, 2001 ("We chose the terms 'class' and 'objects' of classes for our new Simula")
K. Nygaard, O.-J. Dahl, The Development of the SIMULA Languages, HOPL 1978, 439-480, doi:10.1145/800025.1198392

İsteğe bağlı video: James Gosling - Simula: a personal journey (UiO Realfagsbiblioteket, 1 sa 12 dk 12 sn).

Guido van Rossum 2014'te: gözlüklü, kısa sakallı, turuncu tişörtlü; arkada mavi tonlarda bir duvar.
Fotoğraf: Daniel Stroud; rötuş: Deedub1983 ve HarJIT. “Guido-portrait-2014-drc”, Wikimedia Commons, CC BY-SA 4.0.

5B

Açık self ve Modula-3 (Guido van Rossum, 2008)

Python'un tasarım SSS belgesine göre self'in method tanımlarında ve çağrılarında açıkça yazılması fikri Modula-3'ten alındı; Python öğreticisi de Python'un class düzenini C++ ile Modula-3'ünkilerin karışımı olarak tanımlar. Guido van Rossum, self'in kaldırılması önerisine 26 Ekim 2008'de yazdığı yanıtta iki çağrının eşdeğer olduğunu hatırlatır: foo.meth(arg) ile C.meth(foo, arg) aynı şeydir.

a.increment() yazdığınızda Python bunu Counter.increment(a) olarak çalıştırır ve self'e a'yı kendisi verir. Bu yüzden a.increment(a) şu hatayı verir: TypeError: Counter.increment() takes 1 positional argument but 2 were given. self bir gelenektir, Python'un keyword'lerinden biri değildir.

Kaynaklar:
Python Design and History FAQ ("The idea was borrowed from Modula-3")
The Python Tutorial, 9. Classes ("a mixture of the class mechanisms found in C++ and Modula-3"; "nothing more than a convention")
G. van Rossum, Why explicit self has to stay, 26 Ekim 2008

Electrologica X1'in konsolunu gösteren üç fotoğraf alt alta: üstte konsol masası, masanın sağ köşesinde plastik bir kutu içinde delikli şerit makaraları ve en sağda şerit sarma düzeneğinin iki diski; altta konsoldaki lamba, anahtar ve düğme sıralarının yakın çekimleri.
Fotoğraf: PeterFrankfurt (de.wikipedia). “X1 250675”, Wikimedia Commons, Kamu malı (PD-user-de).

5A

ALGOL 60 raporunda local isimler (1960)

Peter Naur'un editörlüğünde on üç kişinin hazırladığı ALGOL 60 raporu 1960'ta yayımlandı. Raporun 1963 tarihli düzeltilmiş baskısındaki 4.1.3. bölüme göre bir block'ta tanımlanan isim o block'a local'dir: bu isimle gösterilen şeyin block dışında hiçbir varlığı yoktur ve dışarıdaki aynı adlı şeye block içinden erişilemez. Bilinen ilk ALGOL 60 compiler'ını (derleyici) Edsger Dijkstra ile Jaap Zonneveld Electrologica X1 için yazdı; compiler Ağustos 1960'ta çalışıyordu.

Python function'ları aynı kuralı izler. area(3, 4) call'unda oluşan result, call bitince ortadan kalkar; dışarıda print(result) yazmak NameError: name 'result' is not defined verir. Dışarıda aynı adla bir variable varsa o başka bir variable'dır.

Kaynaklar:
Revised Report on the Algorithmic Language Algol 60, §4.1.3
J. W. Backus ve diğerleri, Report on the Algorithmic Language ALGOL 60, CACM 3(5), 1960, 299-311, doi:10.1145/367236.367262
E. W. Dijkstra, EWD1166 ("In August 1960 our implementation was working")
Python Language Reference, 4.2.2 Resolution of names

Friedrich L. Bauer 1995'te bir toplantıda konuşurken: gözlüklü, koyu takım elbiseli; sağ eli havada, sol eli başında.
Fotoğraf: Rolf Kickuth. “FriedrichLBauer29-05-1995”, Wikimedia Commons, CC BY-SA 4.0.

5A

Stack: Bauer ve Samelson (1957), Dijkstra (1960)

Friedrich L. Bauer ve Klaus Samelson, en son konanın ilk alındığı "Keller" (mahzen) ilkesini, bugünkü adıyla stack'i, formülleri makine diline çevirmek için geliştirdi ve 30 Mart 1957'de patent başvurusu yaptı. Bauer 1988'de IEEE Computer Society'nin Computer Pioneer Award'ını "for computer stacks" gerekçesiyle aldı. Edsger Dijkstra 1960'ta yayımlanan "Recursive Programming" makalesinde stack'i, program çalışırken procedure call'larını tutmak için kullandı.

PyCharm'daki Frames listesi bu stack'i gösterir: her call kendi variable'larıyla ayrı bir frame olarak üst üste durur ve call bitince kaldırılır. Traceback de aynı stack'in dökümüdür. "Traceback (most recent call last):" en son call'un en altta olduğunu söyler; okumaya bu yüzden alttan başlanır.

Kaynaklar:
IEEE Computer Society, Friedrich L. Bauer (1988 Computer Pioneer Award, "For computer stacks")
F. L. Bauer, The Cellar Principle of State Transition and Storage Allocation, IEEE Annals of the History of Computing 12(1), 1990, 41-49, doi:10.1109/MAHC.1990.10004
DE 1094019 patenti (rüçhan tarihi 30 Mart 1957)
E. W. Dijkstra, Recursive Programming, Numerische Mathematik 2, 1960, 312-318, doi:10.1007/BF01386232

Tony Hoare, 2011'de EPFL'deki bir konuşmada: beyaz saçlı ve sakallı, gözlüklü, açık renk ceketli.
Photograph by Rama, Wikimedia Commons, Cc-by-sa-2.0-fr (“Sir Tony Hoare IMG 5125”). Boyutu küçültüldü.

5A

Tony Hoare ve null reference (1965, 2009)

Tony Hoare (1934-2026) 1965'te ALGOL W dilinin reference type'ını tasarlarken dile hiçbir şeyi göstermeyen bir değer, null reference ekledi; kendi anlatımına göre gerekçesi, gerçeklemesinin çok kolay olmasıydı. 2009'da QCon London'daki konuşmasında bu kararı "milyar dolarlık hatam" diye andı: ona göre değer beklenen yerde yokluk bulan programlar kırk yılda sayısız hataya, güvenlik açığına ve çökmeye yol açmıştı.

Python'da değerin yokluğunu None gösterir ve return yazılmayan her function None döndürür. def square(x): print(x * x) tanımından sonra result = square(4) ekrana 16 yazar, ama result * 2 şu hatayı verir: TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'. Error message'da NoneType görünce önce function'da return olup olmadığına bakın.

Kaynaklar:
QCon London 2009, Null References: The Billion Dollar Mistake, konuşma özeti
InfoQ, konuşmanın kaydı (1:01:58)
Merton College, Professor Sir Charles Antony Richard (Tony) Hoare 1934-2026
Python belgeleri, Built-in Constants, None

IBM 701'in operatör konsolu: gri gövde üzerinde sıra sıra lambalar, düğmeler ve anahtarlar.
Fotoğraf: Dan (Flickr). “IBM 701console”, Wikimedia Commons, CC BY 2.0.

5A

Hans Peter Luhn ve hashing (IBM, 1953)

IBM'den Hans Peter Luhn, Ocak 1953'te yazdığı bir iç notta kayıtları, anahtarlarından hesaplanan bir numaraya göre bucket denen kovalara dağıtmayı önerdi: aranan kayıt için bütün liste taranmaz, doğrudan ilgili kovaya bakılır. Knuth'a göre aynı dönemde IBM'de Gene Amdahl, Elaine Boehme (sonradan McGraw), Nathaniel Rochester ve Arthur Samuel aynı fikre bağımsız olarak ulaştı ve IBM 701 için yazdıkları assembler programında kullandı. Yöntem bugün hashing, ortaya çıkan veri yapısı hash table adıyla bilinir.

Python belgelerine göre dict'ler "resizable hash tables" olarak gerçeklenir. d["ali"] yazdığınızda Python dict'i baştan taramaz; "ali" key'inden bir sayı hesaplar ve doğrudan o yere bakar. Bu yüzden dict büyüdükçe arama ortalamada yavaşlamaz.

Kaynaklar:
H. Stevens, Hans Peter Luhn and the Birth of the Hashing Algorithm, IEEE Spectrum, 30 Ocak 2018
D. E. Knuth, The Art of Computer Programming, c. 3, 2. baskı, §6.4 ("an internal IBM memorandum in January 1953")
Python Design and History FAQ

İsteğe bağlı video: Python Hash Sets Explained & Demonstrated - Computerphile (Computerphile, 18 dk 38 sn).

El-Kindi'nin şifre çözme risalesinden Arapça bir sayfa: üstte düz metin satırları, altta dallanan bir şema halinde yazılmış sınıflandırma.
Görsel: el-Kindi, Risala fi istikhraj al-mu'amma, İstanbul Süleymaniye Kütüphanesi. “Al-kindi cryptographic 1”, Wikimedia Commons, Kamu malı (PD-old).

5A

El-Kindi ve harf sayımı (9. yüzyıl)

9. yüzyılda Bağdat'ta yaşayan el-Kindi, şifreli mesajların çözülmesi üzerine yazdığı risalede (Risala fi istikhraj al-mu'amma) şunu önerdi: şifreli metindeki her harfin kaç kez geçtiği sayılır ve aynı dildeki uzun, sıradan bir metnin harf sıklıklarıyla karşılaştırılır. Bu, frekans analizinin bilinen en eski yazılı tarifidir. Risale, İstanbul'da Süleymaniye Kütüphanesi'ndeki Ayasofya 4832 numaralı derlemenin 211r-216v yapraklarında bulunur.

Derste gördüğümüz harf sayımı aynı işlemdir. for ch in text: count[ch] = count.get(ch, 0) + 1 her harfi key, geçme sayısını değer yapar; "ankara" için sonuç {'a': 3, 'n': 1, 'k': 1, 'r': 1} olur. El-Kindi'nin tarif ettiği sıklık tablosu da harften sayıya bir eşlemedir; dict'in tuttuğu da tam olarak budur.

Kaynaklar:
Ptolemaeus Arabus et Latinus (BAdW), İstanbul, Süleymaniye Kütüphanesi, Ayasofya 4832
I. A. Al-Kadi, Origins of cryptology: the Arab contributions, Cryptologia 16(2), 1992, 97-126, doi:10.1080/0161-119291866801

İsteğe bağlı video: Applied Cryptology 1.2: Frequency Analysis (Cihangir Tezcan, 16 dk 47 sn), 3:39'dan itibaren.

Georg Cantor'un 1884-1885'te çekilmiş siyah beyaz portresi: dalgalı saçlı, gür sakallı, papyon kravatlı.
Fotoğraf: Otto Zeth; Weierstrass'a sunulan fotoğraf albümünden (R. Bölling, Das Fotoalbum für Weierstraß, 1994). “Das Fotoalbum für Weierstraß 033 (Georg Cantor)”, Wikimedia Commons, Kamu malı (PD-old-70-expired).

5A

Cantor'un küme tanımı (1895)

Georg Cantor 1895'te Mathematische Annalen'de yayımlanan "Beiträge zur Begründung der transfiniten Mengenlehre" makalesinde kümeyi (Menge), algımızın ya da düşüncemizin "belirli ve birbirinden ayrı" (bestimmte wohlunterschiedene) nesnelerinin bir bütün halinde toplanması olarak tanımladı ve M = {m} diye süslü parantezle yazdı. Öğelerin birbirinden ayrı olması, bir kümede aynı öğenin iki kez yer alamayacağı anlamına gelir.

Python'un set'i bu tanıma uyar: set([1, 2, 2, 3]) {1, 2, 3} verir ve len(set([1, 2, 2, 3])) 3'tür. Gösterim de Cantor'unkine benzer: set süslü parantezle yazılır.

Kaynaklar:
G. Cantor, Beiträge zur Begründung der transfiniten Mengenlehre, Mathematische Annalen 46(4), 1895, 481-512, doi:10.1007/BF02124929
P. Jourdain çevirisi, Contributions to the Founding of the Theory of Transfinite Numbers, 1915, §1 ("definite and separate objects")

İsteğe bağlı video: Infinity is bigger than you think - Numberphile (Numberphile, 7 dk 59 sn).

Venn'in 1880 makalesinin 6. sayfası: metnin içinde X ve Y harfli iki kesişen daire, altında X, Y, Z harfli üç kesişen daire.
Görsel: J. Venn, 'On the Diagrammatic and Mechanical Representation of Propositions and Reasonings', Philosophical Magazine 5. seri, c. 10 (1880), s. 6; Biodiversity Heritage Library taraması. “The London, Edinburgh and Dublin philosophical magazine and journal of science (IA londonedinburg5101880lond).pdf, sayfa 20”, Wikimedia Commons, Kamu malı (PD-US-expired). Kırpıldı.

5A

Venn'in 1880 makalesi

John Venn Temmuz 1880'de Philosophical Magazine'de yayımlanan "On the Diagrammatic and Mechanical Representation of Propositions and Reasonings" makalesinde, Euler'den beri kullanılan dairelerden ("the familiar Eulerian plan") ayrılan bir çizim önerdi: daireler her zaman kesişecek biçimde çizilir ve her bölge bir birleşimi gösterir. Makalenin 6. sayfasına göre iki daire dört bölge verir: XY, XȲ, X̄Y, X̄Ȳ (üstü çizgili harf "değil" demektir). Üçüncü bir daire eklenince bölge sayısı sekize çıkar.

Python'daki set işlemleri bu bölgeleri seçer. A = {"ali", "emre", "zehra"} ve B = {"emre", "nur"} için A & B ortadaki bölgedir: {'emre'}. A - B yalnızca A'da kalan bölgedir: 'ali' ve 'zehra'. A | B iki dairenin tamamıdır: dört isim.

Kaynaklar:
J. Venn, On the Diagrammatic and Mechanical Representation of Propositions and Reasonings, Philosophical Magazine 5. seri, 10(59), 1880, 1-18, doi:10.1080/14786448008626877
W. B. Ashworth, Linda Hall Library, Scientist of the Day: John Venn, 4 Ağustos 2017

Peano'nun 1888 tarihli Calcolo geometrico kitabının kapak sayfası; alt başlıkta 'Operazioni della logica deduttiva' yazıyor.
Görsel: G. Peano, Calcolo geometrico (Torino: Fratelli Bocca, 1888), kapak sayfası; BEIC dijital kütüphanesi. “Peano, Giuseppe - Calcolo geometrico secondo l'Ausdehnungslehre di H. Grassmann, 1888 - BEIC 6564146”, Wikimedia Commons, Kamu malı (PD-old-70-expired). Boyutu küçültüldü.

5A

Peano'nun ∩ ve ∪ işaretleri (1888)

Kesişim için ∩'yi, birleşim için ∪'yi bu anlamda ilk kullanan Giuseppe Peano'dur: 1888'de Torino'da basılan Calcolo geometrico'nun "Operazioni della logica deduttiva" (tümdengelimli mantığın işlemleri) başlıklı giriş bölümünde. İşaretlerin kendisi Grassmann'ın 1844 tarihli kitabında genel işlem işaretleri olarak geçer. Python'a yerleşik set type'ı 30 Kasım 2004'te 2.4 sürümüyle geldi; PEP 218 birleşim, kesişim ve fark için |, & ve - işlemlerini tanımlar.

Matematikteki A ∪ B Python'da A | B, A ∩ B de A & B diye yazılır. PEP 218 set'ler için ilk başta {1, 2, 3} yazımını önermişti, ama {} zaten boş dict anlamına geliyordu. Python 3.0'ın yenilikler belgesi bunu açıkça yazar: {} boş bir dict'tir, boş set için set() kullanılır.

Kaynaklar:
J. Miller, Earliest Uses of Symbols of Set Theory and Logic (MacTutor, Cajori c. 2, s. 298'e dayanarak)
PEP 218, Adding a Built-In Set Object Type
What's New In Python 3.0
python.org, Python 2.4 sürüm sayfası

Rob Pike, 2010'da OSCON'da kürsüde konuşurken; siyah tişört ve kırmızı çerçeveli gözlük.
Fotoğraf: Kevin Shockey. “Rob-pike-oscon”, Wikimedia Commons, CC BY 2.0.

5B

UTF-8'in tasarımı (1992)

UTF-8'i Eylül 1992'de Bell Labs'ten Ken Thompson ile Rob Pike, New Jersey'deki bir lokantada kağıt bir amerikan servisin üzerinde tasarladı. Pike'ın 2003'te yazdığı anlatıma göre bit düzenini Thompson buldu ve birkaç gün içinde Plan 9 işletim sistemi yalnızca UTF-8 ile çalışıyordu. RFC 3629 da UTF-8'in Eylül 1992'de Thompson tarafından, Pike'ın belirlediği tasarım ölçütlerine göre geliştirildiğini yazar. UTF-8 ASCII karakterlerini tek baytla saklar; ç, ş, ğ gibi harfler iki bayt tutar.

encoding="utf-8" Python'a dosyadaki baytları bu kurala göre çözmesini söyler. Python 3.14 ve önceki sürümlerde bu argument yazılmazsa işletim sisteminin yerel kodlaması kullanılır; Windows'ta bu kodlama çoğunlukla UTF-8 değildir. PEP 686'ya göre Python 3.15'ten itibaren varsayılan UTF-8'dir. Sınıfta farklı sürümler ve işletim sistemleri olacağı için encoding="utf-8" yazmak dosyanın her bilgisayarda aynı okunmasını sağlar.

Kaynaklar:
R. Pike, UTF-8 history, 30 Nisan 2003
RFC 3629, UTF-8, a transformation format of ISO 10646, §1
PEP 686, Make UTF-8 mode default (Python 3.15)
Python belgeleri, Built-in Functions, open() ("locale.getencoding() is called")

İsteğe bağlı video: Characters, Symbols and the Unicode Miracle - Computerphile (Computerphile, 9 dk 37 sn).

PDP-11 simülatöründe çalışan Version 7 Unix'in terminali: ls -l komutu kök dizindeki ve /usr altındaki dizinleri listeliyor; aralarında Dennis Ritchie'nin dmr dizini var.
Ekran görüntüsü: Huihermit. “Version 7 UNIX SIMH PDP11 Filesystem Layout”, Wikimedia Commons, CC0 1.0.

5B

Unix ve current directory (1974)

Dennis Ritchie ve Ken Thompson'ın 1974'te Communications of the ACM'de yayımlanan "The UNIX Time-Sharing System" makalesi dosya adlarının nasıl arandığını tanımlar: "/" ile başlayan bir yol kök dizinden, "/" ile başlamayan bir ad kullanıcının geçerli dizininden (current directory) aranır. alpha gibi yalın bir ad, geçerli dizindeki dosyayı gösterir.

open("grades.txt") yalın bir ad verdiği için dosya working directory'de aranır; Python belgeleri de yolun "relative to the current working directory" yorumlandığını yazar. PyCharm'da bu dizin Run menüsündeki Edit Configurations penceresinin Working directory alanında görünür. .txt dosyası orada değilse şu hatayı alırsınız: FileNotFoundError: [Errno 2] No such file or directory: 'grades.txt'

Kaynaklar:
D. M. Ritchie, K. Thompson, The UNIX Time-Sharing System, CACM 17(7), 1974, 365-375, doi:10.1145/361011.361061, §3.2
Python belgeleri, Built-in Functions, open()
AT&T Archives: The UNIX Operating System, 13:52 (pwd ile working directory)

İsteğe bağlı video: AT&T Archives: The UNIX Operating System (AT&T Tech Channel, 27 dk 27 sn), 13:19'dan itibaren.

Viyana Teknik Müzesi'nde sergilenen bir DEC PDP-11/40: dolap biçiminde gövde, üstte iki DECtape sürücüsünün dört makarası, ortada kırmızı-mor ön panel.
Fotoğraf: Jeff Keyzer. “PDP-11-40 in Technisches Museum Wien”, Wikimedia Commons, CC BY-SA 2.0. Boyutu küçültüldü.

5B

Unix'te metin dosyası ve fopen mode'ları (1974)

Ritchie ve Thompson'ın 1974 makalesine göre Unix bir dosyaya hiçbir yapı dayatmaz: metin dosyası, satırları new-line karakteriyle ayrılmış bir karakter akışıdır. C'nin standart library'sindeki fopen() bir dosyayı "r", "w" ya da "a" mode'uyla açar. POSIX tanımına göre "w" dosyayı sıfır uzunluğa indirir ya da yoksa oluşturur, "a" yazılanları dosyanın sonuna ekler. Python 2 belgeleri open()'ın ilk iki argument'ının stdio'daki fopen() ile aynı olduğunu açıkça yazıyordu.

Python'da da f.write() yalnızca verdiğiniz karakterleri yazar, satır sonu eklemez; \n'i siz koyarsınız: f.write(f"{name} {grade}\n"). "a" mode'unda "merhaba\n" yazan program iki kez çalışınca dosyada iki satır olur, "w" mode'unda tek satır kalır.

Kaynaklar:
D. M. Ritchie, K. Thompson, The UNIX Time-Sharing System, CACM 17(7), 1974, §3.1
POSIX, fopen
Python 2.7 Built-in Functions, open() ("The first two arguments are the same as for stdio's fopen()")
Python belgeleri, open() mode tablosu

Ivan Sutherland MIT Lincoln Laboratuvarı'ndaki TX-2'nin konsolunda Sketchpad'i kullanıyor: kare ekranda üzerinde sayılar yazan bir köprü kafesi çizimi, sağ elinde ışıklı kalem (light pen).
Görsel: Ivan Sutherland, Sketchpad doktora tezi (MIT, 1963), Şekil 1.2; tarama: Kerry Rodden. “SketchpadDissertation-Fig1-2”, Wikimedia Commons, CC BY-SA 3.0.

5B

Sketchpad'de master drawing ve instance'lar (Sutherland, 1963)

Ivan Sutherland'ın Ocak 1963'te MIT'ye sunduğu doktora tezindeki Sketchpad programında kullanıcı bir master drawing (ana çizim) hazırlar ve ondan istediği kadar instance (örnek) üretir; tezde örnek olarak devre şemasındaki direnç sembolü geçer. Tezin sözlüğüne göre aynı master drawing'in bütün instance'ları boyut, dönüş ve konum dışında aynı görünür. Alan Kay 1993'te, Simula'nın bellekte oluşturduğu yapıların Sketchpad'in instance'larına çok benzediğini yazar.

a = Counter() ve b = Counter() aynı class'tan üretilmiş iki ayrı object'tir. Benzetmenin sınırı: Sketchpad'de bir instance'ın iç yapısı ancak master drawing değiştirilerek değiştirilebilir, bu da bütün instance'ları değiştirir. Python'da ise a.increment() yalnızca a'yı değiştirir: a.increment() iki kez, b.increment() bir kez çağrılınca print(a.value, b.value) 2 1 yazar.

Kaynaklar:
I. Sutherland, Sketchpad: A man-machine graphical communication system, Cambridge elektronik baskısı UCAM-CL-TR-574, 2003 ("Except for size, rotation, and location, all instances of one master look the same")
A. Kay, The Early History of Smalltalk, HOPL-II, 1993, doi:10.1145/155360.155364 ("What Simula was allocating were structures very much like the instances of Sketchpad")

Barbara Liskov 2010'da: kıvırcık kısa saçlı, çiçek desenli gömlekli, gülümseyerek sağa bakıyor.
Fotoğraf: Kenneth C. Zirkel. “Barbara Liskov computer scientist 2010”, Wikimedia Commons, CC BY-SA 3.0. Boyutu küçültüldü.

5B

Liskov ve abstract data type (1974)

Barbara Liskov ve Stephen Zilles 1974'te yayımladıkları "Programming with Abstract Data Types" makalesinde abstract data type'ı (soyut veri tipi), tamamen üzerinde yapılabilen işlemlerle tanımlanan soyut object'lerden oluşan bir class olarak tarif etti. Liskov bu fikri MIT'de geliştirdiği CLU dilinde uyguladı; 2008 Turing Ödülü gerekçesinde data abstraction (veri soyutlaması) üzerine çalışmaları özellikle anılır.

class Course: yazmak Python'a yeni bir type eklemektir. type(d) <class '__main__.Course'> verir, tıpkı type([])'in <class 'list'> vermesi gibi. weighted_points() gibi method'lar o type'ın işlemleridir.

Kaynaklar:
B. Liskov, S. Zilles, Programming with Abstract Data Types, ACM SIGPLAN Notices 9(4), 1974, 50-59, doi:10.1145/942572.807045
ACM A.M. Turing Award 2008 gerekçesi ("especially related to data abstraction, fault tolerance, and distributed computing")

İsteğe bağlı video: Barbara Liskov, 2008 ACM A.M. Turing Award Lecture "The Power of Abstraction" (Association for Computing Machinery (ACM), 1 sa 18 dk 34 sn), 23:57-32:18 arası.

Alan Kay 2008'de: dalgalı gri saçlı, bıyıklı, koyu fonun önünde.
Fotoğraf: Marcin Wichary. “Alan Kay (3097597186) (cropped)”, Wikimedia Commons, CC BY 2.0.

5B

Smalltalk'ta object'e mesaj göndermek (1970'ler)

Alan Kay ve Xerox PARC'taki ekip 1970'lerde geliştirdikleri Smalltalk'ta her şeyi object olarak ele aldı. Kay 1993'te yazdığı tarihçede zihnindeki resmi, birbirine istek gönderen ayrı bilgisayarlar olarak anlatır. Goldberg ve Robson'ın Smalltalk-80 kitabı (1983) mesajı, bir object'ten işlemlerinden birini yapmasını istemek olarak tanımlar; method ise o işlemin nasıl yapılacağını söyler.

d.weighted_points() ile numbers.append(5) aynı biçimdedir: noktanın solundaki object'ten sağdaki işi yapması istenir, işin nasıl yapılacağını o object'in class'ındaki method belirler. Python "mesaj" terimini kullanmaz; bu okuma bir benzetmedir.

Kaynaklar:
A. Kay, The Early History of Smalltalk, HOPL-II, 1993, doi:10.1145/155360.155364 ("separate computers sending requests to other computers")
A. Goldberg, D. Robson, Smalltalk-80: The Language and Its Implementation, Addison-Wesley, 1983 ("A message is a request for an object to carry out one of its operations")

İsteğe bağlı video: Object-Oriented Programming, lecture by Daniel Ingalls (Computer History Museum, 45 dk 36 sn).

Alan Turing'in 29 Mart 1951'de çekilmiş siyah-beyaz portresi: tüvit ceket, açık renk gömlek, puantiyeli koyu kravat; yüzü hafifçe sola dönük.
Fotoğraf: Elliott & Fry, 29 Mart 1951, “Alan Turing (1951)”, Wikimedia Commons, kamu malı.

5B

Turing, Computing Machinery and Intelligence (1950)

Alan Turing'in Ekim 1950'de Mind dergisinde (cilt 59, sayı 236, s. 433-460) yayımlanan Computing Machinery and Intelligence makalesi "Can machines think?" sorusuyla açılır. Turing bu soruyu tanımlar üzerinden tartışmak yerine bir taklit oyunu (imitation game) önerir: yazılı sorular soran bir sorgucu, karşısındakinin insan mı makine mi olduğunu ayırt etmeye çalışır. Bugün Turing testi diye bilinen düzen budur. Makalenin altıncı bölümü, Ada Lovelace'ın Analytical Engine üzerine yazdıklarına dayanan itirazı ele alır: makine yalnızca kendisine yapması söyleneni yapabilir. Son bölümün başlığı Learning Machines'tir. Turing burada yetişkin zihnini taklit eden bir program yazmak yerine çocuk zihnini taklit eden bir program yazıp onu eğitmeyi önerir. Eğitimde ödül ve cezadan yararlanılabileceğini, öğretenin de makinenin içinde olup biteni çoğu zaman tam olarak bilmeyeceğini yazar.

Ders 5'in sonundaki ayrım bu makalede açıkça var. Bu kursta her kuralı if, for ve function ile kendimiz yazdık. Turing 1950'de kuralların baştan yazılması yerine makinenin eğitilmesini önerdi; bu, bugün machine learning denen yaklaşımın erken bir tarifidir. Lovelace itirazı, Ders 2'deki Note G bağlantısıyla aynı metne dayanır.

Kaynaklar:
A. M. Turing, Computing Machinery and Intelligence, Mind 59(236), 1950, 433-460, doi:10.1093/mind/LIX.236.433
A. Hodges, Alan Turing, Stanford Encyclopedia of Philosophy
G. Oppy, D. Dowe, The Turing Test, Stanford Encyclopedia of Philosophy

İsteğe bağlı video: The Turing Test - Computerphile (Computerphile, 9 dk 59 sn).

1955 tarihli Dartmouth önerisinin ikinci sayfasından bir kesit: 1956 yazında Dartmouth College'da iki aylık, on kişilik bir artificial intelligence çalışması öneren ilk paragraf; altında Automatic Computers, How Can a Computer be Programmed to Use a Language ve Neuron Nets başlıklı ilk üç madde.
Görsel: J. McCarthy, M. L. Minsky, N. Rochester, C. E. Shannon, A Proposal for the Dartmouth Summer Research Project on Artificial Intelligence (31 Ağustos 1955), s. 2, yeniden dizilmiş metin; “A Proposal for the Dartmouth Summer Research Project on Artificial Intelligence, by John McCarthy et al, 1955”, Wikimedia Commons, kamu malı. Kırpıldı.

5B

Dartmouth önerisi (1955) ve 1956 yaz çalışması

John McCarthy (Dartmouth College), Marvin Minsky (Harvard Üniversitesi), Nathaniel Rochester (IBM) ve Claude Shannon (Bell Telephone Laboratories) 31 Ağustos 1955 tarihli önerilerinde, 1956 yazında Hanover'daki Dartmouth College'da iki ay sürecek, on kişilik bir artificial intelligence çalışması yapılmasını istediler. McCarthy'ye göre artificial intelligence ifadesi bilinen ilk kez bu öneride kullanıldı. Öneri, öğrenmenin ve zekanın her yönünün, bir makinenin taklit edebileceği kadar kesin tarif edilebileceği varsayımıyla başlar. Konu listesinin ilk maddesine göre o günün bilgisayarlarında asıl engel makinenin kapasitesi değil, makineyi tam kullanacak programların yazılamamasıdır. Üçüncü madde Neuron Nets, yani varsayımsal nöronlardan kurulan ağlardır. Çalışma 1956 yazında yapıldı ve Dartmouth College bu toplantıyı alanın doğuşu olarak anıyor.

Görseldeki sayfada iki yol yan yana duruyor: zekayı kesin kurallarla tarif etmek ve öğrenen yapılar (Neuron Nets). Ders 5'in sonundaki kuralı elle yazmak ya da örneklerden çıkarmak ayrımı 1955'te bu listede vardı. İlk madde programcıyı da ilgilendiriyor: önerinin yazarlarına göre sorun makinede değil, programdaydı.

Kaynaklar:
J. McCarthy, M. L. Minsky, N. Rochester, C. E. Shannon, A Proposal for the Dartmouth Summer Research Project on Artificial Intelligence, 31 Ağustos 1955; McCarthy'nin notu ("so far as I know, the first use of phrase Artificial Intelligence")
AI Magazine 27(4), 2006, 12-14, doi:10.1609/aimag.v27i4.1904
Dartmouth College, Artificial Intelligence (AI) Coined at Dartmouth

İsteğe bağlı video: Early AI: The 1956 Dartmouth Conference (Computer History Museum, 1 dk 33 sn).

Mark I Perceptron'un 1960 kullanım kılavuzundaki fotoğrafı. Solda tripod üzerinde kamera; ortada S-unit monitörü, elle uyarı anahtarları ve S-unit'leri A-unit'lere bağlayan priz panosu; sağda association unit rafları, response panel ve meter panel. Parçaların adları fotoğrafın üzerinde İngilizce etiketli.
Görsel: Cornell Aeronautical Laboratory, Mark I Perceptron Operators' Manual (15 Şubat 1960), Şekil 2, “Mark I Perceptron, Figure 2 of operator's manual”, Wikimedia Commons, kamu malı.

5B

Rosenblatt'ın perceptron'u ve Mark I (1958-1960)

Frank Rosenblatt perceptron'u Buffalo'daki Cornell Aeronautical Laboratory'de geliştirdi ve 1958'de Psychological Review'da yayımladı. Temmuz 1958'deki ilk gösterimde perceptron bir IBM 704 üzerinde benzetim olarak çalıştı ve kartlara basılmış işaretin solda mı sağda mı olduğunu denemelerle ayırmayı öğrendi. Ardından yapılan Mark I Perceptron donanımı görüntüyle çalışıyordu: bir kameranın film düzlemine 20 x 20 düzeninde 400 ışığa duyarlı direnç yerleştirilmişti. Ağırlıklar, küçük doğru akım motorlarının çevirdiği potansiyometrelerde tutuluyordu. 15 Şubat 1960 tarihli kullanım kılavuzuna göre perceptron'un hafızası bu potansiyometrelerin konumlarıydı.

Perceptron'un kararı bu kursun araçlarıyla yazılabilir. Girdiler ağırlıklarla çarpılıp toplanır, toplamın eşiği geçip geçmediğine if ile bakılır. Tahmin yanlışsa ağırlıklar doğru cevaba doğru düzeltilir; Mark I bunu motorla potansiyometre çevirerek yapıyordu. IBM 704, Ders 2'deki FORTRAN bağlantısında da geçen makinedir.

samples = [([0, 0], 0), ([0, 1], 1), ([1, 0], 1), ([1, 1], 1)]
w = [0, 0]
for step in range(3):
    errors = 0
    for x, target in samples:
        total = w[0] * x[0] + w[1] * x[1]
        if total > 0:
            guess = 1
        else:
            guess = 0
        if guess != target:
            errors += 1
            diff = target - guess
            w[0] += diff * x[0]
            w[1] += diff * x[1]
    print(step, w, errors)
Çıktı
0 [1, 1] 2
1 [1, 1] 0
2 [1, 1] 0

Kaynaklar:
F. Rosenblatt, The perceptron: A probabilistic model for information storage and organization in the brain, Psychological Review 65(6), 1958, 386-408, doi:10.1037/h0042519
M. Lefkowitz, Professor's perceptron paved the way for AI, 60 years too soon, Cornell Chronicle, 25 Eylül 2019
Guinness World Records, First artificial neural network
J. C. Hay, B. E. Lynch, D. R. Smith, Mark I Perceptron Operators' Manual, Cornell Aeronautical Laboratory VG-1196-G-5, 15 Şubat 1960, DTIC AD0236965, Ek A.1 ve A.3
C. M. Bishop, Pattern Recognition and Machine Learning, Springer, 2006, s. 192-196

İsteğe bağlı video: Learning - Lecture 4 - CS50's Introduction to Artificial Intelligence with Python 2020 (CS50, 1 sa 45 dk 48 sn), 12:30'dan itibaren (Perceptron Learning).