]]> ]]>

gcj

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

gcj — сокращенное название для GNU Java Compiler, который входит в состав GCC — коллекции компиляторов GNU.

Компилятор Java был включен в коллекцию в 1998 году. Его разработка была прекращена в 2007 году, когда реализация Sun Java была опубликована под лицензией GNU GPL и стала основным свободным компилятором Java.

gcj может компилировать исходный код Java в байткод JVM или непосредственно в машинные коды, а также в файлы .class и .jar. Для компиляции в файл .class следует запустить gcj с опцией -C. Полученный .class файл можно выполнить при помощи интерпретатора gij.

GNU Compiler Collection

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

Примеры:

Hello, World!:

Пример для версий Groovy 1.7, Sun Java 6, gcj 3.4.5

Для Java приведенный код должен находиться в файле HelloWorld.java.

public class HelloWorld {
    public static void main(String[] args)
    {
        System.out.println("Hello, World!");
    }
}

Факториал:

Пример для версий Groovy 1.7, Sun Java 6, gcj 3.4.5

Используется рекурсивное определение факториала. Для хранения больших чисел использован элементарный тип данных long, позволяющий хранить числа от -263 до 263-1.

public class Factorial {
    static long factorial(int n)
    {
        return ( n==0 ? 1 : n*factorial(n-1) );
    }
    public static void main(String[] args)
    {
        for (int n=0; n<=16; n++)
            System.out.println(n+"! = "+factorial(n));
    }
}

Факториал:

Пример для версий Groovy 1.7, Sun Java 6, gcj 3.4.5

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

import java.math.BigInteger;

public class Factorial {
    public static void main(String[] args)
    {
        BigInteger f = new BigInteger("1");
        System.out.println("0! = " + f.toString());
        for (int n=1; n<=16; n++)
        {   f = f.multiply(new BigInteger(""+n));
            System.out.println( n + "! = " + f.toString());
        }
    }
}

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

Пример для версий Groovy 1.7, Sun Java 6, gcj 3.4.5

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

public class Fibonacci {
    static int fibonacci(int n)
    {
        return (n<=2 ? 1 : fibonacci(n-1) + fibonacci(n-2));
    }
    public static void main(String[] args)
    {
        for (int n=1; n<=16; n++)
            System.out.print(fibonacci(n)+", ");
        System.out.println("...");
    }
}

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

Пример для версий Groovy 1.7, Sun Java 6, gcj 3.4.5

В Java нет типа данных для работы с комплексными числами, поэтому вычисления производятся в дробных числах и выполняется отдельная проверка на знак дискриминанта. Реализация позволяет решать квадратные уравнения не только с целыми, но и с дробными коэффициентами.

Коэффициенты читаются из потока System.in. Напрямую из него можно читать только отдельные байты, поэтому для повышения комфортности чтения используются классы InputStreamReader и BufferedReader. Строки, прочитанные из System.in, преобразуются в числа типа double с помощью метода Double.parseDouble(). Все операции ввода в Java должны находиться внутри блоков try ... catch, чтобы гарантированно обрабатывать IOException — класс исключений, порождаемых функциями чтения.

import java.util.*;
import java.io.*;

public class Quadratic {
    static String print(double real, double imag)
    {   if (Math.abs(imag)<1E-6)
            return ""+real;
        else 
            return "("+real+","+imag+")";
    }
    public static void main(String[] args)
    {   double A,B,C,D;
      try {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("A = ");
        A = Double.parseDouble(br.readLine());
        if (Math.abs(A)<1E-3)
        {   System.out.println("Not a quadratic equation.");
            return;
        }
        System.out.print("B = ");
        B = Double.parseDouble(br.readLine());
        System.out.print("C = ");
        C = Double.parseDouble(br.readLine());
      }
      catch (Exception e) {
        System.err.println("An error occured while reading input parameters.");
        return;
      }
        A = 2*A;
        D = B*B-2*A*C;
        if (Math.abs(D)<1E-3)
        {   System.out.println("x = "+(-B/A));
            return;
        }
        if (D>0)
            System.out.println("x1 = "+print((-B+Math.sqrt(D))/A, 0)+"\nx2 = "+print((-B-Math.sqrt(D))/A, 0));
        else
            System.out.println("x1 = "+print(-B/A,Math.sqrt(-D)/A)+"\nx2 = "+print(-B/A,-Math.sqrt(-D)/A));
    }
}

Комментарии

]]>

blog comments powered by Disqus

]]>

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