сравнение языков программирования

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: сравнение языков программирования

Непрочитанное сообщение Olej » 30 янв 2014, 17:24

Olej писал(а): Но это, по смыслу, совершенно другая компиляция, чем в случае C/C++!!!
Это должно быть замечено как главное отличием от предыдущих вариантов:
- код .java компилировался в Java байт-код .class
- это не исполнимый код, как в случае с C/C++
- для его выполнения нужна виртуальная машина Java (JRE), которая интерпретирует байт-код...
- но, зато, этот байт-код .class а). не зависит от операционной системы: Windows, Linux, а Solaris ему просто как песня ;-) , б). не зависит от архитектуры процессора: Intel x86, ARM, AVR, кто угодно ;-) ... виртуальная машина Java везде будет понимать байт-код одинаково
- этот байт-код (файл) можно передать и по сети, на любой хост с любой процессорной архитектурой, и он будет выполняться там...
- если этот байт-код передаётся в браузер, то он называется аплет, и выполняется там в окружении, которое создаёт браузер.

По самому коду он очень похож на C++ (в рамках оговоренных синтаксисом различий).
Важное видимое различие, что Java последовательный до конца объектный язык - здесь всё должно быть объектом (или интерфейсом). Поэтому даже для стартовой функции main (точки входа), мы должны её описать как статический функцию-член фиктивного, в общем, класса triangle.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: сравнение языков программирования

Непрочитанное сообщение Olej » 30 янв 2014, 17:45

Olej писал(а):
Olej писал(а): Следующий вариант, естественно, C++.
Следующий вариант, естественно ;-) , Java:
Следующий вариант - Python:

Код: Выделить всё

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import cmath
import math

nodes = 3

def inpoint( prompt ):
    while( True ):
        sys.stdout.write( prompt )
        sys.stdout.flush()
        try:
            s = sys.stdin.readline()
        except KeyboardInterrupt:       # ^C
            print( '' )
            quit()
        if s == '':                     # ^D - EOF
            print( '' )
            quit()
        try:
            ( x, y ) = s.split()
            p = complex( float( x ), float( y ) )
        except ValueError:
            print( 'ошибка' )
            continue
        return p

class triangle:
    """класс треугольника"""
    def __init__( self, parm ):
        if isinstance( parm, list ) :
            self.pts = parm
        else :
            self.pts = [ 0+0j, 0+0j, 0+0j ]
    def printt( self ):
        msg = 'треугольник: '
        for i in range( nodes ):
            msg += ' [{:.2f},{:.2f}]'.\
                   format( self.pts[ i ].real, self.pts[ i ].imag )
        print( '{}'.format( msg ) )
    def perimeter( self ):
        summa = 0.0;
        for i in range( nodes ):
            if i == 0 :
                summa += abs( self.pts[ i ] - self.pts[ nodes - 1 ] )
            else :
                summa += abs( self.pts[ i ] - self.pts[ i - 1 ] )
        return summa;
    def square( self ):
        n1, p1 = cmath.polar( self.pts[ 1 ] - self.pts[ 0 ] )
        n2, p2 = cmath.polar( self.pts[ 2 ] - self.pts[ 0 ] )
        return n1 * n2 * abs( math.sin( p2 - p1 ) ) / 2.

while( True ):
    print( 'координаты вершин в формате: X Y' )
    parms = []
    for i in range( nodes ):
        parms.append( inpoint( 'вершина № ' + str( i + 1 ) + ' : ' ) )
    points = triangle( parms )
    points.printt()
    print( 'периметр = {:.2f}'.format( points.perimeter() ) )
    print( 'площадь = {:.2f}'.format( points.square() ) )
    print( '---------------------------------' )
Выполнение:

Код: Выделить всё

olej@notebook:~/2014_WORK/ManyLan$ python triangle_py
координаты вершин в формате: X Y
вершина № 1 : -1 0
вершина № 2 : 0 1
вершина № 3 : 1 0
треугольник:  [-1.00,0.00] [0.00,1.00] [1.00,0.00]
периметр = 4.83
площадь = 1.0
---------------------------------
координаты вершин в формате: X Y
вершина № 1 : ^C
Это выполнение в среде CPython (стандартной консольной среде Linux), но может быть в любой из множества сред выполнения (IDLE в WIndows). Код интерпретируется ... но не совсем интерпретируется, он однократно компилируется по ходу выполнения - JIT (Just In Time), для всех импортируемых приложением модулей будут создаваться файлы компилированного кода.

Замедление такой техники по сравнению с C-реализацией составляет 10-100 раз (по сообщениям и собственным измерениям), но во многих случаях это не столь существенно. Такой код .py также переносим, в том смысле что и .class Java, но по-другому: сам файл .py может быть перенесен в другую операционную систему, на другой хост по сети, на другую аппаратную платформу, но должен быть там интерпретирован соответствующей Pyhon виртуальной машиной, работающей в той среде.
Вложения
triangle.py
(1.97 КБ) 417 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: сравнение языков программирования

Непрочитанное сообщение Olej » 01 фев 2014, 02:30

Olej писал(а): Следующий вариант, естественно, C++.
Следующий вариант, естественно ;-) , Java:
Следующий вариант - Python:
Ещё вариант ... может кому-то показаться сильно неожиданным ;-) - JavaScript.
Почему JavaScript?
- JavaScript считается языком для встраивания, большинство знают его как встраиваемый компонент в HTML, но всё гораздо шире: JavaScript отличный скриптовый инструмент для встраивания в большие сложные проекты, отличный пример - все VoIP SoftSwitch: Asterisk, FreeSWITCH, YATE.
- но для JavaScript есть и консольный интерпретатор - SpiderMonkey, отличный способ поупражняться
- JavaScript не объектный язык, но в нём есть "не чистая" объектность через прототипы объектов - очень оригинально, для сравнения
- в консольном JavaScript - минимальный API, всего пару десятков функций ... + методы существующих объектов-классов, но этого достаточно для построения развитых приложений, это достигается за счёт практически полного отказа от типизации (на память приходит LISP и FORTH).
- чисто интерпретирующий язык
- интересно для сравнения с Java, для начинающих - чтобы с первого поверхностного взгляда увидеть, что у JavaScript с Java нет ничего общего ... кроме одного слова ;-)

Код: Выделить всё

#!/usr/bin/js -U

function Complex( re, im ) {  // конструктор
   this.x = re; this.y = im;
}

// определение методов экземпляра в объекте-прототипе конструктора ...
Complex.prototype.abs = function() {
   return Math.sqrt( this.x * this.x + this.y * this.y );
}

Complex.prototype.arg = function() {
   return Math.atan2( this.y, this.x );
}

Complex.prototype.sub = function( that ) {
   return new Complex( this.x - that.x, this.y - that.y );
}

Complex.prototype.toString = function() {
   return " [" + this.x.toFixed( 2 ) + "," + this.y.toFixed( 2 ) + "]";
}

// определение методов класса (static, friend)
Complex.sub = function( a, b ) {
   return new Complex( a.x - b.x, a.y - b.y );
}

var nodes = 3;

var perimeter = function( triang ) {  // функциональные литералы
       var summa = 0.0;
       for( i = 0; i < triang.length; i++ ) 
          summa += Complex.sub( triang[ i ],
                   triang[ i == 0 ? triang.length - 1 : i - 1 ] ).abs();
       return summa;
    },
    square  = function( triang ) {
       var side1 = triang[ 1 ].sub( triang[ 0 ] );
           side2 = triang[ 2 ].sub( triang[ 0 ] );
       return side1.abs() * side2.abs() *
          Math.abs( Math.sin( side1.arg() - side2.arg() ) ) / 2.;
    };

while( true ) {
   print( "координаты вершин в формате: X Y" );
   var i = 0; 
   var points = new Array( nodes );
   while( i < nodes ) {
      putstr( "вершина №" + ( i + 1 ) + " : " );
      var s = readline()
      if( s === null ) {       // ^D
         print( "завершение" );
         quit();
      }
      var ws = s.split( ' ' );
      if( ws.length !== 2 ||
          isNaN( x = parseFloat( ws[ 0 ] ) ) ||
          isNaN( y = parseFloat( ws[ 1 ] ) ) ) {
         print( "ошибка" );
         continue;
      }
      points[ i++ ] = new Complex( x, y );
      delete x; delete y;    
   }
   s = "треугольник:";
   for( i in points ) s += points[ i ];
   print( s ); 
   print( "периметр = " + perimeter( points ).toFixed( 2 ) );
   print( "площадь = " + square( points ).toFixed( 2 ) );
   print( "---------------------------------" );
}
(там даже есть обработка ошибок ввода ;-) )

Выполнение:

Код: Выделить всё

olej@notebook:~/2014_WORK/ManyLan$ js -U triangle.js
координаты вершин в формате: X Y
вершина №1 : -1 0
вершина №2 : 0 1
вершина №3 : 1 0
треугольник: [-1.00,0.00] [0.00,1.00] [1.00,0.00]
периметр = 4.83
площадь = 1.00
---------------------------------
координаты вершин в формате: X Y
вершина №1 : завершение
Практиковаться в JavaScript - очень интересно ... истинное удовольствие.
Сложность в том, что по консольному JavaScript и SpiderMonkey практически нет описаний, руководств...

Но, в какой-то степени достаточно (язык то маленький) 2-х источников:

1. описания JS API на сайте Mozilla (которой и принадлежит SpiderMonkey).

2. книга вот такая, даже есть в переводе на русский язык:
Изображение
Дэвид Флэнаган, JavaScript. Подробное руководство, 6-е издание
1080 страниц ... я был научным редактором издания этой книги, поэтому её помню.

Это из отзывов о книге на сайте издательства:
26 декабря 2013
Это единственная книга по JavaScript, которую можно назвать учебником по языку. Все другие книги, притендующие на звание "учебник" - хлам.
Вложения
triangle.js
(2.33 КБ) 432 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: сравнение языков программирования

Непрочитанное сообщение Olej » 02 фев 2014, 00:42

Olej писал(а):
Olej писал(а): Следующий вариант, естественно, C++.
Следующий вариант, естественно ;-) , Java:
Следующий вариант - Python:
Ещё вариант ... может кому-то показаться сильно неожиданным ;-) - JavaScript.
Ещё вариант - PHP (php5).
В принципе, PHP-программисты используют язык только в Web-программировании ... но для целей сравнения, обучения, опробывания синтаксических конструкций - вполне возможен вариант консольных приложений ... и даже удобнее.

Код: Выделить всё

#!/usr/bin/php
<?php

class Complex {
   var $x, $y;
   function __construct( $re, $im ) {  // конструктор
      $this->x = $re;
      $this->y = $im;
   }
   function abs() {
      return sqrt( $this->x * $this->x + $this->y * $this->y );
   }
   function arg() {
      return atan2( $this->y, $this->x );
   }
   function sub( $that ) {
      return new Complex( $this->x - $that->x, $this->y - $that->y );
   }
}

class Point extends Complex {
   function toString() {
      $s = sprintf( "[%.2f,%.2f] ", $this->x, $this->y );
      return $s;
   }
}

function perimeter( $triang ) {
   $sum = 0.0;
   for( $i = 0; $i < sizeof( $triang ); $i++ ) { 
      $j = $i == 0 ? sizeof( $triang ) - 1 : $i - 1;
      $sum += $triang[ $i ]->sub( $triang[ $j ] )->abs();
   }
   return $sum;
}

function square( $triang ) {
   $side1 = $triang[ 1 ]->sub( $triang[ 0 ] );
   $side2 = $triang[ 2 ]->sub( $triang[ 0 ] );
   return $side1->abs() * $side2->abs() *
          abs( sin( $side1->arg() - $side2->arg() ) ) / 2.;
}

define( "NODES", 3 );

while( TRUE ) {
   print "координаты вершин в формате: X Y\n";
   $points = array();  // динамический массив - образ треугольника
   $i = 0;
   while( $i < NODES ) {
      echo "вершина № " . ($i + 1) . " : ";
      $line = stream_get_line( STDIN, 1024, PHP_EOL );
      if( strlen( $line ) == 0 )          // ^D
         die( "завершение\n" );
      $pieces = explode( " ", $line );
      if( sizeof( $pieces ) != 2 ) {
         echo "ошибка\n";
         continue;
      }
      $fmask = "+-0123456789.Ee"; 
      if( 0 == strspn( $pieces[ 0 ], $fmask ) || 0 == strspn( $pieces[ 1 ], $fmask ) ) {
         echo "ошибка\n";
         continue;
      }
      $points[] = new Point( (float)$pieces[ 0 ], (float)$pieces[ 1 ] ); // дополнение! в массив
      $i++;
   }
   $s = "треугольник: ";
   for( $i = 0; $i < sizeof( $points ); $i++ )
      $s = $s . $points[ $i ]->toString();
   echo $s, "\n";
   printf( "периметр = %.2f\n", perimeter( $points ) );
   printf( "площадь = %.2f\n", square( $points ) );
   print "---------------------------------\n";
} 

?>
Выполнение:

Код: Выделить всё

olej@notebook:~/2014_WORK/ManyLan$ php5 ./triangle.php
координаты вершин в формате: X Y
вершина № 1 : -1 0
вершина № 2 : 0 1
вершина № 3 : 1 0
треугольник: [-1.00,0.00] [0.00,1.00] [1.00,0.00]
периметр = 4.83
площадь = 1.00
---------------------------------
координаты вершин в формате: X Y
вершина № 1 : 2
ошибка
вершина № 1 : 3 r
ошибка
вершина № 1 : завершение
Информация по PHP весьма обширная.
Вот этих источников, я думаю, вполне достаточно ... и там есть вариант и на русском языке:
Вложения
triangle.php
(2.37 КБ) 424 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: сравнение языков программирования

Непрочитанное сообщение Olej » 02 фев 2014, 00:57

Итого, уже представлены варианты для сравнения одного и того же, написанного на разных языках:
Olej писал(а): - C
- C++
- Java
- Python
- JavaScript
- PHP
В каждом из вариантов я старался включить те специфические черты, которые присущи этому языку: множественное присваивание в левой части оператора =, функциональные литералы, вложенные описания функций, классы и объекты...

Мне сравнение кажется очень интересным!
Для изучающих (или собирающихся изучать) язык, это лучше 1 раз показать, чем 10 раз объяснять "на пальцах".

Примечание: Все примеры меняются со временем, улучшаются ... а, главное, делаются более похожими друг на друга: эквивалентные переменные называются одними языками и т.д.
Но имена прикреплённых файлов остаются неизменными.
Если кого заинтересуют какие-то из примеров (я их здесь для себя накапливаю ;-) ) - то смотрите файлы самые поздние по времени!

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: сравнение языков программирования

Непрочитанное сообщение Olej » 02 фев 2014, 10:03

Olej писал(а): Информация по PHP весьма обширная.
Вот этих источников, я думаю, вполне достаточно ... и там есть вариант и на русском языке:
Есть такая книга - Мишель Е. Дэвис, Джон А. Филлипс, Изучаем PHP и MySQL, 2-е издание, стр. 448:
Изображение
Книга достаточно поверхностного уровня (этой книги я тоже был научным редактором при подготовке издания), но её вполне достаточно ... особенно если пользоваться справочником функция, показанным выше.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: сравнение языков программирования

Непрочитанное сообщение Olej » 03 фев 2014, 01:31

Olej писал(а):Итого, уже представлены варианты для сравнения одного и того же, написанного на разных языках:
Olej писал(а): - C
- C++
- Java
- Python
- JavaScript
- PHP
Следующий на очереди - Lua:
Изображение

Почти без комментариев:
- Lua - встраиваемый (в C/C++) очень компактный интерпретирующий язык...
- с совершенно динамической структурой данных: все структурные данные (массивы, структуры, хэши, классы, объекты, ...) представляются только одной структурой: таблицы
- ... очень модный для конфигурационных скриптов крупных проектов.

Страница проекта Lua и документация - здесь.

В Lua, естественно, нет класса complex, но это в достатке (именно как класс ООП) можно найти в интернет. Чтобы не загружать код примера, я взял готовый модуль здесь.

Ещё информация по Lua, в том числе и переводы:
http://lua-users.org/wiki/TutorialDirectory
http://www.lua.org/docs.html
http://www.lua.ru/doc/

http://symmetrica.net/lua/lua1.pdf
http://symmetrica.net/lua/lua2.pdf
http://symmetrica.net/lua/lua3.pdf
http://symmetrica.net/lua/lua4.pdf


Вот как загадочно теперь этот пример выглядит (это 1-й примитивный вариант, который будет меняться):

Код: Выделить всё

#!/usr/bin/lua

-- https://github.com/davidm/lua-matrix/blob/master/lua/complex.lua
local complex = require 'complex'


inpoint = function( prompt ) 
   io.write( prompt )
   local s = io.read ()                        -- чтение пары координат
   if( s == nil ) then
      print 'завершение'
      os.exit()
   end
   local res = {}
   for w in string.gmatch( s, "%S+" ) do
      table.insert( res, w )
   end
   if( #res ~= 2 ) then return nil; end        -- только 2 поля ввода: x & y
   local ret, x = pcall( string.format, "%e", res[ 1 ] )
   if( not ret ) then return nil; end
   local ret, y = pcall( string.format, "%e", res[ 2 ] )
   if( not ret ) then return nil; end
   return x, y -- nil если не число
end

local perimeter = function( triang )           -- функциональный литерал
         local function length( p1, p2 )       -- вложенная функция
            n, t =  complex.polar( p2 - p1 )
            return n
         end
         local suma = 0.0
         for i, v in ipairs( triang ) do
            if( i == #triang ) then j = 1
            else j = i + 1
            end
            suma = suma + length( triang[ i ], triang[ j ] ) 
         end
         return suma;
      end

local square = function( triang )              -- функциональный литерал
         -- таблица triang индексируется с 1: n = re, t = im
         local n1, t1 = complex.polar( triang[ 2 ] - triang[ 1 ] )
         local n2, t2 = complex.polar( triang[ 3 ] - triang[ 1 ] )
         return n1 * n2 * math.abs( math.sin( t2 - t1 ) ) / 2.;
         end

nodes = 3 

while true do
   print( 'координаты вершин в формате: X Y' )
   local points = {}                           -- пустая таблица - многогольник
   local i = 0
   repeat
      x, y = inpoint( 'вершина №' .. ( i + 1 ) .. ' : ' )
      if( not x ) then print 'ошибка'
      else
         points[ i + 1 ] = complex.new( x, y ) -- добавить вершину
         i = i + 1
      end
   until i >= nodes
   io.write( 'треугольник:' )
   for i, v in ipairs( points ) do
      local msg = " [" .. string.format( "%.2f", v[ 1 ] ) 
      msg = msg .. "," .. string.format( "%.2f", v[ 2 ] ) .."]"
      io.write( msg ) 
   end
   print ''
   print( 'периметр = ' .. string.format( "%.2f", perimeter( points ) ) )
   print( 'площадь = ' .. string.format( "%.2f",square( points ) ) )
   print "---------------------------------"
end 
И всё то же (примерно) выполнение:

Код: Выделить всё

olej@notebook:~/2014_WORK/ManyLan$ lua triangle.lua
координаты вершин в формате: X Y
вершина №1 : -1 0
вершина №2 : 0 1
вершина №3 : 1 0
треугольник: [-1.00,0.00] [0.00,1.00] [1.00,0.00]
периметр = 4.83
площадь = 1.00
---------------------------------
координаты вершин в формате: X Y
вершина №1 : 3 4 5
ошибка
вершина №1 : 4. h
ошибка
вершина №1 : 1
ошибка
вершина №1 : завершение
P.S. Ложка дёгтя в бочку мёда :shock: :
- во многих текущих дистрибутивах Linux по умолчанию установлена Lua, но версии:

Код: Выделить всё

olej@notebook:~/2014_WORK/ManyLan$ lua -v
Lua 5.0.3  Copyright (C) 1994-2006 Tecgraf, PUC-Rio
Это барахло! Там даже API таблиц нормально ещё не работает...
Сразу устанавливаем что-то типа:

Код: Выделить всё

olej@notebook:~$ sudo aptitude install lua5.2
Следующие НОВЫЕ пакеты будут установлены:
  lua5.2
...

olej@notebook:~/2014_WORK/ManyLan$ lua -v
Lua 5.2.1  Copyright (C) 1994-2012 Lua.org, PUC-Rio
Вот только тогда оно заработает!
(я на это пол-дня убил! :evil: )

P.P.S. Для связывания файл модуля complex.lua всего лишь положить в каталог задачи.
Вложения
triangle.lua
(2.79 КБ) 401 скачивание
complex.lua
(11.22 КБ) 395 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: сравнение языков программирования

Непрочитанное сообщение Olej » 03 фев 2014, 19:18

- C
- C++
- Java
- Python
- JavaScript
- PHP
- Lua

Глядя на сравнительные коды (или когда пишешь что-то подобное) становится сильно понятно насколько гибче ЯП, которые строятся на динамической типизации (те которые отмечены bold шрифтом) ... или даже почти полной её отсутствии (как Lua ... или как в Lisp & FORTH). В них изначально задаются все размерности структурных переменных (списков, массивов, таблиц, ...) - динамическими, и ничего не стоит приложение обсчёта параметров треугольника превратить в программу обсчёта произвольного выпуклого многоугольника, с произвольным числом вершин.

На языках со строгой статической типизацией это возможно только:
- если сразу резервировать под массивы "по максимуму" (1000? :-o ;-) ) ... как это делалось издревле в FORTRAN ещё с 1958 г.
- использовать ссылочно-связанные структуры данных: списки или кольцевые списки (как в ядре Linux) в C, типы STL или Boost в C++ и т.д. ... но это усложняет код.

С другой стороны, строгая статическая типизация - это более жёсткий контроль ошибок, ещё с уровня компиляции ... о верификации динамически типизируемых программ и говорить, наверное, не приходится ... хотя кто её делает?

Пример работы приложений (чуть изменённых) работающих на многоугольниках произвольной размерности:

Код: Выделить всё

olej@notebook:~/2014_WORK/OWN.BOOKS/ManyLan/ex.draft$ ./triangle.py
координаты вершин в формате: X Y (^D конец ввода)
вершина № 1 : 1 1
вершина № 2 : 1 2
вершина № 3 : 2 2
вершина № 4 : 2 1
вершин 4 : [1.00,1.00] [1.00,2.00] [2.00,2.00] [2.00,1.00]
периметр = 4.00
площадь = 1.00
---------------------------------

Код: Выделить всё

olej@notebook:~/2014_WORK/OWN.BOOKS/ManyLan/ex.draft$ js -U triangle.js
координаты вершин в формате: X Y (^D конец ввода)
вершина №1 : 1 1
вершина №2 : 1 2
вершина №3 : 2 2
вершина №4 : 2 1
вершин 4 : [1.00,1.00] [1.00,2.00] [2.00,2.00] [2.00,1.00]
периметр = 4.00
площадь = 1.00
---------------------------------

Код: Выделить всё

olej@notebook:~/2014_WORK/OWN.BOOKS/ManyLan/ex.draft$ php triangle.php
координаты вершин в формате: X Y (^D конец ввода)
вершина № 1 : 1 1
вершина № 2 : 1 2
вершина № 3 : 2 2
вершина № 4 : 2 1
вершин 4 : [1.00,1.00] [1.00,2.00] [2.00,2.00] [2.00,1.00]
периметр = 4.00
площадь = 1.00
---------------------------------

Код: Выделить всё

olej@notebook:~/2014_WORK/OWN.BOOKS/ManyLan/ex.draft$ lua triangle.lua
координаты вершин в формате: X Y (^D конец ввода)
вершина №1 : 1 1
вершина №2 : 1 2
вершина №3 : 2 2
вершина №4 : 2 1
вершина №5 :
вершин 4 : [1.00,1.00] [1.00,2.00] [2.00,2.00] [2.00,1.00]
периметр = 4.00
площадь = 1.00
---------------------------------
Вложения
triangle.py
(2.27 КБ) 399 скачиваний
triangle.js
(2.46 КБ) 424 скачивания
triangle.php
(2.58 КБ) 397 скачиваний
triangle.lua
(3.25 КБ) 425 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: сравнение языков программирования

Непрочитанное сообщение Olej » 03 фев 2014, 23:53

Olej писал(а): Есть у меня на примете такая задача: просчёт треугольника - вы вводите координаты 3-х вершин треугольника, и получаете в ответ его периметр и площадь:
Кстати!
Эти задачи очень хороший показатель того, почему для 2D-координатного представления лучше выбирать пару (X,Y) координат в формате (float,float) ... а не (int,int) как чаще всего моделируется 2D-плоскость, но это только из-за дискретного пиксельного представления экрана.

P.S. Хоть это и понятно... , но напоролся я на это когда решил набросать эквивалент той же задачи на языке bash, для сравнений. Вспомнилось, что на bash написаны полностью несколько Open Source публичных проектов объёмом в тысячи операторов. Но это - высший пилотаж, и многие воспринимают bash как язык написания скриптов в 2-3 строчки ... - путают с .bat в Windows. :lol:

Так вот, я как-то упустил из виду, что в bash вообще нет вещественной арифметики ... помнил, а здесь - забыл. :oops:
Убил на это 2 часа, прописав всю структуру данных и ввода-вывода ... и дойдя до вычислительной математики. :-(

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: сравнение языков программирования

Непрочитанное сообщение Olej » 04 фев 2014, 10:59

Olej писал(а): P.S. Хоть это и понятно... , но напоролся я на это когда решил набросать эквивалент той же задачи на языке bash, для сравнений. Вспомнилось, что на bash написаны полностью несколько Open Source публичных проектов объёмом в тысячи операторов. Но это - высший пилотаж, и многие воспринимают bash как язык написания скриптов в 2-3 строчки ... - путают с .bat в Windows. :lol:

Так вот, я как-то упустил из виду, что в bash вообще нет вещественной арифметики ... помнил, а здесь - забыл. :oops:
Убил на это 2 часа, прописав всю структуру данных и ввода-вывода ... и дойдя до вычислительной математики. :-(
Но как пел незабвенный Владимир Семёнович Высоцкий:
Но если я чего решил - я выпью обязательно
:lol:

Если в bash нет вещественной (и комплексной, соответственно) математики - это вовсе не означает, что на bash нельзя написать такую задачу! :lol:
Сам скрипт на bash может получить данные, сформировать задачу ... а на сами вычисления выбросить эти данные внешнему приложению, которое сделает все расчёты и вернёт результат!
Сказано - сделано...
Писать такие внешние приложения на C вряд ли разумно: их нужно компилировать, а здесь вся "фишка" в скриптовости ... напишу я эти 2 внешних приложения (рассчитать: а). периметр и б). площадь) на ... Python, тем более, что код уже есть - его нужно только оформить.
В итоге:

Код: Выделить всё

olej@notebook:~/2014_WORK/OWN.BOOKS/ManyLan/ex.9/bash$ ls
perimeter.py  polygon.py  square.py  triangle.sh

- triangle.sh - главное приложение
- когда ему нужно сосчитать, оно вызывает perimeter.py и square.py, передавая им описание координат многоугольника виде параметра командной строки...
- polygon.py - это просто библиотечный модуль Python, чтоб не писать в perimeter.py и square.py 2 раза: он распаковывает полученную командную строку + формирует из неё кортеж ([]) комплексных значений для perimeter.py и square.py (чтоб мне их не переписывать ;-) )
Вот и всё кино...
Как-то так:

Код: Выделить всё

triangle.sh
|
+---> perimeter.py ---+ 
|                     |
|                polygon.py
|                     |
+---> square.py ------+
Вот сам файл triangle.sh (остальные особого интереса не представляют - это уже было):

Код: Выделить всё

#!/bin/bash

while [ TRUE ]
declare -a polygon_x
declare -a polygon_y
do
   i=1
   echo "координаты вершин в формате: X Y (^D конец ввода)"
   while [ TRUE ]
   do
      echo -n "вершина № $i : "
      declare -a parm
      read -a parm
      element_count=${#parm[@]}       # число введенных значений
      if [[ $element_count -eq 0 ]]   # ^D - конец ввода
      then
         echo -en "\r\a"
         break
      elif [[ $element_count -ne 2 ]] # неправильное число элементов ввода
      then
         echo "ошибка ввода!"
         continue
      fi
      polygon_x[ $i ]=${parm[0]} 
      polygon_y[ $i ]=${parm[1]}
      i=`expr $i + 1`   
   done
   i=${#polygon_x[@]} 
   echo -n "вершин $i : "
   polystr=""   
   for (( j=1; j <= i ; j++ ))       # двойные круглые скобки и "j" без "$".
   do
      polystr="$polystr [${polygon_x[j]},${polygon_y[j]}] "
   done                     
   echo $polystr
   cmd="./perimeter.py \" $polystr \""
   ret=`eval $cmd`
   echo "периметр = $ret"
   cmd="./square.py \" $polystr \""
   ret=`eval $cmd`
   echo "площадь = $ret"
   echo ---------------------------------
done
Вот его работа:

Код: Выделить всё

olej@notebook:~/2014_WORK/OWN.BOOKS/ManyLan/ex.draft/bash$ ./triangle.sh
координаты вершин в формате: X Y (^D конец ввода)
вершина № 1 : 1 1
вершина № 2 : 2 1
вершина № 3 : 1 2
вершин 3 : [1,1] [2,1] [1,2]
периметр = 3.41
площадь = 0.50
---------------------------------
координаты вершин в формате: X Y (^D конец ввода)
вершина № 1 : 1 1
вершина № 2 : 1 2
вершина № 3 : 2
ошибка ввода!
вершина № 3 : 2 2
вершина № 4 : 2 1
вершин 4 : [1,1] [1,2] [2,2] [2,1]
периметр = 4.00
площадь = 1.00
---------------------------------
координаты вершин в формате: X Y (^D конец ввода)
вершина № 1 : ^C
P.S. Для выполнения этого приложения нужно всего лишь сгрузить 4 файла (по несколько сот байт) в один каталог - и можно запускать.
Вложения
triangle.sh
(1.25 КБ) 393 скачивания
perimeter.py
(376 байт) 410 скачиваний
square.py
(409 байт) 389 скачиваний
polygon.py
(1.16 КБ) 392 скачивания

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 10 гостей