Компонентный Паскаль — язык программирования, созданный на основе языка Оберон-2 компанией Oberon microsystems, Inc. Компонентный Паскаль является прямым наследником языка Паскаль. Схема прямого наследования: Паскаль → Модула-2 → Оберон → Оберон-2.
Синтаксис языка
Основные уточнения Компонентного Паскаля по сравнению с Обероном-2 касаются следующего:
- Введены языковые механизмы (специальные атрибуты для типов и методов), позволяющие удовлетворить повышенным требованиям надежности компонентно-ориентированного программирования. Теперь автор программной компоненты (группы модулей) имеет полный контроль в плане того, разрешать или нет модулям-клиентам расширять предлагаемые им типы.
- Модернизирована несколько устаревшая система основных типов Оберона: теперь набор основных типов Компонентного Паскаля является надмножеством для основных типов языка Java. Основные «рабочие» типы INTEGER, REAL и CHAR соответствуют 32-, 64- (т. н. двойная точность) и 16-(Unicode)-битовым переменным, что позволяет уменьшить разнообразие основных типов, реально используемых в большинстве случаев; использование других типов (LONGINT, SHORTREAL, SHORTCHAR и т. д.) ограничивается специальными приложениями.
- Добавлены базовые средства для работы с цепочками литер (неявный тип String), что вместе со стандартным модулем Strings в системе программирования BlackBox делает Компонентный Паскаль удобным для тех приложений, где обычно используются скриптовые языки. Цепочки литер представляются массивами литер (ARRAY OF CHAR или ARRAY OF SHORTCHAR), причем значением считается последовательность литер до первого вхождения специальной литеры-ограничителя 0X. Цепочки литер можно сравнивать (подразумевается лексикографическое сравнение) и складывать (конкатенация). Конструкция a := b$ позволяет скопировать в массив литер a цепочку, хранящуюся в массиве литер b (включая литеру-ограничитель 0X), даже если присваивание a := b запрещено (скажем, из-за разной длины массивов a и b).
Реализации
Имеются две реализации Компонентного Паскаля:
9. В чем особенность языка программирования Компонентный Паскаль
BlackBox Component Builder
Система программирования BlackBox (производитель Oberon microsystems), работающая под ОС Microsoft Windows и Mac OS и представляющая собой полноценный профессиональный инструмент (имеет профилировщик, возможность создавать автономные exe и dll файлы, обращаться к интерфейсам ОС, а также Microsoft Office, базовые средства работы с базами данных, поддержку коммуникационных протоколов TCP/IP и т. д.). Наиболее впечатляющий аспект системы BlackBox — наличие мощного компонетного каркаса (component framework = библиотека типов и методов) для создания диалоговых систем, интерактивной графики, а также составных документов. Версия под Microsoft Windows прозрачно поддерживает механизм OLE. BlackBox чрезвычайно надежен и удобен в работе (компилятор и каркас шлифуются с 1993 года, при этом развитие идёт, в основном, через добавление новых компонент — совершенно в духе Оберона и КОП). Слабой чертой является отсутствие достаточно подробного «щадящего» описания каркаса, хотя в дистрибуции имеется довольно богатый набор нетривиальных примеров программ.
Урок 1. Первая программа на Pascal (Сложение чисел)
Gardens Point Component Pascal
Эта реализация языка Компонентный Паскаль для среды .NET выполнена в австралийском Queens University (место работы со-основателя Oberon microsystems Клеменса Шиперского до его перехода в Microsoft Research). На данный момент не вполне ясно, насколько полно реализован язык в этом компиляторе (первые версии имели некоторые ограничения), а также достиг ли он степени надежности, необходимой для практического применения.
Литература
- J. Stanley Warford. Programming with BlackBox (англ.) (2Мб)
- Brett S.Hallett. Developing Programs with BlackBox Oberon (англ.) (1,5 Мб)
Ссылки
- Oberon microsystems, Inc.
- Проект OberonCore
- Component Pascal Collection — коллекция программ, написанных на Компонентном Паскале от Хельмута Зинна.
- Система BlackBox. Компонентный Паскаль, 108 сс., 1.8Мб, Информатика-21, перевод части документации
- Компания Oberon microsystems. «Сообщение о языке Компонентный Паскаль», перевод Ф. В. Ткачева
- Знакомство со средой
- Пишем свой первый модуль
- Образовательный проект Информатика-21, посвященный языку Оберон, на сайте есть русифицированный компилятор BlackBox
- Сборки BlackBox (с документацией), проект Информатика-21
- Система BlackBox. Компонентный Паскаль, 108 с., 1.8Мб
- учебные материалы Хабаровской школы программистов
Источник: www.sbup.com
Все статьи
СЕКЦИЯ-ДОК-НЯ Ссылка: ДОК-НЯ::СЕКЦИЯ-ДОК-НЯ
СЕКЦИЯ-Общее Ссылка: ДОК-НЯ::СЕКЦИЯ-Общее
состав-компилятора Ссылка: ДОК-НЯ::состав-компилятора
Состав компилятора Важная информация о структурах данных компилятора — в конце модуля НяФс.
НяЛексер — лексер, существует в единственном экземпляре НяПарсер — парсер, то же НяМ — Вычитывание_исходного_текста_модуля_из_отображения, Чтение_простых_типов_из_символьного_файла Запись_простых_типов_в_символьный_файл Запись_объектного_файла НяФк — порождение кодового файла НяД — строит синтаксическое дерево, проводит контроль и неявное преобразование типов НяФс — файлы символов: создание, импорт, поиск НяГенКода486 — генератор кода НяИспользование — UseCalls и UseReals, что делают — не знаю. НяГ486Ву — генератор кода, высокий уровень (?) НяГ486Ну — генератор кода, низкий уровень (?)
опции-компиляции Ссылка: ДОК-НЯ::опции-компиляции
Опции компилятора ищутся в документации ББ по словам «Особенности, зависящие от платформы».
СЕКЦИЯ-описания-отдельных-файлов Ссылка: ДОК-НЯ::СЕКЦИЯ-описания-отдельных-файлов
ня-компилятор Ссылка: ДОК-НЯ::ня-компилятор
Пакет команд для компилятора Ня. Критичные для безопасности проверки времени выполнения проводятся всегда (охрана типов, проверки границ массивов, и т.п.), в то время как не критичные проверки не могут генерироваться вообще (SHORT, переполнение целых, проверка вхождения во множества). «Критичные» означает, что может быть повреждена нелокальная память, с неизвестными глобальными эффектами.
PROCEDURE Compile — Компилирует модуль Ня, исходный текст которого находится в фокусированном отображении.
PROCEDURE CompileAndUnload — компилирует модуль, исходный текст которого находится в фокусированном отображении. Если компиляция проходит успешно, то старая версия этого модуля выгружается. CompileAndUnload полезна при разработке модулей верхнего уровня, то есть таких, которые не импортируются другими модулями и поэтому могут быть отдельно выгружены.
PROCEDURE CompileModuleList — компилирует список модулей, имена которых выделены. Когда обнаруживается первая ошибка, содержащий ее исходный код открывается, показывая ошибку.
PROCEDURE CompileSelection — компилирует модуль, начало которого выделено.
PROCEDURE CompileThis — используется в тексте с DevCommanders.View. Эта команда берет текст, следующий за ним, и интерпретирует его как список модулей, которые следует откомпилировать. Похожа на CompileModuleList за исключением того, что не нужно выделение.
ня-парсер Ссылка: ДОК-НЯ::ня-парсер
Парсер. Проще всего идти по грамматике из определения языка. Каждый элемент грамматики переведён на русский. Функция разбора этого элемента называется «Разбери», например, «РазбериМодуль», но может содержать и уточнения. Отфильтровать все можно поиском по подстроке «PROCEDURE Разбери»
СЕКЦИЯ-процесс-документирования Ссылка: ДОК-НЯ::СЕКЦИЯ-процесс-документирования
обращение-с-константами Ссылка: ДОК-НЯ::обращение-с-константами
У нас нет инструментов рефакторинга, чтобы исключить дублирование блоков констант (а можно было бы их положить в отдельный модуль). Нужно реанимировать ПроверитьИнклюды и применить здесь, чтобы проверять их совпадение. Пока что каждая группа констант описывается в одноимённой статье данного документа с тегом ОПИСАНИЕ-ГРУППЫ-КОНСТАНТ . Если понимаем, переводим. Если нет — оставляем. При переводе не убираем комментарии, а добавляем к ним русские рядом — на случай, если мы пропустим часть английских, чтобы у нас оставалась смысловая связка.
правила-переименования Ссылка: ДОК-НЯ::правила-переименования
EnglishName => РусскоеИмя_EnglishName предпочтительно Но иногда можно просто превратить в русское имя. Тогда английское надо упомянуть хотя бы в комментарии, в угловых скобках.
словарь Ссылка: ДОК-НЯ::словарь
Лексер выдаёт лексемы, а не символы.
New = Яви (т.к. этот New вызывает тот, к кому мы сейчас обращаемся. Явись было бы, если бы обращались к самому объекту, который должен родиться)
Процедура внутри другой процедуры — Подпроцедура
Case = Сита — состоит из нескольких вариантов, каждый из которых называется Сито.
forward declaration = Упреждающее объявление
правила-документирования-определений Ссылка: ДОК-НЯ::правила-документирования-определений
MODULE ZZZ; (**** Комментарий к модулю *) (** Полный комментарий *) Name = RECORD (* Краткий комментарий *) (** Подробный комментарий к полю, если надо *) Field (* Здесь комментарий *) (** Полный комментарий *) PROCEDURE Имя(args); (* Краткий комментарий *) (* ? Информация в комментарии и имя объекта требуют уточнения *)
правила-документирования-разделов Ссылка: ДОК-НЯ::правила-документирования-разделов
(*** Название_раздела , см. также Название_другого_раздела *)
СЕКЦИЯ-понятия Ссылка: ДОК-НЯ::СЕКЦИЯ-понятия
пример-SYSTEM-точка-VAL Ссылка: ДОК-НЯ::пример-SYSTEM-точка-VAL
Пытаемся взять одну функцию SYSTEM.VAL и отследить её историю по всему компилятору.
Регистрация
Функция регистрируется (становится известной компилятору) в модуле НямФС: EnterProc(«VAL», valfn);
Далее нужно искать valfn.
Документация
«Особенности, зависящие от платформы», Dev/Docu/P-S-I.odc
VAL(T, x), значение значение x интерпретируется как имеющее тип T
Участие в исходных текстах
НяД.StPar0 — обработка первого параметра стандартной функции. Обработки никакой не происходит, дело сводится к проверкам.
НяД.StPar1 — обработка второго параметра стандартной ф-ии (он обозначается x). Главное здесь — в конце. Тип результата (x.typ) назначается равным p.typ (типу первого параметра), а значение результата берётся из второго параметра (p := x) В итоге первый аргумент и сам вызов SYSTEM.VAL удаляются из дерева.
Итого
В простом случае обработка функции VAL сводится к тому, что её вызов выбрасывается, узел её второго аргумента получает другой тип времени компиляции, и его значение возвращается.
о-параметрах-процедур Ссылка: ДОК-НЯ::о-параметрах-процедур
Цель — узнать, как вставить в код (funcall ,(intern имя модуль) . ), где имя и модуль — константы, известные во время компиляции.
НяПарсер.GetParams НяПарсер.FormalParameters(proc.link, proc.typ, name) НяД.CheckParameters
план-реализации-полиморфной-функции Ссылка: ДОК-НЯ::план-реализации-полиморфной-функции
сделать «case» по примитивному типу, известному во время компиляции. Как-то так:
if ч.тип == ‘INTEGER’ then Обернуть ч в узел вызова функции NewItemFromInteger elseif ч.тип = ‘STRING’ then Обернуть ч в узел вызова функции NewItemFromString . endif
Как вставить вызов? Идём по процессу, как это делает компилятор.
РазбериМножитель РазбериИдентификторВтчСКвалификатором НяД.PrepCall(x, fpar); IF (x.obj # NIL) РазбериФактическиеПараметры(apar, fpar, pre, lastp); НяД.Call(x, apar, fpar); IF pre # NIL THEN НяД.Construct(Ncomp, pre, x);
И т.п. При этом, если идти по этим ф-ям, то видно, что можно задать модуль и пр-ру именами (например, ‘Kernel’ ‘NewItemFromInt’) и тем самым импортировать. Правда, нужно будет усовершенствовать сообщения об ошибках.
таблицы-символов Ссылка: ДОК-НЯ::таблицы-символов
НяФс.Import — импортирует модуль (объявление импорта одного файла в директиве IMPORT) Ищи комментарий «Импорт_модуля» . Общая идея: открывает символьный файл, всё читает из него, и вешает в виде графа связей в GlbMod.
Главный тип таблицы символов — это, похоже, НяФс.ObjDesc и указатель на него НяФс.Object
СЕКЦИЯ-Описания-групп-констант Ссылка: ДОК-НЯ::СЕКЦИЯ-Описания-групп-констант
NUMTYP-VALUES Ссылка: ДОК-НЯ::NUMTYP-VALUES
char = 1; integer = 2; real = 4; int64 = 5; real32 = 6; real64 = 7;
SYMBOL-VALUES-1-16 Ссылка: ДОК-НЯ::SYMBOL-VALUES-1-16
symbol values 1-16
Символы арифметических операций, включая сравнения, логических операций, а также is и in
SYMBOL-VALUES-17-76 Ссылка: ДОК-НЯ::SYMBOL-VALUES-17-76
symbol values 17-76
Символы разделителей, ключевые слова языка
SYMBOL-VALUES-20-76 Ссылка: ДОК-НЯ::SYMBOL-VALUES-20-76
symbol values 20-76
Похоже на подмножество symbol-values-17-76, но, как минимум, moudle (moduleSym) отличается написанием
OBJECT-MODES Ссылка: ДОК-НЯ::OBJECT-MODES
object modes
Может находиться в поле ObjDesc.mode. Например, символьная информация модуля имеет ObjDesc.mode = 11 (Mod)
классы-типов-данных Ссылка: ДОК-НЯ::классы-типов-данных
Классы типов данных (structure types)
Structure types Грубая классификация типов данных Перекликаются с тегами типов (см. Kernel DevHeapSpy.FormOf), но не полностью совпадают.
СЕКЦИЯ-недокументированные-особенности-ББЦБ Ссылка: ДОК-НЯ::СЕКЦИЯ-недокументированные-особенности-ББЦБ
VAL-может-принимать-имя-типа Ссылка: ДОК-НЯ::VAL-может-принимать-имя-типа
MODULE Бережок; IMPORT StdLog, SYSTEM; TYPE zz = RECORD END; VAR v : zz; BEGIN StdLog.Int(SYSTEM.TYP(v)); (* напечатает число *) StdLog.Int(SYSTEM.TYP(zz)); (* напечатает то же число *) END Бережок. (* ^q «Kernel.LoadMod(‘Бережок’)» *)
VAL-может-преобразовывать-букву-в-её-код Ссылка: ДОК-НЯ::VAL-может-преобразовывать-букву-в-её-код
MODULE Бережок; IMPORT SYSTEM; BEGIN ASSERT(SYSTEM.VAL(INTEGER,»ж»)=1078); ASSERT(SYSTEM.VAL(INTEGER,»b»)=98); END Бережок. (* ^Q «Kernel.LoadMod(‘Бережок’)» *)
THISRECORD—приведение-типа-от-массива-байт-к-записи Ссылка: ДОК-НЯ::THISRECORD—приведение-типа-от-массива-байт-к-записи
По сути это — преобразование от void* к типу записи. Страшная вещь, т.к. принимает адрес в виде числа. Источник сведений: ОберонЦоре
Ищите применения в исходнике. Параметры — Int32 (или «младшие»)
MODULE Бережок; IMPORT SYSTEM; TYPE ТипЮ = RECORD Поле:LONGINT END; VAR У1 : ТипЮ; VAR Адрес,ТегТипа:INTEGER; ЗначениеПоля:LONGINT; PROCEDURE ВерниПоле(IN З: ТипЮ):LONGINT; BEGIN RETURN З.Поле; END ВерниПоле; BEGIN У1.Поле := 115773100500; Адрес := SYSTEM.ADR(У1); ТегТипа := SYSTEM.TYP(ТипЮ); (* Почему-то нельзя присвоить переменной типа ТипЮ возврат SYSTEM.THISRECORD — компилятор падает. Но можно вызвать процедуру с параметром In *) ЗначениеПоля := ВерниПоле( SYSTEM.THISRECORD(Адрес,ТегТипа) ); ASSERT(ЗначениеПоля = У1.Поле); END Бережок. (* «Kernel.LoadMod(‘Бережок’)» *)
СЕКЦИЯ-справочные-таблицы Ссылка: ДОК-НЯ::СЕКЦИЯ-справочные-таблицы
таблица-из-генератора-кода-низкого-уровня Ссылка: ДОК-НЯ::таблица-из-генератора-кода-низкого-уровня
(* Items: mode | offset index scale reg obj ———————————————— 1 Var | adr xreg scale obj (ea = FP + adr + xreg * scale) 2 VarPar| off xreg scale obj (ea = [FP + obj.adr] + off + xreg * scale) 3 Con | val (val2) NIL Con | off obj (val = adr(obj) + off) Con | id NIL (for predefined reals) 6 LProc | obj 7 XProc | obj 9 CProc | obj 10 IProc | obj 13 TProc | mthno 0/1 obj (0 = normal / 1 = super call) 14 Ind | off xreg scale Reg (ea = Reg + off + xreg * scale) 15 Abs | adr xreg scale NIL (ea = adr + xreg * scale) Abs | off xreg scale obj (ea = adr(obj) + off + xreg * scale) Abs | off len 0 obj (for constant strings and reals) 16 Stk | (ea = ESP) 17 Cond | CC 18 Reg | (Reg2) Reg 19 DInd | off xreg scale Reg (ea = [Reg + off + xreg * scale]) tmode | record tag array desc ————————————- VarPar | [FP + obj.adr + 4] [FP + obj.adr] Ind | [Reg — 4] [Reg + 8] Con | Adr(typ.strobj) *)
таблица-описания-объектов Ссылка: ДОК-НЯ::таблица-описания-объектов
Выдернуто из (Ня)Фс.kp
mode | adr conval link scope leaf ———————————————— Undef | Not used Var | vadr next regopt Glob or loc var or proc value parameter VarPar| vadr next regopt Var parameter (vis = 0 | inPar | outPar) Con | val Constant Fld | off next Record field Typ | Named type LProc | entry sizes firstpar scope leaf Local procedure, entry adr set in back-end XProc | entry sizes firstpar scope leaf External procedure, entry adr set in back-end SProc | fno sizes Standard procedure CProc | code firstpar scope Code procedure IProc | entry sizes scope leaf Interrupt procedure, entry adr set in back-end Mod | scope Module Head | txtpos owner firstvar Scope anchor TProc | entry sizes firstpar scope leaf Bound procedure, mthno = obj.num
таблица-описания-структур Ссылка: ДОК-НЯ::таблица-описания-структур
Выдернуто из (Ня)Фс.kp
form comp | n BaseTyp link mno txtpos sysflag ———————————————————————————- Undef Basic | Byte Basic | Bool Basic | Char8 Basic | Int8 Basic | Int16 Basic | Int32 Basic | Real32 Basic | Real64 Basic | Set Basic | String8 Basic | NilTyp Basic | NoTyp Basic | Pointer Basic | PBaseTyp mno txtpos sysflag ProcTyp Basic | ResTyp params mno txtpos sysflag Comp Array | nofel ElemTyp mno txtpos sysflag Comp DynArr| dim ElemTyp mno txtpos sysflag Comp Record| nofmth RBaseTyp fields mno txtpos sysflag Char16 Basic | String16Basic | Int64 Basic |
таблица-описания-узлов Ссылка: ДОК-НЯ::таблица-описания-узлов
Выдернуто из (Ня)Фс.kp
Здесь Ntype — видимо, литерал, указывающий тип, например, CHAR. Ncall — вызов процедуры.
design = Nvar|Nvarpar|Nfield|Nderef|Nindex|Nguard|Neguard|Ntype|Nproc. expr = design|Nconst|Nupto|Nmop|Ndop|Ncall. nextexpr = NIL|expr. ifstat = NIL|Nif. casestat = Ncaselse. sglcase = NIL|Ncasedo. stat = NIL|Ninittd|Nenter|Nassign|Ncall|Nifelse|Ncase|Nwhile|Nrepeat| Nloop|Nexit|Nreturn|Nwith|Ntrap. class subcl obj left right link ——————————————————— design Nvar var nextexpr Nvarpar varpar nextexpr Nfield field design nextexpr Nderef ptr/str design nextexpr Nindex design expr nextexpr Nguard design nextexpr (typ = guard type) Neguard design nextexpr (typ = guard type) Ntype type nextexpr Nproc normal proc nextexpr super proc nextexpr expr design Nconst const (val = node.conval) Nupto expr expr nextexpr Nmop not expr nextexpr minus expr nextexpr is tsttype expr nextexpr conv expr nextexpr abs expr nextexpr cap expr nextexpr odd expr nextexpr bit expr nextexpr adr expr nextexpr SYSTEM.ADR typ expr nextexpr SYSTEM.TYP cc Nconst nextexpr SYSTEM.CC val expr nextexpr SYSTEM.VAL Ndop times expr expr nextexpr slash expr expr nextexpr div expr expr nextexpr mod expr expr nextexpr and expr expr nextexpr plus expr expr nextexpr minus expr expr nextexpr or expr expr nextexpr eql expr expr nextexpr neq expr expr nextexpr lss expr expr nextexpr leq expr expr nextexpr grt expr expr nextexpr geq expr expr nextexpr in expr expr nextexpr ash expr expr nextexpr msk expr Nconst nextexpr len design Nconst nextexpr min expr expr nextexpr MIN max expr expr nextexpr MAX bit expr expr nextexpr SYSTEM.BIT lsh expr expr nextexpr SYSTEM.LSH rot expr expr nextexpr SYSTEM.ROT Ncall fpar design nextexpr nextexpr Ncomp stat expr nextexpr nextexpr NIL expr ifstat NIL Nif expr stat ifstat casestat Ncaselse sglcase stat (minmax = node.conval) sglcase NIL Ncasedo Nconst stat sglcase stat NIL Ninittd stat (of node.typ) Nenter proc stat stat stat (proc=NIL for mod) Nassign assign design expr stat newfn design nextexp stat incfn design expr stat decfn design expr stat inclfn design expr stat exclfn design expr stat copyfn design expr stat getfn design expr stat SYSTEM.GET putfn expr expr stat SYSTEM.PUT getrfn design Nconst stat SYSTEM.GETREG putrfn Nconst expr stat SYSTEM.PUTREG sysnewfn design expr stat SYSTEM.NEW movefn expr expr stat SYSTEM.MOVE (right.link = 3rd par) Ncall fpar design nextexpr stat Nifelse ifstat stat stat Ncase expr casestat stat Nwhile expr stat stat Nrepeat stat expr stat Nloop stat stat Nexit stat Nreturn proc nextexpr stat (proc = NIL for mod) Nwith ifstat stat stat Ntrap expr stat Ncomp stat stat stat
Статьи по тегам
- Статьи с тегом ДОК-НЯ
- Статьи с тегом ОПИСАНИЕ-ОТДЕЛЬНОГО-ФАЙЛА
- Статьи с тегом СПРАВОЧНАЯ-ТАБЛИЦА
- таблица-из-генератора-кода-низкого-уровня
- таблица-описания-объектов
- таблица-описания-структур
- таблица-описания-узлов
- NUMTYP-VALUES
- OBJECT-MODES
- SYMBOL-VALUES-1-16
- SYMBOL-VALUES-17-76
- SYMBOL-VALUES-20-76
- классы-типов-данных
- о-параметрах-процедур
- таблицы-символов
- о-параметрах-процедур
- таблицы-символов
- обращение-с-константами
- правила-документирования-определений
- правила-документирования-разделов
- правила-переименования
- словарь
Теги
- ДОК-НЯ
- ОПИСАНИЕ-ОТДЕЛЬНОГО-ФАЙЛА
- СПРАВОЧНАЯ-ТАБЛИЦА
- ОПИСАНИЕ-ГРУППЫ-КОНСТАНТ
- СОСТОЯНИЕ-КОМПИЛЯТОРА
- СИМВОЛЬНАЯ-ИНФОРМАЦИЯ
- ПРОЦЕСС-ДОКУМЕНТИРОВАНИЯ
Источник: xn——6kcajervcdvqarhfgengcekya4c.xn--p1ai
prospero78/Redbook
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Switch branches/tags
Branches Tags
Could not load branches
Nothing to show
Could not load tags
Nothing to show
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Cancel Create
- Local
- Codespaces
HTTPS GitHub CLI
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more about the CLI.
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Источник: github.com