質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.34%

非汎用言語の汎用的な使用例

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 1,468

argius

score 9484

共通点のある疑問だったので、まとめてしまいましたが、PHPやJavaScriptについてです。
いずれの言語も、汎用ではないプログラミング言語であるという認識ですが、私の知る限りでは、一部で汎用的に使用する例が増えてきたように思います。

とくにNode.jsのように、本来Webブラウザーで使用することに特化したJavaScriptをサーバーサイドで使うという仕組みが登場しています。
もともと、JavaScriptはコマンドラインで実行できる環境は古くからあるのは知っていますが、ただ汎用として使うためのAPIは揃っていないという認識です。Node.jsがどのようなAPI構成なのかは知りません。

PHPの例は特に思いつきませんが、一般的なスクリプト言語の機能は一通り備えているようなことを聞いたことがあります。

...

本題ですが、現状のPHP,JavaScriptでは、たとえばPythonやRubyのように、標準機能で汎用的なスクリプト言語と同等のことができるのか、ということです。
もし標準機能でできなければ、何かを増設することでそれを実現できるのでしょうか。
広く実用のものでなくても、そのような取り組みはあるのでしょうか。

言い方を変えると、PHPerやJSerの皆さんがその言語だけでツール開発などのすべてを賄おうという傾向があるのかどうかを知りたいです。
それとも他の言語で賄っているのでしょうか。

...

特に何かに使いたいというわけではなく、単純に興味本位の質問です。

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+3

改めて言うまでもありませんが、ほとんどのプログラミング言語はチューリング完全なので、その気になれば(プログラムとしては)どんな処理でもできます。

となると、「どういう環境で使われるか」を決めるのは、ライブラリと処理系が大半、ということになります。例えば、Object-CやSwiftは、「iOS環境」で直接動く言語なので、それらの開発に主に用いられます。また、RubyがWeb開発に用いられるのは、Ruby on Railsの大成功があってこそです。

JavaScriptの場合、ブラウザ戦争の結果で高速化したV8エンジンを使って、「非同期な処理を書きやすい」という言語特徴と組み合わせることで、サーバ向けのNode.jsが生まれました。さらにはChromiumでUIを作ったElectronでデスクトップアプリも書けるようになるほか、大量のJavaScriptを書くために必要なプリプロセッサやタスクランナー、パッケージ管理ツールといった周辺ツールもJavaScriptで揃うようになっています。

PHPのコマンドラインツールはcomposerとか、各フレームワークのCLIとかといった開発の補助ツールが中心で、あまり積極的に使われている印象はないです。

CLRとかJVMとかというように共通のフレームワークに乗った言語だと、ライブラリは同様の水準で使えるので純粋に言語として選ぶことになりますが、そうでない場合は周辺環境のほうが選ぶポイントとなります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/27 23:42

    チューリング完全であることはあまり重要では無く、
    「特定の用途に特化しない」という意味で汎用という言葉を使っています。
    もともとWebページを生成するのに特化した言語やWebブラウザー上で動作するのに特化した言語が、
    今現在、どうやって汎用的なことをしているのか(またはしていないのか)、
    というのが質問の意図でした。
    うまく説明できていなくて済みません。


    > 「どういう環境で使われるか」を決めるのは、ライブラリと処理系が大半

    そうですね、ここがいちばん知りたかったところです。
    そういう意味では、Swiftも私が思う「非汎用」のグループに属します。

    で、これもあくまでイメージでの話ですが、
    例えばJavaScriptでは、どこまでが純粋にJavaScriptなのかが分かりにくいというのもあります。
    Node.jsは割とJavaScript主体で動くもののように見えます。
    でもWebブラウザー上で動作するときにはできなかった処理、
    例えばファイルシステムへのアクセスとか、制限されないネットワーク関連を、
    どのように組み込んでいるんでしょうか。


    PHPは、composerをGitHubで見てみましたが、PHP 100%なんですね。
    PHP開発の補助ツールだとしても、PHP 100%で作っているものがある事実が分かっただけでもGoodです。
    でもPHPに関係ないところまではサポートしていないということですね。
    よく分かりました。

    キャンセル

  • 2016/05/28 00:28

    別な回答をするために以前調べてみましたが、Node.jsのファイルやHTTPアクセスといった部分は、V8に組み込むためにC++で書かれていました。

    JavaのJNIとか、RubyのC拡張とか、結局は多くの言語で言語外のリソースとのやり取りのためにC言語/C++のインターフェースを使っている印象があります。

    キャンセル

  • 2016/05/28 01:03

    > Node.jsのファイルやHTTPアクセスといった部分は、V8に組み込むためにC++で書かれていました。

    なるほど。ありがとうございます。

    先ほどちょっと調べて見つけた記事にNode.jsのAPIが載っていました。
    http://yohshiy.blog.fc2.com/blog-entry-310.html

    const fs = require('fs');
    こんな感じで(PythonやGolangで言うところの)インポートして使うのかな。

    Node.jsはこれらのAPIを提供していて、裏ではC++で実装されてV8に載っているものが使われているということですね。

    Node.jsとV8の境界がよく分かりませんが、これはまた個別に勉強してみます。


    > 結局は多くの言語で言語外のリソースとのやり取りのためにC言語/C++のインターフェースを使っている

    これはそうですね。特にどうしてもネイティブ部分は。
    他にもスクリプト言語のGUIは大体外付けTkとかQtになりますし。

    ただ質問の意図としては、標準ランタイムに含まれてさえいれば、そこは問いません。


    まとめると、すごく大雑把にいって、
    "Node.jsは既にサーバーサイドだけではない、ほぼ他の汎用スクリプト言語と同等のJavaScript処理系"
    であると理解しました。
    (「ほぼ」はJS言語が汎用言語として作られたわけではないからという偏見)

    ありがとうございました。

    キャンセル

+1

適材適所じゃないですかねえ。
自分の場合はPHPで開発やってたんですけど、
ちょっとしたコマンドラインツールとしてもよく使いました。
そのへんの感覚はRubyやPython使ってる人も
似たような感覚じゃないでしょうか。
その昔でいうとPerlくらいしかなかった時代もありましたが、
現在は便利な機能を持つ便利なスクリプト言語が
それなりにありますよね。いい時代になったものです。:-)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/27 19:57

    回答ありがとうございます!


    > 適材適所じゃないですかねえ。

    私はそう思っていて、わざわざ機能に制限があるものでがんばらなくても良いんじゃないの?
    でもNode.jsみたいのが生まれた。
    この辺の、ユーザーやコミュニティーの考えや背景を少しだけ知りたいと思ったのです。
    質問では上手く説明できていないですが...


    > そのへんの感覚はRubyやPython使ってる人も
    > 似たような感覚じゃないでしょうか。

    PHPと異なると思うのは、
    RubyやPython(Perlもですね)だと、比較的大きなツールもそれ自体の言語で作られたりしていますよね?
    で、PHPやJS(JSだとnpmみたいなのがありますね)もそういうのがあるのかなー、
    というのが今回の漠然とした問いです。
    (先入観を除くために敢えて調べてないのですが)

    なので、私の認識自体が間違っていて、当然のようにPHPでツールが作られている可能性もあると思っています。

    ツール作るよ!
    →汎用じゃないからできないことあるよね!?
    →でもがんばって自己完結したよ!(裏側でゴニョゴニョしててもまあ良し)
    →そのどう「ゴニョゴニョ」したのか知りたい!

    みたいな感じです。


    > その昔でいうとPerlくらいしかなかった時代もありましたが、
    > 現在は便利な機能を持つ便利なスクリプト言語が
    > それなりにありますよね。いい時代になったものです。:-)

    そのあたりは同意です。
    私もツールとしてPerlばかり使っていたクチですので。
    選択肢が増えたのはうれしいことですね。

    キャンセル

  • 2016/05/28 20:16

    余談になります。
    他の方の回答コメントにLispの話が出ていましたが、
    そういえば、Lispで開発してる知り合いは
    Gauche使ってちょっとした処理作ってる
    みたいな話を思い出しました。
    多少の難はあるかもしれないけど、
    使い慣れた言語でやっちゃうとこある気がします。(^_^;

    キャンセル

  • 2016/05/28 21:18

    Lispは(今回取り上げた言語に対して)独自の進化を遂げていますからね。
    ツールを書くときでも、同じLisp系で、だけどツールとしてより使いやすい(のかな?)Gaucheを選択する、
    みたいのはあるのかも知れませんね。

    似たようなケースで、
    メインシステムはJavaだけど
    スクリプトやツールとしてはGroovyを使われる方も結構いらっしゃいます。

    キャンセル

+1

Node.jsに関していえば汎用性がなかったことが、ポイントだったようです。

サーバ間の処理能力を高めるのに、データ読み込みを待たずに処理を並列で動かす非同期通信をしたい。
でも、処理に一か所でも、同期通信があると処理能力が上がらない。
既存のプログラミング言語は、同期通信のモジュールが大量にあるので困った。
ブラウザ上で動いているJavaScriptなら、そもそも外部とのインターフェイスがないので、同期通信をしているモジュールはないぞ。
Googleのjavascriptエンジンに、非同期インターフェイス群を作って、サーバサイトで動くようにできた!

といった内容を東京Node学園祭の1回目で聴いた気がします。(うろおぼえ・・)

チューリング完全な言語なら、汎用性のある言語にできるはずです。
(逆にSQLなどなは難しい。)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/27 23:25

    > 言語として汎用性がないのなら、リソースにアクセスできても、なんでもできるわけではないことになります。前提条件ですね。

    確かに、厳密にいえばそうですね。
    そこは当たり前の前提で話してしまっていました。


    > 逆に実行環境がリソースへのアクセスを禁じても、リソースへのアクセスができる実行環境で実行すればいいことになります。 たいへんな作業かもしれませんが・・・

    「たいへんな作業かもしれませんが・・・」というところが重要かと思っています。
    たいへんな作業で(コストが)見合わないので実装されない、なら今はできないわけです。

    キャンセル

  • 2016/05/27 23:53

    コストが見合わないのではなく、だれかにとって”コストを払う理由がない。”と私は考えてます。

    元SEなので「論理的には可能です。」と言ったりする、ちょっとずれた言い方かもしれませんが、私やargiusさんがやっても出来ない話しではないとおもってます。

    言語や移植先の環境にもよる話なので全てが難しいとは一概に言えないと思います。

    たとえば、写経ですがlispの処理系は書いたことあります。すごく短くては簡単でした。

    キャンセル

  • 2016/05/28 00:08 編集

    はい、「論理的には可能です。」という点は理解しています。
    ですが、知りたいのは、これからではなく、現状どうなの? という点なのです。


    ちょっと脱線ですが、
    必要とされている製品なのに、後継開発者が集まらなくて開発が難航している、なんて話も聞きますよね。
    今日から使いたい製品なのに、納期が遅れてまだ使えないとかもあるかも知れません。
    そういう風な、今使いたいのに無い。今無いと意味のないものもあります。


    ともあれ。
    質問内容があいまい過ぎて、上手く伝わらなかったかもしれませんが、
    有意義な回答をいただきました。
    ありがとうございました。


    p.s. Lisp処理系は私も(大昔に)書いてみたことがあります。
    完成はしませんでしたが...(^-^;

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る