デスクトップアプリや業務アプリなどの便利なアプリがどのような原理で作られるのか知りたいです。
開発について調べていると,どの言語でも得手不得手はあるけど、どんなアプリでも作れるとありました。
C言語やjavaなどのメジャーな言語ならライブラリやフレームワークが用意してあって、出来そうな感じがするのですが、haskellやlispなどの言語でアプリを作りたいときはどうすれば良いのでしょうか?
また、開発をするためのフレームワークはどうやって作られているのでしょうか?
(例えばhaskellでwebアプリを作れるYesodなど)
OSとやりとりしたりする命令を書いたりするんでしょうか?
回答よろしくおねがいします。
知識に乏しいため、言っていることがわからなかったら申し訳ありません。
その点を指摘してくだされば、補足します。
補足
アプリを作ってみたいのですが、プログラミングの書籍では、開発の仕方がいまいち分からなかったので質問させていただきました。
プログラミングの基礎を開発につなげるための知識がなく、どのようなキーワードを調べればよいかもわからなかったので…
もしよろしければ参考になる書籍やサイト、キーワードなどを教えていただけるとありがたいです。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
このサイトの趣旨からは外れるかもしれませんが、
自分が重要な問題だと思うので、回答させていただきます。
「原理」というお話ですので、原理原則までさかのぼった話をします。
若干抽象的な話になってしまいますが、かまわなければ読んでください。
「アプリケーション開発」には、大きく分けて二つの異なった作業があります。
1.何を作るのかを決める
2.決めたものを実現する
このサイトで話題になっている技術の大半は、2.に関するものです。
しかし、「便利なアプリ」を作るために本当に重要なのは 1. です。
アプリケーションが便利なものとして完成する「原理」は 1. の中にあって、2. にはありません。
1.の段階で便利でないものを 2.の段階の技術で便利にすることはほぼ不可能です。
ですから、あなたに「どうしても作りたい」アプリがあり、それが便利なものであるという絶対の自信があり、
それを他人に伝える能力があり、しかしながらアプリというものの作り方がよくわからない、という状態であるなら、
それを「便利なアプリ」として完成させるためにあなたが注力すべき作業は1.です。
1.のための時間が足りないのでしたら、2. の作業を能力のある他人に任せるべきです。
なぜなら、あなたが考えたアプリに関して 2.は他人でもできますが、1.はあなたにしかできないからです。
- の作業がきちんとできないならば、そのプログラムが「便利なアプリ」として完成する可能性は
限りなく低くなります。
もちろん、「どうしても作りたい」のでなければ、そこまで極端考える必要はありません。
「アプリをプログラミングする」という作業を、
ホビーとして楽しみたい、または教養として知りたい、仕事で使う技術を身に着けるためにやってみたい、
というならこの限りではありません。
その場合は「便利なアプリを作ること」は手段であって目的ではないからです。
「なんか使いにくいけど面白いからいいや」で済んでしまいますからね。
「便利なアプリを作ること」を第一の目的とするならば、
アプリケーション開発にとって一番重要なことは、言語でもフレームワークでもOSでもありません。
そういうものをいくら勉強しても便利なアプリケーションを開発する方法はわかりません。
わかるのは、すでに何をするのかきちん決まっているアプリの設計を
コンピュータプログラムとして実現する手段だけです。
アプリは問題を解決したり、目的を達成するための手段です。
ですから、最も重要なのは「そのアプリがなんであるか、目的は何か」をしっかり決めることです。
本当に便利なアプリは、目的の作業を行うための手順などがよく考えられていて、
ユーザが無駄なことをしなくても済むように、やるべきことがすぐわかるように、さまざまな工夫が凝らされています。
そのような工夫をこらして、そのアプリがどのようなものか、何をすべきかを決めた人が「便利なアプリ」を作った人です、
プログラマはそれをコードとして実行可能な形にしたに過ぎません。
その作業や技術は自体は十分価値のあるものですが、
「アプリの便利さ」を決定付ける要素ではありません、代替えの効くものです。
haskellやlispなどの言語でアプリを作りたいときはどうすれば良いのでしょうか?
特定技術においてアプリを実装する場合の作業は、
アプリの目的とその技術の機能の付きあわせです。
足りない部分は新規開発するなりライブラリを探すなりします。
一般にそういった作業のコストが予算をオーバーするような(しそうだと予想されるような)場合は、
責任者はその技術を使うことを断念する判断をして別の技術を検討し始めます。
チューリング完全であれば理屈の上ではなんでもできますが、
実装コストが見合うかどうかは別問題です。
もしよろしければ参考になる書籍やサイト、キーワードなどを教えていただけるとありがたいです。
よろしくお願いします。
問題解決や要件定義に関する本を読まれるのがいいと思います
少し古いですが・・(ソフトウェア開発の話はほぼ出てきません)
ライト、ついてますか―問題発見の人間学 単行本 – 1987/10/25
ドナルド・C・ゴース (著), G.M.ワインバーグ (著), 木村 泉 (翻訳)
投稿2016/01/30 02:48
編集2016/01/30 10:46総合スコア1193
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/01/30 03:31 編集
2016/01/30 07:06 編集
2016/01/30 09:15
2016/01/30 10:49
2016/02/05 13:31
0
GUIアプリの場合、直接に画面描画を行っているのはOSなので、たとえばWindowsならWin32APIを呼び出す形でGUIプログラミングが作られています。
GUIライブラリやフレームワークは、それらをラップして扱いやすくしたものですので、言語の機能としてGUIが用意されていなくても、DLL呼び出しができるならGUIプログラムは作れることになります。
…が、HaskellやLISPでGUIを扱うのは今のところ茨の道ですね。
関数型で何でも良いということなら、MicrosoftのF#などは比較的簡単にGUI開発の手段があるようです。
http://qiita.com/nida_001/items/6ea321aff7f664a0e7f3
あとJava仮想マシンで動作するLISP(Clojure)という言語や、関数型とオブジェクト型のハイブリッド言語であるScalaなどは、JavaのGUIライブラリを利用できるかと思います。
また、アプリケーション本体とGUIは他の言語で作成し、関数型言語で作成したDLLを呼び出すなどのやり方も良いのではないかと思います。
副作用を極力抑える関数型のスタイルと、副作用の塊であるGUIプログラミングは相性が良いとは言えないので、やはり適材適所じゃないかなと思います。
どの言語でも得手不得手はあるけど、どんなアプリでも作れる
何でも作れるとは言っても、現実的かどうかはまた別の話ですね。たとえば、現時点で、大抵のスクリプト言語でEXEファイルは作れません。開発環境は言語ごとに大きな違いがあります。
ただ、まるっきり嘘だとは言い切れません。10年前は、JavaScriptでサーバーサイドアプリケーションは作れませんでしたが、Node.jsが登場し、現在では作成できるようになっています。何が作れるかは、言語そのものには左右されない。ただし、コンパイラやライブラリやフレームワークも含めた開発環境には大いに影響を受ける。
といったところでしょうか。
投稿2016/01/30 09:04
編集2016/01/30 09:36総合スコア686
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
デスクトップアプリや業務アプリなどの便利なアプリがどのような原理で作られるのか知りたいです。
開発について調べていると,どの言語でも得手不得手はあるけど、どんなアプリでも作れるとありました。
C言語やjavaなどのメジャーな言語ならライブラリやフレームワークが用意してあって、出来そうな感じがするのですが、haskellやlispなどの言語でアプリを作りたいときはどうすれば良いのでしょうか?
Haskell や Lisp でも、C言語や Java などと考え方は同じです。デスクトップアプリや業務アプリを作る時に使えるライブラリやフレームワークをだれかが用意していて、それを使って開発します。ライブラリは、オープンソースで開発されているものもありますし、企業が開発して販売しているものもあります。
もちろん、ライブラリの品揃えとか成熟度とかは言語によって違いますが、ある程度の知名度がある言語(例えば、その言語について書籍が出ているレベル)なら、一通りのアプリは作れると考えていいでしょう。ただ、成熟度によっては、機能が足りなかったり、バグばかりあったりと、まあ、いくつかのライブラリをある程度試してみないことには、それで実用的な開発ができるかどうかは判断できないでしょう。(オープンソースのライブラリなら、機能を追加したり、バグを直したりするという参加のしかたもできます)
また、開発をするためのフレームワークはどうやって作られているのでしょうか?
(例えばhaskellでwebアプリを作れるYesodなど)
OSとやりとりしたりする命令を書いたりするんでしょうか?
どのようなプログラムでも、必ず入出力がありますので、どこかで必ず OS とやりとりをしています。でも、例えば、Yesod が、OS のシステムコールを直接呼び出しているかというと、そういうことはまずないでしょう。
まず、どのプログラミング言語でも、入出力を行うための組み込みのしくみが付いています。例えば、Haskell で putStrLn
とすれば、画面に文字列を表示できますし、hPutStr
とすればファイルに文字列を格納できます。これらは、言語(例:Haskell)の「処理系(例:GHC)」が、OS とやりとりをすることで実現しているわけです。
さらに、すでにご存知だと思いますが、便利なプログラムをまとめた「ライブラリ」というものがあります。ライブラリには大きく分けて2つあって、その言語(例:Haskell)で書かれたものと、共有ライブラリという、別の言語(C言語とか C++とか、その他)で書かれたものがあります。
共有ライブラリは、OS ごとにフォーマットが決まっていて、それさえ守ればどんな言語からも呼び出して使うことができます。例えば Haskell には FFI(外部関数インターフェイス)と呼ばれる仕組みがあって、これを通して、C言語などでかかれた共有ライブラリーを使うことができます。
こういうライブラリの中には、HTTP プロトコルを扱うものだったり、SSL のような暗号化を扱うものだったり、データベースとのやり取りを扱うものだったり、いろいろなものがあります。Yesod のようなフレームワークは、処理系自体の機能に加え、こうした、別の人たちが書いた、たくさんのライブラリを活用して構築されています。
デスクトップアプリを作るときには、普通は、OSの他に、ウィンドウやキーボードやマウスなどを扱うための、GUI ツールキットと呼ばれるライブラリを使います。(もちろん、FFI などを駆使すれば、それがなくても、ほとんど Haskell だけで作ることもできるでしょう。でも、さすがに何もないところから全部自分で作るのは大変すぎますよね) 例えば、Linux や BSD* などの Unixライクな OS だと、GTK+、Qt、wxWidgets という、X-Window というウインドウシステム上で動く GUI ツールキットがよく使われています。
Haskell でも、すでにだれかが、これらのライブラリを Haskell から使うためのライブラリを用意しているはずです。ですから、そのなかから良さそうなものをいくつか選んで、実際に試してみて、「よし、これで行けそう」というものが見つかったら、それを使って開発すればいいのです。
なお、フレームワークもライブラリの一種です。一般的に、ライブラリと呼ぶ時は、自分が書いたプログラムが主体になって、ライブラリにある部品(関数など)を呼び出す形で使います。
フレームワークと呼ぶ時は、フレームワーク側のプログラムが主体になって、自分の書いたプログラムはフレームワークから呼んでもらいます。Haskell でプログラムを書くとき、main
という名の IO()
型の変数を用意して、そこに IO アクションを返す関数を束縛しますよね。でも、Yesod のようなフレームワークを使う時は、自分のプログラムでは、どこにも main
などという変数は書きません。なのに動くわけです。
実は、Yesod のフレームワークのなかのどこかに main
があって、そちらが最初に評価されるしくみになっているのです。このようなしくみなので、プロジェクトの雛形を作っただけで、ウェブサーバーを起動してデフォルトの画面を表示できるわけです。
作りたいアプリと使いたい言語が決まったら、それに必要なライブラリやフレームワークがあるか調べてみてください。そして、それを試してみてください。試した上で、うまく行かないことがあれば、また質問すればいいのです。その時は、もっと具体的な質問になっているでしょう。
(2016年1月30日 追加)
関数型言語に興味があって、それを使って、デスクトップアプリを作りたいのですね。
最初に言っておくと、私が仕事で主に使っているのは Erlang/OTP で、分散データベースの開発をしています。そのため、デスクトップアプリの開発についてはほとんどわかりません。Haskell や OCaml のような ML 系言語については、以前から趣味として学習しているというレベルです。Lisp も時々遊びで触る程度。最近は ML 系の Rust という言語を、Erlang と組み合わせて使おうとしています。(サーバー側での用途です)
なので、的確な回答ができるかはなんともいえないのですが、わかる範囲で書いてみます。
Haskel
たしかに、Haskell でデスクトップアプリを作っている人は、かなりの少数派のようです。ネットで検索してもあまり出てきませんね。手元には洋書中心で Haskell の書籍が5冊あります。が、その中で GUI について解説しているのは「Real World Haskell」ただ1冊で、しかも14ページしかありません。(英語版でのページ数です)
Real World Haskell の日本語翻訳版はオライリージャパンから出版されています。また、英語版ならオンラインで無料で読めます。
- Real World Haskell - Chapter 23. GUI Programming with gtk2hs
ウェブでの日本語記事ですと、こちらを見つけました。この中の「Haskellでテトリス(Part 1〜9)」が丁寧に解説されていておすすめです。なお、GUI ツールキットは GTK+ を使っています。
Lisp
Lisp に関しては、Common Lisp(CL)、Scheme(+Gauche)、Clojure といった方言がたくさんあり、さらに各方言について、処理系がいくつかある(CL なら SBCL、Clozure CL、CLisp など)という状況なので、非常に探しにくいです。
まあ、最近の日本語での情報(書籍やネット上の記事)の多さを取るなら、Java VM 上で動く Clojure がよいかと思います。Clojure なら、Java の GUI ツールキットである Swing を使ってデスクトップアプリも作れます。私は Clojure の書籍は持っていないので、ご自身で情報を探してみてください。
その他:OCaml
Haskell や Lisp 以外の関数型言語や、関数型言語の影響を強く受けた言語も紹介しましょう。
まず、OCaml ですが、「プログラミング in OCaml」(五十嵐 淳 著、技術評論社)では、2章割いて GUI アプリ開発を解説しています(GUI ツールキットは Tk)。この本は、冊子版は絶版のようですが、電子書籍版が買えます。大学の講義を元に書かれたようで、関数型プログラミングの入門から GUI 構築までが丁寧に解説されていて、おすすめです。
その他:Scala
最近では、OCaml や Haskell の他に、ML から大きな影響を受けている言語が増えてきました。Scala もそのひとつで、日本語の情報も多いです。Scala なら Clojure と同様に、Java Swing を使ったデスクトップアプリが作れます。
(2016年2月6日追記)
「Scala逆引きレシピ」(竹添直樹、島本多可子 著、翔泳社)に、数ページですが「GUIアプリケーションを作りたい」という項目があります。そこにはこのように書かれています。「もちろんScalaから直接Swingを使用することも可能ですが、scala.swingパッケージを使えば関数型言語らしい宣言的なスタイルで、SwingによるGUIアプリケーションを記述できます」
(追記終わり)
その他:Swift
Apple が開発し、オープソース化した Swift も、ML から多大な影響を受けています。iOS と(Mac)OS X 限定ですが、デスクトップアプリや iPhone のゲームを作るために生まれた言語です。iOS アプリの開発者は多いので、日本語の情報も多いです。
日本の Haskell ユーザーで Swift を使っている人は多いようで、ネット上では、Haskell の○○を Swift で再現してみる系の記事が多かったりします。
例:(デスクトップアプリの話ではありませんが)
Swiftでアプリカティブスタイル
その他:Rust
Rust も ML から多大な影響を受けています。Rust は、Mozilla が次期ウェブブラウザーの研究開発プロジェクトのために開発した言語で、マルチプラットフォーム(Windows、OS X、Linux)のデスクトップアプリやゲームなどを作るのに向いています。システムプログラミング向けの言語なので、OS を書くこともできます。ユーザーフォーラム(英語)の常連回答者たちを見ていると、Haskell ユーザーが多いように見えますね。
Rust は私のイチオシ言語なのですが、ライブラリの成熟度がまだ低いことと、日本語の情報が少ないことがあり、デスクトップアプリの開発に使うには、まだ早いかもしれません。Piston という、マルチプラットフォームのゲームエンジンの開発が活発に行われていて、Piston のホームページでは、簡単なパズルゲームや、Minecraft クローンなどのデモアプリが用意されています。また、もちろん、開発途中のウェブブラウザー もあります。
まとめ
いま紹介した中からですと、以下の順番で試すのがいいでしょうか?
- Haskellでテトリス
- プログラミング in OCaml
- Clojure + Swing(情報はウェブや書籍で探してみる)
このどれかの言語で、やりたいことができるようなら、とてもいいですね。
もし不十分だったら、さらに他の言語、Scala や (Mac)OS X なら Swift なども試してみてはどうでしょうか?
投稿2016/01/29 10:54
編集2016/02/06 02:03総合スコア2046
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/01/29 14:07
2016/01/30 09:56
2016/02/05 13:32
2016/02/06 01:21
0
こんにちは。
中々簡単に説明することが難しい質問ですが、誤解を恐れつつむちゃくちゃ簡単化して説明してみます。
まず、コンピュータというハードウェアとその上で走るソフトウェアがありますね。
そのソフトウェアが全て何かのアプリだったと考えてみてください。(実際、そのようなマイコンも世の中にはあります。)
その様々なアプリを1から作っていると本当にたいへんですね。しかし、アプリが必要とする処理の中に多くのアプリが共通で必要とする処理が多数あります。そのようなソフトウェアの内、基本的な部分を集めたものがOSです。ハードウェアを制御する部分~アプリ自身を制御する部分等です。
そして、OSはある意味サブルーチンの塊と考えても良いです。(端折り過ぎですがイメージを掴むためです。)アプリを開発する時は、OSの適切なサブルーチンを呼び出して作るわけです。
ただし、1つのコンピュータで複数のアプリを走らせたり、1つのアプリが暴走してもシステム全体として動作を継続できるようにしたりするために、メモリ空間の話やカーネル・モードとかユーザ・モード等ややこしい話が多数ありますので、実際には単純なサブルーチン呼び出しではないです。
そのようなOSとのやり取りするための約束事を纏めたバッケージがSDKと呼ばれる形式でOSベンダーから提供されます。
そのSDKを直接使ってアプリを作る場合もあります。例えば、Windows SDKを直接呼び出して開発されたアプリですね。たぶん、今もそのようなアプリを開発している人は居ると思います。
また、アプリを開発するための開発ツール(例えばVisual Studioとか)や各種フレームワークもそのようなSDKを使って開発し、アプリとOS間の橋渡しも行います。
さて、具体的な部分は、yu-ki0さんがお使いのOS毎に大きく異なりますので、そのOS用に情報を集める必要があります。
Windowsはその名の通りWindowシステムもOSに含んでいますし、基本部分はあまり変わってないし、情報も多いので比較的集めやすいです。
Linuxの場合は、そのディストリビューション毎にそこそこ異なる場合がありますので、ディストリビューションまで決めた方がよいだろうと思います。
また、作りたいアプリの種類によっても集めるべき情報がかなり異なります。
例えば、WEBアプリとデスクトップアプリでは、OSとやり取りする内容がかなり異なります。
この辺も的を絞って情報収集することをお薦めします。
更に詳しい話は、OSとどんな分野のアプリか的を絞って尋ねるのが良いと思います。
【コメントへの回答です】
自分は関数型言語でデスクトップアプリのようなのを作ってみたかった
とりあえずSDKについて調べてみれば、開発の仕方がわかってくるのでしょうか?
関数型言語をサポートしたSDKを提供しているOSベンダーは事実上ないと思います。(あったとしてもマイナー過ぎて情報がなかなか見つからない。)
ですので、SDKからのアプローチは不発に終わると思います。
でも、こんなサイトがありました。「HaskellでもGUIを持ったアプリケーションを開発する事ができます.」だそうです。
「OSベンダーが提供しないなら、Haskell側で対応すればいいじゃないか」と頑張った方々がいるということです。このあたりを参考に始めてみると良いかも知れません。(Haskellについては私は名前くらいしか知らないので無責任モードですいません。)
【閑話休題】
ところで、GUIの開発はソフトウェア開発の非常に大きな部分を占めますので、そもそもGUIが必要なのかどうかは非常に重要です。
デスクトップアプリは、グラフィカルな表示を行い、マウスやキーボードで操作します。これを、GUI(Graphical User Interface)といいます。
これに対して、WEBアプリは、サーバ上で接続してくるクライアント・マシンのWEBブラウザと通信するものですので本質的にはGUIは不要です。このようなアプリはCUI(Charactor User Interface)を持っている場合が多いです。
投稿2016/01/29 10:20
編集2016/01/29 17:24総合スコア23272
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。