Степулёнок Денис Олегович История развития языков программирования
Фантастика: разговор с компьютером «Идеальный» компьютер «понимает» естественный язык человека - «Программирование» на естественном языке
Ча́рльз Бэ́ббидж Разностная машина - механический аппарат для автоматизации вычислений путём аппроксимации функций многочленами и вычисления конечных разностей
Первая программистка Августа Ада Кинг (урождённая Байрон), графиня Лавлейс Составила первую в мире программу (для Аналитической машины Чарльза Бэббиджа). Аналитическая машина Бэббиджа должна была производить разнообразные вычисления, следуя набору инструкций.
При проектировании Аналитической машины в годах Бэббидж фактически задал направление всему последующему развитию ЭВМ. Проект создания аналитической машины предусматривал целый ряд механизмов, присущих нынешним ЭВМ: 1.Тех же пяти компонент (арифметическое устройство, устройство памяти, управления, ввода и вывода) 2.В число операций, помимо четырех арифметических, была включена операция условного перехода и операции с кодами команд 3.Все программы вычислений записывались на перфокартах пробивками
Ада Лавлейс: создала первые в мире теоретические основы программирования написала первый учебник по программированию вошла в историю как «первая программистка». Именно Лавлейс принадлежит идея использования для подачи на вход машины двух потоков перфокарт, которые были названы операционными картами и картами переменных: первые управляли процессом обработки данных, которые были записаны на вторых. Информация заносилась на перфокарты путем пробивки отверстий. Из операционных карт можно было составить библиотеку функций. Помимо этого, Analytical Engine, по замыслу автора, должна была содержать устройство печати и устройство вывода результатов на перфокарты для последующего использования.
ПРИЧИНЫ НЕУДАЧИ БЭББИДЖА Основная причина: Бэббидж действительно слишком превзошел свое время (в конце жизни он сказал: «я готов отдать последние годы своей жизни за то, чтобы прожить три дня через 150 лет, и чтобы мне подробно объяснили принцип работы будущих машин»). Бэббидж не сомневался в будущем развитии вычислительной техники. Невозможность в то время обрабатывать металл с высокой степенью точности (в то время как для реализации проекта Аналитической машины только зубчатых колес потребовалось бы несколько тысяч!) Финансовая проблема. Если поначалу различные научные общества с энтузиазмом поддерживали Бэббиджа, то совсем скоро они охладели к затратному проекту с размытыми целями. В 1851 году Бэббидж с горечью заявлял, что все, связанное с машиной, он сделал за собственные деньги. Известно, что ученый в целях добычи материальных средств написал роман, пытался избраться в Парламент Британской империи, даже одно время играл в лотерею.
1940-ые, Конрад Цузе, Plancalcul Первая попытка создать высоко- уровневый язык программирования принадлежит гениальному Конраду Цузе (конец 1940-х годов), разработавшему Plancalcul (планировщик вычислений). «Plancalcul родился исключительно как результат теоретической работы, без всякой связи с тем, появится или нет в обозримом будущем машины, подходящие к программам на Plancalcul». Фрагмент рукописи Цузе с шахматной программой на языке Plancalcul
Михаил Романович Шура-Бура и А.П. Ершов – создатели первых отечественных систем автоматизации программирования для ЭВМ «БЭСМ» и «Стрела» ( годы) Языки программирования в СССР
Языки и системы программирования в 1960-е Наиболее активный период разработки языков и систем программирования приходится на 1960-е годы. За это десятилетие в мире родилось более тысячи разнообразных языков, как универсальных, так и специализированных, но выжили и доросли до XXI века дожили немногие, в том числе бессмертные Fotran, Basic, Algol, Cobol, Simula, Lisp и их потомки. На рисунке: «вавилонская башня» языков программи- рования, созданных в 1960-е годы
Родословная основных высокоуровневых языков программирования
Бессмертный Fortran Fortran = FORmula TRANslator Первый высокоуровневый язык программирования Fortran был разработан в фирме IBM под руководством Джона Бэкуса (Backus, John; р. 1924). Работа над языком началась в 1954 г., первая реализация для IBM 704 в выполнена в 1957 г.
CMAIN PROGRAM 101FORMAT(208) 102FORMAT(//N=,15, 5X, R=, 15 1//6X, M, 5X, PROB) 103 FORMAT(18, F14.10) 201READ(1,101) N, IR WRITE(3,102) N, IR IF(N) 202, 202, STOP 203IF(IR) 202, 202, M=O P=COMBF(N,M)*COMBF(IR-1,N-M-1) 1/COMBF(N+IR-1,IR)... Фрагмент программы на языке Fortran
Basic – язык для начинающих BASIC = Beginners All-purpuse Symbolic Instruction Code Язык Basic был разработан в 1964 г. в Дармутском колледже в г. Хановере (Darmouth College, Hanover), штат Нью-Хемпшир
Простейшая программа на языке Basic Авторы языка Basic. Стоит Джон Кемени (Kemeny, John G.; ), сидит Томас Курц (Kurtz, Thomas E.; р. 1928) 10 dim A(5) 20 for i=1 to 5 30 input A(i) 40 next i 50 if i=5 then goto if A(i)
Будущие создатели Microsoft Пол Аллен (Allen, Paul; р. 1954) и Билл Гейтс (Gates, William; р. 1955) познакомились с Бэйсиком, работая в компьютерном классе школы в Сиэтле (снимок 1968 г.) Basic и Microsoft
Начав с Бэйсика, компания Microsoft превратилась в крупнейшую софтверную империю, а Билл Гейтс – стал самым богатым человеком на планете Штаб - квартира корпорации Microsoft в Редмонде (пригород Сиэтла)
На протяжении нескольких десятилетий Visual Basic оставался фирменный языком компании Microsoft. В начале 1990-х годов он стал объектным и приобрел средства визуального проектирования Visual Basic от Microsoft
Cobol – язык для бухгалтеров COBOL = COmmon Business-Oriented Language На фото: разработчики языка Cobol у шуточного обелиска, присланного в их адрес в качестве намека на безнадежно медленную работу, способную похоронить саму идею. Справа внизу – Грейс Хоппер
Основные свойства языка Cobol: независимость программ от оборудования; независимость программ от данных; сложные структуры данных; синтаксис, приближенный к естественному английскому языку. Cobol – язык для бухгалтеров
Программа на Коболе (начало) 1010 IDENTIFICATION DIVISION PROGRAM-ID EXAMPLE ENVIROMENT DIVISION INPUT-OUTPUT SECTION FILE-CONTROL SELECT CD ASSIGN TO SYS010 UNIT-RECORD 2540R SELECT TT ASSIGN TO SYS009 UTILITY DATA DIVISION FILE SECTION FDCDDATA RECORD IS C 1110LABEL RECORDS ARE OMITTED C C1 PICTURE 9(4) C2 PICTURE C3 PICTURE X(70).... Пример программы на языке COBOL
1290 PROCEDURE DIVISION P1.OPEN INPUT CD, OUTPUT TT P2.READ CD, AT END GO TO P MOVE C1 TO D MONE C2 TO D MOVE C3 TO D ADD C1, C2, GIVING D WRITE T FROM D. 1370GO TO P P3.CLOSE SD, TT. 1390STOP RUN. Программа на Коболе (окончание) Программа на Коболе (окончание)
3.2. Языки и системы программирования Algol и его влияние на языки программирования ALGOL = ALGOritmic Language В 1958 году в Цюрихе (Швейцария) состоялась международная конференция, предложившая проект нового универсального международного языка программирования Algol-58. В 1960 году на парижской конференции была принята окончательная версия под названием Algol-60. На снимке: участники парижской конференции голосуют за Алгол-60.
Основные свойства языка Algol-60: машинная независимость; формальный синтаксис; описание переменных и блочная структура; рекурсия Нормальная форма Бэкуса-Наура (БНФ) ::= 1|2|3|4|5|6|7|8|9|0 ::= | Algol и его влияние на языки программирования
begin integer i, n; real s; real array x[1:n]; s:=0; for i:=1 step 1 to n do s:=s+x[i]; s:=s/n end Простейшая программа на Алголе-60, вычисляющая среднее арифметическое n чисел. Синтаксис Алгола-60 сформировал стандарт для всех последующих языков программирования АЛГОЛ и его влияние на языки программирования
В результате многолетней переработки Алгола-60 комитетом IFIP появился язык Алгол-68 (пересмотренное сообщение под ред. А. ван Вейнгаардена (A. van Wijngaarden) и др. опубликовано в 1975 г.) Стандарт АЛГОЛ-68
Pascal и его потомки Член комитета по Алголу-68 Никлаус Вирт (Wirth, Niklaus; р. 1934) был против принятия переусложненного стандарта. В знак доказательства своей правоты он разработал в 1971 г. простой и ясный алголоподобный язык, предназначенный прежде всего для обучения студентов в Федеральном техническом университете в Швейцарии. В честь изобретателя первой вычислительной машины Вирт назвал язык Паскалем.
var i, n: integer; s: float; x: array[1..n] of real; begin s:=0; for i:=1 to n do s:=s+x[i]; s:=s/n end. Программа на Паскале, вычисляющая среднее арифметическое n чисел
Паскаль (Pascal) Никлаус Вирт (Niklaus Wirth) - швейцарский учёный, один из известнейших теоретиков в области разработки языков программирования, профессор компьютерных наук (ETH), Лауреат премии Тьюринга 1984 года. Разработал: Паскаль, Модула-2, Оберон.
Новую жизнь языку Pascal дал Филипп Кан (Kahn, Philippe; р. 1938) – создатель компилятора Turbo Pascal для IBM PC и основатель компании Borland (1984 г.) Turbo Pascal
Среда разработки Delphi фирмы Borland объединила передовые достижения технологии программирования: объектное расширение языка Pascal, визуально- событийное проектирование, модульное структурирование и раздельная компиляция. Delphi - потомок Pascal В отличие от учебного Паскаля, язык программирования Modula-2, предложенные Никлаусом Виртом, изначально предназначался для профессионального применения
В 1975 году Министерство обороны США приняло решение разработать стандартный язык для программирования сложных и ответственных военных приложений. Был объявлен широкий международный конкурс, в котором приняли участие 15 групп разработчиков. В результате нескольких туров в мае 1979 года выявился победитель французская фирма C.I.I., руководитель проекта Жан Ихбиа (Ichbiah, Jean). Снимок сделан на II конференции по истории языков программирования, 1993 г. Pascal и его потомки
Суперязык PL/1 – самый сложный язык EXAMPLE: PROCEDURE OPTIONS (MAIN); ON ENDFILE (SYSIN) GO TO ENDING; P1:GET LIST (A, B, C); D = B*B 4*A*C; E = B/(A+A); IF D
Simula и Smalltalk – революция в программировании – Объектно-Ориентированное программирование Simula = SIMULAlation За разрабртку языка Simula Кристен Нигорд (Nygaard, Kristen; ), на снимке слева, и Оле-Йохан Дал (Dahl, Ole-Johan; ) были удостоены высшей награды компьютерного сообщества – медали Тьюринга
|a| a := Array new: 5. 1 to: 5 do: [:i | a at: i put: (Prompter prompt: Введите элемент массива) asNumber]. a := a asSortedCollection. a do: [:i | Transcript putAll: i printString]. Простейшая программа на Smalltalk, вычисляющая среднее арифметическое пяти чисел Алан Кей Простейшая программа на Smalltalk
С – язык для профессионалов Язык Си (С) был создан Деннисом Ричи (Ritchie, Dennis M.; р. 1941) в 1973 году в Bell Labs в ходе разработки операционной системы UNIX. Он развивал язык Би (B), который основывался на созданном в Кембриджском университете языке BCPL (от Basic Combined Programming Language), который в свою очередь был потомком Алгола-60
float A[5]; for(int i=0;i
Бьярн Страуструп (Stroustrup, Bjarne; р. 1950) ввел в язык С объекты и превратил его в С++ С – язык для профессионалов
Java – дитя интернета В 1995 г. фирма Sun Microsystems представила язык Java для программирования в интернете. Он возник в ходе реализации проекта Oak («Дуб»), целью которого было создание системы программирования бытовых микропроцессорных устройств. Джеймс Гослинг (Gosling, James) – автор Java.
Java - технология Java-апплеты
class test { int i, n; float s; float x[n]; public static void main( String args[] ) { n = 10; s = 0; for( i=1; i
Lisp = LISt Processing Язык Lisp создан в 1960 году Джоном Маккарти (McCarthy, John; р ) в Массачусетском технологи- ческом институте на теоретическом фундаменте лямбда-исчисления, пред- ложенного еще в 1930 году известным американским логиком Алонзо Черчем. Долгожитель Lisp – инструмент функционального программирования Дж. Маккарти и А.П. Ершов Снимок 1975 г.
Программа на Lisp имеет специфический вид из-за обилия скобок. За это студенты прозвали его «Lots of Infuriating & Silly Parenthesis» - «Множество раздражающих и глупых скобок» (setq L `( )) (defun sum (L) (cond ((null L) '0) (t (add (car L) (sum (cdr L)))) ) (div (sum L) '5) Примитивы : cond условная функция, проверяющая с помощью функции null пустоту списка; add суммирование аргументов; car извлечение первого элемента из списка; cdr извлечение остатка списка (без первого элемента). Пример программы на LISP
Scheme – 1975 год Функциональный язык программирования, один из двух наиболее популярных в наши дни диалектов языка Лисп (другой популярный диалект это Common Lisp). Авторы языка Scheme Гай Стил (англ. Guy L. Steele) и Джеральд Сассмен (англ. Gerald Jay Sussman) из Массачусетского технологического института создали его в середине 1970-х годов. Продолжения - continuation состояние программы в определённый момент, которое может быть сохранено и использовано для перехода в это состояние. Продолжения содержат всю информацию, чтобы продолжить выполнения программы с определённой точки.
Prolog – несостоявшаяся мечта ЭВМ V поколения Prolog = PROgramming for LOGic Теоретические основы языка были разработаны Робертом Ковальским (Kowalski, Robert) в Эдинбургском университете (Шотландия) в конце 1960-х годов Первая практическая реализация языка осуществлена Аленом Кольмари (Colmerauer, Alain ) в Марсельском университете (Франция) в 1972 г.
Факты: муж (петя), муж (ваня), муж (коля), жен (таня), жен (маша), мать (ваня, таня), отец (ваня, петя), отец (маша, ваня), отец (коля, ваня). Правила вывода: родитель (X, Y) : отец (X, Y) родитель (X, Y) : мать (X, Y) дед (X, Y) : родитель (X, Z), отец (Z, Y) брат (X, Y) : муж (Y), родитель (X, Z), родитель (Y, Z), XY Примеры диалога: GOAL> дед (коля, X) Кто дед Коли? X = Петя GOAL> брат (маша, X) Кто брат Маши? X = Коля Описание предметной области семейных отношений на языке Prolog Prolog – несостоявшаяся мечта ЭВМ V поколения
Проект ЭВМ V поколения – японский вызов мировой компьютерной индустрии, брошенный в начале 1980-х годов Prolog – несостоявшаяся мечта ЭВМ V поколения
Концептуальные отличия ЭВМ V поколения: новая технология производства микросхем, знаменующая переход от кремния к арсениду галлия, и дающая возможность на порядок повысить быстродействие основных логических элементов; новая архитектура (не фон-неймановская); новые способы ввода-вывода информации распознавание и синтез речи и образов; отказ от традиционных алгоритмических языков программирования (Фортран, Алгол и т. п.) в пользу декларативных; ориентация на задачи искусственного интеллекта с автоматическим поиском решения на основе логического вывода. ЭВМ V поколения
Структура ЭВМ V поколения
В качестве основного языка ЭВМ V поколения предполагалось использовать Prolog
Logo – язык для самых маленьких Язык Logo, изобретен в 1967 г. в MIT выдающимся математиком и педагогом Сеймуром Пейпертом (Papert, Seymour; р. 1928). Пейперт в годах работал в Женеве у знаменитого психолога Жана Пиаже (Piaget, Jean), где занимался детьми и природой их мышления. Идейной основой Logo является язык Lisp На фото: Сеймур Пейперт получает степень почетного доктора Софийского университета (1999 г.)
Программа на Logo управляет черепашкой, оставляющей видимый след. С помощью зрительных образов интерпретируются все базовые структуры программирования Процедура с параметром это дуга :шаг :число_шагов повтори :число_шагов [вперед :шаг направо 10] Конец это спираль :шаг если :шаг < 1 [стоп] дуга :шаг 18 спираль :шаг / 2 конец Цикл Рекурсия 3.2. Языки и системы программирования Logo – язык для самых маленьких
Концепция Logo учитывает детскую психологию и рассчитана на обучение школьников, начиная с младших классов Новейшие реализации Logo используют принципы объектно- ориентированного программирования. В программе Юли Гладких, 9 лет, черепашка в форме лебедя плавает по озеру. На снимке: группа юных программистов на факультете информатики Томского государственного университета. Занятие ведет доцент Т.Н. Поддубная (2002 г.) Logo – язык для самых маленьких
ДРАКОН Дружелюбный Русский Алгоритмический язык Который Обеспечивает Наглядность Создан в рамках космической программы Буран (разработка начата в 1986 г.). В разработке языка принимали участие Федеральное космическое агентство (НПЦ автоматики и приборостроения им. акад. Н.А. Пилюгина, г. Москва) и Российская академия наук (Институт прикладной математики им. акад. М.В. Келдыша).Федеральное космическое агентствоНПЦ автоматики и приборостроения им. акад. Н.А. Пилюгина, г. МоскваРоссийская академия наукИнститут прикладной математики им. акад. М.В. Келдыша
Парадигмы программирования Основные парадигмы программирования: программирование в машинных кодах (Assembler); процедурное программирование (Fortran, Basic, Cobol, Algol, Pascal, Ada, С, Logo, FoxPro); объектно-ориентированное программирование (Simula, Smalltalk, Object Pascal, C++, Java, C#); визуально-событийное программирование (Visual Basic, Delphi, Visual C++, Visual Java, Visual FoxPro); функциональное программирование (Lisp); логическое программирование (Prolog). аспектно-ориентированное программирование. предметно-ориентированное программирование. субьектно-ориентированное программирование.
МестоНазваниеПроцент 1Java17.751% 2C16.110% 3PHP10.351% 4C % 5Basic6.230% 6Python5.339% 7C#5.026% 8Perl2.412% 9Delphi2.305% 10Ruby1.924% 11Objective-C1.895% 12JavaScript1.808%
YearWinner 2009Go 2008C 2007Python 2006Ruby 2005Java 2004PHP 2003C++ «Язык года» Максимально быстрый рост
Визуальное (графическое) программирование
Андерс Хейлсберг Разработчик Delphi и C#
C# объектно-ориентированный язык программирования. Разработан в годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как основной язык разработки приложений для платформы Microsoft.NET. Компилятор с C# входит в стандартную установку самой.NET, поэтому программы на нём можно создавать и компилировать даже без инструментальных средств, вроде Visual Studio. C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к C++ и Java. Язык имеет статическую типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типа), делегаты, атрибуты, события, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкойзамыканий, LINQ, исключения, комментарии в формате XML. Переняв многое от своих предшественников языков C++, Java, Delphi, Модула и Smalltalk С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем: так, C# не поддерживает множественное наследование классов (в отличие от C++).
Python
Go - компилируемый, многопоточный язык программирования, Начало разработки: сентябрь 2007 года. Google Go = Python + C++ Цель: повысить скорость Python за счёт статической типизации С++ при этом сохранив высокий уровень языка
Параллелизм - отличительная особенность дизайна Go. Язык вводит понятие "goroutines" методы, которые выполняются одновременно. Любая функция может быть выполнена как "goroutine" с помощью указания в префиксе вызова функции ключевого слова "go". Язык реализует "channel" механизм, который может быть использован для безопасного обмена данными с "goroutines".
Хранение исходных текстов программ
Online IDE Программирован ие в интернете
Python Текст философии: Красивое лучше, чем уродливое. Явное лучше, чем неявное. Простое лучше, чем сложное. Сложное лучше, чем запутанное. Плоское лучше, чем вложенное. Разреженное лучше, чем плотное. Читаемость имеет значение. Особые случаи не настолько особые, чтобы нарушать правила. При этом практичность важнее безупречности. Ошибки никогда не должны замалчиваться. Если не замалчиваются явно. Встретив двусмысленность, отбрось искушение угадать. Должен существовать один и, желательно, только один очевидный способ сделать это. Хотя он поначалу может быть и не очевиден, если вы не голландец Сейчас лучше, чем никогда. Хотя никогда зачастую лучше, чем прямо сейчас. Если реализацию сложно объяснить идея плоха. Если реализацию легко объяснить идея, возможно, хороша. Пространства имён отличная штука! Будем делать их побольше!
Влияние других языков на Python Появившись сравнительно поздно, Python создавался под влиянием множества языков программирования: ABC (англ.) отступы для группировки операторов, высокоуровневые структуры данных (map) (фактически, Python создавался как попытка исправить ошибки, допущенные при проектировании ABC); ABCангл. Modula-3 пакеты, модули, использование else совместно с try и except, именованные аргументы функций (на это также повлиял Common Lisp); Modula-3Common Lisp Си, C++ некоторые синтаксические конструкции (как пишет сам Гвидо ван Россум он использовал наиболее непротиворечивые конструкции из С, чтобы не вызвать неприязнь у Си-программистов к Python [11] ); СиC++Гвидо ван Россум [11] Smalltalk объектно-ориентированное программирование; Smalltalk Lisp отдельные черты функционального программирования ( lambda, map, reduce, filter и другие); Lispфункционального программирования Fortran срезы массивов, комплексная арифметика; Fortran Miranda списочные выражения; Mirandaсписочные выражения Java модули logging, unittest, threading (часть возможностей оригинального модуля не реализована), xml.sax стандартной библиотеки, совместное использование finally и except при обработке исключений, для декораторов; Java Icon генераторы. Iconгенераторы Большая часть других возможностей Python (например, байт-компиляция исходного кода) также была реализована ранее в других языках.
>>> print ("Здравствуй, %s!" % "Мир") Здравствуй, Мир! 1
# -*- coding: utf-8 -*- Кодировка >>> 2 ** 100 # возведение 2 в степень L >>> from math import * # импорт математических функций >>> sin(pi * 0.5) # вычисление синуса от половины пи 1.0 >>> help(sorted) # помощь по функции sorted Help on built-in function sorted in module __builtin__: sorted(...) sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list Режим калькулятора
# Дан массив чисел. Найти 2 разных элемента, произведение которых # максимально. b = [-2,3,4,-48] max = b[0]*b[1] for x in b: for y in b: if x!=y and x*y > max: # можно if x==y: max = x*y # pass print max # else:
# сортировка пузырьком b = [2,3,4,5,6,7,10,3,4] for i,vi in enumerate(b): for j,vj in enumerate(b): if b[j] > b[i]: b[i],b[j] = b[j],b[i] print b
# Дан массив слов, вывести в виде словаря 10 самых встречающихся букв b=['fall','winter', 'summer','defenestrate', 'compilation'] d={} max=0 for word in b: for letter in word: if d.has_key(letter): d[letter]+=1 else: d[letter]=1
# Дан список (list), вывести все элементы умноженные на 2 (c помощью ГЕНЕРАТОРА) # Например: # b = [2,3,4,5,6] b= [2,3,4,5,6]b= [2,3,4,5,6] h=tuple(x*2 for x in b) print "h = ", h k=tuple(x for x in b if x%2 == 0) # Все делящиеся на 2 (добавили условие) print "k = ", k k1=tuple(x*x for x in b if x%2 == 0) # Квадраты всех делящихся на 2 print "k1 = ", k1 k2=tuple(x*x for x in b if (x+13) % 10 == 5)# может быть условие любой сложности (if...)