اعلان Python سیکھنے میں کون کون دلچسپی رکھتا ہے

دوست

محفلین
میں پائتھون کو ایک سے زیادہ بار سیکھنے کی کوشش کر چکا ہوں۔ ایک بار تو ایک سکرپٹ بھی لکھ ڈالا تھا این ایل ٹی کے سے اردو ٹیکسٹ ٹیگ کروانے کے لیے۔ تاہم پھر سی شارپ سے ہی کام کرتا رہا ہوں دو تین سال سے، جو بھی تھوڑی بہت ٹیکسٹ پروسیسنگ کرنا ہوتی ہے۔ پائتھون آسان ہے، لیکن ڈائنامک لینگوئج ہونے کی وجہ سے مجھے مشکل ہوئی تھی۔ میتھد ڈیفائن کرنے کا طریقہ، پھر متغیر کے شروع میں ٹائپ لکھنے کی عادت جو یہاں نہیں لکھا جاتا۔ میں نے پھر ہاتھ نہیں لگایا اسے۔
 
ہم یہاں کچھ لکھنے کا ارادہ نہیں رکھتے تھے لیکن محب صاحب نے غلط بیانیوں کا سہارا لے کر ہمیں مجبور کر دیا۔ اس قسم کے چور راستے غیر مناسب ہیں۔ :) :) :)

روبی سے زیادہ آسان syntax ہے اس کا اور مستقبل بھی اب تابناک نظر آ رہا ہے اور دوسرا یہ عمومی نوعیت کے لیے بھی مفید ہے اور ویب کے لیے بھی۔ روبی البتہ ویب پر اس کے مقابلے میں زیادہ کارآمد ہے۔
پائیتھون اور روبی دونوں ہی زبانوں کا سنٹیکس خاصہ سہل ہے۔ بلکہ روبی کی رگوں میں پائیتھون کا ڈھیر سارا لہو دوڑ رہا ہے۔ روبی پائتھون کے مقابلے کافی جدید زبان ہے یعنی اس کے کئی سال بعد وجود میں آئی۔ روبی کا سنٹیکس و دیگر کئی خصوصیات پائتھون، پرل، سی سمیت کئی زبانوں سے متاثر ہیں۔ ظاہر ہے اس لحاظ سے دیکھا جائے تو منطقی طور پر روبی کا سنٹیکس پائتھون کے مقابلے کہیں سہل ہونا چاہئے کیوں کہ اس میں "بیسٹ آف آل ورلڈس" کو جمع کرنے کی کوشش کی گئی تھی۔
مستقبل دونوں ہی زبانوں کا تابناک نظر آ رہا ہے، جبکہ مجموعی طور پر مقبولیت کی رفتار کے گراف کا ڈھلوان روبی کا زیادہ عمودی ہے۔ واضح رہے کہ کسی زبان کی مقبولیت کو تعلیمی ادارے متعین نہیں کرتے بلکہ ڈیویلپر کمیونٹی اور کارپوریٹ آئی ٹی انڈسٹری اس بات کا تعین کرتی ہے۔ پائتھون اب کافی پختہ کار زبان ہو چلی ہے اور عرصہ سے انڈسٹری میں موجود ہے اور اس کے لئے کم و بیش ہر قسم کی لائبریرز موجود ہیں اس لئے تعلیمی ادارے بھی اس پر توجہ دے رہے ہیں۔ پائتھون گوگل کی تین آفیشیل زبانوں میں سے ایک ہے۔ وہیں روبی چونکہ جاپان میں پیدا ہوئی اور اس کے خالق جاپانی زبان کو پروگرمنگ سے ہم آہنگ کرنے میں اہم کردار ادا کر چکے ہیں لہٰذا روبی میں روز اول سے یونیکوڈ کی بہترین سپورٹ موجود رہی ہے جو روز بروز بہتر ہوتی جا رہی ہے۔ روبی در اصل امبیڈیڈ سسٹم اور پیریلل پروسیسنگ وغیرہ کے معاملے میں موزوں زبان نہیں ہے، غالباً اگلے میجر اپڈیٹ میں یہ خواص اس میں شامل کی جائیں گی۔ لیکن ان مقاصد کے لئے پائتھون بھی اچھی زبان نہیں بلکہ سی جیسی زبانوں پر تکیہ کرنا چاہئے۔
دونوں ہی زبانیں عمومی اپلیکینش ڈیویلپمینٹ اور ویب ڈیویلپمینٹ کے لئے مفید ہیں۔ پائتھون اس زمانے میں پیدا ہوئی جب ڈیسکٹاب ڈیویلپمنٹ کا دور دورہ تھا اس لئے آپ کو اکثر لینکس ایپلیکیشنز پائتھون میں لکھے ہوئے مل جائیں گے جبکہ روبی آن ریلز کی آمد کے بعد ڈیویلپر کمیونٹی نے اس کو ویب کے لئے استعمال کرنے میں خاصی دلچسپی دکھائی۔ یہ بات درست ہے کہ ریلز کی آمد سے قبل روبی زبان کا نام بھی خال خال ہی لوگوں نے سنا تھا۔ بعد میں روبی آن ریلز سے متاثر ہو کر پائتھون اور پی ایچ پی سمیت دیگر کئی زبانوں میں ایم وی سی بیسڈ ویب ڈیویلپمنٹ فریم ورک کی باڑھ آ گئی۔ لیکن یہ پایا گیا کہ روبی کا سنٹیکس بول چال والی انگریزی سے قریب ترین ہونے کے باعث کئی دفعہ کنفیگیوریشن وغیرہ کی روبی فائلوں کو دیکھ کر گمان ہی نہیں ہوتا کہ یہ ایک پیور روبی فائل ہے، ایسا لگتا ہے کہ کسی نے ڈیویلپر کے لئے انسٹرکشنز ککا نوٹ بنا کر رکھا دیا ہے۔ اسی طرح ٹیسٹ ڈریون ڈیویلپمنٹ میں بھی روبی کے سنٹیکس نے بازی ماری اور تقریباً عام بول چال کی انگریزی جیسی زبان میں لکھے ہوئے ٹیسٹ کیسیز کو ایکزیکیوٹ کیا جا سکتا ہے۔ ساتھ ہی ریلز نے اب تک دیگر تمام زبانوں کے ویب فریم ورک کی پیشوائی کی ہے۔ مثلاً جب ریلز نے ریسٹ فل فلسفے کو اپنایا تو باقی سبھی اس کے پیچھے دوڑ پڑے۔ فی الحال دونوں زبانوں میں ڈیویلپر کمیونٹی یکساں فعالیت دکھا رہی ہے اور ان زبانوں کو نئی جہتوں سے رو شناس کرا رہی ہے۔ اس لئے دونوں میں سے کسی ایک یا دونوں کو سیکھ لینا ضرور رساں نہیں ہونا چاہئے۔ ڈیویلپر کمیونٹی میں ہونے والی "ہولی وار" ہمیشہ سے مفید رہی ہے جس کی ایک مثال وی آئی ایم اور ای میکس ایڈیٹرز ہیں۔ :) :) :)

روبی کا بنیادی فلسفہ ہے کہ کسی بھی چیز کو کرنے کے ایک سے زائد طریقہ ہوتے ہیں۔
غالباً یہ فلسفہ پائتھون کمیونٹی کی جانب سے روبی پر زبردستی تھوپا گیا ہے جو کہ پائتھون کے فلسفے کے مقابل میں ہو۔ جبکہ ہمارے علم اور وکیپیڈیا کے مطابق روبی کا بنیادی فلسفہ "ڈیویلپر ہیپی نیس اور پروڈکٹیوٹی" ہے۔ اس مقصد کے لئے کئی دفعہ زبان کی پرفارمینس پر ترجیح دی گئی ہے۔ مثلاً ایک سرچ انجن اگر پیور جاوا میں بنایا جائے تو کافی سریع ہوگا لیکن اس کی ڈیویلپمینٹ میں جو وقت صرف ہوگا اس کا ایک عشیر بھی اگر روبی زبان میں اسی چیز کو امپلیمینٹ کرنے میں صرف کیا جائے تو زیادہ خوبصورت چیز بن کر آ جائے گی، یہ اور بات ہے کہ اس کی رفتار اتنی اچھی نہیں ہوگی۔ عام طور پر یہ دیکھنے میں آیا ہے کہ جب تک جاوا وغیرہ میں کوئی ایپلیکیشن تیار کی جاتی ہے تب تک کلائنٹ کی ضروریات ہی بدل چکی ہوتی ہیں۔ لہٰذا ریپڈ ڈیویلپمنٹ یا اجائل ڈیویلپمنٹ فلسفوں کے حامی روبی کو ترجیح دیتے ہیں۔ کیوں کہ اس میں کم سے کم مدت میں کم سے کم ڈیویلپر کی افرادی قوت صرف کر کے کلائنٹ کی ضروریات کو پورا کیا جا سکتا ہے اور پھر وقت کے ساتھ اس میں پہتری لائی جا سکتی ہے۔
یہ بات درست ہے کہ روبی میں کسی کام کو کرنے کے ایک سے زائد طریقے پائے جاتے ہیں لیکن یہ اس کا بنیادی فلسفہ ہرگز نہیں۔ در اصل اس کا سبب اس زبان کو نیچرل لینگوئیج سے قریب ترین رکھنا ہے۔ جیسے ایک ہی بات کو انگریزی بولنے والے دس افراد دس طرح سے بولتے ہیں اس طرح روبی میں بھی کئی طریقے رائج ہیں اور لوگ اپنی پسند لے لہجے میں کوڈ لکھ سکتے ہیں۔ اس کو اس مثال سے سمجھا جا سکتا ہے۔
PHP:
if !i.zero? then print "I am not zero"
PHP:
print "I am not zero" unless i.zero?
پہلی مثال میں آئی کی قدر صفر ہو اس بات کا جائزہ لیا گیا ہے پھر ایکسکلیمیشن نشان ! کی مدد سے اس کی نفی کی گئی ہے جس کو سمجھنا غیر پروگرامرس کے لئے قدرے مشکل ہے۔ یہ کئی زبانوں میں رائج طریقہ ہے جبکہ روبی نے اسی مقصد کے حصول کے لئے unless کی مدد سے ایک اس کو نیچرل لینگوئیج سے قریب ترین کر دیا ہے اور عام قاری بھی اس کو آسانی سے سمجھ سکتا ہے۔ واضح رہے کہ اوپر دی گئی مثال کو مزید کئی طریقوں سے لکھا جا سکتا ہے۔ لیکن فی الحال ہم ایک اور دلچسپ مثال یہاں پیش کرتے ہیں۔ جو دونوں کمیونٹیز میں باہمی خوشگوار جنگ کا نتیجہ ہے۔ :) :) :)

روبی پروگرامر کی ارتقا:
PHP:
# Newbie Programmer
def factorial(x)
  if x == 0
    return 1
  else
    return x * factorial(x - 1)
  end
end
puts factorial(6)
puts factorial(0)
 
# Discovered #upto
def factorial(x)
  factorial = 1
  1.upto(x) do |i|
    factorial *= i
  end
  factorial
end
puts factorial(6)
puts factorial(0)
 
# Discovered Enumerators
def factorial(x)
  x.downto(1).inject(1) { |m, i| m * i }
end
puts factorial(6)
puts factorial(0)
 
# Discovered Range+Inject
def factorial(x)
  (1..x).inject(1) { |m, i| m * i }
end
puts factorial(6)
puts factorial(0)
 
# Embraced 1.8.7/1.9
def factorial(x)
  (1..x).inject(:*) || 1
end
puts factorial(6)
puts factorial(0)
 
# Discovered Ternary Operators
def fac(x); x == 0 ? 1 : x * fac(x - 1);end
puts fac(6)
puts fac(0)
 
# Discovered Operator Precedence
def factorial(x)
  i = 1 and (i *= x and x -= 1 while x > 0) or i
end
puts factorial(6)
puts factorial(0)
 
# Discovered Rails
class Numeric
  def fact
    (1..self).inject(:*) || 1
  end
end
puts 6.fact
puts 0.fact
 
# Discovered Camping
def F(x)((1..x).inject(:*)||1)end;p(F(6));p(F(0))
 
# Discovered Magic
module Math
  extend self
 
  def method_missing(method, *args)
    if method.to_s =~ /^fact(orial)?/
      class_eval <<-EOS
      def #{method}(x)
        (1..x).inject(:*) || 1
      end
      EOS
      send(method, *args)
    else
      super
    end
   
  end
end
puts Math.fact(6)
puts Math.fact(0)
 
# Discovered Hash Magic
FACTORIALS = Hash.new { |h, k| h[k] = (1..k).inject(:*) || 1 }
puts FACTORIALS[6]
puts FACTORIALS[0]
 
# Attends Seattle.rb
require 'rubygems'
require 'inline'
class Factorial
  class << self
    inline do |builder|
      builder.c %q{
        long factorial(int value) {
          long result = 1, i = 1;
          for (i = 1; i <= value; i++) {
            result *= i;
          }
          return result;
        }
      }
    end
  end
end
puts Factorial.factorial(6)
puts Factorial.factorial(0)
 
# Premature Optimizer + eval
class << self; class_eval "def factorial(x); case x; #{(0..100).map{|i|"when #{i} then #{(1..i).inject(:*) || 1};"}}; else (1..x).inject(:*) || 1 end end" end
puts factorial(6)
puts factorial(0)

پائتھون پروگرامر کی ارتقا:
PHP:
#Newbie programmer
def factorial(x):
    if x == 0:
        return 1
    else:
        return x * factorial(x - 1)
print factorial(6)
 
 
#First year programmer, studied Pascal
def factorial(x):
    result = 1
    i = 2
    while i <= x:
        result = result * i
        i = i + 1
    return result
print factorial(6)
 
 
#First year programmer, studied C
def fact(x): #{
    result = i = 1;
    while (i <= x): #{
        result *= i;
        i += 1;
    #}
    return result;
#}
print(fact(6))
 
 
#First year programmer, SICP
@tailcall
def fact(x, acc=1):
    if (x > 1): return (fact((x - 1), (acc * x)))
    else:      return acc
print(fact(6))
 
 
#First year programmer, Python
def Factorial(x):
    res = 1
    for i in xrange(2, x + 1):
        res *= i
    return res
print Factorial(6)
 
 
#Lazy Python programmer
def fact(x):
    return x > 1 and x * fact(x - 1) or 1
print fact(6)
 
 
#Lazier Python programmer
f = lambda x: x and x * f(x - 1) or 1
print f(6)
 
 
#Python expert programmer
import operator as op
import functional as f
fact = lambda x: f.foldl(op.mul, 1, xrange(2, x + 1))
print fact(6)
 
 
#Python hacker
import sys
@tailcall
def fact(x, acc=1):
    if x: return fact(x.__sub__(1), acc.__mul__(x))
    return acc
sys.stdout.write(str(fact(6)) + '\n')
 
 
#EXPERT PROGRAMMER
import c_math
fact = c_math.fact
print fact(6)
 
 
#ENGLISH EXPERT PROGRAMMER
import c_maths
fact = c_maths.fact
print fact(6)
 
 
#Web designer
def factorial(x):
    #-------------------------------------------------
    #--- Code snippet from The Math Vault          ---
    #--- Calculate factorial (C) Arthur Smith 1999 ---
    #-------------------------------------------------
    result = str(1)
    i = 1 #Thanks Adam
    while i <= x:
        #result = result * i  #It's faster to use *=
        #result = str(result * result + i)
          #result = int(result *= i) #??????
        result str(int(result) * i)
        #result = int(str(result) * i)
        i = i + 1
    return result
print factorial(6)
 
 
#Unix programmer
import os
def fact(x):
    os.system('factorial ' + str(x))
fact(6)
 
 
#Windows programmer
NULL = None
def CalculateAndPrintFactorialEx(dwNumber,
                                hOutputDevice,
                                lpLparam,
                                lpWparam,
                                lpsscSecurity,
                                *dwReserved):
    if lpsscSecurity != NULL:
        return NULL #Not implemented
    dwResult = dwCounter = 1
    while dwCounter <= dwNumber:
        dwResult *= dwCounter
        dwCounter += 1
    hOutputDevice.write(str(dwResult))
    hOutputDevice.write('\n')
    return 1
import sys
CalculateAndPrintFactorialEx(6, sys.stdout, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
 
 
#Enterprise programmer
def new(cls, *args, **kwargs):
    return cls(*args, **kwargs)
 
class Number(object):
    pass
 
class IntegralNumber(int, Number):
    def toInt(self):
        return new (int, self)
 
class InternalBase(object):
    def __init__(self, base):
        self.base = base.toInt()
 
    def getBase(self):
        return new (IntegralNumber, self.base)
 
class MathematicsSystem(object):
    def __init__(self, ibase):
        Abstract
 
    @classmethod
    def getInstance(cls, ibase):
        try:
            cls.__instance
        except AttributeError:
            cls.__instance = new (cls, ibase)
        return cls.__instance
 
class StandardMathematicsSystem(MathematicsSystem):
    def __init__(self, ibase):
        if ibase.getBase() != new (IntegralNumber, 2):
            raise NotImplementedError
        self.base = ibase.getBase()
 
    def calculateFactorial(self, target):
        result = new (IntegralNumber, 1)
        i = new (IntegralNumber, 2)
        while i <= target:
            result = result * i
            i = i + new (IntegralNumber, 1)
        return result
 
print StandardMathematicsSystem.getInstance(new (InternalBase, new (IntegralNumber, 2))).calculateFactorial(new (IntegralNumber, 6))

اب آپ ہی انصاف فرمائیں کہ ایک کام کو کئی طریقوں سے کرنے کا "الزام" کیا محض روبی پر لگنا چاہئے؟ :)

پائتھون کا بنیادی فلسفہ ہے کہ کسی بھی چیز کو کرنے کا ایک اور صرف ایک ہی واضح طریقہ ہونا چاہیے۔
اوپر کی مثال سے ہم نے اس بات کی تردید کر دی ہے۔ اس کے علاوہ اگر ہم پائتھون اور روبی کے ویب ڈیویلپمنٹ فریم ورک کا موازنہ کریں تو روبی کمیونٹی میں ایک مشہور ترین فریم ورک ہے اور اس کا نام ہے روبی آن ریلز، اس کے علاوہ ایک اور مشہور فریم ورک تھا جس کا نام تھا مرب لیکن روبی کمیونٹی نے دونوں فریم ورکوں کے بہترین فلسفوں کو جمع کر کے ان کو ریلز میں جمع کر دیا۔ ایک اور فریم ورک استعمال ہوتا ہے جس کا نام ہے سناٹرا جو کہ لائٹ ویٹ سا روبی ویب ایپلیکیشن فریم ورک ہے اور بس! اس کے بر عکس پائتھون میں ایم وی سی فریم ورکوں کی پوری قطار موجود ہے، آپ ان کی فہرست گوگل کر سکتے ہیں۔ اب بھلا کوئی بتائے کہ پائتھون اپنے اس فلسفے پر کس قدر کھرا اترتا ہے؟ جہاں تک بات ریلز کی ہے تو اس میں "کنوینشن اوور کنفیگیوریشن" کا فلسفہ پایا جاتا ہے۔ یعنی ہر کام کت کرنے کا ایک ریلز والا طریقہ ہے جو سہل ترین اور کم سے کم کوڈ لکھ کر کیا جا سکتا ہے جبکہ مخصوص صورت حالات، ڈیویلپر کی پسند یا ضرورت کے تحت کنوینشن کی دیوار کبھی حائل نہیں ہوتی اور اس کو توڑ کر اپنے مزاج کے مطابق اس میں پروگرامنگ کی جا سکتی ہے۔ :) :) :)

دونوں زبانیں کافی ترقی یافتہ ہیں البتہ نئے سیکھنے والے اور سکھانے والوں کے لیے پائتھون آسان ہے کچھ لوگوں کی رائے میں کچھ لوگ یہاں بھی روبی کو آسان مانتے ہیں۔
اس بات کا فیصلہ سیکھنے والے کی دلچسپی پر چھوڑ دینا چاہئے۔ عمومی طور پر دونوں ہی زبانیں سمجھنے میں مشکل نہیں ہیں۔ :) :) :)

دونوں زبانوں کے حامیوں کی گفتگو پڑھیں تو بتانا نا ممکن ہے کہ کونسی زبان بہتر ہے۔
یہ مناسب ترین بات ہے اس پوری گفتگو کی۔ :) :) :)

کسی زمانے میں روبی آن ریلز اور جینگو فریم ورک کے خالقین کو کسی یونیورسٹی کے طلبا نے آمنے سامنے لا کھڑا کیا تھا اور ان میں مقابلے کی فضا قائم کی تھی۔ وہ ویڈیو بڑی دلچسپ اور سبق آموز تھی لیکن فی الحال اس کا ربط نہیں مل رہا۔ :) :) :)
 
ہم یہاں کچھ لکھنے کا ارادہ نہیں رکھتے تھے لیکن محب صاحب نے غلط بیانیوں کا سہارا لے کر ہمیں مجبور کر دیا۔ اس قسم کے چور راستے غیر مناسب ہیں۔ :) :) :)


پائیتھون اور روبی دونوں ہی زبانوں کا سنٹیکس خاصہ سہل ہے۔ بلکہ روبی کی رگوں میں پائیتھون کا ڈھیر سارا لہو دوڑ رہا ہے۔ روبی پائتھون کے مقابلے کافی جدید زبان ہے یعنی اس کے کئی سال بعد وجود میں آئی۔ روبی کا سنٹیکس و دیگر کئی خصوصیات پائتھون، پرل، سی سمیت کئی زبانوں سے متاثر ہیں۔ ظاہر ہے اس لحاظ سے دیکھا جائے تو منطقی طور پر روبی کا سنٹیکس پائتھون کے مقابلے کہیں سہل ہونا چاہئے کیوں کہ اس میں "بیسٹ آف آل ورلڈس" کو جمع کرنے کی کوشش کی گئی تھی۔
مستقبل دونوں ہی زبانوں کا تابناک نظر آ رہا ہے، جبکہ مجموعی طور پر مقبولیت کی رفتار کے گراف کا ڈھلوان روبی کا زیادہ عمودی ہے۔ واضح رہے کہ کسی زبان کی مقبولیت کو تعلیمی ادارے متعین نہیں کرتے بلکہ ڈیویلپر کمیونٹی اور کارپوریٹ آئی ٹی انڈسٹری اس بات کا تعین کرتی ہے۔ پائتھون اب کافی پختہ کار زبان ہو چلی ہے اور عرصہ سے انڈسٹری میں موجود ہے اور اس کے لئے کم و بیش ہر قسم کی لائبریرز موجود ہیں اس لئے تعلیمی ادارے بھی اس پر توجہ دے رہے ہیں۔ پائتھون گوگل کی تین آفیشیل زبانوں میں سے ایک ہے۔ وہیں روبی چونکہ جاپان میں پیدا ہوئی اور اس کے خالق جاپانی زبان کو پروگرمنگ سے ہم آہنگ کرنے میں اہم کردار ادا کر چکے ہیں لہٰذا روبی میں روز اول سے یونیکوڈ کی بہترین سپورٹ موجود رہی ہے جو روز بروز بہتر ہوتی جا رہی ہے۔ روبی در اصل امبیڈیڈ سسٹم اور پیریلل پروسیسنگ وغیرہ کے معاملے میں موزوں زبان نہیں ہے، غالباً اگلے میجر اپڈیٹ میں یہ خواص اس میں شامل کی جائیں گی۔ لیکن ان مقاصد کے لئے پائتھون بھی اچھی زبان نہیں بلکہ سی جیسی زبانوں پر تکیہ کرنا چاہئے۔
دونوں ہی زبانیں عمومی اپلیکینش ڈیویلپمینٹ اور ویب ڈیویلپمینٹ کے لئے مفید ہیں۔ پائتھون اس زمانے میں پیدا ہوئی جب ڈیسکٹاب ڈیویلپمنٹ کا دور دورہ تھا اس لئے آپ کو اکثر لینکس ایپلیکیشنز پائتھون میں لکھے ہوئے مل جائیں گے جبکہ روبی آن ریلز کی آمد کے بعد ڈیویلپر کمیونٹی نے اس کو ویب کے لئے استعمال کرنے میں خاصی دلچسپی دکھائی۔ یہ بات درست ہے کہ ریلز کی آمد سے قبل روبی زبان کا نام بھی خال خال ہی لوگوں نے سنا تھا۔ بعد میں روبی آن ریلز سے متاثر ہو کر پائتھون اور پی ایچ پی سمیت دیگر کئی زبانوں میں ایم وی سی بیسڈ ویب ڈیویلپمنٹ فریم ورک کی باڑھ آ گئی۔ لیکن یہ پایا گیا کہ روبی کا سنٹیکس بول چال والی انگریزی سے قریب ترین ہونے کے باعث کئی دفعہ کنفیگیوریشن وغیرہ کی روبی فائلوں کو دیکھ کر گمان ہی نہیں ہوتا کہ یہ ایک پیور روبی فائل ہے، ایسا لگتا ہے کہ کسی نے ڈیویلپر کے لئے انسٹرکشنز ککا نوٹ بنا کر رکھا دیا ہے۔ اسی طرح ٹیسٹ ڈریون ڈیویلپمنٹ میں بھی روبی کے سنٹیکس نے بازی ماری اور تقریباً عام بول چال کی انگریزی جیسی زبان میں لکھے ہوئے ٹیسٹ کیسیز کو ایکزیکیوٹ کیا جا سکتا ہے۔ ساتھ ہی ریلز نے اب تک دیگر تمام زبانوں کے ویب فریم ورک کی پیشوائی کی ہے۔ مثلاً جب ریلز نے ریسٹ فل فلسفے کو اپنایا تو باقی سبھی اس کے پیچھے دوڑ پڑے۔ فی الحال دونوں زبانوں میں ڈیویلپر کمیونٹی یکساں فعالیت دکھا رہی ہے اور ان زبانوں کو نئی جہتوں سے رو شناس کرا رہی ہے۔ اس لئے دونوں میں سے کسی ایک یا دونوں کو سیکھ لینا ضرور رساں نہیں ہونا چاہئے۔ ڈیویلپر کمیونٹی میں ہونے والی "ہولی وار" ہمیشہ سے مفید رہی ہے جس کی ایک مثال وی آئی ایم اور ای میکس ایڈیٹرز ہیں۔ :) :) :)


غالباً یہ فلسفہ پائتھون کمیونٹی کی جانب سے روبی پر زبردستی تھوپا گیا ہے جو کہ پائتھون کے فلسفے کے مقابل میں ہو۔ جبکہ ہمارے علم اور وکیپیڈیا کے مطابق روبی کا بنیادی فلسفہ "ڈیویلپر ہیپی نیس اور پروڈکٹیوٹی" ہے۔ اس مقصد کے لئے کئی دفعہ زبان کی پرفارمینس پر ترجیح دی گئی ہے۔ مثلاً ایک سرچ انجن اگر پیور جاوا میں بنایا جائے تو کافی سریع ہوگا لیکن اس کی ڈیویلپمینٹ میں جو وقت صرف ہوگا اس کا ایک عشیر بھی اگر روبی زبان میں اسی چیز کو امپلیمینٹ کرنے میں صرف کیا جائے تو زیادہ خوبصورت چیز بن کر آ جائے گی، یہ اور بات ہے کہ اس کی رفتار اتنی اچھی نہیں ہوگی۔ عام طور پر یہ دیکھنے میں آیا ہے کہ جب تک جاوا وغیرہ میں کوئی ایپلیکیشن تیار کی جاتی ہے تب تک کلائنٹ کی ضروریات ہی بدل چکی ہوتی ہیں۔ لہٰذا ریپڈ ڈیویلپمنٹ یا اجائل ڈیویلپمنٹ فلسفوں کے حامی روبی کو ترجیح دیتے ہیں۔ کیوں کہ اس میں کم سے کم مدت میں کم سے کم ڈیویلپر کی افرادی قوت صرف کر کے کلائنٹ کی ضروریات کو پورا کیا جا سکتا ہے اور پھر وقت کے ساتھ اس میں پہتری لائی جا سکتی ہے۔
یہ بات درست ہے کہ روبی میں کسی کام کو کرنے کے ایک سے زائد طریقے پائے جاتے ہیں لیکن یہ اس کا بنیادی فلسفہ ہرگز نہیں۔ در اصل اس کا سبب اس زبان کو نیچرل لینگوئیج سے قریب ترین رکھنا ہے۔ جیسے ایک ہی بات کو انگریزی بولنے والے دس افراد دس طرح سے بولتے ہیں اس طرح روبی میں بھی کئی طریقے رائج ہیں اور لوگ اپنی پسند لے لہجے میں کوڈ لکھ سکتے ہیں۔ اس کو اس مثال سے سمجھا جا سکتا ہے۔
PHP:
if !i.zero? then print "I am not zero"
PHP:
print "I am not zero" unless i.zero?
پہلی مثال میں آئی کی قدر صفر ہو اس بات کا جائزہ لیا گیا ہے پھر ایکسکلیمیشن نشان ! کی مدد سے اس کی نفی کی گئی ہے جس کو سمجھنا غیر پروگرامرس کے لئے قدرے مشکل ہے۔ یہ کئی زبانوں میں رائج طریقہ ہے جبکہ روبی نے اسی مقصد کے حصول کے لئے unless کی مدد سے ایک اس کو نیچرل لینگوئیج سے قریب ترین کر دیا ہے اور عام قاری بھی اس کو آسانی سے سمجھ سکتا ہے۔ واضح رہے کہ اوپر دی گئی مثال کو مزید کئی طریقوں سے لکھا جا سکتا ہے۔ لیکن فی الحال ہم ایک اور دلچسپ مثال یہاں پیش کرتے ہیں۔ جو دونوں کمیونٹیز میں باہمی خوشگوار جنگ کا نتیجہ ہے۔ :) :) :)

روبی پروگرامر کی ارتقا:
PHP:
# Newbie Programmer
def factorial(x)
  if x == 0
    return 1
  else
    return x * factorial(x - 1)
  end
end
puts factorial(6)
puts factorial(0)
 
# Discovered #upto
def factorial(x)
  factorial = 1
  1.upto(x) do |i|
    factorial *= i
  end
  factorial
end
puts factorial(6)
puts factorial(0)
 
# Discovered Enumerators
def factorial(x)
  x.downto(1).inject(1) { |m, i| m * i }
end
puts factorial(6)
puts factorial(0)
 
# Discovered Range+Inject
def factorial(x)
  (1..x).inject(1) { |m, i| m * i }
end
puts factorial(6)
puts factorial(0)
 
# Embraced 1.8.7/1.9
def factorial(x)
  (1..x).inject(:*) || 1
end
puts factorial(6)
puts factorial(0)
 
# Discovered Ternary Operators
def fac(x); x == 0 ? 1 : x * fac(x - 1);end
puts fac(6)
puts fac(0)
 
# Discovered Operator Precedence
def factorial(x)
  i = 1 and (i *= x and x -= 1 while x > 0) or i
end
puts factorial(6)
puts factorial(0)
 
# Discovered Rails
class Numeric
  def fact
    (1..self).inject(:*) || 1
  end
end
puts 6.fact
puts 0.fact
 
# Discovered Camping
def F(x)((1..x).inject(:*)||1)end;p(F(6));p(F(0))
 
# Discovered Magic
module Math
  extend self
 
  def method_missing(method, *args)
    if method.to_s =~ /^fact(orial)?/
      class_eval <<-EOS
      def #{method}(x)
        (1..x).inject(:*) || 1
      end
      EOS
      send(method, *args)
    else
      super
    end
 
  end
end
puts Math.fact(6)
puts Math.fact(0)
 
# Discovered Hash Magic
FACTORIALS = Hash.new { |h, k| h[k] = (1..k).inject(:*) || 1 }
puts FACTORIALS[6]
puts FACTORIALS[0]
 
# Attends Seattle.rb
require 'rubygems'
require 'inline'
class Factorial
  class << self
    inline do |builder|
      builder.c %q{
        long factorial(int value) {
          long result = 1, i = 1;
          for (i = 1; i <= value; i++) {
            result *= i;
          }
          return result;
        }
      }
    end
  end
end
puts Factorial.factorial(6)
puts Factorial.factorial(0)
 
# Premature Optimizer + eval
class << self; class_eval "def factorial(x); case x; #{(0..100).map{|i|"when #{i} then #{(1..i).inject(:*) || 1};"}}; else (1..x).inject(:*) || 1 end end" end
puts factorial(6)
puts factorial(0)

پائتھون پروگرامر کی ارتقا:
PHP:
#Newbie programmer
def factorial(x):
    if x == 0:
        return 1
    else:
        return x * factorial(x - 1)
print factorial(6)
 
 
#First year programmer, studied Pascal
def factorial(x):
    result = 1
    i = 2
    while i <= x:
        result = result * i
        i = i + 1
    return result
print factorial(6)
 
 
#First year programmer, studied C
def fact(x): #{
    result = i = 1;
    while (i <= x): #{
        result *= i;
        i += 1;
    #}
    return result;
#}
print(fact(6))
 
 
#First year programmer, SICP
@tailcall
def fact(x, acc=1):
    if (x > 1): return (fact((x - 1), (acc * x)))
    else:      return acc
print(fact(6))
 
 
#First year programmer, Python
def Factorial(x):
    res = 1
    for i in xrange(2, x + 1):
        res *= i
    return res
print Factorial(6)
 
 
#Lazy Python programmer
def fact(x):
    return x > 1 and x * fact(x - 1) or 1
print fact(6)
 
 
#Lazier Python programmer
f = lambda x: x and x * f(x - 1) or 1
print f(6)
 
 
#Python expert programmer
import operator as op
import functional as f
fact = lambda x: f.foldl(op.mul, 1, xrange(2, x + 1))
print fact(6)
 
 
#Python hacker
import sys
@tailcall
def fact(x, acc=1):
    if x: return fact(x.__sub__(1), acc.__mul__(x))
    return acc
sys.stdout.write(str(fact(6)) + '\n')
 
 
#EXPERT PROGRAMMER
import c_math
fact = c_math.fact
print fact(6)
 
 
#ENGLISH EXPERT PROGRAMMER
import c_maths
fact = c_maths.fact
print fact(6)
 
 
#Web designer
def factorial(x):
    #-------------------------------------------------
    #--- Code snippet from The Math Vault          ---
    #--- Calculate factorial (C) Arthur Smith 1999 ---
    #-------------------------------------------------
    result = str(1)
    i = 1 #Thanks Adam
    while i <= x:
        #result = result * i  #It's faster to use *=
        #result = str(result * result + i)
          #result = int(result *= i) #??????
        result str(int(result) * i)
        #result = int(str(result) * i)
        i = i + 1
    return result
print factorial(6)
 
 
#Unix programmer
import os
def fact(x):
    os.system('factorial ' + str(x))
fact(6)
 
 
#Windows programmer
NULL = None
def CalculateAndPrintFactorialEx(dwNumber,
                                hOutputDevice,
                                lpLparam,
                                lpWparam,
                                lpsscSecurity,
                                *dwReserved):
    if lpsscSecurity != NULL:
        return NULL #Not implemented
    dwResult = dwCounter = 1
    while dwCounter <= dwNumber:
        dwResult *= dwCounter
        dwCounter += 1
    hOutputDevice.write(str(dwResult))
    hOutputDevice.write('\n')
    return 1
import sys
CalculateAndPrintFactorialEx(6, sys.stdout, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
 
 
#Enterprise programmer
def new(cls, *args, **kwargs):
    return cls(*args, **kwargs)
 
class Number(object):
    pass
 
class IntegralNumber(int, Number):
    def toInt(self):
        return new (int, self)
 
class InternalBase(object):
    def __init__(self, base):
        self.base = base.toInt()
 
    def getBase(self):
        return new (IntegralNumber, self.base)
 
class MathematicsSystem(object):
    def __init__(self, ibase):
        Abstract
 
    @classmethod
    def getInstance(cls, ibase):
        try:
            cls.__instance
        except AttributeError:
            cls.__instance = new (cls, ibase)
        return cls.__instance
 
class StandardMathematicsSystem(MathematicsSystem):
    def __init__(self, ibase):
        if ibase.getBase() != new (IntegralNumber, 2):
            raise NotImplementedError
        self.base = ibase.getBase()
 
    def calculateFactorial(self, target):
        result = new (IntegralNumber, 1)
        i = new (IntegralNumber, 2)
        while i <= target:
            result = result * i
            i = i + new (IntegralNumber, 1)
        return result
 
print StandardMathematicsSystem.getInstance(new (InternalBase, new (IntegralNumber, 2))).calculateFactorial(new (IntegralNumber, 6))

اب آپ ہی انصاف فرمائیں کہ ایک کام کو کئی طریقوں سے کرنے کا "الزام" کیا محض روبی پر لگنا چاہئے؟ :)


اوپر کی مثال سے ہم نے اس بات کی تردید کر دی ہے۔ اس کے علاوہ اگر ہم پائتھون اور روبی کے ویب ڈیویلپمنٹ فریم ورک کا موازنہ کریں تو روبی کمیونٹی میں ایک مشہور ترین فریم ورک ہے اور اس کا نام ہے روبی آن ریلز، اس کے علاوہ ایک اور مشہور فریم ورک تھا جس کا نام تھا مرب لیکن روبی کمیونٹی نے دونوں فریم ورکوں کے بہترین فلسفوں کو جمع کر کے ان کو ریلز میں جمع کر دیا۔ ایک اور فریم ورک استعمال ہوتا ہے جس کا نام ہے سناٹرا جو کہ لائٹ ویٹ سا روبی ویب ایپلیکیشن فریم ورک ہے اور بس! اس کے بر عکس پائتھون میں ایم وی سی فریم ورکوں کی پوری قطار موجود ہے، آپ ان کی فہرست گوگل کر سکتے ہیں۔ اب بھلا کوئی بتائے کہ پائتھون اپنے اس فلسفے پر کس قدر کھرا اترتا ہے؟ جہاں تک بات ریلز کی ہے تو اس میں "کنوینشن اوور کنفیگیوریشن" کا فلسفہ پایا جاتا ہے۔ یعنی ہر کام کت کرنے کا ایک ریلز والا طریقہ ہے جو سہل ترین اور کم سے کم کوڈ لکھ کر کیا جا سکتا ہے جبکہ مخصوص صورت حالات، ڈیویلپر کی پسند یا ضرورت کے تحت کنوینشن کی دیوار کبھی حائل نہیں ہوتی اور اس کو توڑ کر اپنے مزاج کے مطابق اس میں پروگرامنگ کی جا سکتی ہے۔ :) :) :)


اس بات کا فیصلہ سیکھنے والے کی دلچسپی پر چھوڑ دینا چاہئے۔ عمومی طور پر دونوں ہی زبانیں سمجھنے میں مشکل نہیں ہیں۔ :) :) :)


یہ مناسب ترین بات ہے اس پوری گفتگو کی۔ :) :) :)

کسی زمانے میں روبی آن ریلز اور جینگو فریم ورک کے خالقین کو کسی یونیورسٹی کے طلبا نے آمنے سامنے لا کھڑا کیا تھا اور ان میں مقابلے کی فضا قائم کی تھی۔ وہ ویڈیو بڑی دلچسپ اور سبق آموز تھی لیکن فی الحال اس کا ربط نہیں مل رہا۔ :) :) :)

ہاہاہاہاہاہا

دو سو فیصد یقین تھا کہ ابن سعید اب ضرور اس دھاگے پر تشریف لائیں گے اور وہی ہوا۔

روبی اور پائتھون پر مباحث سے انٹر نیٹ بھرا پڑا ہے اور کوئی بھی جا کر اس کی تصدیق کر سکتا ہے اور میں نے جو لکھا اس میں تو روبی پر بہت ہلکا ہاتھ رکھا تھا ۔ ہر زبان کے ڈویلپر کو اپنی زبان زیادہ اور بہتر محسوس ہوتی ہے اور یہ تعصب فطری ہے ، اس لیے سعود میاں کو معاف کیا جاتا ہے ۔ ;)
 
پائیتھون اور روبی دونوں ہی زبانوں کا سنٹیکس خاصہ سہل ہے۔ بلکہ روبی کی رگوں میں پائیتھون کا ڈھیر سارا لہو دوڑ رہا ہے۔ روبی پائتھون کے مقابلے کافی جدید زبان ہے یعنی اس کے کئی سال بعد وجود میں آئی۔ روبی کا سنٹیکس و دیگر کئی خصوصیات پائتھون، پرل، سی سمیت کئی زبانوں سے متاثر ہیں۔ ظاہر ہے اس لحاظ سے دیکھا جائے تو منطقی طور پر روبی کا سنٹیکس پائتھون کے مقابلے کہیں سہل ہونا چاہئے کیوں کہ اس میں "بیسٹ آف آل ورلڈس" کو جمع کرنے کی کوشش کی گئی تھی۔

روبی پائتھون کے مقابلے میں جدید ہے ، اس سے تو انکار نہیں مگر آپ خود فرما رہے ہیں کہ پرل اور سی سمیت کئی زبانوں سے اس کا syntax متاثر ہے تو پھر آسان کیسے ہوا۔ جس کسی نے بھی پرل استعمال کی ہے یا اس کا syntax دیکھا ہے بخوبی جانتا ہے کہ وہ بسا اوقات مشکل ترین کوڈ بن جاتا ہے پڑھنے کے لیے۔
 

رانا

محفلین
ہم یہاں کچھ لکھنے کا ارادہ نہیں رکھتے تھے لیکن محب صاحب نے غلط بیانیوں کا سہارا لے کر ہمیں مجبور کر دیا۔ اس قسم کے چور راستے غیر مناسب ہیں۔ :) :) :)

ہم بھی اس وقت یہاں کچھ لکھنے کا ارادہ نہیں رکھتے تھے کیونکہ
اس وقت عجیب سی تھکان طاری ہے ہم پر اس لئے اپنے قیمتی خیالات کسی اور وقت پر ٹالنے کا سوچ رہے تھے۔:)

لیکن پھر خیال آیا کہ کچھ لکھ ہی دینا چاہئے۔:) آخر شکریہ تو ادا کرنا بنتا ہے سعود بھائی کا۔ بہت بہت شکریہ سعود بھائی! کسی بہانے سے ہی آپ نے روبی کے بارے میں لکھا تو سہی۔ میری معلومات میں اس پوسٹ سے بہت اضافہ ہوا ہے اور میرا خیال ہے جتنا کچھ میں نے آپ سے پوچھا تھا اس سے زیادہ ہی آپ نے شئیر کردیا ہے۔ جزاک اللہ۔

اب صرف ایک بات اور بتادیں۔ (زیادہ اس لئے نہیں پوچھ رہا کہ آپ کی تھکان کا کوئی بھروسا نہیں کب لوٹ آئے:)) یہ کہ ویب ہوسٹنگ سرورز پائتھون کے لئے زیادہ آسانی سے مہیا ہیں یا روبی کے لئے۔ میرا سوال صرف اور صرف ان دونوں کے موازنے کی حد تک ہے۔
(میری یہ پوسٹ کیونکہ روبی اورپائتھون کے ویب کے نکتہ نظر سے ہے اس لئے اگر دھاگے سے ہٹی ہوئی محسوس ہو تو حذف کرنے کی اجازت ہے۔:oops:)
 
روبی پر اگر کوئی دوست معلومات لینا چاہے تو اس دھاگے سے فائدہ اٹھاتے ہوئے یہ سبق سیکھ سکتاہے کہ روبی پر تھوڑی سی تنقید کردے بس پھر معلومات کا ڈھیر لگ جائے گا ورنہ انتظار ہی رہے گا معلومات کا;) ۔
 

رانا

محفلین
روبی پر اگر کوئی دوست معلومات لینا چاہے تو اس دھاگے سے فائدہ اٹھاتے ہوئے یہ سبق سیکھ سکتاہے کہ روبی پر تھوڑی سی تنقید کردے بس پھر معلومات کا ڈھیر لگ جائے گا ورنہ انتظار ہی رہے گا معلومات کا;) ۔
سچ میں محب بھائ میں بھی یہی سوچ رہا تھا۔:) اپنی سادگی میں خواہ مخواہ مہینہ بھر انتظار کی سولی پر لٹکا رہا۔:) پہلے پتہ ہوتا تو۔۔۔۔ چلیں خیر آئندہ کے لئے تو اس طوطے کا پتہ لگ گیا جس میں ان کی جان ہے۔:)
 
ہاہاہاہاہاہا

دو سو فیصد یقین تھا کہ ابن سعید اب ضرور اس دھاگے پر تشریف لائیں گے اور وہی ہوا۔
ہتھکنڈے!!! لیکن اس کے نتیجے میں ہونے والی "روبی بمقابلہ پائتھون" گفتگو جو کہ یہاں جملہ معترضہ کی مثال بن گئی ہے کے ذمہ دار آپ خود ہیں۔ :)
روبی اور پائتھون پر مباحث سے انٹر نیٹ بھرا پڑا ہے اور کوئی بھی جا کر اس کی تصدیق کر سکتا ہے اور میں نے جو لکھا اس میں تو روبی پر بہت ہلکا ہاتھ رکھا تھا ۔ ہر زبان کے ڈویلپر کو اپنی زبان زیادہ اور بہتر محسوس ہوتی ہے اور یہ تعصب فطری ہے ، اس لیے سعود میاں کو معاف کیا جاتا ہے ۔ ;)
ہمارا نہیں خیال کہ ہم نے اوپر کہیں بھی پائتھون کے ساتھ زیادتی کی ہو یا کسی بھی معاملے میں روبی کی یک طرفہ تعریف کی ہو۔ کسی زبان کو پسند کرنا اور بات ہے جبکہ "تعصب" ایک اور بات ہے۔ :)
 
ہم بھی اس وقت یہاں کچھ لکھنے کا ارادہ نہیں رکھتے تھے کیونکہ
اس وقت عجیب سی تھکان طاری ہے ہم پر اس لئے اپنے قیمتی خیالات کسی اور وقت پر ٹالنے کا سوچ رہے تھے۔:)

لیکن پھر خیال آیا کہ کچھ لکھ ہی دینا چاہئے۔:) آخر شکریہ تو ادا کرنا بنتا ہے سعود بھائی کا۔ بہت بہت شکریہ سعود بھائی! کسی بہانے سے ہی آپ نے روبی کے بارے میں لکھا تو سہی۔ میری معلومات میں اس پوسٹ سے بہت اضافہ ہوا ہے اور میرا خیال ہے جتنا کچھ میں نے آپ سے پوچھا تھا اس سے زیادہ ہی آپ نے شئیر کردیا ہے۔ جزاک اللہ۔
اسی لئے ہم نے متعلقہ دھاگے میں کچھ لکھنے کی ضرورت محسوس نہیں کی۔ اتفاق سے جب جب اس دھاگے کا ذکر آیا ہم کہیں نہ کہیں مصروف ہوتے تھے اس لئے سیر حاصل تبصرے کے لئے وقت نہیں نکل پا رہا تھا۔
اب صرف ایک بات اور بتادیں۔ (زیادہ اس لئے نہیں پوچھ رہا کہ آپ کی تھکان کا کوئی بھروسا نہیں کب لوٹ آئے:)) یہ کہ ویب ہوسٹنگ سرورز پائتھون کے لئے زیادہ آسانی سے مہیا ہیں یا روبی کے لئے۔ میرا سوال صرف اور صرف ان دونوں کے موازنے کی حد تک ہے۔
اگر آپ اپنا کلاؤڈ انسٹینس لے کر ہوسٹنگ کرنا چاہیں تو بے شمار آپشن ہیں کیوں کہ اس صورت میں پوری لینکس/یا کوئی اور مشین آپ خود ہی کنفیگر کر رہے ہوتے ہیں۔ لیکن آپ کا سوال جنرل پرپز شئیرڈ ہوسٹنگ کے بارے میں ہے تو واضح رہے کہ پائتھون اور روبی میں سے کوئی بھی پی ایچ پی کی طرح ہر جگہ دستیاب نہیں۔ فری ہوسٹنگ کے آپشن میں پائتھون کے لئے گوگل کا ایپ انجن موجود ہے جبکہ روبی کے لئے ہیروکو بہترین پلیٹ فارم ہے (ویسے اب ہیروکو پائیتھون کو بھی سپورٹ کرتا ہے)۔ اس کے علاوہ دونوں کی پیڈ ہوسٹنگ کے کئی اچھے اور ریپیوٹیڈ آپشن موجود ہیں۔ ایک دفعہ ہم نے روبی آن ریلز پر ایک سلائڈ بنایا تھا اور ایک عدد بلاگ پوسٹ بھی لکھی تھی۔ ان میں ریلز کی ہوسٹنگ کے کچھ آپشنز کا ذکر تھا۔ پائتھون پر ہمارا زیادہ فوکس نہیں رہا اس لئے اس کی تفصیلات بتانے سے قاصر ہیں۔ شاید محب بھائی نے اس بابت ریسرچ کی ہو۔ :)
 
روبی پائتھون کے مقابلے میں جدید ہے ، اس سے تو انکار نہیں مگر آپ خود فرما رہے ہیں کہ پرل اور سی سمیت کئی زبانوں سے اس کا syntax متاثر ہے تو پھر آسان کیسے ہوا۔ جس کسی نے بھی پرل استعمال کی ہے یا اس کا syntax دیکھا ہے بخوبی جانتا ہے کہ وہ بسا اوقات مشکل ترین کوڈ بن جاتا ہے پڑھنے کے لیے۔
جنھوں نے پرل استعمال کیا ہے (جن میں ہم خود بھی شامل ہیں) وہ جانتے ہیں کہ اس کا کوڈ کرپٹک ہونے کے ساتھ ساتھ بسا اوقات بہت ہی مختصر ہوتا ہے اور سنٹیکٹک شوگر کی اچھی مثال قائم کرتا ہے۔ اس کے علاوہ پرل اسکرپٹ در اصل لینکس شیل اسکرپٹ کے قریب ترین ہونے کے باعث بہت ہی تیز رفتار زبان ہے۔ اگر آپ نے ہمارا جملہ احتیاط سے پڑھا ہو تو آپ پر آشکارا ہوا ہوگا کہ ہم نے صرف سنٹیکس کی بات نہیں کی تھی بلکہ زبان کی دیگر خصوصیات بھی اس فہرست میں شامل تھیں۔ مثلاً روبی ایک ملٹی پیراڈائم زبان ہے جس کا کا آبجیکٹ اورئینٹیڈ ماڈل اسمال ٹاک سے متاثر ہے جو کہ "خالص ترین آبجیکٹ اورئینٹیڈ" زبانوں میں سے ایک ہے۔ اسی طرح ریگیولر ایکسپریشن پرل سے متاثر ہے جس میں بعد میں روبی نے اپنا فلیور کافی شامل کیا۔ (واضح رہے کہ ریگ ایکس کے معاملے میں پرل کو دیگر زبانوں کی ماں تصور کیا جاتا ہے۔)
 
میں نے syntax کا انتہائی مختصر ہونا ریگولر ایکپریشن کی بنیاد پر ہی کہا تھا اور اسی وجہ سے اس کا کوڈ پڑھنے میں انتہائی دشوار ہو جاتا ہے۔ باقی پرل کی جملہ خصوصیات سے انکار نہیں اور نہ ہی روبی کی خوبیوں سے۔ پائتھون کو صرف سیکھنے کے لحاظ سے آسان بلکہ سکھانے کے لحاظ سے آسانی کی وجہ سے شروع کیا گیا ہے نہ کہ اس کی دوسری زبانوں پر فوقیت کی وجہ سے۔

روبی کے اپنے موجد کا کہنا ہے شاید کہ وہ ایسی سکرپٹنگ زبان بنانا چاہتا تھا جو پرل سے زیادہ طاقتور اور پائتھون سے زیادہ آبجیکٹ اورینٹڈ ہو ، یقینا ایسا کرنے میں وہ کامیاب رہا۔
 

رانا

محفلین
جزاک اللہ سعود بھائی۔
دھاگہ پائتھون کا تھا لیکن پائتھون سے زیادہ روبی کی معلومات مل گئیں۔ محب بھائی اب تو مان گئے ہوں گے کہ روبی مافیا زیادہ طاقتور ہے۔ دیکھیں پائتھون کے دھاگے میں بھی آکر گھروالی سے زیادہ جگہ گھیر لی اور بے چاری میزبان منہ ہی دیکھتی رہ گئی۔:)
 
جزاک اللہ سعود بھائی۔
دھاگہ پائتھون کا تھا لیکن پائتھون سے زیادہ روبی کی معلومات مل گئیں۔ محب بھائی اب تو مان گئے ہوں گے کہ روبی مافیا زیادہ طاقتور ہے۔ دیکھیں پائتھون کے دھاگے میں بھی آکر گھروالی سے زیادہ جگہ گھیر لی اور بے چاری میزبان منہ ہی دیکھتی رہ گئی۔:)

یہ لطف تو تب ہے جب روبی کا علیحدہ دھاگہ ہو اور وہاں گفتگو ہو۔

روبی مافیا انتہائی طاقتور ہے اور اس میں شک کی گنجائش نشتہ ۔۔۔۔۔۔۔۔۔۔۔۔۔:)
 
واپس پائتھون کی طرف آنا امر محال لگ رہا ہے۔

ویسے لوگوں کی دلچسپی مجھے زبان سے زیادہ بحث مباحثہ میں ہی لگ رہی ہے۔
 
یہ سوالات پہلے اٹھائے گئے تھے مگر کسی نے بھی طبع آزمائی نہیں کی تو پھر سے لکھ رہا ہوں۔

پائتھون اگر ہائی لیول لینگویج ہے تو لو لیول لینگویج کونسی ہوتی ہیں اور ہائی لیول اور لو لیول میں کیا فرق ہوتا ہے ؟​

ڈائنامک ٹائپنگ کے علاوہ اور کونسی اقسام ہیں ٹائپنگ کی اور ان کی تعریف کیا ہے؟​

Interpreter اور Compiler میں کیا فرق ہے ؟​
 

محمداحمد

لائبریرین
بہت اچھی گفتگو ہو رہی ہے محب بھائی اور سعود بھائی کی پائتھون اور روبی کے تقابلی جائزے پر۔

ہم لوگ تو اناڑی ہیں سو ہم تو دونوں ہی کی باتوں پر سر دُھننے کے علاوہ کچھ نہیں کرسکتے۔ پچھلے دنوں ہمیں روبی (لینگویج) اور روبی آن ریلز میں بھی کچھ دلچسپی ہوئی تھی سو ادھر ادھر سے کچھ نہ کچھ معلومات بھی اخذ کی اور کچھ کوشش بھی کی، پھر کچھ دیگر مصروفیات کے باعث آگے نہ کچھ نہیں ہو سکا۔ محفل میں بھی روبی آن ریلز کا ایک ذمرہ موجود ہے۔ یہاں جس زمانے میں روبی آن ریلز سکھائی جا رہی تھی ان دنوں ہم محفل میں فعال نہیں تھے سو پتہ نہیں چل سکا۔ یہ ذمرہ ، اس کے اسباق اور گفتگو تو ہم نے سب پڑھ لی ، لیکن نہ جانے کیوں یہ بات تین سبق کے بعد آگے نہیں بڑھ سکی۔ ہم نے Try Ruby بھی ٹرائی کیا، اور اسے خوب پایا۔ میرا خیال ہے کہ یہ روبی سیکھنے میں بہت مددگار ہے۔ لیکن چونکہ بات آگے نہیں بڑھ سکی اور ہم بھی تیسرے سبق پر ہی اٹک کر رہ گئے سو بات آئی گئی ہوئی۔

ہمیں نہیں معلوم کہ ہم میں یہ سب کرنے کی مطلوبہ لیاقت ہے بھی کہ نہیں۔ لیکن کچھ نہ کچھ تو کرنا چاہیے سو @محب بھائی کی پائتھون سیکھنے اور سکھانے کی دعوت پر لبیک کہا۔ لیکن ابھی تک دیکھ ہی رہے ہیں۔ کچھ ابتدائی معلومات کے لئے اس کتاب کے شروع کے دو تین اسباق پڑھے ہیں، وہاں سے یہاں پہنچ گئے اور پاور شیل کے متعلق جاننے لگے۔ ابھی اس کو بھی مکمل نہیں کیا ہے۔ بس یہی کچھ ہو سکا عید کے دوسرے دن تک۔ تیسرا دن مصروف رہا سو کچھ نہیں کر سکا۔

پچھلی گفتگو سے یہ بھی کنفیوژن ہوگئی ہے کہ روبی پر طبع آزمائی کی جائے یا پائتھون پر ۔ ویسے میری زیادہ دلچسپی ویب ڈیولپمینٹ میں ہے۔

ویسے اس تقابلی جائزے کے حوالے سے یہ تحریر بھی اہم ہے جو یہاں موجود ہے۔

Instead of emphasizing the what, I want to emphasize the how part: how we feel while programming. That's Ruby's main difference from other language designs. I emphasize the feeling, in particular, how I feel using Ruby. I didn't work hard to make Ruby perfect for everyone, because you feel differently from me. No language can be perfect for everyone. I tried to make Ruby perfect for me, but maybe it's not perfect for you. The perfect language for GuidoVanRossum is probably Python. -- YukihiroMatsumoto [http://www.artima.com/intv/ruby.html]

اس تحریر کا جو لب لباب ہم سمجھے اس کا مطلب تو کچھ یوں نکلتا ہے:

جو ذرہ جس جگہ ہے وہیں آفتاب ہے

یعنی جو شخص جس لینگویج کو کر رہا ہے وہی اس کے لئے بہتر ہے ۔ سوال پھر یہی ہے کہ نئے سیکھنے والے کس طرف جائیں؟؟؟؟؟
 

نمرہ

محفلین
لو لیول لینگویجز مثلاً مختلف آرکیٹیکچرز کے لئے اسمبلی۔
لو لیول زبانوں میں لکھا گیا کوڈ زیادہ طویل مگر ایفیشنٹ ہوتا ہے اور مشین کوڈ کے زیادہ نزدیک ہوتا ہے، بہ نسبت ایک ہائی لیول لینگویج کے۔ یہ کسی خاص ہارڈوئیر کے لئے بھی لکھا جا سکتا ہے۔ اس میں وہ کمانڈز مقابلتاً کم ہوتی ہیں جو کوئی پروگرامر استعمال کر سکتا ہے۔
compiler بیسڈ زبانوں میں ایک پورا پروگرام لکھنے کے بعد کمپائل کیا جاتا ہے اور اس عمل کے مکمل ہونے کے بعد ہی اسے run کیا جا سکتا ہے۔ کمپائلر اسے مشین میں چلنے کے قابل بائنری کوڈ میں تبدیل کر دیتا ہے۔ اگر پروگرام میں کوئی ایرر ہو تو کمپائلیشن کا عمل رک جاتا ہے۔
interpreter استعمال کرنے والی زبانوں میں جب ایک مکمل پروگرام چلایا جاتا ہے تو interpreter ایک ایک سطر پڑھ کر اسے run کرتا ہے، یعنی جس وقت پروگرام چل رہا ہے تو ساتھ ساتھ ہی بائنری کوڈ لکھا جا رہا ہے، اگر اس میں پروگرام میں کوئی ایرر ہو تو چلنے کے دوران ہی انٹرپریٹر کو اس کا علم ہوتا ہے۔
کچھ پروگرامنگ لینگویجز کمپائلر استعمال کرتی ہیں اور کچھ انٹرپریٹر۔
 

محمداحمد

لائبریرین
ہمیں نہیں پتہ تھا کہ یہ سوالات آپ نے ہمارے لئے اُٹھائے ہیں۔ :)

اب تک ادھر ادھر منہ مارنے کے بعد جو بات ہماری سمجھ آئی وہ لکھ رہے ہیں ۔ جہاں جہاں ضروری ہو تصیح کر دی جائے۔

ہائی لیول لینگویجز سیکھنے میں آسان ہوتی ہیں اور ان کا موڈیفیکیشن بھی نسبتاً آسان ہوتی ہیں۔ ان کا سنٹکس بھی انسانی زبان سے قریب تر ہوتا ہے۔ ہائی لیول لینگویج کی مثالوں میں سی، سی ++ ، جاوا اور پائتھون وغیر ہ شامل ہیں۔

اس کے برعکس لو لیول لینگویج ہارڈ ویر کنڑولنگ کے لئے استعمال ہوتی ہیں اور نسبتاً مشکل ہوتی ہیں۔ اس کی مثالوں میں اسمبلی لینگویج شامل ہیں۔

حوالہ

رہی بات ڈائنامک ٹائپنگ کی تو ، اب تک کی معلومات کے مطابق ، ڈائنامک ٹائپ لینگویجز میں کسی بھی ویری ایبل کو استعمال کرنے سے پہلے اسے ڈیفائن کرنا ضروری ہوتا ہے، لیکن اس کی ٹائپ ڈیفائن کرنے کی ضرورت نہیں ہوتی بلکہ اس کی ٹائپ اس کی ویلیو سے اخذ کی جاتی ہے۔ اس کی مثال پائتھون ہے۔ شاید جاوا اسکرپٹ بھی اسی ذمرے میں آئے کہ اس میں بھی ویری ایبل کی ٹائپ ڈیفائن نہیں کی جاتی اور شاید اسی لئے جاوا اسکرپٹ کو لوزلی ٹائپڈ لینگویج کہا جاتا ہے۔

دوسری قسم اسٹیٹک ٹائپنگ ہوتی ہے جس میں ویرایبل کو استعمال سے پہلے ڈیفائن کرنا ضروری نہیں ہوتا ہے لیکن اس میں ڈیٹا ٹائپ کا پری فکس دینا ضروری ہوتا ہے۔

حوالہ


Interpreter اور Compiler میں کیا فرق ہے ؟

انٹر پریٹر پروگرامنگ لینگویج کو لائن بائے لائن چیک کرتا اور امپلیمنیٹ کرتا ہے۔ جبکہ کمپائلر ساری انسٹرکشنز کو ایک ساتھ چیک کرکے اسے مشین کوڈ میں تبدیل کرتا ہے اور امپلیمینٹ کرتا ہے۔

حوالہ

کچھ چیزیں ہمیں پہلے سے معلوم تھیں اور کچھ گوگل کی مہربانی سے پتہ چلیں۔ آپ سب ہماری تصیح کریں کہ کہاں تک ہماری ناقص عقل ان چیزوں کو سمجھ پائی ہے۔
 

فاتح

لائبریرین
لو لیول لینگویجز سیکھنے میں آسان ہوتی ہیں اور ان کا موڈیفیکیشن بھی نسبتاً آسان ہوتی ہیں۔ ان کا سنٹکس بھی انسانی زبان سے قریب تر ہوتا ہے۔ لو لیول لینگویج کی مثالوں میں سی، سی ++ ، جاوا اور پائتھون وغیر ہ شامل ہیں۔
شاید ٹائپو کر گئے ہیں آپ۔۔۔
ہائی لیول لینگویجز سیکھنے میں آسان ہوتی ہیں اور ان کا موڈیفیکیشن بھی نسبتاً آسان ہوتی ہیں۔ ان کا سنٹکس بھی انسانی زبان سے قریب تر ہوتا ہے۔ ہائی لیول لینگویج کی مثالوں میں سی، سی ++ ، جاوا اور پائتھون وغیر ہ شامل ہیں۔
 
Top