]]> ]]>

gcc (Objective-C)

Реализация языка программирования Objective-C

Компилятор Objective-C, который входит в состав GCC — коллекции компиляторов GNU. Используется в GNUstep. Является надстройкой над компилятором C в gcc. Как и большинство других компонентов GCC, компилятор C написан на C.

GCC начал поддерживать язык Objective-C в 1992 году. Для того, чтобы компилятор gcc распознал файл как код на C, следует использовать файлы с расширением .m или .l.

GNU Compiler Collection

GNU Compiler Collection (обычно используется сокращение GCC) — набор компиляторов для различных языков программирования, разработанный в рамках проекта GNU. GCC является свободным программным обеспечением и распространяется фондом свободного программного обеспечения (FSF) на условиях GNU GPL и GNU LGPL. Он используется в качестве стандартного компилятора в свободных Unix-подобных операционных системах, а также в нескольких проприетарных операционных системах, в том числе Apple Mac OS X.

Все компиляторы GCC используют интерфейс, стандартный для Unix: драйвер gcc интерпретирует аргументы вызова, определяет, какой компилятор следует применить ко входному файлу, запускает его, ассемблирует и при необходимости линкует результат, чтобы получить окончательный исполняемый файл.

Компилятор каждого языка имеет сходную структуру. Фронт-енд парсит исходный код программы и строит по нему абстрактное синтаксическое дерево. Затем оно трансформируется в представление среднего уровня — либо архитектурно-независимый GIMPLE, либо архитектурно-зависимый RTL. Наконец, генерируется низкоуровневое представление программы в машинных кодах.

Примеры:

Факториал:

Пример для версий GCC 3, GCC 4, TCC 0.9.25, gcc 3.4.5, gcc 3.4.5 (Objective-C)

Используется рекурсивное определение факториала.

#include <stdio.h>

unsigned long long factorial(unsigned long long n)
{
    if (n == 0) {
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}

int main(void)
{
    int n;
    for (n = 0; n <= 16; n++) {
        printf("%i! = %lld\n", n, factorial(n));
    }

    return 0;
}

Hello, World!:

Пример для версий Borland C++ Builder 6, TCC 0.9.25, g++ 3.4.5, gcc 3.4.5, gcc 3.4.5 (Objective-C)
#include <stdio.h>

int main()
{
    printf("Hello, World!\n");
    return 0;
}

Квадратное уравнение:

Пример для версий Borland C++ Builder 6, Microsoft Visual C++ 9 (2008), TCC 0.9.25, g++ 3.4.5, gcc 3.4.5, gcc 3.4.5 (Objective-C)

Этот пример работает на C и C++, а также на Objective-C, являющемся строгим надмножеством языка C. В случае C может понадобиться компилировать программу с опцией -lm, чтобы подключить библиотеку математики.

#include <math.h> 
#include <stdio.h>

int main()
{
  int A, B, C, D;
  printf("A = ");
  scanf("%d", &A);
  if (A == 0) {
    printf("Not a quadratic equation.\n");
    return 0;
  }
  
  printf("B = ");
  scanf("%d", &B);
  printf("C = ");
  scanf("%d", &C);

  D = B * B - 4 * A * C;
  if (D == 0) {
    printf("x = %f\n", -B / 2.0 / A);
    return 0;
  }
  
  if (D > 0) {
    printf("x1 = %f\nx2 = %f\n",
           (-B + sqrt(D)) / 2.0 / A, (-B - sqrt(D))/ 2.0 / A);
  } else {
    printf("x1 = (%f, %f)\nx2 = (%f, %f)\n",
           -B / 2.0 / A, sqrt(-D) / 2.0 / A, -B / 2.0 / A, -sqrt(-D) / 2.0 /A);
  }
  return 0;
}

Числа Фибоначчи:

Пример для версий TCC 0.9.25, gcc 3.4.5, gcc 3.4.5 (Objective-C)

Используется рекурсивное определение чисел Фибоначчи.

#include <stdio.h>

int fibonacci(int n)
{
    return ( n<=2 ? 1 : fibonacci(n-1) + fibonacci(n-2) );
}

int main(void)
{
    int n;
    for (n=1; n<=16; n++)
        printf("%d, ", fibonacci(n));
    printf("...\n");
    return 0;
}

CamelCase:

Пример для версий TCC 0.9.25, gcc 3.4.5, gcc 3.4.5 (Objective-C)

Пример основан на посимвольной обработке строки. Функция gets читает строку до конца строки. Следует отметить, что эта функция считается “опасной” из-за отсутствия контроля того, сколько символов введено, и возможных ошибках доступа к памяти. В C нет логического типа данных, поэтому его приходится симулировать целой переменной.

#include <stdio.h>

void main() {
    char text[100],cc[100];
    gets(text);
    int i,j=0,lastSpace=1;
    for (i=0; text[i]!='\0'; i++) 
        if (text[i]>='A' && text[i]<='Z' || text[i]>='a' && text[i]<='z')
        {   if (lastSpace>0)
                cc[j] = toupper(text[i]);
            else
                cc[j] = tolower(text[i]);
            j++;
            lastSpace = 0;
        }
        else
            lastSpace = 1;
    cc[j]='\0';
    printf("%s\n",cc);
}

CamelCase:

Пример для версий gcc 3.4.5 (Objective-C)
#import <Foundation/Foundation.h>

#define LETTERS @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"

NSString *camelCase(NSString *s) {
  return [[[s capitalizedString] componentsSeparatedByCharactersInSet:[[NSCharacterSet characterSetWithCharactersInString:LETTERS] invertedSet]] componentsJoinedByString:@""];
}

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSLog(@"%@", camelCase(@"Test Example One"));
    NSLog(@"%@", camelCase(@"exampleTwo "));
    NSLog(@"%@", camelCase(@"!!! is_this_3RD EXAMPLE?.."));

    [pool drain];
    return 0;
}

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам