Создаем свой язык программирования

Введение

До этого в своей работе мы использовали только один язык программирования - Python, но, как вы догадывайтесь, их гораздо больше.

Сегодня мы поговорим о том, какие бывают языки программирования, как они функционируют и даже попробуем придумать собственный. В общем, материала много, должно быть интересно.

Сколько существует языков программирования?

Сколько существует языков программирования? Это сложный вопрос, скорее всего - более 500. Многие из них создаются в процессе учебы/для развлечения. Многие использовались раньше, но сейчас мало популярны.

Горадо более интересен вопрос, какие из них наиболее популярны. Определить это можно по разному: например, можно подсчитать на скольких страницах в интернете упоминается язык, так делает рейтинг TIOBE - https://www.tiobe.com/tiobe-index/.

Другой способ - подсчитать количество кода на разных языках в проектах с открытым исходным кодом, так, например, делает рейтинг GitHub (платформа для хранения кода и командного взаимодействия программистов) - https://tproger.ru/articles/github-top-10-languages-2017/.

Несмотря на то, что позиции языков в разных рейтингах различны и меняются со временем, основные действующие лица достаточно стабильны. Далее мы обсудим эти языки более подробно.

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

Общепринятой классификации языков программирования на данный момент не существует, но можно выделить некоторые ключевые отличия.

Примеры кода в разных языках программирования: http://cs.lmu.edu/~ray/notes/pltypes/

  1. Как мы замечали ранее, существуют языки низкого и высокого уровня. Языки низкого уровня (ассемблеры) позволяют напрямую отправлять команды процессору, а языки высокого уровня (все остальные языки) писать понятный человеку код одновременно для большого числа устройств.

  2. Языки различаются по назначению. Языки общего позволяют решать практически любые задачи (например, python или Java), а специализированные языки служат конкретным целям. Например, язык PostScript используется для программирования заданий для принтера (печать изображений), а язык SQL - для запросов к реляционным базам данных.

  3. Языки различаются по модели выполнения. Программу на компилируемом языке (C, C++, Pascal...) перед запуском необходимо скомпилировать - транслировать (перевести) в машинный код. На выходе получится бинарный файл (.exe в windows).

Интепретируемые языки (PHP, Perl, отчасти python) для запуска используют специальную программу - интерпретатор, которая в реальном времени исполняет команды, описанные в коде. Например, для запуска программы на питоне, в системе должен быть установлен питон.

Сейчас большинство таких языков альтернативно могут использовать JIT-компиляцию (Just In Time компиляция - методика, которую изначально используют Java и C#). Программа перед запуском транслируется в промежуточное представление - байт-код, который похож на ассемблер, но не привязан к конкретному процессору. Трансляция в машинный код происходит непосредственно в процессе работы программы. Это позволяет совместить портируемость интерпретируемых языков (один код работает везде, если есть интерпретатор) со скоростью компилируемых (скомпилированная программа работает на конкретной платформе, но очень быстро).

  1. Ну и, конечно, парадигма программирования - это общий подход к составлению программ. Большинство современных языков поддерживают разные стили написания кода - они мультипарадигмальны. В данный момент мы используем процедурный стиль программирования (программа = блок-схема), а в следующем семестре рассмотрим и другие подходы - ООП и функциональное программирование.

Самые популярные языки

Вернемся к списку самых популярных языков от GitHub.com и рассмотрим их подробнее.

№1 JavaScript

Главный герой списка прошел долгий путь от обычного интерпретируемого языка для оживления веб-страниц, который выполняется в браузере (интерпретатор js встроен во все современные браузеры) до языка, который сейчас используется повсеместно.

Главная причина - это, конечно, повсеместное распространие веб-сервисов. На Javascript по прежнему пишется фронтенд в интернете, но теперь это уже большие самостоятельные приложения, такие, как фронтенд ВК или Gmail. Для упрощения таких задач существуют большие фреймворки, такие, как JQuery, AngularJS, React. NodeJS теперь позволяют писать на js не только фронтенд, но и серверную часть сайтов.

Но настоящий бум произошел, когда большое распространение получили веб-сервисы, замаскированные под офлайновые приложения. В мобильном приложении на весь экран запускается браузер в котором отображается веб-страница, внешне неотличимая от настоящего приложения. В мобильных приложениях для этого используются фреймворки Apache Cordova, Ionic, React Native. Для настольных приложений используется Electron.

Пример кода:

<script>
var y=window.prompt("please enter your name")
window.alert(y)
</script>

№2 Python

С питоном вы уже неплохо знакомы - это JIT-компилируемый язык общего назначения. Второе место по популярности занимает благодаря простоте синтаксиса и огромной библиотеке доступных модулей в любой области.

На питоне очень удобно писать произвольные настольные и серверные программы. На данный момент есть проблема с мобильными приложениями, но есть способы ее обойти, например Kiwi.

№3 Java

Классический пример объектно-ориентированного JIT-компилируемого промышленного языка. В основном используется в мобильных приложениях (Android), кроссплатформенных настольных приложениях и веб-сервисах (например, банковских системах).

Пример кода:

public class SimpleIfElseStatementExample {
  public static void main(String[] args) {     
     int i = 0;

     if(i == 0)
       System.out.println("i is 0");
     else
       System.out.println("i is not 0");
  }
}

№4 Ruby

По сфере применения и принципу работы похож на python. Подробнее - https://ru.wikipedia.org/wiki/Ruby. Наиболее известен, как язык для построения веб-сервисов, благодаря фреймворку Rails.

Пример кода:

a = [ 45, 3, 19, 8 ]
b = [ 'sam', 'max', 56, 98.9, 3, 10, 'jill' ]
print (a + b).join(' '), "\n"
print a[2], " ", b[4], " ", b[-2], "\n"
print a.sort.join(' '), "\n"
a << 57 << 9 << 'phil'
print "A: ", a.join(' '), "\n"

b << 'alex' << 48 << 220
print "B: ", b.join(' '), "\n"
print "pop: ", b.pop, "\n"
print "shift: ", b.shift, "\n"
print "C: ", b.join(' '), "\n"

b.delete_at(2)
b.delete('alex')
print "D: ", b.join(' '), "\n"

№5 Go

Компилируемый многопоточный язык от Google - https://ru.wikipedia.org/wiki/Go

№6 PHP

PHP - это изначально и до сих пор главный язык в вебе. Его основная задача - написание кода для серверной части веб-сервисов.

Пример кода:

<?php
$t = date("H");

if ($t < "20") {
    echo "Have a good day!";
}
?>

№7-8 C/C++

Классические компилируемые языки, которые позволяют как работать с железом на низком уровне для написания драйверов и операционных систем, так и на высоком, для разработки прикладных приложений, например, используя Qt или Windows Forms.

#include <iostream>
#include <cstdlib> // для system
using namespace std;

int main() 
{ 
    cout << "Hello, world!" << endl;
    system("pause"); // Только для тех, у кого MS Visual Studio
    return 0; 
}

№9 Typescript

Объектно-ориентированный аналог Javascript от Microsoft, который транслируется в него. Сфера применения - аналогична.

№10 С Sharp

С# - это изначально аналог Java от компании Microsoft. На этом объектно-ориентированном (это парадигма) JIT-компилируемом языке общего назначения можно писать программы для платформ Microsoft: настольные приложения для Windows и Windows Phone, веб-сервисы на ASP.MVC, игры на Unity.

Сейчас Microsoft активно продвигает решения для запуска программ на C# на других платформах (.NET Core, Mono), а также решения для разработки кроссплатформенных мобильных приложений на этом языке - Xamarin.

Пример кода:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace check1
{
    class Program
    {
        static void Main(string[] args)
        {
            int i;
            Console.Write("Enter a Number : ");
            i = int.Parse(Console.ReadLine());
            if (i % 2 == 0)
            {
                Console.Write("Entered Number is an Even Number");
                Console.Read();
            }
            else
            {
                Console.Write("Entered Number is an Odd Number");
                Console.Read();
            }
        }
    }
}

Изотерические языки программирования

Изотерические языки программирования - это отдельный класс языков, которые разработаны либо с целью изучения границ возможностей разработки языков, либо, в качестве шутки.

Обычно такие языки состоят всего из нескольких команд, однако полны по Тьюрингу, т.е. теоретически позволяют написать произвольную программу.

Примеры кода на 39 изотерических языках - https://habrahabr.ru/company/edison/blog/313334/

Наиболее известный изотерический язык - Brainfuck - состоит всего из восьми операций, которые обозначаются знаками арифметических операций и скобочками.

Другой пример - язык Petooh - состоит из криков петуха.

Свой язык программирования

Принцип работы

Если языков так много, то почему бы не придумать свой?

В таком случае перед нами встает две проблемы: язык нужно придумать, а затем написать для него транслятор.

Даже если мы придумаем идеальный язык, без транслятора никто не сможет написать программу на нем. К задаче написания транслятора есть два подхода:

  1. Написать транслятор в машинный код. Это задача выполнимая, но на нашем уровне - очень сложная. Если вам интересна эта тема, можно начать копать здесь и здесь.
  2. Написать транслятор в другой язык, для которого уже существует транслятор в машинный код. Например, транслировать наш язык в питон или яваскрипт. Так работают Petooh (транслируется в десяток языков), язык для реальных пацанов (транслируется в javascript) и, разработанный авторами этого курса, язык pithon [писон] (транслируется в python).

Второй вариант выглядит гораздо доступнее, поэтому выбрать на этом этапе предлагается именно его. Транслировать мы будем, конечно, в python.

Требования к языку

Чтобы языком можно было пользоваться, он должен поддерживать достаточное количество операций, включая:

  • определение переменных
  • операции с переменными
  • условный оператор, логические операции
  • циклы

Для каждой из этих операций можно придумать свое название и синтаксис, но, учитывая необходимость трансляции, старайтесь всегда держать в голове процесс преобразования вашего языка в Python.

В самом простом случае в вашем языке можно просто переназвать все команды, а в процессе трансляции использовать replace для замены на команды из питона.