注: コミュニティ wiki としてマークされています。
ビジュアル プログラミング言語がまだ普及していない理由について、適切な分析はありますか? 最近でも、80x25 のテキスト ウィンドウで「直線的に」コーディングしています。私たちが表現する概念 (データ構造、アルゴリズム) は、視覚的により直感的に表現できるように見えます。
注: コミュニティ wiki としてマークされています。
ビジュアル プログラミング言語がまだ普及していない理由について、適切な分析はありますか? 最近でも、80x25 のテキスト ウィンドウで「直線的に」コーディングしています。私たちが表現する概念 (データ構造、アルゴリズム) は、視覚的により直感的に表現できるように見えます。
単純なテキストだけではないプログラミングへの2つのアプローチが思い浮かびます。
構造化編集は非常に興味深いと思います。これは、コードを整理するのに非常に役立つことが証明されている「中括弧と識別」の規則を論理的に極端なものにするためです。誰かがそれを(使いやすさの観点から)見事に実装したとしたら、それは本当に何かかもしれないと思います。
一方、LabViewのアプローチは私をそれほど興奮させません。視覚的なイディオムは、テキストと比較して、強力で明白ではないようです。私はLabViewをあまり使用していませんので、おそらく私が思っているよりはましです。
Dont forget with VS 2010 (.NET 4), its now multi monitor supported, which mean you can now allow editors, designers and tool-windows to be moved outside the top-level window and positioned anywhere you want across to any monitor on your system.
かなりのミキシングとマッチングがあります。
たとえば、コードよりも描画しやすいものがあるため、NetBeansMatisseやVS.NetなどのGUIエディタを使用します。GUIデータモデルエディターを使用する人もいます。DDLを作成するよりもはるかに簡単で高速であり、(私が主張するように)より良い結果が得られます。コードを作成する場合でも、実行していることを理解するのに役立つあらゆる種類のグラフィカルツールがあります(たとえば、日食階層ビュー)。
一方で、私たちは今でも30年前に多くの仕事で使用していたものと同様のテキストエディタを使用しています。:)両方から得られる価値があることは明らかです。
80x25 のテキスト ウィンドウ?本当に?サイズを比較するわけではありませんが、私のテキスト ウィンドウはそれよりもかなり大きいです。とはいえ、個人的には満足できるビジュアルプログラミング言語が思い浮かびません。技術的な情報については、テキストはビデオよりもはるかに情報密度が高いです。5 倍の時間でその主題に関するビデオを見るよりも、技術的な主題に関する記事をざっと読み飛ばした方がましです (真剣な皆さん、もうビデオでそれを打ち負かしてしまいます)。
同様に、同じことを行うために数分間ドラッグ アンド ドロップするよりも、数行のコードを入力するのに数秒を費やしたいと考えています。それは簡潔さと表現力です。私の経験では、ビジュアルプログラミング言語にはそれがありません。プログラミングの基礎を教えるのに適していますか? もちろん。アリスはかなりきれいです。しかし、日常の仕事のためではありません。
やや関連するメモとして、Code Bubblesは「80x25 テキスト ウィンドウ」を改善する興味深い試みです。
ビジュアル プログラミング言語が人気を博したことはありません。C++ / ビジュアル スタジオが登場した当時、人々にとって適切なテクノロジであったのと同じように。
しかし、私たちのマシン (Alex 音声サービス) と対話し、テキスト エディターよりも優れたツールを使用してプログラミングする時代が近づいています。
これが私が取り組んでいるものの始まりです。私は自分のプロジェクトをブートストラップしようとしています。なぜなら、あなたがクールなプログラミング ツールを作成しているのであれば、ツール自体が最終的にツールの入力言語で書かれないのはなぜでしょうか。最初は PyQt5 / QGraphicsScene で独自のグラフをレンダリングすることから始めましたが、2D シーンのデバッグは実際には非常に困難です。したがって、自分のグラフをレンダリングしてグラフ エディターを作成するのは、基本的なグラフを実行できるようになった後で行います。私のお気に入りの汎用グラフ エディタは yEd です。Python用のnetworkxライブラリはすでに.graphmlを読み込むことができるため、.graphmlを出力します(問題は、グラフの色と位置以外のプロパティをロードすることだけです。そのため、独自のグラフ描画を行うまで機能は待機します)。
これを実行するための基本的なコードを次に示します。
import networkx as nx
from PyQt5.QtCore import QThread, QObject, pyqtSignal
from PyQt5.QtGui import QColor
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
import re
import sys
EDAT = 2
NDAT = 1
class CodeGraphThread(QThread):
ifRgx = r'^if\s+(.+)\s*$'
elseRgx = r'\s+|^$'
def __init__(self, graph, parent=None):
super(CodeGraphThread, self).__init__(parent)
self._nodes = {}
self.setGraph(graph)
self._retVal = None
self._locals = []
def setGraph(self, graph):
self._graph = graph
G = graph.G()
nodes = [x for x in G.nodes(data=True) if x[NDAT]['label'] == 'start']
if nodes: self._setStart(nodes[0][0])
def _setStart(self, nstr):
self._nodes['start'] = nstr
def start(self):
self._running = True
self._nodes['current'] = self._nodes['start']
QThread.start(self)
def _exec(self, codeText):
try:
exec('self._retVal=' + codeText)
except:
try:
exec(codeText)
except:
self.codeGraph().errorMessage.emit('Coudln\'t execute code: "' + codeText + '"')
def returnVal(self):
return self._retVal
def run(self):
while self._running:
cg = self.codeGraph()
G = cg.G()
current = self._nodes['current']
#TODO transfer over to regex system
data = [d for x,d in G.nodes(data=True) if x == current and 'label' in d and d['label'] not in ['start']]
if data:
codeText = data[0]['label']
self._exec(codeText)
rgx = self.ifRgx
edges = cg.edgesFr(current, rgx)
if edges:
e= edges[0]
ifArg = cg.matches(rgx).group(1)
self._exec(ifArg)
if self.returnVal():
self._nodes['current'] = e[1]
continue
rgx = self.elseRgx
edges = cg.edgesFr(current, rgx)
edges += cg.edgesFr(current, None)
if edges:
e = edges[0]
self._nodes['current'] = e[1]
continue
break
def codeGraph(self):
return self._graph
class CodeGraph(QObject):
errorMessage = pyqtSignal(str)
statusMessage = pyqtSignal(str)
_rgxMemo = {}
def __init__(self, gmlpath=None):
QObject.__init__(self)
if gmlpath != None:
self.loadGraphML(gmlpath)
else:
self._gmlpath = None
self._G = nx.MultiDiGraph()
self._thread = CodeGraphThread(self)
def G(self):
return self._G
def loadGraphML(self, gmlpath):
self._gmlpath = gmlpath
self._G = nx.read_graphml(gmlpath)
def saveGraphML(self, gmlpath):
self._gmlpath = gmlpath
nx.write_graphml(self._G, gmlpath)
def debugPrintNodes(self):
print(self._G.nodes(data=True))
def debugPrintEdges(self):
print(self._G.edges(data=True))
def matches(self, rgx):
if rgx in self._rgxMemo:
return self._rgxMemo[rgx][1]
return None
def rgx(self, rgx):
if rgx not in self._rgxMemo:
self._rgxMemo[rgx] = [re.compile(rgx), None]
return self._rgxMemo[rgx][0]
def rgxMatch(self, rgx, string):
if rgx not in self._rgxMemo:
rgx_ = self.rgx(rgx)
else:
rgx_ = self._rgxMemo[rgx][0]
match = self._rgxMemo[rgx][1] = rgx_.match(string)
return match
def edgesFr(self, n0, rgx):
if rgx != None:
return [(u,v,d) for u,v,d in self.G().edges(data=True) if u == n0 and 'label' in d and self.rgxMatch(rgx, d['label'])]
else:
return [(u,v,d) for u,v,d in self.G().edges(data=True) if u == n0 and 'label' not in d]
if __name__ == '__main__':
cg = CodeGraph('unnamed0.graphml')
cgthread = CodeGraphThread(cg)
def printError(errorMsg):
print(errorMsg)
cg.errorMessage.connect(printError)
# Qt application reqd for QThread testing
app = QApplication(sys.argv)
win = QMainWindow()
win.setWindowTitle('PyGraphML Practice 0')
button0 = QPushButton('Start thread running')
button0.clicked.connect(cgthread.start)
win.setCentralWidget(button0)
win.show()
sys.exit(app.exec_())
現在の問題: Python 3 は exec / locals() を適切に処理しません (したがって、x だけでなく self.x を使用します)。そのため、サードパーティの Python インタープリターを使用するか、コードを静的に変更することを検討してください。
私のツールはまだ何も正しくないとは言っていません。物事を正しく行うには、自動リファクタリング ツールやデバッグなども必要です。
simulink は matlab の一部であり、エンジニアリングの問題に最適です