インターネットのサービスを作るときについて完全に素人の僕から質問があります。
是非、実際のプログラマの方などからの怪盗をお待ちしております。
※質問本文はコメント欄にて。
プログラマの端くれからの答えです。
1:質問者の“新しい言語”のイメージは理解しかねますが、英語よりは全然マシと思います。
私が理系だからかもしれませんが、数学や物理の1単元を勉強する感じでした。
高校で例えるなら、微分積分を勉強したとか、ベクトルを勉強したとか、電磁気を勉強したとか。
学んだ概念や公式で問題を解く代わりに、学んだ言語で問題の解き方を書く感じです。
2:多くの場合、そう考えて良いと思います。
私は、プログラミングは、マニュアルを書くことと思っています。
コンピュータがそのマニュアルを実行している意味で、その通りだと思います。
ただ、皆さんが今見ているこの画面の各要素を生きたキャラクタと見なし、
それぞれのキャラクタに対してマニュアルを書く考え方もあります。
例えば、左矢印のボタンに対して「クリックされたら1ページ戻るように」など。
コンピュータに命令するイメージからは、ちょっと離れると思います。
詳しくは「オブジェクト指向」について調べてみると良いと思います。
3:言語次第です。
Windowsどころか、ランタイムと呼ばれる特殊なソフトの機能に限定される言語もあります。
逆に、Windowsなど関係無しにコンピュータそのものの機能を限界まで引き出せる言語もあります。
後者は、コンピュータがあって、それに直接指示するプログラムを書くことになります。
この場合、Windowsは全く関係ないので、影響されません。
対して前者は、Windowsなどの他のソフトウェアに頼んで、、
そのソフトウェアにコンピュータを操作させるプログラムを書くことになります。
この場合、Windowsが出来ない操作は頼めません。
これら両方ができ言語もあります。
あとは「できないこと」とは何かです。
プリンタに接続してないコンピュータに印刷しろ!と命令しても出来ないと言えば、確かにですが、
そのレベル=物理行動のレベルと思って良いと思います。
一方、論理レベルでは、普通に言うコンピュータは無敵と思って良いと思います。
時間さえ掛ければ、どんな処理だってできます。そのように設計されています。
というわけで、そう決めているのは「コンピュータの設計者」 です。
4:全く別物です。
テレビ局とテレビメーカーほど違っています。
全くの素人も大勢いますが、その知識がプログラマのレベルを決める要因の一つでもあります。
5:一に論理的思考、二に記憶力、三は想像力でしょうか。
計算はコンピュータにやらせばいいので、要らんかと。
単語数で言ったら、高校英語と良い勝負のプログラミング言語もあります。
コンピュータの状態が予想できて初めて、次ぎ何をさせるか書けます。
6:致命的な勘違いは無いと思います。
大体は良い感じではないでしょうか?
注:この答えでは専門用語を厳密に使ってません。
大体の感じが伝われば良いと思ってます。
1 & 2
新しい言語、というのが英語や中国語のようなものなら、個人的には違う、と言う意見です(まったく異なる、というわけでもないですが)。
むしろ自動車や機械の操作手順を覚える方が近いような気がします。
3
コンピュータにできることや X と言う動作に関してどの様なイメージでおっしゃっておられるか少し分かりませんが、
Windows の場合、物理的に可能な大抵のことはできると言ってもよいのではないかと思います。
ただし、コンピュータに指示を出す、つまりプログラミングに関しては様々な方法があり、人間でいえば関節ひとつずつの角度を指定するようなやり方から、
おおざっぱに犬の絵を描け、とか校歌をうたえというようなものまであります。
後者の方が簡単なのですが、細かいニュアンスは出せない場合があります。
この場合、コンピュータにできること、というよりも指示できるものは誰が決めているというか、自分がその指示の仕方を選んだ結果です。
細かく指示を出せるがややこしい方法か、簡単だけどおおざっぱか。
4
どう説明したらいいか分からないので保留。
技術分野が違うので知らなければできません。
5
例として上げられた中では論理的思考 (他の要素もそれなりに必要)。
プログラマがどれほどの範囲を受け持つかにも寄りますが、設計に近くなるほど数学的素養も必要でしょう。
暗算はできれば便利ですが、電卓を使えればさほど問題はありません。
これを覚えるということは、イメージとしては“新しい言語”をマスターするのと同じようなものと考えて良いのですか?
2.プログラミング言語をマスターして、プログラミングをするということは、これもイメージとしてですが、
コンピュータにこういう動きをして欲しいという自分の意志を、プログラミング言語という言葉を使ってコンピュータに命令するようなもの、と考えて良いのでしょうか?
3.少し話が変わりますが、コンピュータをプログラミングするということは、コンピュータに指示を与えることだと思いますが、
この指示は、例えばWindowsのパソコンであれば、Windowsのパソコンに可能なことの範囲内でしか出すことは出来ないのでしょうか?
つまり、Xという動きをして欲しいなーと思っても、既存のソフトウェアでXという動きをするものが無い場合、
Windowsが行うことの出来る行動を組み合わせてXに近い動きをするソフトを作ることは出来ても、
いきなりコンピュータにXの動きをしろ!という命令を出すことは出来ないのか、という意味です。
また、この際に「コンピュータに出来ること」というのは、誰が決めているのでしょうか?
4.「3」の最終行の質問の補足になりますが、
僕のような素人は、コンピュータをプログラミングする人と、コンピュータを作る人を混同して考えてしまいがちです。
プログラマは、コンピュータを作る人とは全くの別物ですか?
既存のコンピュータをプログラミングすることは出来ても、新しいコンピュータを作ることに関しては全くの素人ですか?
5.プログラマになるには、精神論以外で何が得意であれば有利ですか?
計算力ですか?想像力ですか?論理的思考ですか?記憶力ですか?・・・なんでしょうか?
また、高校までの科目で言うと、どの科目が得意な人がプログラマに向いていますか?
僕のイメージでは、数学が得意な人だろうな、と思います。何十桁の暗算がちゃちゃっと出来るような人なのかなぁと。
6.以上の質問を踏まえて、僕が「プログラミング」というものに関して抱いている勘違いがありそうな点があれば、指摘して下さい。
以上、長々と申し訳ありませんが、どうぞご教授下さい。
となるでしょう。
日本語で じゃんけんしよう、じゃんけん ぽん
と言えば、グー、チョキ、パーのどれかを 出すでしょう。
つまり、言語は この会話みたいなもの。
ハード(コンピューター)は 質問者となります。
質問者が理解できる言葉で ああして こうしてといえば、
質問者は 自分の頭の中で ああするには これやってあれやって なんて考えるでしょう。
コンピューターは そんなものなのです。
>質問者は 自分の頭の中で ああするには これやってあれやって なんて考えるでしょう。
>コンピューターは そんなものなのです。
そうなんですか!?
ということは、例えばこのコメント欄を作るのも、
こういう枠組みの広さと色とフォントと位置と全部細かく指定して、
さらに登録するボタンを押したらどうなる、とかも別に細かく指定しなくても、
「コメント欄を良い感じに作って、登録したらページに表示されるようにしてくれ」っていうのをプログラミング言語で命令すれば、
あとは勝手にコンピュータがやってくれるんですか・・・?
なんだかイメージと違って驚きです。
また、
「コメント欄を良い感じに作って、登録したらページに表示されるようにしてくれ」
という命令を コンピューターが できる内容に変換するソフト(コンパイラ)というのもあります。
おおもとは コンピューターのハードです。
ハードによる論理回路による処理です。
そこまで理解して プログラムしている人は少ないと思いますけどね。
>>というわけで、そう決めているのは「コンピュータの設計者」 です。
>これがイマイチピンとこないのですが、
>コンピュータの設計者は神様なのでしょうか・・・?
>どうしてそんな凄いものが作れるのでしょう・・・・?
うんー誤解されそうなので人型ロボットを例に補足します。
物理レベルというのは、「飛べ」と言われても飛べません。
論理レベルというのは、物理的に可能なポーズを取らせることです。
関節一個一個の角度を指定すれば、一応は「全てのポーズは取れます」。
それを時間掛けて操作すれば、出来うることは全て「言語でさせられます」。
ついでに、取り得るポーズを決めてるのは、ロボットの設計者です。
気を付けて欲しいのは、「ロボットが自分で考えて行動する」とかとは別次元の話しです。
そんな「行動(ポーズ)」を設計できた設計者は神様と称えられるでしょうね。
SEがプログラムの仕様を考え、普通のプログラマはそれをコーディングするだけなので、あまり論理思考は要りません。
6についていえば、プログラムを実際にするというイメージがまだ湧いていないようです。基本から知りたい場合はCから始めるのも良いかもしれませんが、やりたい事がある程度windows上とか決まっているのであればVisualBasic等から始めても良いと思います。
プロとしてやるのであれば別ですが、趣味をとしてやるのであれば、Web上に初心者の為のページもたくさんありますのでまずは習うより慣れろで初めて見た方がイメージが着くと思います。OfficeをもっているのであればExcelのVBAから始めてみても良いでしょう。
手前味噌ですが、ここ数日の私の回答をご覧いただくと、なんとなくでも解ってもらえるのではないかと思います
いずれもphpです
(1)特定のパターンを抜き出すことを指示している例
http://q.hatena.ne.jp/1283604894
プログラマとして私が行ったことは「文字列のパターンを特定しただけ」です。
実際に抜き出すのはpreg_matchというphpのビルトイン関数(標準で備えている関数)がやってくれてます
(2)RSSを読み取って、必要な情報だけを抜き出し、表として出力することを指示している例
http://q.hatena.ne.jp/1283713039
私が行ったことは「RSSを読み取って、itemの内容を順次出力する」という流れを書いているだけです
(3)データベースから必要な情報を抜き出し、件数が多い場合は、複数のページに分割するように指示している例
http://q.hatena.ne.jp/1283130886
google検索などを行うと「前へ 1 2 3 4 5 次へ」といったように複数のページに分割してくれてますが、それと似たようなことをPEARという既存のライブラリ(プログラムの集まり)を使うことによって、たった20行程度のプログラムで実現しています
ライブラリを使わずにフルスクラッチで造ったこともありましたが、自分で造ってテストしてという手間がなくなれば、開発は比較にならないほど楽になります
ここから先、何をどのように覚えていくことが良いのかにつきましては、どのようなサービスを造り上げたいのかのビジョンを明確にしていくことが必要になりますので、今回の質問に対しては、この程度までだと思います
RomBasicいじって飽きあきしたな。
サークルで座標と半径指定して色指定して、ハイ、赤い丸ができました・・・
これのどこが面白いねんw
コメントありがとうございます。
ロボットが物理的に取れるポーズがあるというのは分かるのですが、
そもそもロボットがそのプログラミング言語とやらを理解する、というのが凄過ぎると思います。
右足を上げろという指示を出されて、その指示通りに実行したということは、
その指示を理解したということで、プログラミング言語を理解しているということですよね?
それともロボットに指示を与えたいときは、
ロボットのシステム自体に右足を挙げるという動作を「プログラミング言語ごと」機能として追加する、という、
これが自体がプログラミング、というのでしょうか?
きっと僕はプログラミングというもの自体を理解していないような気がします。
>>naka1kazu様
僕は仕事としてプログラミングをしたいなんてことは考えていません。
というか、今の状態では出来る気すらしません。
趣味でも良いので、この素晴らしい技術を体感してみたいなーという気持ちです。
また舞台はwindowsというか、パソコン上だけで構いません。
ロボットなんて全然分からないので。
ちょっといろんなサイトを見てみたいと思います。
ありがとうございます。
>>seble様
ハッカーになりたいという欲求はありません。
RomBasicというのが何のことを仰っているのかすら分かりませんが、
その赤い丸を作るだけでも、例えばそれでお金がもらえるのであれば楽しいような気がします。
これは専門的には「形態素解析」といい「文節切り分け」ともいいます。
http://ja.wikipedia.org/wiki/%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90
英語であればスペースで単語が区切られているので簡単ですが、日本語だとちょっと難しいです。
単語毎に切り分けるためのライブラリを色々な言語用に公開されている方がいて、そのライブラリを使って日本語を分割します。
私も以前遊んだことがありますが、yahooの日本語形態素解析サービスを使うと日本語の文を渡すと、単語毎に分けて返してくれます。
http://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html
つ・ま・り、言語に元々ない機能については
1.買う(もしどこかの会社が作っていれば)
2.フリーのソフトを使う
3.自分で作る(「形態素解析」について十分な知識があれば、自分で作るのも当然可能です)
のが基本です。
>>
フリーで入手可能なもの [編集]
フリーなライセンスで、自由に入手出来る。
* KAKASI(kanji kana simple inverter)、kakasi.namazu.org
* MeCab(和布蕪)、mecab.sourceforge.net
* ChaSen(茶筌)、chasen.naist.jp
* Juman、nlp.kuee.kyoto-u.ac.jp
* Sen(MeCabのJavaへの移植)、ultimania.org、sen.dev.java.net
* 日本語形態素解析Webサービス(Yahoo!デベロッパーネットワーク)、developer.yahoo.co.jp
市販されているもの [編集]
* Rosette形態素解析システム、Basis Technology
Google、Amazon、MSN、楽天などで利用されており、世界で最も利用者の多い形態素解析エンジンであると言える。
* 形態素解析エンジン言語郎、Zoo Corporation
* 日本語形態素解析MARIMO ムーター株式会社
大規模な辞書を持たず、1000語程度の学習モデルのみで未知語、新語、流行語、略語、話し言葉に対応する。
<<
>元々あるプログラムを転用するのでしょうか?
>このようなものなら既に似たような動きのプログラムが存在していると思うのですが、
>もしこれらが存在しておらず、1から作るときにはどうやって作るのでしょう・・・?
たぶん詳しく説明するほど、混乱されると思います。
アイザック・ニュートンの言葉に「もし私が、より遠くを眺めることができたとしたら、それは巨人の肩に乗ったからです。」というのがありますが、同じことがプログラミングでも言えます。
色々な方が有用なライブラリを公開されているため、本来作らなくてはいけないプログラムが簡単なコマンド一つで実行できるわけです。
「googleで検索をかける」
こういう「ウェブサイトのデータを必要な部分だけ抽出して利用すること」を「スクレイピング」といいます。
私の好きなRubyという言語では以下のように色々な人がライブラリを作って公開しています。
http://route477.net/rubyscraping/
もし、自分で作る場合は
1.まず最下層として「TCP/IP」(トランスミッション プロトコル/インターネットプロトコル)インターネットによる通信の基本機能 に関するプログラミングの知識が必要です。これは1台のパソコンと1台のサーバーがデータのやりとりを出きるようになる規約です。
2.「Http」「TCP/IP」による接続ができるようになったら、今度はHTTP(ハイパー テキスト トランスファー プロトコル)を使用してgoogleに質問文を送信するプログラムが必要です。
3.「XML」googleの場合は通常の応答ですが、戻ってきた応答を解析する必要
があります。htmlはxmlに含まれるので、xml用のパーサー(解析用の関数)を使うことで自分が取り出した情報を取り出すことができます。
これらの複雑なことが、どなたかの公開されたライブラリを使用すれば、一言(多分数行)書くだけで使用可能になるわけですから、「巨人の背にのって~」というのもあながち嘘ではないと思います。
>そもそもロボットがそのプログラミング言語とやらを理解する、というのが凄過ぎると思います。
>右足を上げろという指示を出されて、その指示通りに実行したということは、
>その指示を理解したということで、プログラミング言語を理解しているということですよね?
>それともロボットに指示を与えたいときは、
>ロボットのシステム自体に右足を挙げるという動作を「プログラミング言語ごと」機能として追加する、という、
>これが自体がプログラミング、というのでしょうか?
これはプログラミングよいうより、プログラムが動く仕組みの問題かと思います。
ちょっと答え方を色々悩みましたが、ロボットの例で粘りながら、少し具体的な話しを混ぜてみます。
コンピュータは0と1しか扱えないのがご存じと思います。それが機械語です。
コンピュータは機械語だけを理解できるように設計されます。
プログラミング言語で書かれるコードは最終的に機械語で書かれるバイナリに変換されます。
で、コンピュータは結局そのバイナリを理解して行動する訳です。
ロボットの例に戻りますと、「右足を上げろという指示」は結局は関節の角度に変換されます。
ロボットが理解しているのは飽くまでも関節の角度です。身も蓋もない話しですw
次ぎに、「右足を上げろという指示」から実際に右足を上げる過程はざっと次の3つがあります。
1:インタプリタ方式
プログラミング言語で書かれたコードを動作に変換するインタプリタを使います。
インタプリタ自身もプログラムなので、正体はバイナリです。
言語を解析するマニュアルと、対応した動作をするマニュアルの両方を持っています。
コンピュータがインタプリタのバイナリを理解して、
解析のマニュアルに従い「右足を上げろ」を読み取り、動作のマニュアルに従い動作する感じです。
この方式が「プログラミング言語を理解している」に最も近いではないかと思います。
2:セルフコンパイラ方式
プログラミング言語で書かれたコードを機械語で書かれるバイナリに変換するコンパイラを使います。
コンパイラもまたプログラムなので、やはりバイナリです。
こちらはプログラミング言語を機械語に翻訳するマニュアルです。
「右足を上げろ」のような指示を受けると、コンピュータが理解できる機械語に翻訳します。
翻訳も理解の内と思うのであれば、あながち間違いでもないですが、場合によっては少々危険です。
3:クロスコンパイラ方式
同じくコンパイラを使いますが、別のコンピュータ/ロボットにやらせます。
ロボットA君がプログラミング言語Xで書かれた内容を機械語に翻訳してから、ロボットB君に渡します。
B君は言語Xを理解どころか、知る必要すらありません。
方式1はBASIC、Perl、Ruby、PHPなどです。方式2はC、C++、Dなどです。これらを融合したのもあります。
そして、方式3は方式2の特殊形態ですが、例えば次のシチュエーションです。
ネットからソフトをダウンロードして使うと思いますが、直接実行できるものがあります(exeファイル)。
これが、どっかの誰かさんが、とある言語Yで書いたプログラムをコンパイルしてできたバイナリです。
バイナリですから、貴方のコンピュータは言語Yを知らなくとも、それを理解し、実行できます。
続けて、「プログラミング言語ごと機能として追加」はインタプリタ方式の考え方でしょうか。
インタプリタもコンパイラもプログラムの一種類ですから、それらを作ること【も】プログラミングです。
が、それはプログラミング言語を提供する側の仕事であって、使う側の仕事ではありません^^
使う側は、「右足を上げて、少し前で下げて、……」のように使うだけで良いです。
さらに、「右足を上げて、少し前で下げて、……」は「歩く」のつもりですが、
このような誰もが使いそうな機能は、既に誰かさんがプログラミングして公開している場合が多いです。
それを使うのが他の皆さんが答えに書いている、他人のコード流用、調整することです。
例えば、信号を渡るマニュアル、大根を選ぶマニュアル、買うマニュアルなどを掻き集めば、
大根を買ってくるマニュアルを簡単に書けるかと思います。
ロボットに「家を出て、信号を渡って、八百屋へGo! 大根を選んで、買う、戻る」と命令する感じです。
一々「右足を上げて」まして「右足膝を45°曲げて」からプログラムを書く必要はありません。
結構長くなってしまいましたが、
雰囲気だけでも掴んで貰えたら嬉しいなw
garyoさんの仰ることはとてもよく理解出来ました。
ただ、
今は多くの人がいろんなプログラムを公開してくれているからそれらを組み合わせるだけでいろんなことが出来る、までは分かるのですが、
例えば、一番最初にプログラムを考えた人はどうやったのだろう、っていうのが分からないのです。
ただ、この部分に関しては次にコメントして下さったLimgHTさんの説明でなんとなくわかりました。
>「もし私が、より遠くを眺めることができたとしたら、それは巨人の肩に乗ったからです。」
これは分かりやすいですね。現状としてこういう状態なのだから、そのように理解すればとりあえず良い、という状態とも言えるのでしょうか。
ご丁寧な説明本当にありがとうございます。
>>LimgHT様
いやぁ、とってもよくわかりました。
ロボットの部分の説明がとてもためになりました。
僕が分からなかったのはズバリこの点だったと思います。
プログラミング言語は結局ロボット用の言語に変換される、ということでしたら、
なるほどな、という感じです。
僕が不勉強過ぎて理解出来ない箇所も多少ありましたが、
雰囲気はつかめたと思います!
こんな何も分かってない素人に丁寧に説明して頂き本当に感謝します。
ありがとうございます。