Контакти

Різні мови програмування і їх області застосування. Лекція в Яндексі. Розширення існуючих мов програмування Розширювані мови програмування

Zalina 13 січня 2016 о 15:42

Різні мови програмування і їх області застосування. Лекція в Яндексі

  • Прес-центр компанії Яндекс,
  • Розробка веб-сайтів,
  • програмування,
  • Промислове програмування

Наш перший пост в цьому році ми вирішили присвятити дуже базової темі, лекція на яку була прочитана в Малому Шаде. Займаються в ньому старшокласники, яким цікаві технології, звідси специфічність викладу - лекція буде особливо цікава тим, хто тільки починає програмувати і замислюється про те, в якому напрямку розвиватися. Для них же у Яндекса є курс «Введення в програмування (С ++)», який можна пройти на платформі Stepic.org.

Лектор Михайло Густокашін - куратор академічних програм Яндекса, директор центру студентських олімпіад факультету комп'ютерних наук ВШЕ. Михайло підготував десятки переможців і призерів Всеукраїнських олімпіад з програмування.

В рамках лекції розповідається про те, які бувають мови програмування, чим вони відрізняються, як вони з'явилися і які з них краще, а які - гірше. На початку мова трохи піде про історію мов - як вони з'явилися, як люди почали програмувати, як все розвивалося, що зараз відбувається. У другій частині буде порушено то, для яких завдань яка мова підходить, як «вибрати собі улюблену мову й отримувати задоволення від життя». Лектор також трохи розповість про те, як, на його думку, всьому цьому навчитися і потім влаштуватися на роботу.

Як завжди, під катом - детальна розшифровка лекції, щоб ви могли зорієнтуватися в її змісті.

Історія мов програмування

Давайте почнемо з самого початку. На самому початку у комп'ютерів не було навіть клавіатури! Тобто все було дуже погано - у них не було ні клавіатури, ні екрану, були перфокарти (це такі штучечкі з дірочками або з відсутністю дірочок). Відповідно, то чи штирі туди засовували, то там світлом світили. Якщо є дірочка (або навпаки немає) - це означало нулик або одиничку. І програми в той час писали за допомогою машинних кодів - у кожної операції в комп'ютері (додавання, віднімання, якісь більш складні операції) був якийсь код машинний. Люди самі по табличці вибирали цей код, всякі адреси в пам'яті, все це вибивали руками і засовували в зчитувач - і воно все вважалося. Звичайно, робота програміста була, напевно, тоді не особливо цікавою - проробляти дірочки - і з розвитком науки і техніки, звичайно, почали придумувати всякі, більш «цікаві» штуки. Наприклад, асемблер (Assembler), який вже кілька полегшував життя.

Ну, як він полегшував життя? Замість запам'ятовування того, що там якийсь «чарівний» код у команди, використовувалися всілякі слова, схожі на «людський» англійську мову - якісь add або mov - ну і потім перераховувалися регістри або області пам'яті, змінні, з якими потрібно ці операції виробляти. Але ясна річ, що це взагалі-то теж вимагало чималої напруги розуму, щоб тримати у себе в голові, в якому регістрі у нас що лежить, де які змінні і що взагалі відбувається. Чому так відбувалося? Тому що комп'ютери були «дурні» і нічого більше «розумного» зрозуміти не могли. Взагалі-то і зібрати з асемблера машинний код теж вимагає часу, пам'яті (на ті часи було звичайно мало її).

Поступово, ставало зрозуміло, що розробляти так великі складні програми дуже складно. Продуктивність програміста в цих командах була гранично низькою - тобто він писав кілька рядків в день (осмислених), і кожен рядок нічого особливо й не робила - якісь прості арифметичні дії. І людям хотілося зробити мови набагато більш схожими на людську мову, на англійський зокрема, щоб писати програми було легше і зручніше. І пішло-поїхало!

Старі і мертві мови

Одним з перших мов став Fortran. До речі, його теж ще вибивали на перфокартах - були спеціальні перфокарти для вибивання програм на Fortran'е. Але якщо ви зараз візьмете цей Fortran - по-моєму, він навіть десь між 50-60 рр. з'явився - і спробуєте на ньому щось написати, то вам буде дуже неприємно, я вам гарантую! Сучасний Fortran досі живий, але вже досить сильно відрізняється від того, що було раніше.

Інші мови - зараз напишу одну штуку, про яку напевно ви якщо і чули, то тільки на всяких заходах, де розповідають про історію програмування - це COBOL. Це була мова для написання бізнес-додатків. Що таке бізнес-додатки? Які-небудь транзакції в банках, ще щось, все це писали на Коболе. У нас, ясна річ, не дуже популярний. Я думаю, програміста на Коболе, в Москві, ви знайдете на превелику силу. А де-небудь не в Москві - з ще більшим працею. Але, що дивно, ще 10 років тому більше половини всього коду, написаного людством, було написано на Коболе. І до сих пір, значна частина яких банківських транзакцій йде за допомогою програм, написаних на ньому (COBOL), і до сих пір люди на ньому щось пишуть.

Є ще «забавний» мову, він називався Алгол (68-я версія, що характеризує рік його створення). Це алгоритмічний мову. Загалом, вони щось там вміли, але нам зараз не дуже цікаво, що вони вміють. І на цьому наш екскурс в старовину і в щодо невикористовувані мови можна закінчити і перейти до того, що жваво досі (і активно живе).

Старі, але живі мови

Алгол придумали в Європі, а Фортраном користувалися в основному в Штатах - великих відмінностей немає. Яка тенденція помітна? Спочатку все було складно і щоб писати потрібно було бути чи не інженером, іелектротехніком, розуміти, де які контакти замикаються і ще щось для програмування. Потім теж потрібно було сидіти з листочками і вважати пам'ять, дивитися за нею. І поступово все ставало простіше, простіше, простіше і далі ще простіше для програміста - якомога менше думати людині, як можна більше робити автоматично. Приблизно в кінці ось цього періоду (лектор вказує на Алгол і Кобол) починають з'являтися мови, які в якомусь сенсі «дожили» до наших днів.

BASIC. Можливо, до сих пір деякі люди на ньому щось пишуть, по крайней мере я бачив, що в деяких закладах навчають на QBasic Ті - таке синє віконце, де написано «1989». Загалом, «щосили» живе! Він придумувався як мову для не програміст. У той час програміст була така дуже спеціалізована професія. А тут тобі кажуть: «Ось у нас є класний мову Basic, і будь-яка розумна людина візьме і напише програму на ньому - легко». Знову ж той Бейсік і сучасний Бейсік - це величезна різниця. Всякі ось ці рядки з нумерацією через 10, всякі GOTO та інший жах - вони до сучасного Бейсік вже не мають ніякого відношення і навіть до Бейсік 89-го року вони мають мало відношення.

Ще одна кумедна історія - мова Паскаль, широко відомий в вузівських колах, в основному в Росії та в країнах колишнього Радянського Союзу. Він використовувався і продовжує використовуватися на подив як навчальний мову. У всьому іншому світі він поменше поширений, але теж живе і процвітає. Є така людина Вірт - ось він учений, теоретик. Він брав участь в обговоренні Алгола, йому не сподобалося те, що вийшло, і він придумав свою мову - Pascal. А потім фірма Borland (і до цього багато інших фірм - Apple займалася, зокрема) взяли і все зіпсували. У нього була красива теорія, струнка - «все буде добре», - а вони взяли і напхали туди того, що людям потрібно для роботи. Ну, і вийшло не так красиво, як він хотів.

І наприкінці, . Сі придумали інженери. Якщо Паскаль придумав учений, то Сі придумали Керниган і Рітчі, вони працювали інженерами в Bell. Як це сталося? У той час на цих мовах (лектор вказує на Fortran, COBOL, Algol) нічого системного написати було не можна. Що таке «системне»? Наприклад, операційну систему, драйвера якісь, ще щось. Ці мови призначалися для математичних розрахунків, для бізнес-розрахунків, для всього такого. А все інше писали на Асемблері. Були якісь мови, вони зараз померли, тобто мова Сі з'явився не відразу від Ассемблера, а через якісь проміжні речі.

Суть в чому? Керниган і Рітчі любили грати в іграшку Asteroids - літає космічний корабель, і тут є астероїди, він в них стріляє, і вони розвалюються на частини. У них був сервер, на якому вони грали, але там було багато народу, і іграшка гальмувала. І вони виявили у себе десь в кабінеті, що у них стоїть якийсь комп'ютер, яким ніхто не користується. Але було проблема - він інший архітектури був, а гра була написана на Асемблері.

Вони її переписали, звичайно, навіть впився фичи якісь, щоб грати на ньому. Але це навело їх на думку, що переписувати під нову архітектуру кожен раз - це не дуже розумно. І вони вирішили написати таку мову високого рівня, Який буде підходити для системного програмування, тобто, в якому можна буде управляти пам'яттю, в якому можна буде розуміти де-що лежить і як звертатися до цих шматочках пам'яті. І так з'явилася мова Сі, який зробив величезний вплив на все подальше. Вони все (лектор показує на Алгол, Фортран і інші згадані мови) справили великий вплив, але ось Сі - прямо так ...

Відповідно, це був основний мову в Unix - операційній системі, яка в той час була ще популярнішим, ніж зараз. І приблизно до 80-х років ситуація була якась отака (лектор показує на Basic, C і інші згадані мови). Припустимо, що все це у нас вже потихеньку померло (лектор стирає згадки про Ассемблері, Фортране і Алгол) ... І в 80-ті роки комп'ютери стали менше, розумніше, дешевше, і людям захотілося всяких дивацтв, щоб жити стало ще краще, жити стало ще веселіше.

Мови родом з 80-х

Одна з перших дивацтв - це була мова C ++. Мова C має величезну кількість недоліків (ну просто взагалі величезна) - на ньому можна робити взагалі все, в тому числі стріляти собі в ногу, стріляти собі в ногу з вигадкою, в іншу ногу, однією ногою стріляти в іншу ногу, в загальному - що завгодно робити. Але при цьому деякі архітектурні речі там робляться досить складно - знову ж таки, як і в Асемблері, нам доводиться весь час стежити, де ми, чого і яку пам'ять виділили; вона там весь час «тече» кудись ця пам'ять - тобто ми виділили, забули видалити, видалили не те, вилізли за межі пам'яті, в загальному - огреблі купу проблем.

C ++ створювався спочатку як набір доповнень до мови C, який полегшить розробку. У той час стало модно об'єктно-орієнтоване програмування та люди вирішили, що все можна описати у вигляді ієрархії, тобто - є у вас м'ячик (абстрактний), ви від нього успадковуєте футбольний м'яч, волейбольний м'яч, ще один абстрактний м'яч. Тоді було модно, що «ми зараз пишемо все у вигляді якоїсь ієрархії, і все буде добре, життя налагодиться, все стане чудово і все». C ++ в якомусь сенсі реалізовував цей об'єктний підхід - це не був перший мову об'єктно-орієнтованого програмування, але він став досить популярним і в ньому почали з'являтися всякі фічі. При цьому C ++ зберігав майже повну сумісність (на той момент) з мовою C, програма написана на Сі в 99% випадків успішної компілювати як C ++ - ная і навіть працювала також. Це було задумано, щоб з Сі було легко перейти на C ++.

На додаток до об'єктного підходу (в C ++) досить швидко з'явилася стандартна бібліотека шаблонів (STL). Я думаю, що в школі ті, хто ще вчив Паскаль, виявляли, що у вас там, по-перше, немає вбудованої сортування (в древньому, синьому Борланд Паскалі, зараз вона вже є в сучасних версіях) - там є приклад (исходник) сортування, його можна скопіювати і вставити. Але якщо ви хочете тут впорядкувати цілі числа, тут хочете речові числа, а тут рядки, які можна між собою порівнювати, вам доводилося писати три різні сортування, які роблять абсолютно одне і теж, просто у них різні типи даних. Ось це не дуже добре і шаблони, які не відразу з'явилися в C ++, цю проблему здорово полегшили. Тобто, у вас була абстрактна програма, яка щось, що може між собою порівнюватися, успішно сортувала.

Скриптові мови з 90-x

Але час не стояв на місці, в 80-і роки ще багато чого цікавого відбувалося. Але десь на рубежі 80-х і 90-х комп'ютери стали настільки гарні, що можна вже було робити зовсім дивні і дуже неефективні речі. Зокрема, це були скриптові мови, що не компілювалися в машинний код, а інтерпретувалися. Бейсік теж в якийсь час інтерпретувався, але ці скриптові мови були призначені в основному для обробки текстів - це, наприклад, Perl, Python (він був тоді не дуже знаменитий), PHP, Ruby - ось ті скриптові мови, які в тій чи іншою мірою живуть до сих пір (вони все встигли з'явитися до 2000 року, навіть сильно раніше).

Давайте трохи по ним пройдемося, бо це специфічні речі і зараз багато де використовуються. Ідея полягає в чому? Якщо ми не компілюємо, то можна дозволити набагато більше всього. Наприклад, програма може дивитися на свій код і як-то користуватися цим; вона знає, що в ній відбувається і за рахунок цього можна багато чого цікавого робити.

Perl був призначений для обробки текстів - в ті часи вже пам'яті стало настільки багато в комп'ютерах, що туди можна було запхнути якийсь текст і з цим текстом щось корисне робити (наприклад, вважати слова, пошук якоїсь). Але, на мій погляд, його проектували люди, які були трохи не в собі, тому що про нього жарт така є: «Будь-який набір символів, написаний, є коректною програмою на Перлі». На мій погляд, на ньому можна тільки писати, читати його не можна. Коли я дивлюся на код на Перлі і намагаюся щось зрозуміти, я нічого не розумію. Може бути, якщо б я знав його краще, я б щось розумів, але як я чув від тих людей, які все таки вміють, - вони кажуть, що легше переписати заново. Тобто, програми виходять короткі і реально простіше переписати заново, ніж розібратися з тим, що там є і виправити.

Приблизно в той час, в середині 90-х, з'явився інтернет. Спочатку це були пошта, сайтики зі статичним HTML, але людям захотілося додати туди якусь динаміку, щоб у нас все відбувалося динамічно, формочки якісь можна було заповнювати, гостьові книги робити, ще щось. Відповідно це вимагало якогось взаємодії, придумали протокол, як це взаємодіє, і, найголовніше, генерацію цих статичних (умовно) сторінок, які будуть «випльовує» користувачеві у відповідь на його запит.

Загалом, нічого крім Перла на той момент не підходило. Писати на чистому Сі або на C ++ обробник було поганою ідеєю. І від відсутності кращого в той час (і досить довго) Перл був популярною мовою для веб-розробки. Звичайно, масштаби не зрівняються з тим, що зараз відбувається.

PHP з'явився як ... випадково. Одна людина досить швидко перестав займатися цим - робив свою сторінку якусь, була у нього гостьова книга якась, ще щось, якісь штуки. І він написав набір макросів якихось для Перла, які були схожі на Сі, тому що він на Сі вмів, просто тому що йому було так зручно. І назвав це Personal HomePage. Разшарив і каже: «Люди, дивіться яку штуку я написав, тут все набагато зрозуміліше, ніж на Перлі і можна правити». І людям це сподобалося.

Потім він цю справу кинув. Загалом, в результаті цей PHP став жити і став згодом набагато популярніше, ніж Perl. Але ось ця його «родова травма» (задумка як набір макросів для Перла) з ним зіграла досить злий жарт. Мова вийшов дивний. Тобто він розвивався сам по собі, його ніхто не проектував, ніхто не администрировал процес розвитку (ні компанія, ні якийсь чоловік), а було багато групок, кожна з яких пиляла те, що їм подобається. В результаті там функції називаються по-різному, навіть стилю немає, все через підкреслення, в загальному як попало, настройки лежать тут і там, і як все це буде працювати не дуже зрозуміло. Зате можна сісти і через дві години писати на PHP, тому що він так думав.

Python і Ruby: Ruby зараз менш популярний, Python якось краще «виструганих», давайте про нього потім поговоримо. Ясна річ, що в ті часи це були (лектор вказує на Perl, Python, Ruby, PHP) сильно спеціалізовані мови для сильно спеціалізованих цілей. У загальному випадку ніякого системного програмування, жоден бізнес-логіки ніхто на них не писав в той час і зараз не дуже багато це робить.

Компільовані мови з 90-х

Ми підемо приблизно в ті ж часи, але в іншу сторону. У нас на той момент C ++ застосовувався практично для всього, що потрібно було писати не для інтернету, не для обробки тексту, а для просто додатків, для операційних систем, для іграшок - в загальному, для чого завгодно. Але C ++ - це страшний мову насправді. Чому? Тому що, по-перше, він успадкував через зворотної сумісності всі проблеми Сі. Там можна було і раніше вбитися мільйоном різних способів, Тих же самих, що були в Сі (природно, додалися і нові способи в C ++). При цьому, якщо писати все добре і правильно, як було задумано авторами C ++, то, звичайно, старими сішнимі способами вже вбитися було не можна, і ніби як їх стало трохи менше. Проте, у нього була дуже дивна об'єктна модель своєрідна. Розбиття програми на модулі, на шматочки якісь взагалі прийшло з Сі (якщо include ви вмієте писати на Сі або на C ++ - фактично це було задумано як просто вставити текст бібліотеки в вашу програму, в результаті, коли ви пишете купу інклюд у вас все - якщо «примітивно», як це було на самому початку - у вас все вставляється в один файлик і потім все це моторошно довго компілюється, тому що по кілька разів ходить. Той же Паскаль, Віртовскій, був в цьому плані набагато більш продумано, більш пізні версії стали ще краще.

Загалом, недоліків у C ++ дуже багато. Кваліфікація у програміста повинна була бути висока, щоб писати на C ++, і коштували такі програмісти дорого (і підготовка, і ще чогось, тобто знайти на ринку програмістів складно, платити їм потрібно багато, ну і взагалі це не справа ... ). А комп'ютери у нас все швидше і швидше вважають, стають все дешевше, люди купують собі нові комп'ютери і хочуть більше додатків, більше іграшок для телефону, в загальному - більше радості.

Так і з'явилася Java (Ява). Там теж пов'язана досить кумедна історія, як назва з'явилася у цієї мови. Там програмісти, вони весь час п'ють каву і в той час було модним пити каву, який на острові Ява ріс. Мова замислювався як мова для вбудованих приладів, зокрема для кави-машини. Ось так і вийшло назва ...
Що взагалі почалося з неї, що в ній було гарне і чому ж вона завоювала велику популярність? По-перше, вони позбулися спадщини Сішного, повністю. Ніяких покажчиків, гораздно менше способів відстрелити собі якусь частину тіла і все зламати. По-друге, вони впровадили набагато більш свіжі ідеї в плані об'єктної моделі - тобто C ++ з'явився значно раніше, ніж Java і використовував більш архаїчну, «дику» модель об'єктну. Ну а тут (лектор вказує на Java) вона була вже більш продуманою тоді вже, і в теорії люди думали, і на практиці застосовували і зробили все набагато крутіше.

І нарешті, третє. У нас програмки на Джаві збиралися не в машинний код, а в код для віртуальної машини. Тобто, у вас жила віртуальна машина (VM) JVM - Javовская. Ваші програми збиралися в якесь проміжне представлення і потім, за допомогою це машини вже виконувалися. Що це дало? По-перше, воно гальмувало, по-друге, воно жерло пам'ять зі страшною силою, по-третє воно було переносимо куди завгодно (теоретично) - хоч на кавоварку, хоч на кавомолку, хоч на комп'ютер, хоч на телефон мобільний. Це, з одного боку добре, тобто ви написали просто реалізацію віртуальної машини, потім свої джавовскіе програми запускаєте всюди. Але, з іншого боку, погано, що на тому ж самому телефоні тоді було мало пам'яті, була низька продуктивність і все це ще додатково починало тупити і гальмувати.

Але навіть не це головне, для чого взагалі мова придумувався. Мова Джава придумувався щоб знизити вимоги до кваліфікації програмістів. Тобто більш погані програмісти можуть писати хороші програми на Java, тому що вона не дозволяє писати погані програми - там немає коштів, щоб писати програми погано. Там можна писати тільки добре, програми. Добре, в розумінні творців мови.

Тобто, якщо на Сі, на C ++, на Python, на чому завгодно ми можемо розвести зі свого проекту моторошну смітник якусь, де у нас все лежить упереміш, збирається годинами і там ще чогось. То в Java смітник розвести теж можна, але для цього вже треба докласти якихось зусиль. Тобто, за умовчанням, там виходить не "смітник", виходять інші проблеми, що там щось пронаследовалі-пронаследовалі - в загальному на одну осмислену рядок виходить десять не надто осмислених. Зате, може такий, середньої кваліфікації, програміст писати досить низькоякісний продукт.
Ми майже дійшли до кінця. У нас, наступне, що з'явилося - ето.Net (дотнет), ну і зокрема нас цікавить C # (майже те ж саме [лектор вказує на Java], тобто там відмінності в деталях, якщо будете вибирати між ними - дивіться, де грошей більше платять).

І ще одна штука - JavaScript. Не має ніякого відношення до мови Java, з'явився в тому ж році - слово було модне, вони ліцензували торгову марку, Щоб використовувати.

На що, головне, потрібно звернути увагу? (Лектор малює стрілки від C ++ до Java, .Net, C #, JavaScript і PHP). Щоб написати простеньку програмку на одному з цих мов, та й на багатьох інших - якщо ви знаєте C ++, вам в общем-то нічого більше знати не треба - ви берете і пишете на C ++, а потім додаєте долари на початку, ще щось робите по дрібниці і у вас вона починає працювати на чому завгодно (лектор показує на мови, до яких були відведені стрілочки від C ++). Тобто вони гранично схожі в якихось простих речах. Якщо ви вирішуєте якісь шкільні завдання, навчальні завдання, Ще щось (НЕ проектуєте великий проект - у вас один файлик, який читає числа, виводить числа в консолі, ще чогось робить), то різниці майже ніякої немає між цими мовами. Зрозуміло, що JavaScript та PHP вони спеціалізовані, у них все трошки по іншому. А ось тут (лектор вказує на Java і C #) взагалі гранично мало різниці.

З тих пір з'являються всякі інші цікаві речі, але незрозуміло - будуть вони жити або успішно помруть. Чим зараз, для яких завдань користуються?

Вибір мови в залежності від завдання

Припустимо, перед вами стоїть завдання написати драйвер для відеокарти. Якою мовою ви будете користуватися сьогодні? (Вигуки із залу: Java!) А чого ... Джава - відмінно, але чого не на Рубі або на PHP? (Лектор каже з сарказмом.)

низькорівневе програмування

Якщо ви пишете чогось низкоуровневое, то кращий вибір - це Сі, але взагалі-то я чогось чув (але не бачив), що C ++ застосовують для цього. Але я слабо вірю в це, тому що в Сі можна чітко контролювати - раз ви дали стільки-то байт пам'яті, значить стільки-то і буде. А в C ++ (STL) як реалізована рядок? Ну, як-то реалізована. І ми в результаті не знаємо, як і що там відбувається, може у нас пам'ять скінчиться на нашій відеокарті або ще щось станеться. Тому Сі досі живе і не вмирає, такі завдання системного програмування як і раніше є - написати операційну систему, написати драйвера, написати ще чого-небудь - Сі відмінно підходить для цього. Крім того, зараз з'являються всякі пристрої, (інтернет речей обіцяють, що він ось-ось настане) які живуть від батарейки (і, природно, їх будуть мільйони, все буде обвішаний цим інтернетом речей), вони повинні бути дуже дешевими і дуже мало електрики споживати. Відповідно, там буде 2 КБ пам'яті, процесор на 5 кГц, ну і ясна річ, що вкрутити якусь віртуальну машину або скриптова мова найближчим часом не вийде - значить, доведеться писати щось на Сі. Та й зараз, наприклад, обчислення на відеокарті (OpenCL або ще якась технологія) - там не придумують нову мову, щоб писати для них програм - там роблять Сі з якимось великими обмеженнями. Просто тому що люди вже вміють, навіщо вчити чогось нове? Формально це, напевно, теж, в якомусь сенсі Сі.

Веб програмування

Припустимо, ви хочете написати новий Facebook (соціальну мережу). На чому ви будете це писати? (Із залу говорять про HTML і CSS.) HTML, CSS - це дизайн, а ми хочемо, щоб там можна було фотографії додавати, друзів, коментарі залишати.

Для скриптовой частини - тобто те, що буде відбуватися на стороні клієнта, - це JavaScript. Причому іноді JavaScript генерується на іншій мові і висилається (так буває, що скрипт генерується ..., тому що так простіше іноді буває обробляти якісь зміни в логіці).

На подив, він написаний на PHP - і Facebook, і багато інших великі проекти. Довелося, звичайно, написати свої якісь речі, щоб це все-таки працювало нормально, а не так як «тяп-ляп» було зроблено, але вони впоралися. В принципі, більш менш все одно, на чому ви будете писати, але не раджу Perl. Тут і зараз, ясна річ, з нуля вже для інтернету ніхто нічого не пише. Всі пишуть якийсь фреймворк або ще чогось. Інтернет магазин? Завантажили фреймворк для інтернет-магазину - ну і все, написали інтернет-магазин.

Програмування для бізнесу

Далі ви хочете написати яке-небудь нудне додаток для банку. Або, наприклад, чи є у вас хто-небудь, хто продає сімки? Можливо, ви коли-небудь купували телефон або ще щось і вам говорили: «Ось система висить, ми нічого не можемо зробити». На чому ви будете писати такий додаток? (Вигуки із залу про Python) На Пітоні таке не можна писати, ви що ?! Нічого для бізнесу не варто писати на Python. Чому? Тому що коли ви пишете щось на Python, у вас в процесі написання неможливо виявити значно кількість багів. Пітон всіляко динамічно типізований, і взагалі там можна так заховати баг, що він спливе в такій ситуації, що ви навіть зрозуміти не зможете, що там зробили ось ці криворукий користувачі, що у вас все зламалося. Тобто на Python краще писати для себе, маленькі скрипти - ви розумієте, що там відбувається і що робиться. Ну або що-небудь, що не шкода викинути: ви хочете раніше конкурентів щось викотити, ну і що, що воно через раз буде ламатися. Ви написали на Python і все - ви захопили ринок. А якщо ви пишете щось надовго, наприклад банківський додаток якесь (щоб воно кредити схвалював, ще що-небудь) - ви пишете це на Java. Тому що там справа серйозна, папірці, гроші, документи, ще чогось, а в ній так накосячіть не можна, що все зламається, а то люди образяться - у них гроші пішли і нікуди не дійшли, тому що у вас в якийсь момент рядок перетворилася в число або навпаки. Отже, значить, методично на Java берете і пишете, пишете ... Ну або на.Net, теж такі ситуації, в принципі, бувають. Там, звичайно, теж можна нарватися на проблеми, але все таки ймовірність цього трохи нижче.

Програмування для армії, аерокосмічної галузі

А тепер уявіть, що вас вирішили відправити на Місяць на ракеті. На чому б ви хотіли, щоб був написати код, який управляє двигунами ракети? Давайте подивимося. Ось це, напевно (лектор показує на Perl, Python, PHP, Ruby), не варто - воно гальмує, ще чогось відбувається, ну і взагалі я б не погодився летіти на такій ракеті. На C ++? Я б теж, чесно кажучи, не довірив, бо на C ++ занадто багато способів вбитися. Коли ти там десь в космосі, це не дуже добре.

Може бути на Java? Начебто там досить надійно все і архітектура хороша, ніяких диких типів, ніяких виходів за межі пам'яті зайвих. Припустимо, настав найвідповідальніший момент, а наша Java вирішила зібрати сміття за нас. Нам потрібно приземлятися, гальмувати, а вона така: «Ні, garbage збирається». Загалом, теж не дуже.

Чесно кажучи, я б вважав за краще, щоб на Паскалі писали цю програму. Я, звичайно, не дуже люблю Паскаль, але якось в таких питаннях, було б дуже здорово.

Використання відразу декількох мов для розробки ПО

Ну і що потрібно взагалі сказати про сучасних мовах. Зараз багато проектів не живуть якимось одним мовою, тобто у них частину якась живе на одній мові, частина - на іншому, ще якась частина - на третьому. Наприклад, якщо у вас якийсь веб-додаток, який обробляє дикі обсяги інформації, звернення до дисків (навіть не до баз даних, вони настільки величезні, що там навіть база даних не тягне якась уже написана) напевно написані на якому- то низкоуровневом Сі, щоб дико швидко писати на диск і все таке. Природно, писати весь проект на Сі не варто. Може бути, там якась проміжна логіка, написана на Java, яка звертається до Сішним функцій для швидких звернень. Ну а фронтенд (то на що дивиться користувач), звичайно, вже написаний на чому-небудь, на якихось скриптах, на тому, що безпосередньо виконується браузером (JavaScript). І все це живе разом і успішно взаємодіє.

У розробці якихось додатків, навіть великих, іноді люди що роблять? Вони беруть і на Python пишуть прототип (як воно все буде працювати), накидають, якусь архітектуру продумують. Писати на ньому реально дуже швидко - вони накидали прототип, експериментували з ним і сказали: «Во! Ось так круто! » І повністю переписали. Здавалося б, вони два рази зробили роботу, від цього в два рази більше часу пішло (ну, в півтора). Але немає! Часто виявляється, що такий спосіб непоганий, тому що, якщо ви напишете відразу на чимось, наприклад на Java, а потім вирішите: «Ні, давайте рефакторинг, міняємо архітектуру повністю і все таке,» - то витратите в 10 разів більше часу . Такі речі теж існують і живуть.

Умови успіху будь-якої мови програмування

Тепер поговоримо про те, чому деякі хороші на вигляд мови не вижили, ну або живуть в дуже обмеженому просторі. Коли Вірт побачив, що зробили з його Паскалем нехороші фірми Applе, Borland і все таке, він придумав мову ще краще - Oberon. Він тільки був дико мінімалістичний - тобто, там було дуже мало команд (Рядки? Навіщо нам рядки? Ми зробимо масив символів!). Ну і чого-то не пішла у нього, в тій мірі, як могло б піти.

Ще одна штука. Американські військові попросили розробити їм теж крутий мову, на якому все працює і все можна написати. В результаті вийшов досить монструозної мову Ada, на якому, правда, до цих пір щось пишуть, але знову ж таки - для військових тільки.

В чому проблема? Чому деякі мови на зразок Python, який ніяка компанія його не підтримувала спочатку, захопили ринок. PHP, який ще й погано спроектований, теж сам по собі взяв і захопив ринок (більшу частину). А всякі мільярди доларів вкладені (лектор показує на Ada) і нікуди не пішли, нічого не сталося. З чим це пов'язано? Це пов'язано з тим, що немає інфраструктури навколо цих мов. Тобто мова може бути відмінний, але поки немає документації, поки немає спільноти, яка вміє відповідати на питання (на Stack Overflow) і, нарешті, найголовніше, поки немає великої кількості бібліотек, язик не вистрілює. Тобто, ви, наприклад, захотіли на Обероне написати сайт. А що такого, чому б і ні? І починається морока ... Веб-сервер ви не можете підняти свій на Обероне, щоб потестувати легенько, якісь бібліотеки ви підключити не можете, тому що їх на Обероне немає. І все це через якісь милиці робиться, сили йдуть, і в загальному ви плюєте і пишете на чистому Сі свій сайт замість Оберона. А живуть добре ті мови, які вміють користуватися бібліотеками від інших мов. Той же Пітон в тих місцях, де він гальмує. Ну і взагалі всякі стандартні речі типу сортування і ще чогось написані на Сі, і він (Python) вміє з ними взаємодіяти.

У Java теж є Java Native Interface. Це по суті Сі, тобто там (по-моєму, весь час хочуть заборонити, але здається ще не заборонили) ці мови можуть взаємодіяти з уже існуючими бібліотеками (в основному Сішнимі). І за рахунок цього беруть і працюють. Зрозуміла ідея, яку я намагаюся до вас донести, так? Не пишіть на тих мовах, які не вміють підключати Сішную бібліотеку. Ну, якщо ви хочете користуватися чимось класним. Ну, і поступово вони (мови) обростають своєю якоюсь інфраструктурою. І живуть якось добре.

Мова програмування і профорієнтація

Тепер поговоримо про те, як зрозуміти, чого ви хочете в житті. Що буває з прикольних речей? Ви можете займатися яким-небудь системним програмуванням, так? У вас там класно вважати ці байтікі, ви хочете запускати квадрокоптера, камери якісь, ще чогось робити. Тоді, напевно, Сі - ваш вибір.

Якщо ви хочете писати, можливо, не найцікавіші в життя програми, але вам круто їх проектувати, думати про це все і заробляти купу грошей, за те, що ви сидите і сумуєте більшу частину часу (за це треба платити, якщо ви якісно сумуєте), ось вони - Java, .Net. Ви йдете працювати в якій-небудь банк, пишете, ходите до дев'яти на роботу в білій сорочечці, отримуєте гарну зарплату і пишете згідно з рекомендаціями кращих Java-водів, .Net-івців і все таке ...

Якщо ви хочете писати якісь додатки, браузер який-небудь, іграшки якісь, ще щось, то C ++ відмінно підходить. Якщо ви хочете писати сайтики, то ось вони, мови на ваш вибір (лектор показує на Perl, Python, PHP, Ruby), великої різниці немає. Єдине - PHP помре раніше, ніж Python, тому якщо ви лінуєтеся вчитися новому, то вчіться пітона. Великої різниці не помітите, але довше протягне.

Що відбувається з Ruby, теж незрозуміло. Ну, можете і PHP, якщо вже вивчили, благо вони такі прості, що там переучуватися не так довго.

І, нарешті, є ще одна область застосування мов програмування - це коли не програміст ними користується. Припустимо, ви математик, фізик, хімік, аналітик, хто завгодно, і вам потрібно швидко щось порахувати, якісь дані проаналізувати (біологам, наприклад, скільки песців живе на Командорських островах). Ви можете в табличку в Excel'е вбити все це або проаналізувати чимось. Теж Пітон добре підходити для цього, з текстом вміє працювати і бібліотек повно всяких, статистичних та всього такого. Якщо хочете робити який-небудь Machine Learning, якісь дані обробляти, прогнозувати, то теж на Python це зараз робиться швидше за все. Правда, треба зауважити, що завдання бувають дуже різні. Наприклад, якщо ви хочете торгувати на біржі моментально в умовах, коли котирування міняються весь час, то якою б ви класний Machine Learning не написано на Python, люди, у яких це написано на чомусь більш швидкому, встигнуть все скупити раніше, поки у вас все дорахується, навіть якщо у них алгоритми гірше. Тому навіть ці завдання машинного навчання (деякі з них) вимагають високої продуктивності (причому екстремально високою), і відповідно інших мов.

Єдиний спосіб зрозуміти, чого вам хочеться - це все спробувати. Зараз я скажу як одне з бачень того, як можна все спробувати. Як стати програмістом, причому щасливим? Отже. З чистого аркуша починаємо. Ось ви вчитеся в школі своєї математики, російської мови та інших обов'язкових і необов'язкових предметів, і ваші знання в області програмування відображені на дошці (лектор показує на порожню дошку) на наразі. І ви хочете стати щасливою людиною, займатися улюбленою справою, заробляти багато грошей і ні в чому собі не відмовляти і радіти.

Один із способів цього домогтися. Є, звичайно, всякі надихаючі історії про людей, які взагалі не вступали до університетів, або кинули їх і стали мільярдерами, власниками компаній і так далі. Але треба зазначити, що більшість людей, які може бути і не стали мільярдерами, але теж непогано живуть, все-таки університет в якийсь момент закінчили.

Яка у нас ситуація зі вступом до університету (зараз ви в школі навчаєтесь)? Поки ви вчитеся в школі, потрібно зрозуміти що наступний крок - вчинити і подбати про це. Здати ЄДІ або перемогти в олімпіаді. На ЄДІ можна користуватися Паскалем, C ++ (включаючи чистий Сі), Пітоном (не буду їх далі згадувати). На олімпіаді - той же Паскаль, той же C ++, той же Пітон (ми поговоримо зараз про його проблеми) і, найчастіше, є Java. Там ще всяке буває в залежності від олімпіади, але не суть.

Як виглядає графік розподілу мов на Всеросійській олімпіаді з інформатики? Люди, які беруть участь у всеросійській, найкрутішою олімпіаді, на чому вони пишуть? Виглядає він ось так (тут означає Паскаль, а тут приблизно 2000 рік, а тут приблизно нуль, тут C ++, а тут 2015 рік).

У 2000 році на C ++ майже ніхто не писав. Минуло 15 років, і на Паскалі майже ніхто не пише, не дивлячись на те, що Паскаль сучасний. Це мова, яка вміє майже все те ж саме. Просто чогось всім стало лінь цьому вчитися, всяким новим віянням, і все продовжують писати на Borland Pascal'е, який звичайно нічого не вміє. На C ++ люди пишуть якісь алгоритми (STL) посортувати - відмінно, написали sort () і все. На Паскалі, на звичайному, на старому - це проблема. Написали який-небудь set (знадобився) - відмінно, на C ++ написали, на Паскалі знову мука суцільне. На нових Паскалях, ясна річ, можна це робити, але вони грошей коштують взагалі-то. Можливо, ви не помічали цього, але це так.

Є Java ще, але в Java дуже багато букв. Вона для великих проектів, а для маленьких одноразових програмок вона виходить зовсім погана, тому що багато зайвих літер. Але теж якісь люди пишуть, можна навчитися писати на ній. Але на ЄДІ її немає і ЄДІ все одно здавати доведеться в більшості своїй.

Що краще за все для ЄДІ? Для ЄДІ найкраще (якщо ви нічого не знаєте і в школі вас нічому не вчать) вивчити Пітон. Деякі завдання іспиту відмінно вирішуються на ньому. На олімпіаді, в общем-то, виходить що (використовується) C ++, тому що Пітон дуже повільний, там не все вирішується на ньому.

Таким чином, ви вивчили деякий невеликий підмножина мови і якісь алгоритми (можливо) і багато задачок повирішували для того, щоб отримати диплом своєї олімпіади і вступити до університету, щоб здобувати вищу освіту.

Я зараз розповім про те, як ми в Вишці вибудовуємо курс, в якому порядку мови йдуть, як вивчаються на прикладної математики та інформатики факультету прикладних наук, які ми з Яндексом робимо. У першому семестрі - Пітон (не в повному обсязі, приблизно як ви в школі повинні вчити) і С ++ (вже ширше, значно ширше, ніж його зазвичай вчать в школах). Давайте відразу скажу, щоб ви не лякалися, якщо ви раптом захочете надходити, скажете: «Чого, я вже все це знаю, навіщо я піду кудись вчитися? Краще я піду в інше місце ». Для тих, хто вже вміє програмувати добре, там є можливість відразу перейти до вивчення алгоритмів, причому в досить теоретичній підготовці. Ми зараз на них не дивимося, це (показує на дошку) для тих хто програмує середньо або взагалі ніяк.

У першому семестрі вивчаються основи Пітона, просто щоб люди навчилися програмувати і щоб нікому особливо не було прикро. Пітонові мало де вчать в школах, в основному люди приходить зі знанням Паскаля або C ++. В основному навіть Паскаля, якщо це масова школа. Ну і щоб нікому не було образливо, все вчать нову мову (як би в рівних умовах перебувають). І C ++ просто тому, що від C ++ потім можна перейти куди завгодно.

Потім йде курс «Алгоритми» і окремий курсової проект. Класичні алгоритми з реалізацією. Не те, що в теорії ми чогось взяли, порахували складність. На лекції ми взяли, порахували складність, на семінарі - взяли, реалізували алгоритм. Проект - це студенти роблять щось закінчене. Наприклад, один з проектів був: порахувати ... Припустимо у вас багато квартир в Москві і ви розумієте: «О, чогось у мене багато зайвих, я здам якусь. І виставили якусь ціну, і ніхто чогось не хоче у вас квартиру знімати - напевно, занадто дорого. Або виставили якусь ціну, у вас тут же зняли і ви думаєте: «Ой, напевно, я дешево здав» - і теж турбуєтеся. Тобто треба було порахувати, скільки коштує оренда квартири? Ви вбиваєте дані - воно вам будує оцінку. Такий сайтик, який складався з кількох речей: взяти пропозиції, попарсіть, застосувати якийсь алгоритм навчання машинного (напевно) простенький і зробити красиву веб-морду, в якій можна щось вибрати, щось вбити, якісь метри, якісь кількості кімнат, кількість саун, кількість джакузі у вашій квартирі і приблизно оцінити вартість. Тобто якась закінчена, не надто складна річ. Тут значить (лектор показує на курс по алгоритмам) такий Ядрена C ++, з консольним введенням-виведенням. Ну, а тут (лектор показує на напис «проект») щось під керівництвом ментора, можливо з базами даних, можливо з парсинга текстів і з чимось ще.
Потім, йде третій семестр - це курс, який називається "Комп'ютерні системи". Там зовсім трошки асемблера для розуміння (дуже мало) і потім, щось схоже на чистий Сі і взаємодія з операційними системами, системне програмування по суті. І проект на семінар - теж щось на тему всяких мережевих взаємодій, досить низькорівневих: розробити якусь утиліту, наприклад rsync (синхронізація, можливо ви знаєте. На чистому Сі, більш менш, написати аналог rsync'а, який по мережі буде у вас синхронізувати татка з усіма доступами до файлів і так далі).

І нарешті, четвертий. Я навіть не знаю, як це назвати, це такий вінегрет технологій, необхідних для реальної розробки, наприклад для веб-розробки. Тобто це практичне застосування баз даних, знову ж щось схоже на те, що робилося в проекті (лектор показує на проект 2 курсу) але вже більш поглиблене. Тобто такі більш-менш конкретні речі вже, практичне програмування. Паралельно з цим йде будь-яка теорія, ну і тут наукою займаються ще.

І після двох курсів люди розходяться займатися, ніж їм цікаво, тому що ця штука охоплює досить широко такі основи програмування і люди до цього моменту вже розуміють, що вони не хочуть займатися комп'ютерними системами ні в якому разі (системне програмування їм, наприклад, не сподобалося), а хочуть займатися якимись теоретичними алгоритмами, складності вважати, придумувати нові якісь штуки, розподілені або ще щось. Або навпаки думають, що тут у них не дуже ( лектор вказує на рядок першого курсу з Пітоном і C ++) Пішло, потім ( лектор вказує на рядок третього курсу, з системним програмуванням) - як не подобається, вважати байтікі і виставляти будь-які обмеження на читання-запис, робити потоки, треди і ще що-небудь. І відповідно до цього люди вибирають якийсь напрямок і вчаться. Тобто, в принципі, щоб у вас не розвинувся «синдром каченяти» - ви першим побачили свій Паскаль і тепер говорите «Паскаль - сила»; або більш просунуте - ви побачили C ++ і почали про всіх говорити, що C ++ сила, а все інше там не дуже.

Ось треба подивитися на це (лектор показує на список курсів на дошці) ширше - це один із способів, який був обраний, зокрема в Вишці (недавно з'явився, так що він досить сучасний). Є й інші способи познайомитися. В інших хороших університетах трошки в іншому порядку і інші акценти розставлені. Але теж намагаються людей з усім познайомити, що мають.

Як програмісту шукати роботу

Ви це ( лектор показує на список курсів) Зробили все, навчилися в університеті, ще чимось два роки позаймались більш продуктивно і вам потрібно йти працювати. Як вибрати собі що-небудь для роботи? По-перше, ви з усім познайомилися, заглибилися кудись і знаєте вже, що ви любите. Треба вибирати те, що ви любите, природно. Тому що якщо ви любите, будете вкладати сили, у вас буде мотивація і взагалі все буде добре. Тому що там справа не тільки в грошах, справа в тому, щоб вам було цікаво і приємно. Ну, і ви хочете потрапити в круту компанію, влаштуватися на роботу. Яку людину ось особисто я хотів би бачити? До мене приходить, скажімо, сто студентів - я повинен взяти двох на роботу або одного. Чого вони приходять, я взагалі не розумію, хто вони, що вони, як вони? У кращому випадку вони мені покажуть диплом, який отримали в університеті, і я скажу: «Во! Це крутий диплом, а це не такий крутий! » І можу помилитися, до речі. Може, у людини було багато вільного часу, і він навчився набагато краще.

Що було б здорово? По-перше, будь-якої опенсорс-проект, який ви від початку і до кінця написали. Бажано, якщо я роблю якусь інфраструктуру, щоб дані швидко вважалися, ще щось, то, звичайно, мені було б цікаво, щоб мені написали чогось опенсорсний. Чи не сайтик якийсь зробили, а чого-небудь по темі. Чому мені це цікаво? Можу подивитися на ваш код, я можу подивитися як часто ви коммітов, можу подивитися як ви реагували на баги від користувачів, баги від розробників, які це використовують - все записано, я все дивлюся і думаю: «Во, тут баг два роки вже не закривали, тут ви неввічливо відповіли користувачеві, тут ще чогось - не беру ». Тобто це ваш особистий проект.

Далі, що ще було б класно? Я хотів би подивитися, як ви зробили командну роботу. Тобто ви приходите до мене на співбесіду і говорите: «Ми з хлопцями з універу запив якийсь додаток хороше. Я ось там робив базу даних, вони там робили якийсь мобільний додаток, і ще у нас там хлопчина працював, дівчинка-дизайнер, хлопчик на техпідтримку. Нас було п'ять чоловік, і ми зробили класний проект ». Ну я дивлюся, що дійсно ваш проект, кажу: «Що ваше?» Дивлюся ще раз код і розумію, що ви вмієте працювати в команді з людьми.

Програміст - це не той хто сидить один (інді такий) в гаражі, десь з вимкненим світлом, ні з ким не розмовляє, обростає бородою і пише. Все одно якась взаємодія з людьми є. З начальником, наприклад, який на вас можливо лається іноді (начальники, вони бувають такими, що не завжди добрими). І я бачу, що ви вмієте працювати з людьми і мене це радує, якщо у вас гарна команда якась. Навіть якщо не хороша, це краще ніж її відсутність.

Чого ще особисто мені б сподобалося? Якби ви проявили себе у великих проектах. Наприклад, закоммітілі щось в ядро \u200b\u200bЛінукса, якщо ви системним програмуванням займаєтеся, поправили якийсь баг. Тобто показали, що ви вмієте читати чужий код і вмієте якісь зміни в нього вносити. Я дивлюся: «О, дійсно, ви розібралися в чомусь складному і якісь баги поправили!» І я починаю від цього дуже радіти. Тому що у мене є ... ну не знаю ... от мій програміст звільнився, бо конкуренти запропонували йому більше зарплату, і мені потрібно терміново когось затикати його місце - вами. Я такий дивлюся, що ви тільки з нуля писали, а чужий код не вмієте читати і правити, і засмучуюсь.

Ну і нарешті, в залежності від конкретної посади бувають різні інші речі. Якщо ви влаштовуєтеся аналітиком, я б хотів, щоб ви на Kaggle повирішували завдання на аналіз даних. Якщо ви влаштовуєтеся на якісь алгоритмічні речі, я б хотів щоб ви в спортивному програмуванні якісь алгоритми поробили. І нарешті, якщо ви замислювалися про професії, читали як інтерв'ю проходять, - зустрічали, що там деякі люди висловлюють велике невдоволення: «Я прийшов, а у мене запитують, яке у мене хобі. Я сиджу як сич і не відповідаю, бо у мене немає хобі, »- і думають, що HR'и роблять таке. Насправді, вони намагаються зрозуміти, наскільки ви доброзичливі і адекватні. Якщо ви недоброзичливі і неадекватні, то яким би ви не були там генієм і трудоголіком, крутим фахівцем з великими знаннями, колективу буде з вами складно працювати, а поодинці ви проект не витягніть. Крім того, навіть якщо витягніть, то уявляєте, яка для компанії навантаження. А що ви завтра прийдете і скажете: «Збільште мені зарплату в 10 разів, а то я від вас піду». Ясна річ, компанії не хочуть потрапляти в таку ситуацію. Тому виховання в собі адекватності і доброзичливості настільки ж важливо (як мінімум) як розвиток якихось професійних навичок.

Підводячи підсумок, що можна сказати? Які мови хороші, а які погані? Ну всередині якоїсь групи мов, наприклад між Ruby, Python і PHP, що вибрати? Звичайно, правильна відповідь Пітон, але насправді різниця між ними в кількості багів допускаються, в кількості ще чогось - 5%, ну, може 10%. Тобто, якщо у вас вже готовий проект на PHP написаний, то ніхто при здоровому глузді не буде говорити: «Давайте перепишемо все на Python». Скажуть: «Давайте наймемо ще PHP-розробників і будемо далі писати на PHP». Відмінно, це непоганий вибір. Ясна річ, якщо ви раптом затіє писати якийсь проект, то можливо розумно зараз вибрати Пітон. Хоча, це теж залежить. Може, у вас на ринку купа дешевих PHP-розробників, а пітоновскіе дорогі, і ви думаєте: «Так, технологія більш прикольна, але я заощаджу гроші на вже готових розробників». І все, відмінно, ви вже приходьте і працюєте там.
Як вибрати між Java і C ++? Так то ж саме приблизно відбувається. Я думаю, що до того моменту, коли ви будете вирішувати, якою мовою вам починати новий великий проект, ви наберете знань саме у вашій професійній області і зможете зробити правильний вибір. Зараз вам поки що не потрібно робити такий вибір, і тому я вам раджу робити те, що подобається.

Основи, як я вже говорив, най-най основи програмування (що таке функція, що таке if'ікі, for'ікі, массівчікі, ще щось) можна вивчити більш-менш на будь-якій мові. Наприклад на C ++, оскільки на нього багато чого схоже, і специфіки в ньому (на такому рівні) найменше, і літер зайвих писати найменше. Ну а потім, коли будете якісь складні архітектурні речі вчити, навчитеся і переживати сильно не треба з цього приводу. Тобто, головне --пробуйте, шукайте те, що подобається і, коли ви зрозумієте, що зараз вже 4 годині ранку, а ви for fun сидите і пишете, бо вам подобається - напевно, в цей момент зрозуміло, що ви знайшли своє .

Для вирішення обчислювальних завдань зараз все активніше використовуються графічні процесори, але залишається відкритим питання: як писати ефективні програми під відповідні конфігурації?

15.06.2011 Андрій Адінец

Для вирішення обчислювальних завдань зараз все активніше використовуються графічні процесори, але залишається відкритим питання: як писати ефективні програми під відповідні конфігурації? Стандартне рішення - зв'язка CUDA або OpenCL - дозволяє порівняно швидко реалізувати алгоритм, проте створити оптимізовану під конкретну конфігурацію версію з їх допомогою складно. Потрібні інструменти для програмування графічних процесорів більш високого рівня, які можуть бути створені, наприклад, за допомогою розширюваних мов.

Ще три роки тому графічні процесорні пристрої (Graphical Processing Unit, GPU) розглядалися лише як відеокарти для ПК, то зараз ставлення до них змінилося - з'явилися спеціальні серверні моделі GPU, орієнтовані на рішення обчислювальних задач, збільшилася продуктивність на обчисленнях з подвійною точністю, виникли системи рекордної продуктивності, що займають вищі рядки в Top500. А як писати ефективні програми під такі машини? Стандартна відповідь - зв'язка CUDA або OpenCL для програмування GPU і MPI на рівні кластера. Ці інструменти доступні, активно підтримуються виробниками обладнання, під них вже написано багато програм, однак є і недоліки.

CUDA і OpenCL - розширення мови Сі, вони не складні для вивчення, хоча і є досить нізкуровневимі інструментами. З їх допомогою можна порівняно швидко реалізувати алгоритм для GPU, проте створити оптимізовану під конкретне застосування і конфігурацію версію виявляється значно складніше. Все оптимізації потрібно виконувати вручну, що призведе до збільшення розміру коду і погіршення його читаності. І хоча програми, створені за допомогою OpenCL, будуть переносяться між широким спектром архітектур, продуктивність при такому перенесенні не збережеться. Потрібні інструменти для програмування GPU більш високого рівня.

Створювати такі інструменти можна різними шляхами: вводити нову мову програмування; додавати директиви в уже існуючий мову, як робиться в моделі PGI Accelerator або CAPS HMPP; скористатися розширюваними мовами. розширювані мови- мови програмування, синтаксис і семантика яких не фіксовані, а можуть бути змінені в залежності від потреб програміста. У порівнянні з традиційними, які розгортаються мови мають ряд переваг: в них простіше додавати нові можливості; вони відкриті; вивчення нових моделей програмування на основі таких мов простіше, оскільки потрібно вивчити лише порівняно невеликі за обсягом розширення; за допомогою таких мов легше виконувати тонке налаштування і оптимізацію програм.

розширювані мови

Для того щоб мова була розширюваним, необхідно щоб в ньому були присутні:

  • механізм розширення без зміни компілятора, однаково підтримуваний всіма компіляторами, що означає, зокрема, наявність стандартного інтерфейсу взаємодії з компіляторами;
  • конструкції для розширення і маніпуляції з деревом коду, такі як макроси або квазіцітірованіе, для розширення мови;
  • потужні засоби написання розширень, наприклад сам розширювана мова, так і іншу мову, потужність якого передбачає, що код розширення може робити те ж саме, що і будь-яка програма на цій мові.

Виявляється, що мов, які відповідають цим вимогам, порівняно небагато: Lisp, Nemerle, Seed7, xoc і Stratego. При цьому xoc, який призначений для розширення мови Сі, використовує окрема мова Zeta для написання розширень, а Stratego - це мова предметної області для створення перетворювачів вихідного коду. Nemerle - розширювана мова, що використовує середовище. Net.

Все розгортаються мови підтримують механізми для роботи з деревом програм, і перш за все це конструкція квазіцітірованія - специфікації об'єкта, що представляє дерево програми, за допомогою самого вихідного коду.

У мові Nemerle для цього використовується конструкція, наприклад створює дерево, що складається з оголошення змінної i з початковим значенням 0. Квазіцітірованіе схоже на створення строкових об'єктів при строкових константах. На рис. 1 наведено приклад квазіцітірованія. Конструкція інтерполяції дозволяє підставляти значення змінних в фіксований шаблон всередині квазіцітірованія. У Nemerle для цього використовуються конструкції $ (...), якщо потрібно підставити список, наприклад. Також в розширюваних мовах присутні конструкції розбору дерева програми. У мові Nemerle для цього використовується оператор match (...) (...), аналог switch з мови Сі, в якості гілок якого використовуються конструкції квазіцітірованія. При цьому інтерполяція трактується як оголошення нових змінних, які в разі успішного зіставлення отримують значення відповідних піддерев. Наприклад, для оператора зіставлення match (e) (| \u003d\u003e ...), якщо e містить дерево, в змінну a потрапить, а в змінну b.

Засоби для роботи з деревом програми використовуються в конструкціях розширення мови. У мові Nemerle такими є макроси - спеціальні функції, Що виконуються на етапі компіляції і повертають фрагмент дерева програми, який підставляється на місце їх виклику. При цьому макрос приймає фрагменти програми в якості параметрів, і може їх перетворювати. В принципі, викликати макрос можна точно так само, як і звичайну функцію; але більш цікавою можливістю є прив'язка виклику макросу до спеціального синтаксису. Це дозволяє вводити в мову Nemerle нові синтаксичні конструкції і таким чином розширювати мову.

На рис. 2 наведено приклад макросу з синтаксичним розширенням, що дозволяє оголосити багатовимірний цикл зі змінними і кількістю ітерацій по кожному виміру, а на рис. 3 дан приклад перетворення програми, яка здійснює цей макрос. Зауважимо, що макрос, який здійснює таке розширення, займає менше 30 рядків вихідного коду і при цьому включає кілька перевірок на помилки. При традиційному підході реалізація такого розширення зажадала б значно більшої кількості коду і, крім того, зажадала б вивчення внутрішньої будови компілятора.

Історично першим з'явився механізм макросів в Ліспі, програма в якому представляється як звичайний список і не вимагає спеціальних конструкцій для роботи з деревом програми, тому саме в цій мові розширюване програмування отримало найбільше поширення. Макроси в Nemerle аналогічні таким в Ліспі. В системі xoc механізм розширень реалізований через розширення граматики і атрибути дерева розбору. Будь-яке розширення обов'язково задає два атрибути: тип синтаксичної конструкції і вираз на базовому мовою, В яке вона перетвориться.

Для розширюваних мов характерна реалізація через макроси багатьох стандартних конструкцій. У мові Nemerle все цикли і умовні оператори, Крім match, реалізовані через макроси, а в Ліспі макросами є стандартні конструкції циклів і оголошення функцій.

Як використовувати мови?

Для розширюваної мови програмування можна написати конструкції, що дозволяють найбільш зручним способом програмувати графічні процесори, що і було зроблено в рамках проекту NUDA (Nemerle Unified Device Architecture), метою якого є створення розширень мови Nemerle для програмування GPU. Як інтерфейс взаємодії з GPU і цільової мови для представлення програми використовується OpenCL.

Для початку треба реалізувати виконання на GPU підмножини коду на мові Nemerle. При цьому повинні підтримуватися звичні оператори мови, такі як цикли і розгалуження, а також робота з простими типами даних, структурами і масивами. Код для GPU виноситься в окремі функції, або в ядра NUDA. Кожне ядро \u200b\u200bвідзначається макросом nukernel, який за кодом ядра генерує код на OpenCL і метод-заглушку для виклику ядра на стороні хоста. Перед генерацією коду проводиться розкриття всіх макросів, за винятком макросів циклів і розгалуження. Якщо всередині ядра потрібно викликати функцію, ця функція повинна бути позначена макросом nucode, який згенерує для цієї функції код на мові OpenCL. Виклик ядра здійснюється за допомогою макросу nucall; крім параметрів ядра, йому передається ще й конфігурація решітки потоків, з якої воно запускається.

Найчастіше в якості ядра для GPU використовується тіло циклу, тому хотілося б відразу переносити цикл на GPU. У Nemerle це можна реалізувати - відповідний макрос в NUDA називається nuwork. В якості обов'язкових параметрів він приймає розмір блоку потоків і на підставі поточного контексту і аналізу коду тіла циклу визначає набір змінних, які необхідно передати ядру в якості параметрів. Тіло ядра формується з тіла циклу, обчислення індексів циклу через глобальний номер потоку, а також умови, що дозволяє коректно виконувати цикл навіть у тому випадку, коли глобальний розмір сітки не ділиться на розмір групи потоків. На місце циклу підставляється виклик макросу nucall, який здійснює виклик згенерованого ядра.

В принципі можна дозволити використовувати в GPU-програмах звичайні масиви мови Nemerle, але це призводить до високих накладних витрат - масив потрібно копіювати в пам'ять GPU при кожному виклику ядра, а потім копіювати назад. Тому в програмах для GPU використовуються спеціальні типи-масиви з ледачою синхронізацією між GPU і CPU. Це дозволяє, з одного боку, не захаращувати текст програми командами копіювання даних, а з іншого - уникнути накладних витрат на копіювання даних. Для таких масивів, як і для звичайних масивів в Nemerle, використовується управління пам'яттю за допомогою збірки сміття. Для виділення пам'яті під такі масиви існує макрос nunew, який треба застосувати до звичайного оператору виділення пам'яті.

На рис. 4 зліва приведена звичайна програма складання масивів, а праворуч - аналогічна програма, але виконує обчислення на GPU. Отримати GPU-програми зі звичайної досить просто - потрібно лише застосувати макроси до циклам і операціям виділення пам'яті, при цьому обсяг коду практично не змінюється. Програма, написана з використанням NUDA, займає менше 20 рядків коду. аналогічна програма, Але на чистому мовою Сі і OpenCL займає понад 100 рядків.

Крім макросів, що полегшують роботу з GPU, система розширень NUDA включає також анотації для перетворення циклів. Анотації, по суті, є спеціальними макросами. Наприклад, анотація inline застосовується до циклу з фіксованим числом ітерацій і виконує його повну розгортку. Анотація dmine виконує глибоку розгортку циклу. "Глибока розгортка" означає, що створення декількох копій тіла циклу і перемішування виконуються не тільки для самого перетворюється циклу, але і для вкладених циклів, якщо вони незалежні.

ефект

Для чого програмісту потрібно вчити нову мову і освоювати нові бібліотеки розширюваних мов? Основний відповідь - продуктивність. Маючи алгоритм з паралельних циклів, які працюють з масивами і записаний на мові Nemerle, досить додати кілька анотацій, щоб отримати програму для GPU. При цьому програма буде виконуватися на будь-якому пристрої з підтримкою OpenCL, включаючи графічні процесори nVidia і AMD, а також процесори x86. Щоб домогтися того ж за допомогою тільки технологій OpenCL або CUDA, потрібно затратити значно більше ресурсів, які підуть не тільки на написання вихідного коду, але і на налагодження взаємодії між хостом і GPU.

Інша причина - продуктивність створеного коду. На CUDA або OpenCL перетворення циклів потрібно виконувати вручну, причому окремо для кожної архітектури. Це довгий і багате помилками процес, а отриманий в результаті код мають важко і незручний для супроводу. З NUDA цю роботу можна робити за допомогою анотацій. Наприклад для декількох ядер можна оптімізіроватьаціі операції згортки зображень або множення матриць за допомогою анотацій inline і dmine. Без збільшення розміру вихідного коду вдається домогтися підвищення продуктивності в два-п'ять разів. При цьому, якщо б ті ж самі перетворення виконувалися вручну, це призвело б до збільшення коду в рази, а іноді і на порядок, не кажучи вже про витрати часу на налагодження і підбір оптимальних параметрів розгортки. Наприклад, універсальна анотована програма з семи рядків в NUDA множення транспонованою матриці на матрицю з подвійною точністю виконується на nVidia Tesla C2050 лише на 40% повільніше найшвидшою зараз реалізації (CUBLAS 3.2). Аналогічна програма, написана вручну, зайняла б 70 рядків коду. Природно, для стандартних завдань можна один раз вручну написати код, щоб підвищити продуктивність, але для специфічних завдань зниження трудовитрат і підвищення продуктивності буде дуже до речі. Нарешті, підвищення продуктивності відноситься і до створення самих розширень: створювати їх за допомогою розширюваних мов простіше, ніж за допомогою традиційних інструментів. Вся система NUDA, незважаючи на свою функціональність, займає всього лише 12 тис. Рядків коду, не рахуючи тестів. Це порівняно небагато, наприклад, компілятор мови Nemerle (збірка 9025) займає близько 130 тис. Рядків.

Розширювана мова - це потужний інструмент, і його використання в паралельних обчисленнях знаходиться поки в самому початковому стані. В області розробки паралельних мов програмування є дуже багато цікавих завдань, і будь-яку з них можна вирішити за допомогою поєднання розширень і бібліотек. Можна додати в мову асинхронні блоки коду і паралельні цикли, можна створити зручні конструкції для програмування кластерних систем, Такі як розподілені масиви. Нарешті, можна за допомогою розширень побудувати повноцінний мову паралельного програмування, такий як Chapel або X10.

Андрій Адінец([Email protected]) - м.н.с. НИВЦ МГУ (Москва).



Написання більшості сучасних комп'ютерних програм здійснюється при залученні мов високого рівня. Примітно, що багато хто з них були розроблені ще в 60 і 70-х роках, але актуальні й досі. Які ще факти про високорівневих мовах ми можемо відзначити? Які найбільш поширені різновиди відповідних рішень?

Сутність високорівневих мов написання програм

Мова програмування високого рівня - інструмент, що відноситься до категорії машинно-незалежних. Що це означає? Справа в тому, що мови програмування діляться на кілька категорій.

Є машинний код: набір алгоритмів, що призначені для управління користувачем безпосередньо апаратними елементами комп'ютера. Їх сутність буде повністю машинно-залежною: для конкретних типів ПК підійдуть тільки певні алгоритми.

Є мови асемблера. По суті справи, вони є надбудовою над тими, що призначені для низькорівневого управління апаратними компонентами ПК за допомогою машинного коду. Але за багатьма ознаками мови асемблера також прийнято відносити до машинно-залежним. Як правило, вони адаптовані до конкретної різновиди апаратного компонента ПК. Їх основне завдання - спростити користувачеві управління комп'ютером за допомогою відповідних низькорівневих комунікацій.

У свою чергу, мова програмування високого рівня дозволяє здійснювати користувачеві взаємодія з ПК незалежно від того, яке конкретно обладнання встановлено на комп'ютері. Тому його слід відносити до машинно-незалежним. При написанні операційних систем найчастіше задіюється мову програмування високого рівня. Але є ОС, що написані на асемблері. Мови програмування низького і високого рівня можуть використовуватися одночасно. Людина, віддаючи ПК високорівневі команди, повинен, так чи інакше, доносити їх до конкретних апаратних компонентів, і ця функція може бути реалізована при використанні мов асемблера одночасно з високорівневими, що задіяні в структурі операційної системи.

транслятори

Найважливіші елементи, що входять в мови програмування високого рівня, - транслятори. Їх функція може бути різною. У числі ключових областей застосування трансляторів - «переклад» команд, сформованих на мові програмування високого рівня, в машинний код, зрозумілий конкретному апаратному компоненту ПК, наприклад, процесору. Транслятори, що виконують цю функцію, називаються також компиляторами. Є інший різновид відповідних компонентів - інтерпретатори. Вони призначені, в свою чергу, для «перекладу» високорівневих команд в ті, що зрозумілі операційній системі або будь-якій програмі.

Класифікація високорівневих мов

Високорівневі мови програмування можуть бути класифіковані за різними підставами. Поширена схема, по якій вони діляться на наступні основні різновиди:

Процедурно-орієнтовані (задіюються в якості інструменту при обробці інформації на будь-якому етапі обчислень);

Проблемно-орієнтовані (використовуються як засіб вирішення галузевих і прикладних задач, що формуються при розширенні сфер застосування ПК);

Об'єктно-орієнтовані (можуть бути окремими випадками мов перших двох типів, однак, адаптуються до користування широким колом розробників з різним рівнем підготовки, наприклад, у вигляді рішення з візуальним інтерфейсом).

Розглянемо тепер деякі історичні та сучасні мови програмування високого рівня, відповідні даній класифікації.

Процедурно-орієнтовані мови

До таких можна віднести Фортран. Він вважається першою мовою програмування високого рівня, створеним для широкого застосування. Характеризується простою структурою. До процедурно-орієнтованим мовам також відноситься Бейсік. Вважається одним з найбільш часто використовуваних при навчанні програмуванню. Приклад іншого процедурно-орієнтованої мови - СІ. Спочатку він створювався для ОС UNIX. На його основі згодом була створена мова C ++, доповнений інструментами об'єктно-орієнтованого програмування. Ще одна мова, що відноситься до даної категорії - Паскаль. Часто також задіюється при навчанні програмуванню. Можливості даного мови дозволяють його використовувати як дуже потужний інструмент розробки професійних видів ПО.

Проблемно-орієнтовані мови

До таких можна віднести Лисп, Пролог. Перша мова був розроблений в 1962 році - через кілька років після створення Фортрана. Розглядається, таким чином, як другий в історії. Активно задіяли як інструмент роботи програмістів з рядками символів. На практиці Лисп використовувався в системах, що класифікуються як експертні, а також ті, що призначалися для аналітичних обчислень. Пролог знайшов широке застосування в області логічного програмування. На практиці найчастіше задіюється в управлінні алгоритмами штучного інтелекту в відповідних системах.

Об'єктно-орієнтовані мови

Вивчимо тепер приклади мов програмування високого рівня, які відносяться до категорії об'єктно-орієнтованих. У числі таких - Visual Basic, Delphi, Visual Fortran, зазначений вище C ++, а також Prolog ++. Фактично всі вони в своїй основі містять процедурно-орієнтовані мови. Однак передбачається істотне їх доповнення візуальними елементами управління з метою подальшого освоєння необхідних алгоритмів розробниками, звиклими до інших інструментів. Так, перша мова програмування високого рівня - Фортран - може бути в оперативні терміни вивчений IT-фахівцями за допомогою можливостей Visual Fortran. Аналогічним методом можна швидко освоїти Бейсік або Пролог.

Здійснюється, в свою чергу, при використанні Delphi програмування на мові високого рівня Object Pascal. Існує велика кількість інших середовищ розробки ПЗ, що класифікуються як об'єктно-орієнтована мова. Дана сфера технологій розробки ПЗ активно розвивається.

Фортран і Лісп - перший і другий високорівневі мови

Вивчимо докладніше то, як з'явився перший мова програмування високого рівня - Фортран, а також Лисп, який вважається другою. У 1954 році розробники з компанії IBM, очолювані Джоном Бекуса, створили мову, за допомогою якого програмісти отримали можливість значно полегшити взаємодію з ПК, яке до того моменту здійснювалося за допомогою машинних команд або асемблера. Він отримав назву Fortran і незабаром став відомий і в СРСР під русифікованим найменуванням. Фортран став популярним інструментом для наукових обчислень.

Основним революційним елементом, запропонованим фахівцями IBM спільноті, став, власне, той самий компілятор, покликаний бути альтернативою асемблеру. У перші роки практики написання програм при використанні Фортран багато розробників вважали компілятор не зовсім вдалим рішенням, перш за все, з точки зору трудовитрат. Багато машинні коди, дійсно, складалися простіше, ніж при залученні транслятора. Однак у міру стрімкого збільшення продуктивності комп'ютерів програмісти починали усвідомлювати, що без використання компілятора ефективне ПО, яке буде повністю задіяти обчислювальні потужності ПК, створювати вкрай проблематично. Так, починання розробників з IBM отримали подальший розвиток. Основні синтаксичні конструкції мови програмування високого рівня Фортран в багатьох випадках стали задейстоваться в якості базових при створенні нових рішень.

Прикладом досягнення практичних результатів в області розвитку концепцій, закладених в Фортран, можна вважати створення Лісп. Дана мова був розроблений в 1958 році, проте, широку популярність він придбав кілька пізніше - в 1960-м. Лісп був розроблений Джоном Маккарті і опублікований в одному з популярних журналів для IT-фахівців. Основне призначення даного мови - обробка списків. Лисп став популярний в середовищі розробників систем штучного інтелекту. На його основі були створені такі мови, як Planner, Scheme, а також Common Lisp. Також Лисп справив значний вплив на багато сучасні інструменти розробки ПО. Структура мов програмування високого рівня, популярних сьогодні, в значній мірі базується на алгоритмах Фортран і Лісп.

Цікаво буде, однак, розглянути інші підходи до класифікації розглянутих інструментів розробки засобів ПО.

Універсальні високорівневі мови

Так, сучасні експерти виділяють універсальні високорівневі мови. До них відносяться, зокрема, ті, що були розроблені в 60-і роки. Ключові їх характеристики:

Орієнтація на широкий спектр завдань (насамперед, відносяться до обчислювальних);

Велика кількість мовних конструкцій та алгоритмів;

Значимість не тільки для свого часу, але і для сучасного етапу розвитку комп'ютерної техніки;

Підтримка у відповідних мовах імперативною методології.

Універсальні мови - основоположні у відповідній галузі IT-розробки. Можна відзначити, що до цих пір вони не мають прямих аналогів в частині внутрішньої структури. Власне, це багато в чому пояснює актуальність задіяння відповідних мов в сучасних об'єктно орієнтованих інтерфейсів. Також загальне в зазначених мовах - тип даних. Цей фактор в значній мірі визначає їх універсальність. У числі найбільш примітних властивостей мов, що відносяться до категорії універсальних - спадкоємність. Так, історично більш пізні мови, як правило, базувалися на концепціях попередників.

унікальні мови

Деякі IT-експерти виділяють в самостійну категорію «унікальні мови». У числі таких: APL, Cobol, Forth, SETL, а також CLU. Яка їхня специфіка?

Найважливіший аспект APL - задіяння масивів (векторів і матриць) в якості ключового структурного типу. Специфіка мови Cobol - в орієнтованості на комерційну сферу. Так, його доцільно задіяти при вирішенні завдань, пов'язаних зі стандартизованим форматом представлення результатів. Мова Forth характеризується використанням постфіксной записи програм, а також залученням стековой нотації. У мові SETL застосовуються сукупності значень в якості одного з ключових типів даних. Мовою програмування високого рівня є також CLU. Його основна особливість - залучення концепції роботи з абстрактними типами даних. Багато IT-фахівці бачать логічним поява нових рішень, що базуються на унікальних мовами - таких як, наприклад, Object-Oriented Cobol.

Засоби паралельного програмування

Дана категорія може включати велику кількість рішень. У свою чергу, мови паралельного програмування можуть мати велику кількість підстав для класифікації. Наприклад, метод організації процесів. Дане підставу передбачає класифікацію засобів паралельного програмування виходячи з наявності в них:

співпрограми;

розгалужень;

об'єднань;

Паралельних дужок;

Алгоритмів роботи з процесами.

Інша підстава для класифікації мов розглянутого типу - методи синхронізації процесів. Відповідні рішення можуть, таким чином, включати:

семафори;

Монітори;

- «рандеву»;

Критичні ділянки;

Дистанційний виклик процедур;

Транзакції, які стосуються категорії атомарних.

До мов розглянутого типу відносяться Modula-2, BLISS, Concurrent Pascal, DP, Argus.

Сімейство мов C

Вище ми розглянули як приклад мови високорівневого програмування таке рішення, як C. По суті справи, воно формує ціле сімейство. Мови, що належать до нього, є приватними конструкціями C. Так, його доповнення різними об'єктно-орієнтованими компонентами призвело до розробки C ++. Після суттєвої фільтрації ряду конструкцій C з'явилася мова Java. Можна відзначити, що Java створювався багато в чому під впливом концепцій проекту Oberon, яким керує Ніклаус Вірт, творець мови Паскаль. Чи відноситься до високорівневих JavaScript? Безумовно, так, не дивлячись на вузькість застосування - в якості інструменту розробки веб-сторінок. Але до мов програмування високого рівня не належать, зокрема, HTML, XML і SGML. Вони класифікуються як інструменти розмітки гіпертексту.

Сімейство мов Pascal

Мови програмування високого рівня Pascal також утворюють окреме сімейство. На базі Паскаль був, власне, створений Oberon, що класифікується як мову об'єктно-орієнтованого типу. ключова особливість Oberon - в можливості забезпечення безпеки типів. Крім Oberon, до мов сімейства Pascal можна віднести Modula-2, а також Component Pascal.

Сімейство мов Ada

Основоположний у відповідній категорії мов - замовлений під потреби Міністерства оборони США Ada. Він був створений в кінці 70-х - початку 80-х років. характеризується великою кількістю функцій, можливостей, універсальністю. Сімейство мов Ada включає такі рішення, як Cedar, Modula 3.

Сімейство мов Simula

Мова Simula поширений в галузях програмування, пов'язаних з імітаційним моделюванням. Специфіка відповідних рішень - в залученні специфічного ядра. Його використання дозволяє застосовувати різні розширення, адаптовані до тих чи інших сфер застосування. На основі Simula були створені об'єктно-орієнтована мова Smalltalk, а також BETA, що характеризується здатністю комбінувати в рамках єдиної абстракції алгоритми, що відображають роботу з даними, процедурами, а також управління. Об'єкти BETA можуть розглядатися в різному контексті, наприклад, в якості змінних, функцій або паралельних систем.

Назва доповіді

Сучасні мови програмування та їх використання

Автор проекту

структура проекту

● Схема класифікації мов програмування

● Класифікація мов програмування

● Огляд мов програмування

● Корисні ресурси

Схема класифікації мов програмування

Класифікація мов програмування

процедурне програмування - є відображенням фон Неймановская архітектури комп'ютера. Програма, написана на процедурному мовою, являє собою послідовність команд, що визначають алгоритм вирішення задачі. Основна ідея процедурного програмування - використання пам'яті для зберігання даних. Основна команда-привласнення, за допомогою якої визначається і змінюється пам'ять комп'ютера. Програма проводить перетворення вмісту пам'яті, змінюючи його від вихідного стану до результуючому.

Розрізняють такі мови процедурного програмування:

 Мова Фортран створений на початку 50-х років 20-го століття для програмування науково-технічних завдань;

 Кобол - створений в кінці 60-х років 20-го століття для вирішення завдань обробки великих обсягів даних, що зберігаються на різних носіях даних;

 Алгол (1960 рік) - це багатоцільовий розширена мова програмування. У ньому вперше введено поняття «блокова структура програми» і «динамічний розподіл пам'яті»;

 У середині 60-х років 20-го століття був створений спеціалізований мова програмування для початківців - BASIC. Характеризується простотою освоєння і наявністю універсальних засобів для вирішення наукових, технічних і економічних завдань, а також завдань, наприклад, ігрових.

Всі перераховані вище мови були орієнтовані на різні класи задач, але вони в тій чи іншій мірі були прив'язані до конкретної архітектурі ЕОМ.

 У 1963-1966гг був створений багатоцільовий універсальна мова PL-1. Ця мова добре пристосований для дослідження і планування обчислювальних процесів, моделювання, рішення логічних задач, розробки систем математичного забезпечення.

 Мова Паскаль (PASCAL) (1968-1971гг) - мова процедурного програмування найбільш популярний для ПК, який і в даний час успішно застосовується. В основу мови Pascal покладено підхід від загального завдання до приватних (більш простим і меншим за обсягом). До основних принципів, якими володіє Паскаль, можна віднести: а) Структурний програмування, яке засноване на використанні підпрограм і незалежних структур даних; б) Програмування «зверху-вниз», коли завдання ділиться на прості, самостійно оцінити потреби. Потім вибудовується рішення вихідної завдання повністю зверху вниз.

 До мов процедурного програмування можна віднести мову АДА (1979 г) Мова названий на честь першої програмістки Ади Лавлейс- дочки Байрона. Його відрізняє модульність конструкцій.

 Мова СІ (початок 70-х років) також відноситься до мов процедурного програмування. Початковий його варіант планувався як мову для реалізації операційної системи Unix замість мови Асемблера. Однією з особливостей мови СІ є те, що відмінності між виразами і операторами згладжуються, що наближає його до функціональних мов програмування. Крім того, в мові СІ відсутнє поняття процедури, а використання підпрограм засноване на понятті функції, яка може поєднувати в собі можливості процедури. З одного боку, по набору керуючих конструкцій і структур даних його можна віднести до мов високого рівня, а з іншого - він має набір засобів прямого звернення до функціональних вузлів комп'ютера, а це означає, що його можна використовувати як операційний мову.

Об'єктно-орієнтоване програмування (ООП) - це метод програмування, при використанні якого головними елементами програм є об'єкти. У мовах програмування поняття об'єкта реалізовано як сукупність властивостей (структур даних, характерних для даного об'єкта), методів їх обробки (підпрограм зміни їх властивостей) і подій, на які даний об'єкт може реагувати і, які призводять, як правило, до зміни властивостей об'єкта. Об'єднання даних і властивих їм процедур обробки в одному об'єкті, називається инкапсуляцией і є одним з найважливіших принципів ООП.

Іншим фундаментальним поняттям є клас. Клас це шаблон, на основі якого може бути створений конкретний програмний об'єкт, він описує властивості і методи, що визначають поведінку об'єктів цього класу. Кожен конкретний об'єкт, який має структуру цього класу, називається екземпляром класу.

Наступними найважливішими принципами ООП є спадкоємство і поліморфізм. Спадкування передбачає створення нових класів на базі існуючих і дозволяє класу нащадку мати (успадковувати) все властивості класу - батька.

Поліморфізм означає, що народжені об'єкти мають інформацію про те, які методи вони повинні використовувати в залежності від того, в якому місці ланцюжка вони знаходяться.

Іншим найважливішим принципом ООП є модульність - об'єкти містять в собі повне визначення їх характеристик, ніякі визначення методів і властивостей не повинні розташовуватися поза ним, це робить можливим вільне копіювання і впровадження одного об'єкта в інші.

Найбільш сучасними мовами програмування є С ++ і Java. З середини 90-х років багато об'єктно-орієнтовані мови реалізуються як системи візуального проектування, в яких інтерфейсна частина програмного продукту створюється в діалоговому режимі, практично без написання програмних операторів. До об'єктно - орієнтованих систем візуального проектування відносяться Visual Basic, Delphi, C ++ Builder, Visual C ++. Мова VBA (Visual Basic for Application) - рідну мову програм Microsoft Office (Excel, Word, Power Point та ін). VBA дотримується основний синтаксис мови і правила програмування мов Basic - діалектів, дозволяє створювати макроси для автоматизації виконання деяких операцій і графічний інтерфейс користувача, інтеграцію між різними програмними продуктами.

Декларативні мови програмування

До них відносяться функціональні та логічні мови програмування. Функціональне програмування-це спосіб складання програм, в яких єдиним дією є виклик функції. У функціональному програмуванні не використовується пам'ять, як місце для зберігання даних, а, отже, не використовуються проміжні змінні, оператори присвоювання і цикли. Ключовим поняттям в функціональних мовах є вираз. Програма, написана на функціональній мові, являє собою послідовність опису функцій і виразів. Вираз обчислюється зведенням складного до простого. Всі вирази записуються у вигляді списків. Першою мовою стала мова Лісп (LISP, LIST Processing- обробка списків) створений в 1959р. Ця мова дозволяє обробляти великі обсяги текстової інформації. Логічне програмування-це програмування в термінах логіки. У 1973 році була створена мова штучного інтелекту Пролог (PROLOG) (Programming in Logic). Програма на мові Пролог будується з послідовності фактів і правил, потім формулюється твердження, яке Пролог намагається довести за допомогою правил. Мова сам шукає рішення за допомогою методів пошуку і зіставлення, які в ньому закладені. Логічні програми не відрізняються високою швидкодією, так як процес їх виконання зводиться до побудови прямих і зворотних ланцюжків міркувань різноманітними методами пошуку.

Огляд мов програмування

асемблер

Мови програмування комп'ютерів діляться на 2 основні групи:

1) мови низького рівня;

2) мови високого рівня.

До мов низького рівня належать мови Асемблера. Свою назву вони отримали від імені системної програми Асемблер, яка перетворює вихідні програми, написані на таких мовах, безпосередньо в коди машинних команд. Частинами тут служать оператори, а результатом складання послідовність машинних команд Мова Асемблера об'єднує в собі переваги мови машинних команд і деякі риси мов високого рівня. Асемблер забезпечує можливість застосування символічних імен у вихідній програмі і позбавляє програміста від стомлюючого праці (неминучого при програмуванні на мові машинних команд) по розподілу пам'яті комп'ютера для команд, змінних і констант.

Асемблер дозволяє також гнучко і повно використовувати технічні можливості комп'ютера, як і мова машинних команд. Транслятор вихідних програм в Асемблері простіше транслятора, що вимагається для мови програмування високого рівня. На Ассемблері можна написати так само ефективну за розміром і часу виконання програму, як і програму на мові машинних команд. Це гідність відсутня у мов високого рівня. Ця мова часто застосовують для програмування систем реального часу, технологічними процесами і обладнанням, забезпечення роботи інформаційно-вимірювальних комплексів. До таких систем зазвичай пред'являються високі вимоги за обсягом займаної машинної пам'яті. Часто мова Асемблера доповнюється засобами формування макрокоманд, кожна з яких еквівалентна цілій групі машинних команд. Такий мову називають мовою макроассемблера. Застосування мак "будівельних" блоків і наближає мову Асемблера до мови високого рівня. Асемблер машинно-залежний мову, т. Е. Він відображає особливості архітектури конкретного типу комп'ютера

Паскаль

Мова програмування Паскаль був розроблений професором кафедри обчислювальної техніки Швейцарського федерального інституту технології Ніколасом Віртом в 1968 році як альтернатива існуючим і все ускладнюється мов програмування, таким, як PL / 1, Algol, Fortran. Інтенсивний розвиток Паскаля призвело до появи вже в 1973 році його стандарту у вигляді переглянутого повідомлення, а число трансляторів з цієї мови в 1979 році перевалила за 80. На початку 80-х років Паскаль ще більше зміцнив свої позиції з появою трансляторів MS-Pascal і Turbo -Pascal для ПЕОМ. З цього часу Паскаль стає одним з найбільш важливих і широко використовуваних мов програмування. Важливо не тільки те, що мова давно вийшов за рамки академічного і вузько професійного інтересу і використовується в більшості університетів високорозвинених країн не тільки як робочий інструмент користувача. Найважливішою особливістю Паскаля є втілена ідея структурного програмування. Іншою істотною особливістю є концепція структури даних як одного з фундаментальних понять.

Основні причини популярності Паскаля полягають в наступному:

Простота мови дозволяє швидко його освоїти і створювати алгоритмічно складні програми

Розвинені засоби представлення структур даних забезпечують зручність роботи як з числової, так і з символьного і бітової інформацією

Наявність спеціальних методик створення трансляторів з Паскаля спростило їх розробку і сприяло широкому поширенню мови

Оптимізують властивості трансляторів з Паскаля дозволяють створювати ефективні програми. Це стало однією з причин використання Паскаля в якості мови системного програмування

У мові Паскаль реалізуються ідеї структурного програмування, що робить програму наочної і дає хороші можливості для розробки і налагодження

Співробітник фірми Bell Labs Денис Рітчі створив мову Сі в 1972 році під час спільної роботи з Кеном Томпсоном, як інструментальний засіб для реалізації операційної системи Unix, проте популярність цієї мови швидко переросла рамки конкретної операційної системи і конкретних завдань системного програмування. В даний час будь-яка інструментальна і операційна система не може вважатися повною якщо до її складу не входить компілятор мови Сі. Рітчі не вигадував Сі просто з голови - прообразом служив мову Бі розроблений Томпсоном. Мова програмування Сі був розроблений як інструмент для програмістів-практиків. Відповідно до цього головною метою його автора було створення зручного і корисного в усіх відношеннях мови.

Сі є знаряддям системного програміста і дозволяє глибоко влізати в найтонші механізми обробки інформації на ЕОМ. Хоча мова вимагає від програміста високої дисципліни, він не строгий в формальних претензії і допускає короткі формулювання.

Сі - сучасну мову. Він включає в себе ті керуючі конструкції, які рекомендовані теорією і практикою програмування. Його структура спонукає програміста використовувати в своїй роботі спадний проектування, структурне програмування і покрокову розробку модулів.

Сі - потужний і гнучкий мову. Велика частина операційної системи Unix, компілятори і інтерпретатори мов Фортран, Паскаль, Лисп, і Бейсік написані саме з його допомогою.

Сі - зручний мову. Він досить структурований, щоб підтримувати хороший стиль програмування і в той же час не пов'язаний жорсткими обмеженнями. У певному сенсі мова Сі - самий універсальний, тому що крім набору засобів, притаманних сучасних мов програмування високого рівня (структурність, модульність, певні типи даних), в нього включені кошти для програмування практично на рівні асемблера. Великий набір операторів і засобів вимагають від програміста обережності, акуратності і доброго знання мови з усіма ярмо перевагами і недоліками.

Мова C ++ з'явився на початку 80-х років. Створений Бьерном Страуструпом з первинною метою позбавити себе і своїх друзів від програмування на асемблері, Сі або різних інших мовах високого рівня.

На думку автора мови, відмінність між ідеологією Сі і C ++ полягає приблизно в наступному: програма на Сі відображає "спосіб мислення" процесора, а C ++ - спосіб мислення програміста. Відповідаючи вимогам сучасного програмування, C ++ робить акцент на розробці нових типів даних найбільш повно відповідних концепцій обраної галузі знань і завданням програми. Клас є ключовим поняттям C ++. Опис класу містить опис даних, потрібних для подання об'єктів цього типу і набір операцій для роботи з подібними об'єктами.

На відміну від традиційних структур Сі і Паскаля, членами класу є не тільки дані, але і функції. Функції - члени класу мають привілейований доступ до даних усередині об'єктів цього класу і забезпечують інтерфейс між цими об'єктами і решті програмою. При подальшій роботі зовсім не обов'язково пам'ятати про внутрішню структуру класу і механізм роботи вбудованих функцій. У цьому сенсі клас подібний до електричного приладу - мало хто знає про його пристрої, але всі знають, як ним користуватися.

Мова С ++ є засобом об'єктного програмування, Новітньої методики проектування та реалізації програм, яка в поточному десятилітті, швидше за все, замінить традиційне процедурне програмування. Головною метою творця мови доктора Бйорна Страустрапа було оснащення мови С ++ конструкціями, що дозволяють збільшити продуктивність праці програмістів і полегшити процес оволодіння великими програмними продуктами.

Абстракція, реалізація, успадкування і поліморфізм є необхідними властивостями якими володіє мовою С ++, завдяки чому він не тільки універсальний, як і мова Сі, але і є об'єктним мовою. Фортран Фортран широко поширена мова, особливо серед користувачів, які займаються чисельним моделюванням. Це пояснюється кількома причинами:

Існуванням величезних фондів прикладних програм на Фортране, накопичених за ці роки, а також наявністю величезної кількості програмістів, ефективно використовують цю мову;

Наявністю ефективних трансляторів Фортрана на всіх типах ЕОМ, причому версії для різних машин досить стандартизовані і перенесення програм з машини на машину зазвичай не становить великих труднощів;

Початковою спрямованістю Фортрана на фізико-математичні та технічні додатки; зокрема, це проявилося в тому, що протягом довгого часу він залишався єдиною мовою з вбудованим комплексним типом змінних і великим набором вбудованих функцій для роботи з такими змінними.

За минулий період сформувалася нова методологія і філософія програмування. З початку 70-х років Фортран піддавався заслуженій критиці. У 1977 році був прийнятий новий стандарт мови Фортран-77. На створення нового стандарту пішло багато часу, але зараз вже можна вважати, що його розробка завершена і новий стандарт Фортран-90 почав входити в практику користувачів Фортрана. Тільки на машинах типу IBM PC існує кілька трансляторів наприклад, Watfor, Lap-Fortran і т. Д. Але найбільшого поширення на машинах цього типу отримали різні версії транслятор Fortran-77. Випущений в 1990 році транслятор MS-Fortran 5.0 практично повністю відповідає стандарту Fortran-90. Більшість великих науково-технічних прикладних програм написано на Фортране тому, що він володіє переносимість і стійкістю, а також завдяки наявності вбудованих математичних та тригонометричних функцій. Додатковою, невід'ємною частиною будь-якої прикладної програми на мові Фортран є розширена графічна бібліотека, що дозволяє використовувати різні графічні дані і зображення.

Мова створений в основному в 1975 - 1980 роках в результаті грандіозного проекту, початого Міністерством Оборони США з метою розробити єдину мову програмування для так званих вбудованих систем (т. Е. Систем управління автоматизованими комплексами, що працюють в реальному часі). Малися на увазі перш за все бортові системи управління військовими об'єктами (кораблями, літаками, танками, ракетами, снарядами і т. П.). Тому рішення, прийняті авторами Ади не слід вважати універсальними. Їх потрібно сприймати в контексті особливостей обраної предметної області. Мова Ада виник в результаті міжнародного конкурсу мовних проектів проходить в 1978-1979 роках. Учасники повинні були задовольнити досить жорстким, детально розробленим під егідою Міністерства Оборони США вимогам. Цікаво, що всі мови, які дійшли до останніх турів цього конкурсу, були засновані на Паскалі. У зв'язку з цим Аду можна попередньо охарактеризувати як Паскаль, розвинений з урахуванням перерахованих вище п'яти основних вимог. При цьому автори пішли в основному по шляху розширення Паскаля новими елементами. В результаті вийшов істотно більш складну мову.

Кобол

Кобол - це порівняно старий мову, розроблений насамперед для досліджень в економічній сфері. Мова дозволяє ефективно працювати з великою кількістю даних, він насичений різноманітними можливостями пошуку, сортування та розподілу. Про програми на Коболе, заснованих на широкому використанні англійської мови, Кажуть, що вони зрозумілі навіть тим, хто не володіє Кобола, оскільки тексти на цій мові програмування не потребують будь-яких спеціальних коментарів. Подібні програми прийнято називати самодокументірующіміся. До числа інших плюсів Кобола зазвичай відносять його структурованість. Досить потужні компілятори з цієї мови розроблені для персональних комп'ютерів. Деякі з них настільки ефективні, що програму, налагоджену на персональному комп'ютері, неважко перенести на великі ЕОМ.

Перераховуючи мінуси можна не згадати про те, що на Коболе можна запрограмувати лише найпростіші алгебраїчні обчислення. Для інженерних розрахунків ця мова не годиться. Ще одна причина, яка в якійсь мірі стримує розвиток мови, - це наявність в США спеціально створеного галузевого комітету, який виробляє стандарти, за дотриманням яких стежить урядова комісія. Як це завжди буває в подібних випадках, фірми, що займаються розробкою програмного забезпечення, не поспішають підганяти свої заготовки до жорстких вимог комісії, відсутня конкуренція версій, а в підсумку програє поширення мови

ПЛ / 1 розроблений в 1964-1965 роках фірмою IBM. ПЛ / 1 відноситься до числа універсальних мов, т. Е. Дозволяє вирішувати завдання з різних областей: чисельні розрахунки, текстова обробка, економічні завдання і т. Д. За своїми можливостями він перекриває такі мови, як Фортран, Алгол-60 (створений для чисельних розрахунків), Кобол (для економічних задач), хоча в силу ряду причин витіснити ці мови ПЛ / 1 не зміг.

ПЛ / 1 містить всі основні конструкції, характерні для так званих мов високого рівня, а також ряд специфічних засобів, зручних для практичного програмування. Мова нагадує конструктор з великим числом деталей - користувачеві досить освоїти лише ті частини мови, які йому практично необхідні. Його оператори досить об'ємним, що часто дозволяє отримати запис програми більш компактну, ніж на інших мовах. Знаючий ПЛ / 1 програміст без праці освоює будь-який інший мову того ж або близького класу.

Разом з тим, ПЛ / 1 має і ряд недоліків, що ускладнюють вивчення і використання мови. Основні з них такі. По-перше, є багато дублюючих один одного коштів їх складно запам'ятати, не ясно, що коли застосовувати, крім того, це знижує як швидкість трансляції, так і швидкість виконання програм. По-друге, програми виходять не зовсім машинно-незалежними.

Модула

Можна вважати, що історія мови Модула починається в 1980 році, коли Ніклаус Вірт, один з видатних фахівців з теорії інформації, відомий більшості фахівців з обчислювальної техніки в основному як творець мови Паскаль, опублікував опис нової мови програмування, названого їм Модула. На відміну від Паскаля, який був за задумом мовою для навчання програмування, Модула з самого початку був мову для професійних системних програмістів, Продовжуючи кращі традиції свого попередника і збагачуючи їх новими ідеями, які відповідають таким вимогам до мов програмування, як структурність, модульність і здатність до розширення. Як і безліч інших мов програмування, Модула піддавалася еволюції, під час якої її початкова назва було перероблено в ім'я Модула-2. Одночасно з розвитком мови Модула для нього створювалися нові компілятори, однак, жоден з них не міг змагатися з кращими реалізаціями мов Паскаль і Сі, наприклад, розроблених фірмою Борланд. В цей перехідний для мови Модула період кращої вважалися реалізації виконані фірмою Logitech, які за своїми характеристиками програвала Турбо Паскалю і Турбо Сі. Тільки в 1988 році після появи на американському ринку системи Top Speed, Модула-2 зайняла гідне місце серед процедурних мов, призначених для системного програмування. Зростаючої популярності системи Top Speed \u200b\u200bсприяло кілька чинників: зручне і, крім того, легко змінна за бажанням користувачів операційне оточення, швидкий компілятор і селективний редактор зв'язків. Але найбільш істотним виявилося те, що створювані програми відрізнялися великим швидкодією і займали небагато місця в пам'яті.

Бейсік

Бейсік (Basic - Beginner's All-Purpose Symbolic Instruction Code - "універсальний символічний код інструкцій для початківців"). Прямий нащадок Фортрана і до сих пір найбільш популярна мова програмування для персональних комп'ютерів. З'явився Бейсік в 1963 році (назвати автора було б важко, але основна заслуга в його появі безсумнівно належить американцям Джону Кемені і Томас Курц). Як і будь-які переваги, простота Бейсика оберталася, особливо в ранніх версіях труднощами структурування; крім того, Бейсік не допускав рекурсию - цікавий прийом, що дозволяє складати ефективні і в той же час короткі програми.

Розроблено потужні компілятори Бейсика, які забезпечують не тільки багату лексику і високу швидкодію, але і можливість структурного програмування. На думку деяких програмістів, найбільш цікавими версіями є GWBASIC, Turbo-Basic і Quick Basic.

Свого часу поява Quick Basic ознаменувало народження другого покоління систем програмування на мові Бейсік. Він надавав можливість модульного і процедурного програмування, створення бібліотек, компіляції готових програм та інше, що вивело його на рівень таких класичних мов програмування, як Сі, Паскаль, Фортран та ін. Більш того, в зв'язку з відсутністю офіційного стандарту мови Бейсік, його реалізація у вигляді Quick Basic стала фактичним стандартом. Безумовними лідерами серед різних версій Бейсика були Quick Basic 4.5 і PDS 7.1 фірми Microsoft, що з'явилися в кінці 80-х років.

Лисп

Мова Лісп був запропонований Дж. Маккарті в роботі в 1960 році і орієнтований на розробку програм для вирішення завдань не чисельного характеру. Англійська назва цієї мови - LISP є абревіатурою виразу LISt Processing (обробка списків) і добре підкреслює основну область його застосування. Поняття "список" виявилося дуже ємним. У вигляді списків зручно представляти алгебраїчні вирази, графи, елементи кінцевих груп, безлічі, правила виведення і багато інших складні об'єкти. Списки є найбільш гнучкою формою подання інформації в пам'яті комп'ютерів. Тому не дивно, що зручний мову, спеціально призначений для обробки списків, швидко завоював популярність.

Після появи Лиспа різними авторами було запропоновано цілий ряд інших алгоритмічних мов орієнтованих на вирішення завдань в галузі штучного інтелекту, серед яких можна відзначити Пленер, Снобол, Рефал, Пролог. Однак це не завадило Ліспі залишитися найбільш популярною мовою для вирішення таких завдань. Протягом майже сорокарічної історії його існування з'явилася низка діалектів цієї мови: Common LISP, Mac LISP, Inter LISP, Standard LISP і ін. Відмінності між ними не носять принципового характеру і в основному зводяться до кілька відрізняється набору вбудованих функцій і певну різницю в формі запису програм. Тому програміст, яка навчилася працювати на одному з них без праці зможе освоїти і будь-який інший. Великою перевагою Лиспа є його функціональна спрямованість, т. Е. Програмування ведеться за допомогою функцій. Причому функція розуміється як правило, зіставляє елементам деякого класу відповідні елементи іншого класу. Сам процес зіставлення не робить ніякого впливу на роботу програми, важливий тільки його результат - значення функції. Це дозволяє відносно легко писати і налагоджувати великі програмні комплекси. Ясність програм, чітке розмежування їх функцій, відсутність каверзних побічних ефектів при їх виконанні є обов'язковими вимогами до програмування таких логічно складних завдань, якими є завдання штучного інтелекту. Дисципліна в програмуванні стає особливо важливою, коли над програмою працює не одна людина, а ціла група програмістів.

Мова програмування Лісп призначений в першу чергу для обробки символьної інформації. Тому природно, що в світі Лиспа числа грають далеко не головну роль. Основні типи даних в Ліспі називаються "атом" і "точкова пара".

Пролог

Мова логічного програмування призначений для подання і використання знань про деяку предметну область. Програми на цій мові складаються з деякого безлічі відносин, а її виконання зводиться до висновку нового відносини на основі заданих. У передмові реалізований декларативний підхід, при якому досить описати задачу за допомогою правил і тверджень щодо заданих об'єктів. Якщо це опис є досить точним, то ЕОМ може самостійно знайти необхідну рішення.

Object PAL

Object PAL є потужним мовою програмування. Object PAL є об'єктно-орієнтована, керований по подіям, візуальна мова програмування. На початковому рівні функціональності Object PAL можна здійснювати операції з даними, створювати спеціальні меню, а також керувати сеансом введення даних. Події в Object PAL породжують команди, які імітують ефект використання Paradox в інтерактивному режимі. Існує можливість автоматизувати часто виконувані завдання, а також здійснювати над таблицями, формами і звітами дії, які були не доступні при інтерактивній роботі. Також Object PAL надає всі засоби повнофункціонального мови програмування в середовищі Windows. Можна використовувати Object PAL для створення закінчених систем, в яких реалізовані спеціальна система меню, довідкова система, а також всілякі перевірки даних. У Object PAL можна зберегти свої напрацювання в динамічно компонованих бібліотеці, доступ до якої матимуть кілька форм. Крім того, можна встановити зв'язок з іншими динамічними бібліотеками, що містять прграмми написані на таких мовах як Сі, C ++ або Паскаль.

Object PAL може бути використаний як інструмент для створення автономних програм. Можна написати закінчене Windows-додаток і запустити його під Paradox.

Object PAL підтримує механізм динамічного обміну даними в якості як клієнта, так і сервера. Крім того, Object PAL підтримує в якості клієнта механізм роботи зі складеними документами. На додаток до сказаного існує можливість включати в свій додаток мультимедійні засоби, забезпечивши виконується додаток звуковими і анімаційними ефектами.

Створена фірмою Борланд реалізація мови dBase є вдалий гібрид об'єктної орієнтації і традиційних способів програмування. Він дозволив створювати системи за допомогою об'єктного дизайну і використовувати звичайні прийоми обробки записів. Великим досягненням фірми Борланд стало те, що вона дуже вдало поєднала об'єктні і процедурні прийоми програмування. Перша версія для Windows давала користувачу найпотужніший об'єктний інструмент на ринку програм баз даних. Вона дозволяє створювати нові класи об'єктів, які мають властивості спадкування, інкапсуляції і поліморфізму. Вона також дозволяє програмувати ці об'єкти за допомогою традиційних команд dBase, що ідеально підходять для управління простими табличними базами даних. Все це дає незаперечну перевагу - здійснювати без особливих зусиль перехід до прийомів об'єктного програмування, перехід настільки складний, наприклад, як в - СУБД Paradox.

Мова Java зародився як частина проекту створення передового програмного забезпечення (ПО) для різних побутових приладів. Реалізація проекту була почата на мові С ++, але незабаром виник ряд проблем, найкращим засобом боротьби з якими була зміна самого інструмента - мови програмування. Стало очевидним, що необхідний платформо-незалежний мова програмування, що дозволяє створювати програми, які не доводилося б компілювати окремо для кожної архітектури і можна було б використовувати на різних процесорах під різними операційними системами. Мова Java потрібен для створення інтерактивних продуктів для мережі Internet. Фактично, більшість архітектурних рішень, прийнятих при створенні Java, було продиктовано бажанням надати синтаксис, схожий з Сі і Сі ++. В Java використовуються практично ідентичні угоди для оголошення змінних, передачі параметрів, операторів і для управління потоком виконанням коду. В Java додані всі хороші риси C ++.

Три ключові елементи об'єдналися в технології мови Java

Java надає для широкого використання свої аплети (applets) - невеликі, надійні, динамічні, які не залежать від платформи активні мережеві додатки, що вбудовуються в сторінки Web. Аплети Java можуть налаштовуватися і поширюватися споживачам з такою ж легкістю, як будь-які документи HTML.

Java вивільняє міць об'єктно-орієнтованої розробки додатків, поєднуючи простий і знайомий синтаксис з надійним і зручним в роботі середовищем розробки. Це дозволяє широкому колу програмістів швидко створювати нові програми і нові аплети.

Java надає програмісту багатий набір класів об'єктів для ясного абстрагування багатьох системних функцій, використовуваних при роботі з вікнами, мережею і для введення-виведення. Ключова риса цих класів полягає в тому, що вони забезпечують створення незалежних від використовуваної платформи абстракцій для широкого спектра системних інтерфейсів.

Мови програмування для комп'ютерних мереж

Мови програмування для комп'ютерних мереж є інтерпретуються. Інтерпретатори для них поширюються безкоштовно, а самі програми - у вихідних текстах. Такі мови називаються скрипт - мовами.

Perl є інтерпретується мовою, створеним програмістом Лари Уоллом для обробки великих текстів і файлів і розшифровується, як Practical Extraction and Report Language (мова для практичного вилучення даних та складання звітів). За допомогою Perl ви, наприклад, можете створити скрипт, який відкриває один або кілька файлів, обробляє інформацію і записує результати.

Perl - мова, пристосований для обробки довільних текстових файлів, витягання з них необхідної інформації і видачі повідомлень. Perl також зручний для написання різних системних програм. Ця мова простий у використанні, ефективний, але про нього важко сказати, що він елегантний і компактний. Синтаксис виразів Perl близький до синтаксису Сі. Рекурсія може бути довільної глибини. Хоча Perl пристосований для сканування текстових файлів, він може обробляти так само двійкові дані. Perl дозволяє використовувати регулярні вирази, створювати об'єкти, вставляти в програму на Сі або Сі ++ шматки коду на Perl, а також дозволяє здійснювати доступ до баз даних, в тому числі Oracle.

З винаходом World Wide Web, Perl виявився прекрасним засобом для взаємодії з web-серверами через Common Gateway Interface (CGI) - загальний інтерфейс взаємодії. Команди Perl можуть легко отримати дані з форми HTML або іншого джерела і виконати з ними будь-яка дія.

Мова PHP (1995-1997рр) володіє засобами доступу до БД і використовується творцями динамічних сайтів в усьому світі.

Мова Tcl / Tk (Кінець 80-х років) складається з потужних команд, призначених для роботи з абстрактними нетипізований об'єктами і дозволяє створювати програми з графічним інтерфейсом.

Мова VRML (1994р) створений для організації віртуальних тривимірних інтерфейсів в Інтернеті.

Мова XML. З 1996р йде робота над створенням універсальної мови структури документів. Може стати заміною мови HTML.

висновок

Корисні ресурси

відгук Айзілі

Де доповідь?

відгук Раніфка

Re: Де доповідь?
Все буде: -D

Відгук Шамагуловой Еліти

Відгук Мішина Олександра

Відмінний доповідь. Дізнався багато нового про мови програмування.

Відгук Морозова Олександра

Звичайно хотілося б бачити доповідь або хоча б презентацію в будь-якому вигляді.

Перш ніж ви захочете вивчати якусь мову програмування треба знати трохи про їхню історію і де вони застосовуються.

Я представляю вам короткий огляд 25 відомих мов програмування. Починаючи з самого відомого до менш популярного. Стаття зроблена для новачків в сфері програмування. Ви можете почитати про кожній мові і вибрати той який вам більше сподобатися для вивчення.

Перш ніж приступити до вивчення мов програмування рекомендую вам вивчити курс по.

1. JavaScript

Прототипна-орієнтований сценарний мову програмування. JavaScript спочатку створювався для того, щоб зробити web-сторінки «живими». У браузері вони підключаються безпосередньо до HTML і, як тільки завантажується сторінка - тут же виконуються.

Коли створювався мову JavaScript, у нього спочатку була інша назва: «LiveScript». Але тоді був дуже популярний мову Java, і маркетологи вирішили, що схожу назву зробить нову мову більш популярним.

Планувалося, що JavaScript буде таким собі «молодшим братом» Java. Однак, історія розпорядилася по-своєму, JavaScript сильно виріс, і зараз це абсолютно незалежний мову, зі своєю специфікацією і до Java не має ніякого відношення.

2. Java


Строго типізований об'єктно-орієнтована мова програмування. Програми Java зазвичай транслюються в спеціальний байт-код, тому вони можуть працювати на будь-якої комп'ютерної архітектурі, за допомогою віртуальної Java-машини.

Перевагою подібного способу виконання програм є повна незалежність байт-коду від операційної системи і устаткування, що дозволяє виконувати Java-додатки на будь-якому пристрої, для якого існує відповідна віртуальна машина. Іншою важливою особливістю технології Java є гнучка система безпеки, в рамках якої виконання програми повністю контролюється віртуальною машиною.

Спочатку мова називалася Oak ( «Дуб») розроблявся Джеймсом Гослінгом для програмування побутових електронних пристроїв. Згодом він був перейменований в Java і став використовуватися для написання клієнтських додатків і серверного програмного забезпечення.

3. PHP


Є поширеним інтерпретується мовою загального призначення з відкритим вихідним кодом (скриптова мова). PHP створювався спеціально для ведення web-розробок і код на ньому може впроваджуватися безпосередньо в HTML-код. Синтаксис мови бере початок з C, Java і Perl, і є легким для вивчення.

Основною метою PHP є надання web-розробникам можливості швидкого створення динамічно генеруються web-сторінок, однак сфера застосування PHP не обмежується тільки цим.

4. Python

Високорівнева мова програмування загального призначення, орієнтований на підвищення продуктивності розробника, читання коду і на розробку веб додатків. Синтаксис ядра Python мінімалістичний. Код в Python організовується у функції та класи, які можуть об'єднуватися в модулі.

5. C #


Об'єктно-орієнтована мова програмування. Розроблено в 1998-2001 роках групою інженерів під керівництвом Андерса Хейлсберг в компанії Microsoft як мова розробки додатків для платформи Microsoft .NET Framework. C # відноситься до сім'ї мов з C-подібним синтаксисом, з них його синтаксис найбільш близький до C ++ і Java.

Мова має статичну типізацію, підтримує поліморфізм, перевантаження операторів, делегати, атрибути, події, властивості, узагальнені типи і методи, ітератори, анонімні функції з підтримкою замикань, LINQ, виключення, коментарі у форматі XML.

6. З ++


Компільований, статично типізований мова програмування загального призначення. Є одним з найпоширеніших мов у світі. Google Chrome, Mozilla Firefox, Winamp і лінійка продуктів Adobe були розроблені за допомогою С ++. Крім того, деякі сучасні ігри і операційні системи були розроблені на С ++ через швидке процесингу і компіляції.

7. Ruby


Простий і читається мова програмування, орієнтований на розробку веб додатків. Розроблений Юкіхіро Мацумто в 1995 році. Мова має незалежної від операційної системи реалізацією багатопоточності, суворої динамічною типізацією, Збирачем сміття.

Основне призначення Ruby - створення простих і в той же час зрозумілих програм, де важлива не швидкість роботи програми, а малий час розробки, зрозумілість і простота синтаксису. Мова дотримується принципу «найменшої несподіванки»: програма повинна вести себе так, як очікує програміст.

8. CSS


Cascading Style Sheets (каскадні таблиці стилів) формальна мова опису зовнішнього вигляду документа, написаного з використанням мови розмітки.
Переважно використовується як засіб опису, оформлення зовнішнього вигляду веб-сторінок, написаних за допомогою мов розмітки HTML і XHTML, але може також застосовуватися до будь-яких XML-документах.

9. C


Компільований статично типізований мова програмування загального призначення. Мова Сі був розроблений Деннісом Рітчі в 1972 році в Bell Labs. Він є попередником таких мов програмування як С ++, Java, C #, JavaScript і Perl. З цієї причини вивчення цієї мови веде до розуміння і інших мов. Мова С використовується для розробки низькорівневих програм, так як вважається найближче до апаратного.

10. Objective-C


Компільований об'єктно-орієнтована мова програмування, що використовується корпорацією Apple, побудований на основі мови Сі і парадигм Smalltalk. Мова Objective-C є надбезліччю мови Сі, тому Сі-код повністю зрозумілий компілятору Objective-C. Мова використовується в першу чергу для Mac OS X (Cocoa) і GNUstep - реалізацій об'єктно-орієнтованого інтерфейсу OpenStep. Також мова використовується для iOS (Cocoa Touch).

11. Shell

Він не стільки мова, скільки інтерпретатор команд (командний мову). Його скрипти використовуються для автоматизації оновлення програмного забезпечення. Містить стандартні конструкції для циклів, розгалуження, оголошення функцій. У сімействі операційних систем, сумісних з ОС UNIX, мова SHELL використовується в якості стандартного мови управління завданнями.

12. R


Мова програмування для статистичної обробки даних і роботи з графікою, а також вільна програмне середовище обчислень з відкритим вихідним кодом в рамках проекту GNU. R широко використовується як статистичне програмне забезпечення для аналізу даних і фактично став стандартом для статистичних програм. В R використовується інтерфейс командного рядка.

13. Perl


Високорівнева інтерпретується динамічний мова програмування загального призначення. Назва мови є абревіатурою, що розшифровується як Practical Extraction and Report Language - «практичну мову для отримання даних та складання звітів». Основною особливістю мови вважаються його багаті можливості для роботи з текстом, в тому числі робота з регулярними виразами, вбудована в синтаксис. На даний момент він використовується для виконання широкого спектру завдань, включаючи системне адміністрування, веб-розробку, мережеве програмування, Ігри, біоінформатику, розробку графічних користувальницьких інтерфейсів.

14. Scala


Мультипарадигмальності мову програмування, спроектований коротким і тіпобезопасним для простого і швидкого створення компонентного програмного забезпечення, що поєднує можливості функціонального і об'єктно-орієнтованого програмування. Scala - програми багато в чому схожі на Java-програми, і можуть вільно взаємодіяти з Java-кодом.

15. Go


Компільований багато-мова програмування, розроблений компанією Google. Мова Go розроблявся як мова системного програмування для створення високоефективних програм, що працюють на сучасних розподілених системах і багатоядерних процесорах. Він може розглядатися як спроба створити заміну мови Сі. При розробці приділялася особлива увага забезпеченню високоефективної компіляції. Програми на Go компілюються в об'єктний код і не вимагають для виконання віртуальної машини.

16. SQL

Мова структурованих запитів. формальний непроцедурного мова програмування, застосовуваний для створення, модифікації та управління даними в довільній реляційної базі даних, керованої відповідною системою управління базами даних. SQL є перш за все інформаційно-логічним мовою, призначеним для опису, зміни і вилучення даних, що зберігаються в реляційних базах даних. Кожна пропозиція SQL - це або запит даних з бази, або звернення до бази даних, яке призводить до зміни даних в базі.

17. Haskell


Cтандартізірованний чистий функціональний мова програмування загального призначення. Є одним з найбільш поширених мов програмування з підтримкою відкладених обчислень. Характерна риса мови - серйозне ставлення до типізації. Haskell чудовий мову для навчання і для експериментів з складними функціональними типами даних.

18. Swift


Відкритий мультипарадигмальності компільований мова програмування загального призначення. Створено компанією Apple в першу чергу для розробників iOS і OS X. Swift працює з фреймворками Cocoa і Cocoa Touch і сумісний з основною кодової базою Apple, написаної на Objective-C. Swift замислювався як більш легкий для читання і стійкий до помилок програміста мова, ніж передував йому Objective-C. Swift запозичив досить багато з Objective-C, проте він визначається не покажчиками, а типами змінних, які обробляє компілятор. За аналогічним принципом працюють багато скриптові мови.

19. Matlab


Високорівнева інтерпретована мова програмування, що включає засновані на матрицях структури даних, широкий спектр функцій, інтегроване середовище розробки, об'єктно-орієнтовані можливості і інтерфейси до програм, написаним на інших мовах програмування. Програми, написані на MATLAB, бувають двох типів - функції і скрипти. Функції мають вхідні і вихідні аргументи, а також власний робочий простір для зберігання проміжних результатів обчислень і змінних. Скрипти ж використовують загальний робочий простір. Як скрипти, так і функції зберігаються у вигляді текстових файлів і компілюються в машинний код динамічно.

20. Visual Basic


Мова програмування, а також інтегроване середовище розробки програмного забезпечення, що розробляється корпорацією Microsoft. Мова Visual Basic успадкував дух, стиль і синтаксис свого предка - мови BASIC, У якого є чимало діалектів. У той же час Visual Basic поєднує в собі процедури та елементи об'єктно-орієнтованих і компонентно-орієнтованих мов програмування.

Visual Basic також є хорошим засобом швидкої розробки RAD додатків баз даних для операційних систем сімейства Microsoft Windows. Безліч готових компонентів, що поставляються разом із середовищем, покликані допомогти програмісту відразу ж почати розробляти бізнес-логіку додатка, не відволікаючи його увагу на написання коду запуску програми.

21. Delphi


Імперативний, структурований, об'єктно орієнтована мова програмування з суворою статичної типізацією змінних. Основна область використання - написання прикладного програмного забезпечення.

На сьогоднішній день, поряд з підтримкою розробки 32 і 64-розрядних програм для Windows, реалізована можливість створювати додатки для Apple Mac OS X, а також для Google Android (безпосередньо виконувані на ARM-процесорі).

22. Groovy


Об'єктно-орієнтована мова програмування, розроблений для платформи Java як доповнення до мови Java з можливостями Python, Ruby і Smalltalk. Groovy використовує Java-подібний синтаксис з динамічної компіляцією в JVM байт-код і безпосередньо працює з іншим Java кодом і бібліотеками. Мова може використовуватися в будь-якому Java-проект або як скриптова мова.

23. Visual Basic .NET


Об'єктно-орієнтована мова програмування, який можна розглядати як черговий виток еволюції Visual Basic, реалізований на платформі Microsoft .NET. VB.NET не має зворотної сумісності з більш ранньою версією (Visual Basic 6.0). Розвиток проектів старих версій (* .vbp) можливо тільки після попередньої конвертації їх в формат VB.NET спеціальним майстром (Migration Wizard); проте, після конвертації потрібна істотна ручна доробка текстів.

24. D

Мультипарадигмальності компільований мова програмування, створена Уолтером Брайт з компанії Digital Mars. Спочатку D був задуманий як реінжиніринг мови C ++, проте, незважаючи на значний вплив С ++, не є його варіантом. Також мова зазнала впливу концепцій з мов програмування Python, Ruby, C #, Java, Eiffel.

25. Assembler


Машинно-орієнтована мова низького рівня з командами, не завжди відповідними командам машини, який може забезпечити додаткові можливості зразок макрокоманд; автокод, розширений конструкціями мов програмування високого рівня, такими як вираження, макроси, засоби забезпечення модульності програм.

Мова асемблера - система позначень, яка використовується для подання в зрозумілій формі програм, записаних в машинному коді. Мова асемблера дозволяє програмісту користуватися алфавітними мнемонічними кодами операцій, на свій розсуд присвоювати символічні імена регістрів ЕОМ і пам'яті, а також задавати зручні для себе схеми адресації. Крім того, він дозволяє використовувати різні системи числення для представлення числових констант і дає можливість позначати рядки програми мітками з символічними іменами з тим, щоб до них можна було звертатися.

Я не став брати всі мови тому вони не так сильно затребувані у професійних програмістів. Моя задача виконана, тепер Вам залишилося вибрати потрібну мову і підкорювати його. Удачі Вам у ваших починаннях.



Сподобалася стаття? поділіться їй