Сравнение языков программирования (esyr) (1161143), страница 10
Текст из файла (страница 10)
Известно, что сопрограммы выполняются квазипараллельно. Следовательно, их использование исключает трудную проблему взаимодействия истиннопараллельных процессов.2. Переключение процессора от одной сопрограммы к другой осщ ествляется явным оператором передачи управления. Выполнение сопрограммы, которойпередаётся управление, возобновляется с той точки, где она была приостановлена последним таким оператором.Примеры кода[править]Примеры кода на Java[править]package MyPackage; // Всё, что будет написано в этом файле, считается лежащим в этом пакете.import java.lang.*; // Импорт пакетов.public class MyClass{private static int m_i = 3;private static int m_j;static {// Демонстрация статического блока в Java.
Операторы в этом блоке будут выполнены в самом начале программы.m_j = m_i * 4;}public static void main(String[] args){final int N = 5; // final — аналог констант в языках C/C++final int M = 3;double a[][] = new double[N][M];double [][]b = new double[N][M];for (int i = 0; i < a.length; ++i) {for (int j = 0; j < a[i].length; ++j) {a[i][j] = i * j;}}for (int i = 0; i < b.length; ++i) {for (int j = 0; j < b[i].length; ++j) {b[i][j] = i + j;}}double res[][] = sumMatrices(a, b);for (int i = 0; res != null && i < res.length; ++i) {for (int j = 0; res[i] != null && j < res[i].length; ++j) {System.out.print(res[i][j] + " ");}System.out.println();}}public static double[][] sumMatrices(double a[][], double b[][]){label1: if (a != null && b != null && a.length == b.length) {label2: {for (double x[] : a) { // аналог for-eachfor (double y[] : b) {if (x.length != y.length) {break label2; // прервать внешний цикл}}open in browser PRO versionAre you a developer? Try out the HTML to PDF APIpdfcrowd.com}}break label1;}}}System.out.println("Bad Arrays...");return null;} else {System.out.println("Bad Arrays...");return null;}double [][]res = new double[a.length][a[0].length];for (int i = 0; i < a.length; ++i) {for (int j = 0; j < a[i].length; ++j) {res[i][j] = a[i][j] + b[i][j];}}return res;package MyPackage;import java.sql.SQLException;public class Example{public static void main(String [] argv){// демонстрация работы внутренних классов:Outer outer = new Outer(10);outer.test();// демонстрация работы динамической диспетчеризации методов:A refA;refA = new A(5);refA.callMe();refA = new B(10, 15);refA.callMe();// демонстрация работы с абстрактными классами:}}//AbstrA abstra = new AbstrA(5); — нельзя, т.к.
AbstrA — абстрактный класс.AbstrA refAbstrA;refAbstrA = new AbstrB(5, 10);refAbstrA.callMe();// демонстрация работы с интерфейсами:Client client = new Client();client.someFunc();// демонстрация работы с исключениями:try {client.badFuncEx();// Мы не можем оставить потенциальную посылку функцией исключения без внимания:// либо окружим её вызов конструкцией try-catch,// либо напишем, что эта функция тоже может бросать исключения (большое отличие от языка С++).} catch (Exception ex) { // Ловушка для всех исключений, ибо Exception — это базовый класс.//do Smth...}class Outer{private int x = 0;public Outer(int x){this.x = x;}private void display(){System.out.println(x);}public void test(){Inner in = new Inner();in.useOuterFunc();open in browser PRO versionAre you a developer? Try out the HTML to PDF APIpdfcrowd.com}in.useOuterFunc();}class Inner{public void useOuterFunc(){// Внутренний класс имеет непосредственный доступ к приватным и публичным полям внешнего класса.// Обратное неверно.display();x = 15;display();}}// Реализация динамической диспетчеризации методов:class A{private int i;A(int i){this.i = i;}public void callMe(){System.out.println("In A.callMe().
" + i);}}final class B extends A// final означает, что никакой класс не сможет отнаследоваться от В.// final, стоящий перед описанием метода запрещает его переопределение.{private int i; // Поле i класса B перекрывает поле i суперкласса.B(int i, int j){super(i); // вызывается метод А(int i) суперкласса.this.i = j;}public void callMe()// Сигнатура функций должна совпадать. В противном же случае — это обычная перегрузка.// Сам метод называется переопределённым (аналог виртуальным методам в С++).{System.out.println("In B.callMe(). " + i); // Здесь выведется значение поля подкласса.// Для доcтупа к полю суперкласа нужно использовать super.i (но здесь поле недоступно, ибо private).}}// Использование абстрактных классов. Если мы объявляем какой-то метод в классе абстрактным, то// автоматически должны сделать абстрактным и сам класс.
С точки зрения динамической диспетчеризации это означает лишь то,// что подклассы должны будут явно реализовать все абстрактные методы или тоже быть абстрактными.abstract class AbstrA{private int i;AbstrA(int i){this.i = i;}abstract public void callMe();}final class AbstrB extends AbstrA{private int i;AbstrB(int i, int j){super(i);this.i = j;}public void callMe(){System.out.println("In AbstrB.callMe().
" + i);}protected void finalize()open in browser PRO versionAre you a developer? Try out the HTML to PDF APIpdfcrowd.com}protected void finalize(){// Считаю нужным упомянуть о методе finalize. Он должен вызываться при удалении объекта сборщиком мусора.// Используется для освобождения занятых ресурсов (закрытия файлов и т.п.).// Однако его поведение настолько туманно, что применять его не стоит, а позаботиться об освобождении отдельно. :)System.out.println("Wow! You're lucky to see it in your console! :D");}// Использование интерфейсов и исключений.
:)// Все методы и члены интерфейсов по умолчанию делаются публичными. Все члены — final static.interface MyInterface{int pubStatFinalMember = 121;// Все переменные должны быть инициализированы.void someFunc();}/*Доступ class имя_класса [extends суперкласс][implements интерфейс [, интерфейс...]]//тело класса*/class Client implements MyInterface// В классе должны быть определены все функции интерфейса. Спецификатор доступа у них обязан быть public.// Если в классе определяются не все функции интерфейса, то он должен быть объявлен абстрактным.// Кроме того интерфейс может быть вложен в класс или же другой интерфейс, а также интерфейсы можно наследовать.{public void someFunc(){//pubStatFinalMember = 601; ——— Нельзя, т.к.
переменная — final.}System.out.println("In someFunc() from interface.");}public void badFuncEx() throws SQLException{//Здесь же и рассмотрим исключения. :)try {int i = 0;i = pubStatFinalMember / i;System.out.println("You shouldn't see it.");} catch (ArithmeticException ex) { // Тут мы поймаем исключение деления на нульSystem.out.println(ex);throw new SQLException();// Пошлём другое исключение выше. >:D Но в таком случае мы должны у функции пометить, что она может// разбрасываться исключениями (см. throws список_исключений).} finally {// Этот блок кода обязательно получит управление после блока try/catch вне зависимости от исключения.System.out.println("You will always see it.");}}Вывод:1015In A.callMe().
5In B.callMe(). 15In AbstrB.callMe(). 10In someFunc() from interface.java.lang.ArithmeticException: / by zeroYou will always see it.Пример кода на Delphi[править]Описание юнита, наследования и конструкторовunit Unit1;interfaceopen in browser PRO versionAre you a developer? Try out the HTML to PDF APIpdfcrowd.comusesForms, Dialogs, Classes, Controls, StdCtrls;type// Определение родительского класса основанного, по умолчанию, на TObjectTFruit = classpublicname: string;Constructor Create; overload;// Этот конструктор использует умолчанияConstructor Create(name : string); overload;end;// Определение типа потомкаTApple = class(TFruit)publicdiameter : Integer;publishedConstructor Create(name : string; diameter : Integer);end;// Класс формы используемой этим модулемTForm1 = class(TForm)procedure FormCreate(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm} // Вложение определений формы// Создание объекта fruit - версия без параметровconstructor TFruit.Create;begin// Сначала выполняется родительский конструктор (TObject)inherited; // Вызов родительского метода Create// Теперь устанавливаем имя fruit, по умолчаниюself.name := 'Fruit';end;// Создание объекта fruit - версия с параметрамиconstructor TFruit.Create(name: string);begin// Не cможет выполниться родительский конструктор - параметры отличаются// И сохраняем имя fruitself.name := name;end;// Создание объекта appleconstructor TApple.Create(name: string; diameter : Integer);begin// Сначала выполняется родительский конструктор (TFruit)inherited Create(name); // Вызов родительского метода// Теперь сохраняем переданный apple диаметрself.diameter := diameter;end;// Основная линия кодаprocedure TForm1.FormCreate(Sender: TObject);varfruit : TFruit;banana : TFruit;apple : TApple;begin// Создание 3-х различных объектов fruitfruit := TFruit.Create;banana := TFruit.Create('Banana');apple := TApple.Create('Pink Lady', 12);// Смотрим какие из наших объектов являются fruitopen in browser PRO versionAre you a developer? Try out the HTML to PDF APIpdfcrowd.com//ififif//ifififend;end.Смотрим какие изfruit Is TFruitbanana Is TFruitapple Is TFruitнаших объектов являются fruitthen ShowMessage(fruit.name +' - fruit');then ShowMessage(banana.name +' - fruit');then ShowMessage(apple.name +' - fruit');Смотрим какие объектыfruit Is TApple thenbanana Is TApple thenapple Is TApple thenявляются appleShowMessage(fruit.nameShowMessage(banana.nameShowMessage(apple.name+' - apple');+' - apple');+' - apple');Fruit - fruitBanana - fruitPink Lady - fruitPink Lady - appleПримеры на C++, Ада и Java с использованием шаблонов[править]Стек:GENERICTYPE T IS PRIVATE; SIZE : INTEGER;PACKAGE Stacks ISTYPE Stack IS LIMITED PRIVATE;PROCEDURE Push(S: IN OUT Stack; X : IN T);PROCEDURE Pop(S: IN OUT Stack; X : OUT T);FUNCTION IsEmpty(S : IN Stack) RETURN BOOLEAN;FUNCTION IsFull(S : IN Stack) RETURN BOOLEAN;PRIVATETYPE Stack is RECORDBody : ARRAY (1..SIZE) OF T;Top : INTEGER := 1;END RECORD;END Stacks;template <typename T, int size> class Stack{public:Stack() {top = 0;}void Push(T x);T Pop(T& x);bool IsEmpty();bool IsFull();private:Stack (const Stack& s);T body[N];int top;};Очередь:generictype T is private;Size : integer;package G_Queue istype Queue is limited private;procedure Enqueue(Q: inout Queue; X:T);procedure Dequeue(Q: inout Queue; X:T);procedure Init(Q: out Queue);procedure Destroy(Q: inout Queue);function IsFull(Q: Queue);function IsEmpty(Q: Queue);–- другие процедуры ...privateopen in browser PRO versionAre you a developer? Try out the HTML to PDF APIpdfcrowd.comprivatetype Queue is recordLeft, Right: integer;body : array(1..Size) of T;end record;end G_Queue;Дек:generictype T is private;package G_Deque istype Deque is limited private;procedure PushRight(Deq: inout Deque; X:T);procedure PushLeft(Deq: inout Deque; X:T);procedure PopRight(Deq: inout Deque; X: out T);procedure PopLeft(Deq: inout Deque; X: out T);procedure Init(Deq: out Deque);procedure Destroy(Deq: inout Deque);function IsFull(Deq: Deque);function IsEmpty(Deq: Deque);–- другие процедуры ...privatetype PLink is access;type Link is record inf : T; next, prev : PLink; end record;type PLink is access Link;type Deque is record Left, Right: PLink; end record;end G_Deque;interface IDeque<T>{void PushLeft(T x);void PushRight(T x);T PopLeft();T PopRight();bool IsFull();bool IsEmpty();// другие функции}Функция перемножения матриц:template <class T> Matrix<T>& MatMult (Matrix<T>& A, Matrix<T>& B);Matrix<float> b,c;// конкретизация функцииMatrix<float> a = MatMult(b,c);generictype T is private;with function “+”(x,y:T) return T (<>);with function “*”(x,y:T) return T (<>);type Matrix is private;function G_MatMult(A,B: Matrix) return Matrix;Примеры кода на С#[править]Пример обработки исключений в C#.class NegativeValueException : Exception{public NegativeValueException(string message) : base(message)open in browser PRO versionAre you a developer? Try out the HTML to PDF APIpdfcrowd.compublic NegativeValueException(string message) : base(message){}}// ...string path = @"c:\users\public\test.txt";var file = new System.IO.StreamReader(path);try{var buffer = file.ReadLine();var time = Int32.Parse(buffer);if ( time < 0){throw new NegativeValueException("Time must be a positive value.");}MyClassInstance.Foo(time);}catch (System.IO.IOException e){Console.WriteLine("Error reading from {0}.