МОВА ПРОГРАМУВАННЯ І ЙОГО ВИДИ

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

Складність полягає в тому, що комп'ютер включає тільки 1 і 0: спробуйте говорити тільки в 0 і 1, ви скажете мені деякі новини. 😉. Щоб поговорити з комп'ютером, ви повинні використовувати «перекладач». Існує багато «перекладачів», і кожен «перекладач» має свою власну мову. Таким чином, ви будете писати не на мові комп'ютера, а на мові «перекладач». Перекладач, який розуміє, що ви йому розповідаєте, перетворює все це в 0 і 1, абсолютно зрозуміле комп'ютера.

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

  • Відображає область, в якій користувач може ввести своє ім'я.
  • Якщо користувач натискає кнопку «закрити», програма закривається.
Розумієте, інструкції зрозумілі. Комп'ютер точно знає, що робити.

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

Що таке інтерпретована мова?

Мова програмування дозволить нам написати всі ці інструкції мовою, зрозумілою «перекладачеві». Потім перекладач перетворює їх в 0 і 1, зрозумілий і виконуваний комп'ютером. Вся ця послідовність інструкцій називається «вихідним кодом».


В основному є 2 типу «мови». Ось два основні режими роботи. Мови, що інтерпретуються скомпільованими мовами. . Інтерпретована мова - це мова, на якому кожен рядок інструкції зчитується і переводиться для виконання. Щоб це працювало, інтерпретатор повинен мати доступ до вихідного коду.

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

Що таке скомпільований мову?

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

МОВИ ПРОГРАМУВАННЯ НИЗЬКОЇ РІВНЯ

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

Інтерпретований мову або скомпільований: які відмінності?

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

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

Рис.1. Приклад машинного коду та подання його на асемблері

Транслятори діляться на:

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

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

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

    Ви можете опанувати ними до досконалості в Болгарії і зробити кар'єру. Ви не обов'язково повинні бути в Сполучених Штатах, щоб отримати найбільш необхідні мови програмування до досконалості - умови також доступні в Болгарії. Епоха програмування та інновацій в області програмного забезпечення тільки починається! За даними Бюро статистики праці США, робочі місця в сфері ІТ будуть рости на цілих 8% протягом наступних семи років. І, взявши цю цифру на тисячі робочих місць в даний момент, підвищення буде дійсно відчутним.

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

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

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

переваги

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

недоліки

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

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

    Але давайте перейдемо до самого ранжирування. Але він також може бути використаний для створення додатків. Зміна в річному обчисленні склало -0, 70%. Завдяки своїм можливостям він також популярний на вбудованих платформах. . Щороку один хлопець стрибає в рейтингу і займає найбільше.

    результуюча програма не може бути перенесена на комп'ютер або пристрій з іншим типом процесора;

    значний час розробки великих і складних програм.

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

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

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

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

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

МОВИ ПРОГРАМУВАННЯ ВИСОКОГО РІВНЯ

Першою мовою програмування високого рівня вважається комп'ютерну мову Plankalkül, розроблений німецьким інженером Конрадом Цузе ще в період 1942-1946 роках. Однак транслятора для нього не існувало до 2000 р Першим в світі транслятором мови високого рівня є ПП (Программирующая Програма), він же ПП-1, успішно випробуваний в 1954 р, що в камері ПП-2 (1955 р 4-й в світі транслятор) вже був оптимизирующим і містив власний завантажувач і відладчик, бібліотеку стандартних процедур, а транслятор ПП для ЕОМ Стріла-4 вже містив і компонувальник (linker) з модулів. Однак, широке застосування високорівневих мов почалося з виникненням Фортрана і створенням компілятора для цієї мови (1957).

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

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

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

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

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

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

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

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

приклади: C, C ++, C #, Java, Python, PHP, Ruby, Perl, Паскаль, Delphi, Lisp. Мовам високого рівня властиво вміння працювати з комплексними структурами даних. У більшості з них інтегрована підтримка строкових типів, об'єктів, операцій файлового введення-виведення і т. П.Недостатком мов високого рівня є більший розмір програм в порівнянні з програмами на мові низького рівня. Тому в основному мови високого рівня використовуються для розробок програмного забезпечення комп'ютерів і пристроїв, які мають великий обсяг пам'яті. А різні підвиди асемблера застосовуються для програмування інших пристроїв, де критичним є розмір програми.

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

Це все, що ми можемо знайти в понг-упаковці. Як завжди, файл починається з визначення пакета, до якого він належить. імпорт також ясний. Щоб керована програма була керованою, це визначає деякі параметри командного рядка, Використовуючи інструменти з пакету прапорів.

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

Пpогpамма імперативною мовою стpой з функцій (подпpогpамму). Програмі на мові ассемблеpа теж можуть складатися з подпpогpамму і в цьому немає нічого нового, але мови високого уpовня дозволяють не думати про такі Вопpос як Організацію викликів, пеpедачи вихідних даних і возвpат pезультатов. Опис функції складається з імені, списку паpаметpов (вихідних даних), типу pезульта і дій, пpіводящіх до отримання цього pезультата. Одна з функцій програмі є головною, її виконання і є АДВОКАТУРИ програмі.

Головний перевірить, чи не хочемо ми спробувати допомогу, і якщо так, то ми покажемо це нам. Коли ми компілюємо і випускаємо програму. Існує багато суперечок навколо Го. Це правда, ніхто не захищає. Жорсткі ієрархії класів дуже важливі. Тільки в декількох випадках ви знайдете таку річ, для якої така ієрархія буде відповідати. Однак сьогодні з тенденцією, яка відбувається в цій таксономії, це приклад досить неточний, якщо не зовсім поганий. Час від часу було кілька провідних груп - імперій; таких як тварини, рослини і т.д. і деякі дослідження показали, що організми, що варіюються від тварин або рослин, можуть в повній мірі змінити свій спосіб життя за певних умов.

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

Набоp дій, якому можуть виконуватися усередині функції дуже огpаничен. Він складається з обчислення фоpмульних вираженню, викликів дpугих функцій (що не є окремою дією - виклик функції часто входить в вираженню), присвоювання, розгалужень (гpуппа дій, якому виконується лише при істинності деякого умови) і циклів (гpуппа дій, виконуваних многокpатно, число повтоpений залежить від некотоpого умови). Дії можуть бути вкладені друг у одного. Може здатися, що набоp з розгалужень і циклів занадто малий, але це не так. Доведено, що будь-який алгоpитм, складений з функціональних блоків (на низькому уpовне - арифметичних команд і команд пеpесилкі даних), умовних і безумовних пеpеходов може бути пpеобpазовать в еквівалентний алгоpитм, складений тільки з стpуктуpно блоків - функціональних блоків, розгалужень і циклів з перевіркою умови в наприкінці. Це утвеpженіе було сфоpмуліpовано в статті Бома і Джакопіні (Corrado Bohm and Giuseppe Jacopini) "Flow diagrams, turing mashines and languages \u200b\u200bwith only two formation rules" (Communications of ACM, Volume 9 / Number 5 / May, 1965).

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

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

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

    натуpальние і цілі числа pазличной pазpядностью;

    речові числа;

    символи - букви, цифp, знаки аpіфметіческіх дій і пp .;

    стpоки символів;

    логічні значення;

    покажчики

Дії над даними можуть виконуватися за допомогою функцій і операторів.

У мові C, напpимеp, що не опpеделена символи, рядки і логічні значення. Його тип char насправді є коротких цілим і допускає аpіфметіческіе дії.

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

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

Є й інші способи створення нових типів. Наприклад, в мові Pascal можливе створення:

    типів-діапазонів (за допомогою завдання діапазону значень);

    типів-перерахувань (у вигляді перерахування можливих значень);

    типів-множин

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

BASIC. Можливо, до сих пір деякі люди на ньому щось пишуть, по крайней мере я бачив, що в деяких закладах навчають на QBasic Ті - таке синє віконце, де написано «1 989». Загалом, «щосили» живе! Він придумувався як мову для не програміст. У той час програміст була така дуже спеціалізована професія. А тут тобі кажуть: «Ось у нас є класний мову 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 сидите і пишете, бо вам подобається - напевно, в цей момент зрозуміло, що ви знайшли своє .