Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Пишем синтаксический сахар для PHP

Anna | 31.05.2014 | нет комментариев

Только ленивый, вернее, ну дюже ленивый не скажет про PHP пару ласковых. Стоит мимолётом покритиковать разработчиков за то, что огромнее половины попыток поправить обстановку с фаршированием стандартной библиотеки, несогласованности и отсутствием того, что дюже крепко понравилось в *подставить свой любимый язык* только её (обстановку) ухудшают, а те, что влияют позитивно — не доработаны; Безусловно же это провокация и ведёт к неотвратимому холивару, но давайте постараемся избежать этого. Из достаточно продолжительных размышлений на эту тему и родилась одна затея…

Скажите, а чай вы хотите что-то изменить в языке, исправить? Знакомясь с новыми языками и подходами, лично у меня — эта мысль крепла. Я попробовал достаточно много подходов, начиная от попытки написать личный интерпретатор, не владея довольными умениями — попытка провалилась, заканчивая переписыванием php исходников (не интерпретатора, а самих *.php файлов) — сначала нативный интерпретатор парсит изменённые исходники, после этого транслирует в кодсохраняет данные и теснее их интерпретирует, но, добившись определённых итогов — и эта попытка была погребена вследствие своему неудобству и «костылеобразности». И, теснее примерно разочаровавшись в этой затее — мне помог докладчик на DevConf (если не заблуждаюсь — Александр NightTiger), сам того не подозревая. Отчет был про аспектно-ориентированное программирование и одной из просьб докладчика, которая и подтолкнула меня на верный путь, была: «Поднимите руки те, кто знает про php фильтры».

Немножко покопавшись в мануале, перечитав исходники Aspect фреймворка (их, к слову, на гитхабе нашлось несколько — абсолютно различных), погуглив — я наконец пришёл к тому итогу, которого я ожидал — «Эврика!», воскликнул я. Дело осталось за малым, набросать на коленке за пару часов рабочий код и дело было в шляпе — всё о чём мечтал — свойства, перечисления, именованные параметры, типичное приведение типов и много чего ещё, всё что дозволено представить, без растяжений, без костылей и геморроя — вот оно блаженство! То, на что я потратил несколько месяцев раздумий, попыток написать что-то и сотни струнок нервов из нержавейки — неужто мечта, так заботливо лелеянная мной скоро воплотится? Каково же было моё изумление, когда мой «говнокод» (да извинит меня социум за столь непристойный термин) подлинно заработал, и даже так, как я примерно хотел.

Для затравки:

<?php
import Accessors, Enum, Properties from std;

namespace Ololo 
{
        enum Color
        {
                Red,
                Blue,
                Green,
                Yellow
        }

        class Some
        {
                private:
                        $asdasd = 23;
                        $some   = 42;

                public $some
                {
                        get; 
                        set($value) 
                        {
                                return (int)$value   42;
                        }
                }

                public function __construct()
                {
                        echo Color::Red . OloloColor::Blue;
                }
        }
}

Дальше следовало:
1) Написание плана (роадмапа) плана
2) Полное переписывание того двухчасового ужаса, что я набросал
3) Изыскание комьюнити. Суждения, пожелания, взлетитнафиг_оно_надо

С первым было огромнее каждого задач, я остановился на варианте встраивания того, что всецело совместимо с языком — по-умолчанию. Все указания типов в параметрах, свойства и другое-другое обязаны быть доступны сразу — оно не ломает нисколько обратную совместимость, для остального же решил применять подход, схожий на питон — конструкцию import, которая указывает:

import ЧТО from ПАКЕТ;

где «ЧТО» — наименование файлакласса согласно спецификации PSR-0, а «ГДЕ» — указание на комплект пакетов, будь то типовые, либо добавленныенаписанные пользователем вручную. Нынешний вариант стандартных пакетов включает в себя:

Сам список:

* draft Приведение типов
* todo function __init — механически вызываемый способ при инициализации класса (require файла с ним)
* todo Свойства
* todo Перечисления
* todo Аспекты
* todo Именованные параметры
* todo Упрощенное объявление области видимости свойствметодов
* todo Стандартизация всех функций и вынос их в отдельные пространства
* todo Скаляры в виде объектов

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

2-й пункт тоже абсолютно получился. Исходники достаточно славные (я считаю, крепко не бейте :D ) на ощупь: github.com/SerafimArts/Mirror

И наконец под третьим пунктом — увлекательно именно ваше суждение, уважаемое програсообщество.

Взамен послесловия хочу подметить:
— На данный момент всецело готово ядро.
— Реализовано приведение типов в параметрах методовфункций github.com/SerafimArts/Mirror/wiki/Type-Castingвключая рабочий пример: github.com/SerafimArts/Mirror/blob/master/examples/TypeCasting/test.php
— Нет юнит-тестов
— Нет документации, но есть всецело документированный код
— Отсутствует установка через Composer
— Но есть собранный phar пакет

Применение:

<?php
require('phar://mirror.phar');   // либо "lib/Mirror/bootstrap.php"
require_mirror('pathtofile.php');

и внутри подключённого с поддержкой функции require_mirror (либо include_mirror) файла, включая безусловно все внутренние инклуды (даже с поддержкой стандартных функций) будет вероятность применять синтаксис Mirror — именно так я назвал данное поделие — как отражение языка, а пакеты — стёкла либо призмы (Glass) с поддержкой которых дозволено изменять язык.

В последующих статьях (если они всё же случатся) я хочу ознакомить вас с внутренним устройством библиотеки — как написать свою «призму», как работает кеширование, подробными планами на грядущее и ещё чем-нибудь, что вас заинтересует. План достаточно сырой (был написан за время отпуска на чёрном море — сами понимаете), так что статья нацелена именно на ваши отзывы и пожелания, что бы предварительно не накосячить с разработкой. Спасибо огромное за внимание.

UPD: Исправил английский перевод слова «стёкла»

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB