ورود

View Full Version : سوال: تولید زبان برنامه نویسی جدید



Hadi-Hashemi
پنج شنبه 03 مهر 1393, 12:30 عصر
سلام دوستان

یه سوال دارم البته نمیدونم میتونم خوب براتون توضیح بدم یا نه

باید برنامه ای بنویسم که یه فایل متنی رو بگیره و با توجه به نوشته های داخلش چیزی که ازمون خواسته رو انجام بده.

نوشته های داخلش مثل زبانهای برنامه نویسی دارای قوانین ثابتی هستش. مثلا وقتی میگه:



sahih a;


منظورش همون:



int a;


هستش و به این ترتیب. این قوانین بهمون داده شده.

مثلا به این برنامه نیگا کنین ( قدر مطلق عدد رو حساب میکنه ) :



program hadi;

shuru

sahih a;

agar a<0
shuru
a= -1 * a;
payan

benevis(a);

payan



این نوشته رو به صورت فایل TEXT به برنامه میدیم و برنامه باید بفهمه که چی ازمون خواسته شده.

البته همونطور که گفتم این قوانین با همون Syntax قبلا بهمون داده شده.


حالا سوالم اینه واسه حلش شما چی پیشنهاد میدین؟

چطوری ترتیبشو بدم؟

محمد فدوی
پنج شنبه 03 مهر 1393, 12:58 عصر
ربط سوالت به زبان Java رو دقیقا متوجه نشدم. به نظرم اگه توی بخش مهندسی نرم افزار مطرحش کنی بهتر بتونن کمکت کنن.

اگر میخوای مستقیما یه برنامه بنویسی که بتونه این فایل رو اجرا کنه، خب باید یه مفسر برای زبانت بنویسی. خیلی هم سخت نیست! باید یه جورایی یه مفسر اسکریپت بنویسی. برنامت خط به خط فایل رو بخونه، با یه سری فاکتور که خودت استخراجشون میکنی بفهمه هر خط از کد چه مفهومی داره و بعد اجراش کنه.

اما به نظر من راه ساده تری هم داری! از روی فایل txt که بت داده میشه فایلت رو فایل یکی از زبون های برنامه نویسی تبدیل کن، بعد کامپایلش کن و اجراش کن!
مثلا من برات یه قرارداد میکنم! اون اسمی که اول برنامه داده شده اسم فایل خروجیت باشه و بخش بین shuru و payan اصلی، همون تابع main باشه! حالا یه برنامه بنویس که خط به خط از روی کد بالا، این کد رو که به زبان جاوااسکریپته رو تولید کنه که خیلی هم ساده ست! فقط باید replace کنه، چون ساختار زبانی که تو نوشتی خیلی شبیه به زبان های خانواده C هست:

// Program Hadi

var a;

if (a < 0)
{
a = -1 * a;
}

console.log(a);


حالا میتونی اسکریپتت رو توی Browser یا با کامپایلر node (http://nodejs.org/) اجرا کنی! :لبخند:
از خیلی از زبان های برنامه نویسی دیگه هم میتونی استفاده کنی! مثلا Java:


public class Hadi {
public static void main(String[] args) {
int a;

if (a < 0)
{
a = -1 * a;
}

System.out.println(a);
}
}

این کد هم خط به خط و خیلی ساده از روی کد خودت ساخته میشه و حالا میتونی فایل Hadi.java رو با کامپایلر javac کامپایل و بعد اجرا کنی!
ولی راه اصولی اینه که خودت مفسرت رو بنویسی. بهرحال موفق باشی.

Hadi-Hashemi
پنج شنبه 03 مهر 1393, 16:37 عصر
با تشکر بابت جواب و وقتی که گذاشتین

ربط سوال به جاوا اینه که برنامه باید با جاوا نوشته بشه.

یه چند تا مشکل دارم.

اولا که shuru و payan تعدادشون میتونه زیاد باشه. اگه دقت کنین if هم خودش shuru و payan داره. حلقه ها و زیر برنامه ها هم shuru و payan دارن.

دوما اینکه یه متغییر تو زیر برنامه باید فقط همونجا کاربرد داشته باشه و با متغییر هم نام توی برنامه اصلی قاطی نشه. اینو چطوری متوجه بشم؟

و...

محمد فدوی
پنج شنبه 03 مهر 1393, 18:20 عصر
اصلا ساخت یه مفسر حتی اگر اینقدر که شما میخوای ساده هم باشه، به این سادگیا نیست! یکم در این مورد سرچ کنی نمونه کد زیاد هست.
هیچوقتم به مشکل قاطی شدن با متغیرهای داخلی مواجه نمیشی چون از یه ساختار مثل HashMap برای هر حوزه تعریف استفاده میشه برای نگهداری مقادیر متغیرهای درون اسکریپت و بهتر بگم! اصلا متغیرهای داخل اسکریپت واقعی نیستن!

اما در مورد پیشنهاد دومم که یه جورایی تعریف ماکرو بود (البته نه دقیقا) اصلا چنین ایرادهایی که شما میگیری رو نداره! پیشنهاد دومم این بود که برنامت یه فایل txt. بگیره و یه فایل java. بده تحویل! اونم نه با پیچیدگی! توی فایلت اسکریپتت بگرده و به جای قسمت اولش، تیکه اول کلاس جاوا رو توی فایل خروجی بنویسه، و از اینجا به بعد هرجا shuru دید به جاش } بذاره.
هرجا payan دید به جاش { بذاره. هرجا agar دید به جاش if بذاره و هرجا benevis دید به جاش System.out.println بذاره! فکر نمیکنم برنامه ی پیچیده ای باشه.
فقط چندتا replace و find و اینا نیاز داره!

ahmad.mo74
جمعه 04 مهر 1393, 18:53 عصر
سلام،

حالا که بحث به اینجا رسید، کسی میدونه GWT چجوری کد جاوا رو به javascript تبدیل میکنه؟
تا جایی که میدونم به bytecode ربط داره یعنی گوگل یه راهی پیدا کرده که bytecode جاوا رو به javascript تبدیل میکنه، حالا چجوریشو خدا میدونه...
مطمئنا از چیزی مثل دیکشنری و این حرفا هم استفاده نمیکنه...کسی چیزی میدونه؟

مثلا:


public class HelloWorld {


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


}


byteCode:


Compiled from "HelloWorld.java"
public class HelloWorld {
public HelloWorld();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return


public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String Hello, World!
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}


اینو چجوری به JavaScript تبدیل میکنه؟

محمد فدوی
جمعه 04 مهر 1393, 20:28 عصر
اولا مبحثی که شما مطرح کردین به سوال Hadi-Hashemi مربوط نمیشه. بهتر بود جدا مطرح میشد.



byteCode:

Compiled from "HelloWorld.java"
...


این کدی که شما گذاشتی bytecode نیست. اگه میخوای bytecode برنامت رو ببینی کافیه فایل class. رو با یه ادیتور ساده مثل Notepad باز کنی.

اما در مورد GWT (http://en.wikipedia.org/wiki/Google_Web_Toolkit) یا همون Google Web Toolkit، تا اونجایی که من میدونم کامپایلر GWT کد جاوا رو به کد جاوا اسکریپت تبدیل نمیکنه. گوگل کنار بسته ی GWT اومده JSNI (http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html) یا JavaScript Native Interface رو معرفی کرده که میتونید باهاش بین کدهای جاوا و جاوا اسکریپت ارتباط برقرار کنید (یعنی مثلا یه تابع جاوا رو توی جاوااسکریپت فراخوانی کنید). برای اینکار هم از JNI یا Java Native Interface کمک گرفته.
من که چیزی در مورد Convert کردن توش ندیدم و بعیدم میدونم بشه یه Convertor کامل بین Java و JavaScript ساخت! چون خیلی باهم فاصله دارن.
در ضمن هدف از تشکیل GWT اصلا چنین چیزی نبوده (از اسمشم معلومه!) و واسه همین از نظر منطقی ام بعیده! :متفکر:
اینجا (http://www.gwtproject.org/learnmore-sdk.html) یکم در موردش میتونی بخونی.

اگه منبعی برای این حرف داری بذار.

ویرایش(۱):
من چیز زیادی از GWT نمیدونم ولی به نظر میرسه هدفش از گنجوندن کدهای JavaScript توی کد Java، راحت شدن تولید کد Client-Side و بخصوص Ajax باشه. حالا بازم در موردش میخونم.

ویرایش(۲):
طبق نوشته‌ی ویکی پدیا:


GWT Java-to-JavaScript Compiler
Translates the Java programming language to the JavaScript programming language.

:متفکر: یکم الان شک کردم ولی بازم نظرم اینه که حداکثرش اینه که GWT از روی کد جاوا کد جاوااسکریپت رو تولید میکنه و تبدیلی در کار نیست.

ahmad.mo74
جمعه 04 مهر 1393, 21:38 عصر
دلیل اینکه نوشتم bytecode برای این بود که اسمشو نمیدونستم چی بذارم در واقع به این کدا میگن disassemble شده ی یک فایل .class و گرنه با bytecode که همه آشنا هستن :)، در واقع اگر شما همون bytecode رو با یه hex editor باز کنید میبیند که عددهایی که تو هر خط از کدهای disassemble شده هست معادل قسمتی از همون hex هاییه که تو bytecode هست...

اما در مورد اینکه گفتم gwt کد جاوا رو به JavaScript تبدیل میکنه : http://www.tutorialspoint.com/gwt/gwt_quick_guide.htm
اون JSNI که میگید بحثش جداش، شما اون جا مستقیما با کد js و native کار میکنی...و اینکه میگید java با js خیلی با هم فاصله دارند بله درسته و سوال من هم همینه که چطور این کارو میکنه گوگل؟ چون اصلا ما تو js آبجکت اورینتد و این حرفا نداریم و...

و اینکه چه ربطی به bytecode داره رو دقیقا یادم نیست (یعنی gwt با استفاده از کدهای disassemble شده کد js معادلشو تولید میکنه) کجا خونده بودم فکر میکنم همین tutrialspoint بود یا javacodegeeks دقیقا یادم نیست...

فکر میکنم خیلی هم با سوال اصلی بی ربط نباشه چون اینجا هم داریم یه کدی رو به یه کد دیگه تبدیل میکنیم!


ادیت: فکر میکنم اینجا فرقی بین تولید و تبدیل نباشه

محمد فدوی
جمعه 04 مهر 1393, 22:59 عصر
چون اصلا ما تو js آبجکت اورینتد و این حرفا نداریم

زبان جاوا اسکریپت هم شیء گراست فقط رویکردش در مورد شیء گرایی با زبان های کلاسیکی مثل جاوا متفاوته. این (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript) رو بخون.

تفاوت بین تولید و تبدیل خیلی زیاده. ممنون بابت لینکی که گذاشتی؛ خیلی کمک کرد به فهم بهترم، خودتم یه نگاه اجمالی بندازی بش کامل متوجه میشی GWT چکار میکنه و به نظرم واقعا دمش گرمه!
توی لینکی که گذاشتی یه Web Application با GWT مثال زده شده که به بخشای اولش کاری نداریم. گام پنجم (Step 5) رو نگاه کن.
توجه کن که اینجا اصلا هیچ تبدیلی در کار نیست! اینجا جاوا کد سمت سرور و جاوااسکریپت کد سمت کلاینته. این کلاس با زبون جاوا نوشته شده ولی ساختار متد onModuleLoad شباهت زیادی با جاوا اسکریپت داره:

package com.tutorialspoint.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.Window;

public class HelloWorld implements EntryPoint {
public void onModuleLoad() {
Window.alert("Hello, World!"); // Java, Used for generate javascript!
}
}


در واقع با این کاری که GWT کرده دیگه لازم نیست برنامه نویس JavaScript بنویسه! این کد موقع پاسخگویی به کاربر کد JavaScript مورد نیاز که اینه رو تولید میکنه:


alert("Hello, World!"); // Javascript, Generated by GWT!


تصویر نهایی رو توی همون لینک ببین که پیغام "!Hello, World" نشون داده شده.
پس همونطور که حدس میزدم GWT کارش تبدیل جاوا به جاوا اسکریپت نیست. فقط موقع پاسخگویی از روی کد جاوا، جاوا اسکریپت سمت کلاینت رو تولید میکنه. حتی به نظرم ادبیات ویکی پدیا هم یکم در این مورد ایراد داره. ویکی پدیا میگه GWT Compiler جاوا رو به جاوا اسکریپت ترجمه میکنه.
مثلا هیچوقت اون برنامه ای که شما نوشتین رو نمیشه با GWT به Javascript تبدیل کرد! :چشمک:

بهرحال من که خیلی از GWT خوشم اومد. مخصوصا توی ارتباطات AJAX فکر میکنم خیلی کار رو راحت میکنه.
ممنونم بابت معرفیش.

ahmad.mo74
شنبه 05 مهر 1393, 09:51 صبح
سلام، ممنون

زبان آبجکت اورینتد زبانیه که علاوه بر class base بودن 3 تا ویژگی دیگه هم داشته باشه:

1- encapsulation
2- inheritance
3- polymorphism

خب حالا js آبجکت اورینتده؟

اما این مثالی که زدید برای alert ، اینا درسته و یه قسمتیش بازم مربوط به JSNI میشه اما من در این مورد که GWT کد جاوا رو به js تبدیل میکنه یا تولید میکنه یا ... مطمئنم چون یه بار دربارش مفصل خونده بودم جایی اما متاسفانه هر چی میگردم پیداش نمیکنم...

من خودمم تازه کار با gwt رو شروع کردم یکی دو تا هم پروژه بیشتر انجام ندادم هنوز خیلی چیزاشو بلد نیستم :)

محمد فدوی
شنبه 05 مهر 1393, 10:16 صبح
خب حالا js آبجکت اورینتده؟
بله. برنامه نویسی Prototype-Based (http://en.wikipedia.org/wiki/Prototype-based_programming) یه نوع برنامه نویسی شیء گراست.

اگه منبعی در این مورد پیداکردی بذار همگی استفاده میکنیم.

ahmad.mo74
شنبه 05 مهر 1393, 11:11 صبح
تا حالا درباره prototype-base چیزی نشنیده بودم ولی ظاهرا js رو جز زبونای oo به حساب میارن، به هر حال...
در چه مورد منبع بذارم؟

اما در این مورد که gwt جاوا رو به js تبدیل میکنه شکی نیست و اونایی هم که باهاش کار کردن میدونن من چی میگم، به jsni و اون مثالی که شما زدید هم مربوط نیست اونا کلا بحثش جداس و هیچ ربطی به js compiler نداره!

گوگله دیگه یه کارایی میکنه که هیچ بنی بشری به جز خودشون نمیفهمه چیکار کردن :|