Tiny C Compiler
Реализация языка программирования CTiny C Compiler, часто называемый tcc или TCC, — компилятор C для платформ x86 и x86-64. Автор — Фабрис Беллар (Fabrice Bellard). Написан на C и ассемблере, распространяется под лицензией GNU LGPL.
Особенности реализации:
- Компактность. Исполняемый файл компилятора для x86 имеет размер около 100 кб. Это позволяет, например, запускать компилятор с дискеты или загрузочного диска.
- Быстрая компиляция. Автор языка утверждает, что tcc полностью скомпилировал браузер Links в 9 раз быстрее, чем gcc.
- tcc реализует стандарты ANSI C (целиком), C99 (частично) и ряд расширений GNU C.
- Реализация языка содержит несколько черт, специфических для tcc, например, контроль использования памяти и границ массивов. Изменения предназначены для повышения стабильности работы полученных программ.
- tcc позволяет запускать программы сразу после компиляции, используя для этого параметр командной строки. Это позволяет запускать программы как шелл-скрипты в Unix-подобных системах.
Ссылки:
Примеры:
Факториал:
Пример для версий 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);
}
Комментарии
]]>blog comments powered by Disqus
]]>