Основи більшості процедурних мов майже однакові.
Вони пропонують:
- Скалярні типи даних: зазвичай булі, цілі числа, поплавці та символи
- Складені типи даних: масиви (рядки - це окремий регістр) та структури
- Основні побудови коду: арифметика над скалярами, доступ до масиву / структури, завдання
- Прості структури управління: якщо-то, якщо-то-ще, поки, для циклів
- Пакети блоків коду: функції, процедури з параметрами
- Області застосування: області, в яких ідентифікатори мають конкретні значення
Якщо ви це розумієте, ви добре розумієте 90% мов на планеті. Що робить ці мови трохи складнішими для розуміння, це неймовірне різноманіття непарного синтаксису, який люди використовують, щоб сказати ті самі основні речі. Деякі використовують стислі позначення, що містять непарні пунктуації (APL є крайнім). Деякі використовують безліч ключових слів (COBOL є прекрасним представником). Це не має великого значення. Важливо, якщо мова є достатньо повною, щоб робити складні завдання, не змушуючи вас виривати волосся. (Спробуйте кодувати кілька серйозних хакерських рядків у сценарії оболонки Window DOS: це Тьюрінг здатний, але дуже поганий у всьому).
Більше цікавих процедурних мов пропонують
- Вкладені або лексичні області застосування, простори імен
- Покажчики, що дозволяють одному об'єкту звертатися до іншого, з динамічним розподілом пам’яті
- Упаковка пов'язаного коду: пакети, об'єкти з методами, ознаками
- Більш досконалий контроль: рекурсія, продовження, закриття
- Спеціалізовані оператори: рядкові та масивні операції, математичні функції
Хоча технічно це не властивість мови, а властивість екосистеми, в якій живуть такі мови, є бібліотеками, які легко доступні або надаються мовою як частина інструменту розвитку. Наявність широкого спектру бібліотечних засобів спрощує / прискорює написання програм просто тому, що не потрібно винаходити те, що роблять бібліотеки. У той час як Java та C # вважаються хорошими мовами самі по собі, що робить їх справді корисними - це величезні бібліотеки, що постачаються разом із ними, і легкодоступні бібліотеки розширень.
Мови, які важче зрозуміти, є непроцедурними:
- Чисто функціональні мови, без призначень і побічних ефектів
- Логічні мови, такі як Prolog, в яких відбуваються символьні обчислення та об'єднання
- Мови відповідності шаблонів, в яких ви вказуєте фігури, які відповідають задачі, і часто дії ініціюються збігом
- Мови обмежень, які дозволяють задавати відносини та автоматично вирішувати рівняння
- Мови опису апаратних засобів, в яких все виконується паралельно
- Мови, характерні для домену, такі як SQL, кольорові мережі Петрі тощо.
Існує два основних стилі репрезентації для мов:
- На основі тексту, в якому ідентифікатори іменних об'єктів та потоки інформації кодуються неявно у формулах, які використовують ідентифікатори для іменування сутностей (Java, APL, ...)
- Графічний, в якому об'єкти малюються як вузли, а відносини між сутностями малюються як явні дуги між цими вузлами (UML, Simulink, LabView)
Графічні мови часто дозволяють текстовим підмовам як анотації у вузлах та на дугах. Графічні мови одержуваних рекурсивно дозволяють графіки (з текстом :) у вузлах і на дугах. Дійсно непарні графічні мови дозволяють графікам анотацій вказувати на графіки, що коментуються.
Більшість цих мов засновані на дуже невеликій кількості моделей обчислень:
- Обчислення лямбда (основа для Lisp та всіх функціональних мов)
- Пост-системи (або методи перезапису рядків / дерев / графіків)
- Машини Тьюрінга (модифікація стану та вибір нових комірок пам'яті)
Зважаючи на зосередженість більшості галузей на процедурних мовах та складних структурах управління, вам добре послужить, якщо ви добре вивчите одну з найбільш цікавих мов цієї категорії, особливо якщо вона включає певний тип орієнтації на об'єкт.
Я настійно рекомендую вивчити Схему, зокрема із справді чудової книги:
Структура та інтерпретація комп’ютерних програм . Тут описані всі ці основні поняття. Якщо ви знаєте цей матеріал, інші мови будуть здаватися досить зрозумілими, крім синтаксису goofy.