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

Objective-D — альтернатива либо дополнение к Objective-C

Anna | 2.07.2014 | нет комментариев
Objective-C, по-моему суждение, — не дюже комфортный язык со большинством задач. Но мы обязаны писать приложения под iOS на этом языке. Я разработал иной язык, тот, что генерирует код Objective-C. Следственно в этом языке вы можете легко применять классы Objective-C и C функции. Вы также легко можете применять сгенерированные классы в коде Objective-C. Так что есть вероятность вести разработку сразу на 2-х языках. Я назвал данный язык Objective-D.

Должен сказать, что это не завершенный продукт. Я разрабатывал данный язык под свои нужды, следственно в нем до сих пор много багов и недоработок. Разработку языка я вел на Haskell и это был мой 1-й навык работы с этим языком. Следственно начальный код не дюже классен и его следует переработать.

Фичи

Синтаксис

За основу я взял синтаксис Scala, потому что Scala владеет дюже суперкомпактным синтаксисом и мне это нравиться. Таким образом декларация класса получилось дюже примитивный:

class Foo(bar : int) {
    val baz = 1 //constant
    var qux = 0 //mutable variable
    def twiceBar = bar * 2 //function
}
Функции

Мне нравятся именованные параметры в Objective-C. Это повышает читаемость кода.

def foo(p1 : int, p2 : int) : int = p1 * p2
def bar = foo(p1 = 1, 2)

Впрочем, изредка имена параметров излишни, следственно в Objective-D их дозволено опустить.

def foo(bar : int) = bar * 326
val bar = 1
foo(bar = bar)
foo(bar)
Классы-заглушки

Эти классы необходимы, Дабы дозволено было применять Objective-C классы либо C конструкции в Objective-D. Они легко описывают способы и поля классов либо конструкций.

stub class XMLElement {
    def name : string
    def text : string
    def parent : XMLElement?
    def children : [XMLElement]
}
Обобщенное программирование

Жутко, что Objective-C не поддерживает дженерики и использует утиную типизацию. В Objective-D я внедрил дженерики и использую статическую типизацию.

class Foo {
    var array = MutableArray<Bar>()
}
Итог типов

Вы можете не указывать тип переменной либо возвращаемое значение функции. Это может быть вычислено механически.

var i = 0
var i : int = 0 //тоже самое
Типажи (Traits)

Вы можете отнаследовать класс от одного класса и множества типажей, но типаж — не примитивный интерфейс. Он может содержать поля и функции. Типаж только не может содержать конструкторы.

trait Foo {
    def foo = 1
}
trait Bar {
    var bar = 0
}
class Baz extends Foo with Bar
Конструкции

Вы можете определить конструкции и функции внутри конструкции. Конструкции будут сгенерированы в C конструкции, а функции в C функции.

struct Vec2(x : float, y : float) {
    def dot(vec2 : Vec2) : float = x*vec2.x   y*vec2.y
}
Перегрузка операторов

В реальное время это работает только со особыми наименованиями функций (add, sub, div, mul). Но я планирую реализовать следующее:

struct Vec2(x : float, y : float) {
    def  (vec2 : Vec2) : float = Vec2(x   vec2.x, y   vec2.y)
}
Блоки

Продемонстрирую синтаксис блоков на примерах:

def filter(predicate : T -> bool) : [T]
val array = [4, 3, 5, 1]
array.filter{item : int -> item > 3} // [4, 5]
array.filter{item -> item > 3 } // [4, 5]
array.filter(_ > 3) // [4, 5]

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

Строки

Вы можете применять встроенные выражения и переносы внутри строки. Посмотрите на пример:

val a = 1
val b = 2
val s = "a = $a
         b = $b"
Кортежи

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

val tuple = (1, "foo", "bar")
tuple.a == 1
tuple.b == "foo"
Ленивые значения

Эти значения будут вычислены только в момент первого обращения.

class Foo(bar : int) {
    lazy val barSquare = bar * bar
}
Сравнение с образом

Сравнение с образом — огромная тема в функциональном программировании. Это разрешает создавать больше лаконичный и чистый код.

def foo(bar : (int, int)) : int = case(bar) {
    (a, 1) -> a
    (0, _) -> 1
    _ -> 0
}
Перечисления

Мне нравятся перечисления в Java, следственно я реализовал что-то схожее Objective-D.

enum Foo(bar : int) {
    baz(1)
    qux(2)
}
Пакеты

Отсутствии системы пакетов — огромная задача Objective-C, и мне вовсе не нравятся префиксы классов.

package com.foo
import com.baz.ParticularClass
import com.bar._

Но префиксы нужны в Objective-C, так что вы можете определить префикс пакета в Objective-D в пакетном объекте. Данный префикс будет добавлен к сгенерированным классам и файлам. В пакетном объекты вы также можете определить всеобщие импорты для всех классов пакета.

package com
object foo {
    import com.bar._
    val prefix = "FOO"
}

История разработки

Когда я начинал разрабатывать Raildale я применял Cocos2D и Objective-C. Позднее я отказался от Cocos2D и перешел легко на OpenGL, так как я решил продолжить разработку. Если бы я применял OpenGL с самого начала, я мог бы предпочесть C взамен Objective-C.

Чере некоторое время позже начала разработки я осознал, что Objective-C начал меня нервировать. Первой задачей стало, что там нет перечислений. Я имею ввиду перечесления со связанными свойствами как в Java либо чего-нибудь, что могло бы это заменить. Я придумал несколько способов, как решить эту задачу, но все равно требовалось много кода. Я пробовал применять макросы, но обнаружить классное решение у меня так и не получилось.

И я решил разработать генератор кода для перечислений, что является типично практикой в языко-ориентированном программировании. Это была первая часть Objective-D:

enum RailConnector(x : int, y : int, angle : int) {
    left(-1, 0, 0)
    bottom(0, -1, 90)
    top(0, 1, 270)
    right(1, 0, 180)
}

В качестве платформы для разработки генератора я выбирал из 3 вероятностей: JetBrains MPSScala и Haskell. Я предпочел Haskell, потому что там есть чудесная библиотека для парсинга(Parsec), и я не пробовал Haskell до этого. Должен сказать Haskell — очаровательный язык.

Я разработал перечисления дюже стремительно. И здесь я подумал, что было бы здорово писать неизменяемые классы в простом лаконичном синтаксисе, и это нетрудно реализовать. И я разработал генератор для этого случая. Потом я добавил вероятность писать примитивные функции в классах и продолжал добавлять фичи в процессе разработки Raildale. Также я разработал плагин для AppCode, которые подсвечивает синтаксис и разрешает делать некоторые примитивные рефакторинги. На разработку Objective-D к настоящему моменту я потратил 230 часов.

Как испробовать Objective-D

Я был бы рад, если бы кто-нибудь испробовал Objective-D, япомогу и постараюсь поправить возникающие у вас задачи. Если кто-то захочет поучаствовать в разработке, буду дюже рад.

  1. Скачайте Objective-D и разархивируйте;
  2. Сделайте план в XCode;
  3. Скопируйте папку ObjDLib в ваш план и добавьте m-files в вашу цель;
  4. Добавьте Build phase в вашу цель (Editor->Add Build Phase->Add Run Script Build Phase) и вызовите ObjDфайл в папку bin:
    $OBJD_HOME$/bin/ObjD
  5. Сделайте файл с растяжением od и напишите туда Objective-D код. Скажем:
    package test
    
    class Foo(bar : int)
    
  6. Соберите план. h-файл and m-файл будут сгененрированы в той же папке, что и od-файл. Добавьте эти файлы к вашему плану.

Вы можете также скачать плагин для AppCode.

План становления

  • Генерация в Java — я собираюсь портировать Raildale на Android;
  • Убрать статические функции и поля, всецело заменив их на объекты;
  • Добавить огромнее проверок, Дабы сделать разработку больше неопасной;
  • Значения по-умолчанию для параметров функции.

Ссылки

P.S. Это перевод моей же статьи с английского языка. Оформлял, это не как перевод, так как в правилах сайта сказано, что я не могу вставлять ссылки на свой сайт в статью, если она только не в блоге «Я пиарюсь». Спрашивал о такой обстановки у администрации сайта, результата на запрос так и не получил. Так что ссылки решил не указывать.

 

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

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